{"version":3,"sources":["components/3d/geonovop0/src/webasm/VoxelBrickMesher.js","dataSources/WebServiceClient.ts","dataSources/geo/GeoAuth.ts","actions/AuthAction.ts","dataSources/geo/GeoWebServiceClient.ts","dataSources/geo/MapLegend.ts","dataSources/geo/GeoModel.ts","dataSources/dataforsyningen/Address.ts","actions/GeneralActions.ts","dataSources/geo/HydroModel.ts","actions/HydroModelActions.ts","components/wiki/wikidocument/wikicontent/WikiContent.style.ts","components/wiki/wikidocument/wikicontent/videoembed/VideoEmbed.style.ts","components/wiki/wikidocument/wikicontent/videoembed/VideoEmbed.tsx","components/wiki/wikidocument/wikicontent/fullsizedialog/FullSizeDialog.style.ts","components/wiki/wikidocument/wikicontent/fullsizedialog/FullSizeDialog.tsx","components/wiki/wikidocument/wikicontent/WikiContent.tsx","dataSources/wiki/Wiki.ts","CustomTypes.ts","reducers/WikiReducer.ts","actions/WikiActions.ts","Enums.ts","Themes.ts","Constants.ts","App.style.ts","dataSources/geo/CrossSection.ts","actions/MapActions.ts","dataSources/layers/Layer.ts","img/legend_borehole.png","dataSources/layers/BoreHoles.ts","img/legend_buried_valleys.png","dataSources/layers/BuriedValleys.ts","img/legend_postglacial_sediment_thickness.png","dataSources/layers/PostGlacialSedimentThickness.ts","dataSources/layers/GroundPollution1.ts","img/legend_ground_pollution_1.png","dataSources/layers/GroundPollution2.ts","img/legend_ground_pollution_2.png","img/legend_raw_materials.png","dataSources/layers/RawMaterialAreas.ts","img/legend_varv.png","dataSources/layers/Varv.ts","dataSources/dataforsyningen/Dataforsyningen.ts","dataSources/layers/SeaLevelOnLand.ts","dataSources/layers/SliceKote.ts","dataSources/layers/SliceDHM.ts","dataSources/layers/BlueSpotExtremeRain.ts","dataSources/layers/TerrainShadows.ts","img/legend_gerda.png","dataSources/layers/Gerda.ts","dataSources/layers/OnshoreWindmills.ts","img/legend_water_extraction_plants.png","dataSources/layers/WaterExtractionPlants.ts","img/legend_protected_nature_types.png","dataSources/layers/ProtectedNatureTypes.ts","img/legend_shallow_groundwater.png","dataSources/layers/ShallowGroundwater.ts","dataSources/layers/IceAge.ts","img/legend_ice_age.png","dataSources/layers/WindmillsAtSea.ts","img/legend_windmillsatsea.png","dataSources/layers/BirdProtection.ts","dataSources/layers/Ramsar.ts","dataSources/layers/HabitatProtection.ts","dataSources/layers/ForestProtection.ts","dataSources/layers/Wildlife.ts","dataSources/layers/NaturaStateOwned.ts","dataSources/layers/Natura.ts","img/legend_prequaternary_lithology.png","dataSources/layers/PreQuaternaryLithology.ts","img/legend_prequaternary_elevation.png","dataSources/layers/PreQuaternaryElevation.ts","img/legend_elevation_depth.png","dataSources/layers/ElevationAndDepth.ts","img/legend_soil_types.png","dataSources/layers/SoilTypes.ts","img/legend_morphology.png","dataSources/layers/Morphology.ts","img/legend_seabed_sediments.png","dataSources/layers/SeabedSediments.ts","dataSources/layers/PesticideWaterworks.ts","img/legend_pesticide_waterworks.png","dataSources/layers/PesticideWaterSupplyWells.ts","img/legend_pesticide_water_supply_wells.png","img/geo_model.png","dataSources/layers/ModelAreaLayer.ts","dataSources/layers/CostalLocations.ts","dataSources/datafordeler/Datafordeler.ts","dataSources/layers/ScreenClassic.ts","dataSources/layers/ScreenSubdued.ts","dataSources/layers/ScreenGrey.ts","dataSources/layers/OrtoBackground.ts","dataSources/layers/TopoLowBackground.ts","dataSources/layers/TopoHighBackground.ts","dataSources/layers/PrussianBackground.ts","dataSources/layers/OSMBackground.ts","dataSources/layers/HydroModel.ts","img/legend_windspeed.png","dataSources/layers/WindSpeed.ts","dataSources/layers/LayerRegistry.ts","reducers/MapReducer.ts","utils/MapLayerUtils.ts","actions/ProfileActions.ts","reducers/ProfileReducer.ts","components/co2levelsorg/CO2LevelsOrg.style.ts","components/co2levelsorg/CO2LevelsOrg.tsx","utils/Utils.ts","components/layerpicker/layerlegend/LayerLegend.style.ts","components/layerpicker/layerlegend/LayerLegend.tsx","components/profileinfo/ProfileInfo.style.ts","dataSources/geo/NearestBoreHoles.ts","dataSources/geo/Borehole.ts","dataSources/geo/BoreholeLegend.ts","dataSources/dataforsyningen/AddressReverse.ts","actions/BoreholeInfoActions.ts","reducers/InfoMenuReducer.ts","dataSources/geo/VirtualBorehole.ts","actions/VirtualBoreholeInfoActions.ts","actions/InfoMenuActions.ts","components/profileinfo/ProfileInfo.tsx","components/bottombar/BottomBar.style.ts","dataSources/graphs/GraphRegistry.ts","components/bottombar/BottomBar.tsx","components/leftsidebar/LeftSideBar.style.ts","components/layerpicker/layerparameters/LayerParameters.style.ts","components/layerpicker/layerparameters/LayerParameters.tsx","components/confirm/Confirm.style.ts","components/confirm/Confirm.tsx","components/layerpicker/LayerPicker.style.ts","components/layerpicker/LayerPicker.tsx","components/leftsidebar/leftsidebaricon/LeftSideBarIcon.tsx","components/leftsidebar/LeftSideBar.tsx","components/logindialog/LoginDialog.style.ts","components/logindialog/LoginDialog.tsx","components/openlayersmap/OpenLayersMap.style.ts","components/openlayersmap/OpenLayersMap.tsx","reducers/GeneralReducer.ts","reducers/AuthReducer.ts","actions/RedirectAction.ts","reducers/RedirectReducer.ts","reducers/BoreholeInfoReducer.ts","reducers/VirtualBoreholeInfoReducer.ts","reducers/HydroModelReducer.ts","Store.ts","components/maincontentview/MainContentView.style.ts","components/3d/geonovop0/src/HeightMap.js","components/3d/geonovop0/src/voxel/VoxelModel.js","components/3d/geonovop0/src/ClipPolygon.js","components/3d/geonovop0/src/voxel/VoxelTransferFunction.js","components/3d/geonovop0/src/tile3d/W3DTile.js","components/3d/geonovop0/src/tile3d/W3DTileSet.js","components/3d/geonovop0/src/tile3d/TileLoader.worker.js","components/3d/geonovop0/assets/aarhus_compress.nrrd","components/3d/geonovop0/assets/VoxelDefinition.json.txt","components/3d/geonovop0/assets/verdana.json.txt","components/3d/geonovop0/assets/verdana.png","components/3d/geonovop0/src/WgApp.js","components/3d/geonovop0/src/WgAppComponent.jsx","components/mapview3d/MapView3D.style.ts","components/mapview3d/MapView3D.tsx","components/maincontentview/MainContentView.tsx","components/rightsidebar/RightSideBar.style.ts","components/boreholeinfo/BoreholeInfo.style.ts","components/boreholeinfo/boreholefigure/BoreholeFigure.style.ts","components/boreholeinfo/boreholefigure/BoreholeFigure.tsx","components/boreholeinfo/boreholelegend/BoreholeLegend.style.ts","components/boreholeinfo/boreholelegend/BoreholeLegend.tsx","components/boreholeinfo/boreholemeta/BoreholeMeta.style.ts","dataSources/geo/DataList.ts","components/boreholeinfo/boreholemeta/BoreholeMeta.tsx","components/boreholeinfo/BoreholeInfo.tsx","components/virtualboreholeinfo/VirtualBoreholeInfo.style.ts","components/virtualboreholeinfo/virtualboreholefigure/VirtualBoreholeFigure.style.ts","components/virtualboreholeinfo/virtualboreholefigure/VirtualBoreholeFigure.tsx","components/virtualboreholeinfo/virtualboreholemeta/VirtualBoreholeMeta.style.ts","components/virtualboreholeinfo/virtualboreholemeta/VirtualBoreholeMeta.tsx","components/virtualboreholeinfo/VirtualBoreholeInfo.tsx","components/rightsidebar/RightSideBar.tsx","components/themepicker/ThemePicker.style.ts","img/energi.jpg","img/istid.jpg","img/klima.jpg","img/miljo.jpg","components/themepicker/ThemePicker.tsx","components/modelpicker/ModelPicker.style.ts","components/modelpicker/ModelPicker.tsx","components/toolbar/ToolBar.style.ts","components/toolbar/toolbarslider/ToolBarSlider.style.ts","components/toolbar/toolbarslider/ToolBarSlider.tsx","components/toolbar/virtualboreholesettings/VirtualBoreholeSettings.style.ts","components/toolbar/virtualboreholesettings/VirtualBoreholeSettings.tsx","components/toolbar/profilesettings/ProfileSettings.style.ts","components/toolbar/profilesettings/ProfileSettings.tsx","components/toolbar/ToolBar.tsx","components/userinfo/UserInfo.style.ts","components/userinfo/UserInfo.tsx","components/topbar/TopBar.style.ts","components/searchfield/SearchField.style.ts","components/searchfield/SearchField.tsx","components/topbar/TopBar.tsx","components/wiki/wikisidebar/WikiSideBar.style.ts","components/wiki/wikibrowser/WikiBrowser.style.ts","components/wiki/wikisearch/WikiSearch.style.ts","components/wiki/wikisearch/WikiSearch.tsx","components/wiki/wikibrowser/WikiBrowser.tsx","components/wiki/wikidocument/WikiDocument.style.ts","components/wiki/wikidocument/wikisection/WikiSection.style.ts","components/wiki/wikidocument/wikisection/WikiSection.tsx","components/wiki/wikidocument/WikiDocument.tsx","components/wiki/wikicategory/WikiCategory.style.ts","components/wiki/wikicategory/WikiCategory.tsx","components/wiki/wikisidebar/WikiSideBar.tsx","components/redirectroute/RedirectRoute.tsx","App.tsx","AccessTokenLogin.tsx","AppWrapper.tsx","reportWebVitals.ts","index.tsx"],"names":["Module","_scriptDir","document","currentScript","src","undefined","readyPromiseResolve","readyPromiseReject","Promise","resolve","reject","key","moduleOverrides","hasOwnProperty","readBinary","arguments_","ENVIRONMENT_IS_WEB","ENVIRONMENT_IS_WORKER","scriptDirectory","self","location","href","indexOf","substr","lastIndexOf","url","xhr","XMLHttpRequest","open","send","responseText","err","data","tryParseAsDataURI","array","ret","i","length","chr","ASSERTIONS","assert","String","fromCharCode","push","join","intArrayToString","responseType","Uint8Array","response","onload","onerror","status","buffer","console","log","bind","wasmBinary","warn","wasmMemory","WebAssembly","abort","ABORT","condition","text","UTF8Decoder","TextDecoder","UTF8ToString","ptr","maxBytesToRead","heap","idx","endIdx","endPtr","subarray","decode","str","u0","u1","u2","ch","UTF8ArrayToString","HEAPU8","HEAP8","HEAP16","HEAPU16","HEAP32","HEAPU32","HEAPF32","HEAPF64","UTF16Decoder","UTF16ToString","maxIdx","codeUnit","stringToUTF16","outPtr","maxBytesToWrite","startPtr","numCharsToWrite","charCodeAt","lengthBytesUTF16","UTF32ToString","utf32","stringToUTF32","lengthBytesUTF32","len","updateGlobalBufferAndViews","buf","Int8Array","Int16Array","Int32Array","Uint16Array","Uint32Array","Float32Array","Float64Array","wasmTable","__ATPRERUN__","__ATINIT__","__ATPOSTRUN__","runDependencies","runDependencyWatcher","dependenciesFulfilled","what","e","RuntimeError","wasmBinaryFile","path","dataURIPrefix","isDataURI","filename","startsWith","getBinary","file","binary","callRuntimeCallbacks","callbacks","callback","shift","func","arg","get","ExceptionInfo","excPtr","this","set_type","type","get_type","set_destructor","destructor","get_destructor","set_refcount","refcount","set_caught","caught","get_caught","set_rethrown","rethrown","get_rethrown","init","add_ref","value","release_ref","prev","getShiftFromSize","size","TypeError","embind_charCodes","readLatin1String","c","awaitingDependencies","registeredTypes","typeDependencies","char_0","char_9","makeLegalFunctionName","name","f","replace","createNamedFunction","body","Function","extendError","baseErrorType","errorName","errorClass","message","stack","Error","toString","prototype","Object","create","constructor","BindingError","throwBindingError","InternalError","throwInternalError","whenDependentTypesAreResolved","myTypes","dependentTypes","getTypeConverters","onComplete","typeConverters","myTypeConverters","registerType","forEach","Array","unregisteredTypes","registered","dt","rawType","registeredInstance","options","ignoreDuplicateRegistrations","cb","ClassHandle_isAliasOf","other","ClassHandle","leftClass","$$","ptrType","registeredClass","left","rightClass","right","baseClass","upcast","throwInstanceAlreadyDeleted","obj","finalizationGroup","detachFinalizer","handle","releaseClassHandle","count","smartPtr","smartPtrType","rawDestructor","runDestructor","attachFinalizer","FinalizationGroup","iter","result","next","done","register","unregister","ClassHandle_clone","preservePointerOnDelete","o","clone","getPrototypeOf","deleteScheduled","ClassHandle_delete","ClassHandle_isDeleted","delayFunction","deletionQueue","flushPendingDeletes","pop","ClassHandle_deleteLater","registeredPointers","ensureOverloadTable","proto","methodName","humanName","overloadTable","prevFunc","arguments","apply","argCount","RegisteredClass","instancePrototype","getActualType","downcast","pureVirtualFunctions","upcastPointer","ptrClass","desiredClass","constNoSmartPtrRawPointerToWireType","destructors","isReference","_embind_repr","handleClass","genericPointerToWireType","isSmartPointer","rawConstructor","isConst","sharingPolicy","clonedHandle","rawShare","__emval_register","nonConstNoSmartPtrRawPointerToWireType","simpleReadValueFromPointer","pointer","RegisteredPointer_getPointee","rawGetPointee","RegisteredPointer_destructor","RegisteredPointer_deleteObject","downcastPointer","rv","getInheritedInstanceCount","keys","registeredInstances","getLiveInheritedInstances","k","setDelayFunction","fn","getInheritedInstance","class_","getBasestPointer","makeClassHandle","record","RegisteredPointer_fromWireType","rawPointer","getPointee","makeDefaultHandle","pointeeType","toType","actualType","registeredPointerRecord","call","constPointerType","pointerType","dp","RegisteredPointer","destructorFunction","dynCall","sig","args","includes","concat","dynCallLegacy","embind__requireFunction","signature","rawFunction","fp","argCache","getDynCaller","UnboundTypeError","getTypeName","___getTypeName","_free","throwUnboundTypeError","types","unboundTypes","seen","visit","map","heap32VectorToArray","firstElement","runDestructors","del","craftInvokerFunction","argTypes","classType","cppInvokerFunc","cppTargetFunc","isClassMethodFunc","needsDestructorStack","returns","argsList","argsListWired","invokerFnBody","dtorStack","args1","args2","paramName","argumentList","dummy","r","new_","emval_free_list","emval_handle_array","__emval_decref","count_emval_handles","get_first_emval","v","t","floatReadValueFromPointer","integerReadValueFromPointer","signed","emscripten_realloc_buffer","grow","byteLength","codes","embind_init_charCodes","decodeBase64","atob","input","chr1","chr2","chr3","enc2","enc3","enc4","keyStr","output","charAt","s","decoded","bytes","_","intArrayFromBase64","slice","calledRun","asmLibraryArg","m","_malloc","l","primitiveType","minRange","maxRange","h","trueValue","falseValue","fromWireType","wt","toWireType","argPackAdvance","readValueFromPointer","rawPointerType","rawConstPointerType","baseClassRawType","getActualTypeSignature","upcastSignature","downcastSignature","destructorSignature","legalFunctionName","numArguments","exposePublicSymbol","base","basePrototype","constructor_body","referenceConverter","pointerConverter","constPointerConverter","replacePublicSymbol","n","rawClassType","rawArgTypesAddr","invokerSignature","invoker","rawArgTypes","splice","rawInvoker","context","isPureVirtual","unboundTypesHandler","Symbol","substring","method","className","memberFunction","b","bitshift","isUnsignedType","a","dataTypeIndex","TA","decodeMemoryView","g","stdStringIsUTF8","decodeStartPtr","currentBytePtr","stringSegment","getLength","ArrayBuffer","valueIsOfTypeString","Uint8ClampedArray","u","lengthBytesUTF8","outIdx","startIdx","stringToUTF8Array","charCode","charSize","decodeString","encodeString","getHeap","lengthBytesUTF","HEAP","isVoid","j","argv","impl","requireRegisteredType","d","p","dest","num","copyWithin","q","requestedSize","x","multiple","oldSize","maxHeapSize","cutDown","overGrownHeapSize","Math","min","max","info","receiveInstance","instance","module","exports","unshift","id","clearInterval","removeRunDependency","receiveInstantiationResult","instantiateArrayBuffer","receiver","fetch","then","credentials","catch","instantiate","reason","instantiateStreaming","createWasm","run","doRun","postRun","preRun","setTimeout","runCaller","ready","WebServiceClient","baseUrl","params","setPath","setParams","addParam","hasParam","urlEncodedParams","reduce","acc","val","token","encodeURIComponent","GeoAuth","URL","super","fetchToken","ok","tokenData","SET_TOKEN","SET_USER_CREDENTIALS","SET_TOKEN_EXPIRED","LOGIN_STARTED","LOGIN_FAILURE","LOGIN_SUCCESS","LOGOUT","authActions","setToken","tokenExpirationTimestamp","setUserCredentials","username","password","setTokenExpired","loginStarted","loginFailure","errorMessage","loginSuccess","logout","login","async","dispatch","usingPermaToken","authParams","role","parsedToken","jwtDecode","exp","GeoWebServiceClient","geoAreaId","_token","MapLegend","setModelId","modelId","validateParams","fetchMapLegend","headers","Authorization","json","GeoModelService","format","setX","setY","y","hasX","hasY","parseGeojsonString","stringRepr","replaceAll","JSON","parse","fetchModels","responseData","jsonResponse","models","features","feature","ID","properties","Id","Name","Description","BoundingBox","MinX","MinY","MaxX","MaxY","Srid","Type","Priority","Geometry","geometry","Address","srid","noFormat","struktur","fuzzy","autocomplete","setQuery","query","fetchAddresses","ADD_GRAPH_GROUP","FETCHING_ADDRESSES_STARTED","FETCHING_ADDRESSES_SUCCESS","FETCHING_ADDRESSES_FAILURE","FETCHING_GEO_MODELS_STARTED","FETCHING_GEO_MODELS_SUCCESS","FETCHING_GEO_MODELS_FAILURE","FETCHING_MAP_LEGEND_STARTED","FETCHING_MAP_LEGEND_SUCCESS","FETCHING_MAP_LEGEND_FAILURE","REMOVE_GRAPH_GROUP","SET_ADDRESS_QUERY","SET_BOTTOM_BAR_DRAGGING","SET_BOTTOM_BAR_HEIGHT","SET_BOTTOM_BAR_WIDTH","SET_DATA_THEME","SET_RIGHT_SIDE_BAR_DRAGGING","SET_RIGHT_SIDE_BAR_WIDTH","SET_SELECTED_GEO_MODEL","SET_SELECTED_GRAPH","SET_SELECTED_TOOL","SET_SHOW_LEFT_SIDE_BAR","generalActions","addGraphGroup","graphGroup","fetchingAddressesStarted","fetchingAddressesFailure","fetchingAddressesSuccess","addresses","fetchingGeoModelsStarted","fetchingGeoModelsFailure","fetchingGeoModelsSuccess","getState","wsAddress","error","fetchGeoModels","authState","wsGeoModels","fetchingMapLegendStarted","fetchingMapLegendFailure","fetchingMapLegendSuccess","borehole","wsMapLegend","mapLegend","removeGraphGroup","setAddressQuery","setBottomBarHeight","height","setBottomBarWidth","width","setBottomBarDragging","dragging","setDataTheme","dataTheme","setRightSideBarDragging","setRightSideBarWidth","setSelectedGeoModel","model","setSelectedGraph","graph","setSelectedTool","toolType","setShowLeftSideBar","show","HydroModel","geoareaid","fetchHydroModels","FETCHING_HYDRO_MODELS_STARTED","FETCHING_HYDRO_MODELS_SUCCESS","FETCHING_HYDRO_MODELS_FAILURE","hydroModelActions","fetchingHydroModelsStarted","fetchingHydroModelsFailure","fetchingHydroModelsSuccess","hydroModels","wsHydroModel","sort","wikiContentStyle","makeStyles","theme","image","cursor","root","paddingTop","spacing","subtitle","fontSize","video","videoEmbedStyle","videoResponsive","overflow","paddingBottom","position","iframe","top","VideoEmbed","props","classes","intl","useIntl","_jsx","children","frameBorder","allow","allowFullScreen","title","formatMessage","fullSizeDialogStyle","actions","padding","closeButton","backgroundColor","palette","geoColors","toolBar","light","color","main","content","overflowY","FullSizeDialog","wikiService","WikiService","_jsxs","Dialog","onClose","handleClose","paper","maxWidth","DialogContent","getImageUrl","imageKey","alt","DialogActions","IconButton","onClick","Close","WikiContentType","WikiContentComponent","rootRef","useRef","rootWidth","setRootWidth","useState","fullSizeKey","setFullSizeKey","useEffect","_rootRef$current","_rootRef$current2","current","offsetWidth","ref","TEXT","ReactMarkdown","linkTarget","IMAGE","_Fragment","VIDEO","ContextTag","process","REACT_APP_WIKI_HOST","imageId","fetchDocumentsMeta","fetchDocument","documentId","validateWikiDocument","sections","isArray","logo","resume","footer","categories","validateWikiSection","section","validateWikiContent","CallResult","WikiView","wikiStateInitial","fetchDocumentsMetaStatus","Initial","fetchDocumentsMetaError","fetchDocumentStatus","fetchDocumentError","openSectionIds","documentsMeta","contextTags","OSM","MODEL_AREAS","poi","category","showWikiSideBar","currentWikiViews","FETCHING_DOCUMENTS_META_STARTED","FETCHING_DOCUMENTS_META_FAILURE","FETCHING_DOCUMENTS_META_SUCCESS","FETCHING_DOCUMENT_STARTED","FETCHING_DOCUMENT_FAILURE","FETCHING_DOCUMENT_SUCCESS","ADD_OPEN_SECTION_ID","REMOVE_OPEN_SECTION_ID","ADD_CONTEXT_TAGS","REMOVE_CONTEXT_TAGS","ADD_CATEGORIES","SET_POINTS_OF_INTEREST","SET_CATEGORY","PUSH_VIEW","POP_VIEW","REMOVE_VIEW","CLEAR_VIEW_STACK","SHOW_WIKI_SIDE_BAR","CLEAR_DOCUMENTS_META","CLEAR_DOCUMENT","wikiActions","fetchingDocumentsMetaStarted","fetchingDocumentsMetaFailure","fetchingDocumentsMetaSuccess","fetchingDocumentStarted","fetchingDocumentFailure","fetchingDocumentSuccess","addOpenSectionId","removeOpenSectionId","addContextTags","removeContextTags","addCategories","setPointsOfInterest","setCategory","pushView","wikiView","popView","removeView","clearViewStack","clearDocumentsMeta","clearDocument","clearViews","meta","_meta$categories","WikiDocument","openCategory","WikiCategory","DataTheme","LayerViewType","ToolType","dataThemeIceAgeMain","dataThemeClimateMain","dataThemeEnergyMain","dataThemeEnvironmentMain","common","black","white","topBar","contextBar","dark","headerText","dataThemeIceAge","dataThemeClimate","dataThemeEnergy","dataThemeEnvironment","defaultTheme","primary","secondary","iceAgeTheme","climateTheme","energyTheme","environmentTheme","getThemeOptionsByDataTheme","ICE_AGE","CLIMATE","ENERGY","ENVIRONMENT","NONE","tooltipDelay","leftSidebarToolsWidth","leftSidebarWidth","toolbarHeight","topbarHeight","headerHeight","sidebarAnimationDuration","appStyle","borderWidth","borderStyle","borderColor","backgroundClip","display","flexDirection","alignItems","justifyContent","marginLeft","marginRight","textAlign","errorIcon","marginBottom","mainContainer","flex","breakpoints","down","mobileContainer","mobileWarning","mainArea","background","mainContentArea","toolbar","bottomBar","bottom","zIndex","leftSideBar","progressIcon","rightSideBar","wikiSideBar","CrossSection","setHydroModelIds","hydroModelIds","setMaxBoreholeDistance","maxBoreholeDistance","setMaxDepth","maxDepth","setPathCoordinates","coordinates","coordinate","setWidth","setHeight","fetchProfile","SET_MAP_CENTER","SET_MAP_CURRENT_ZOOM","SET_MAP_EXTENT","SET_COLORS_IN_FOCUS","ADD_LAYER","ADD_LAYER_GROUP","REMOVE_LAYER","REMOVE_LAYER_GROUP","CLEAR_LAYERS","SET_LAYER_PARAMS","SET_LAYER_ACTIVE_VIEW","SET_LAYER_CAPABILITIES","mapActions","center","currentZoom","mapExtent","colorsInFocus","layer","layerGroup","clearLayers","setLayerActiveView","view","capabilities","AbstractLayer","_minimumZoom","_enabled","_olLayer","_type","_zIndex","layerType","minZoom","enabled","ol","Layer","olLayer","setZIndex","setProperties","set","visible","getVisible","setVisible","getSubLayerName","getMinimumZoom","onZoomChange","zoomLevel","describe","BoreHoleLayer","LayerType","BORE_HOLES","opacity","defaultParams","Image","source","ImageWMS","layers","projection","Projection","code","getSource","setImageLoadFunction","bboxStr","getArgFromUrl","srsStr","bbox","seperator","parts","split","res","parseFloat","parseBBOX","getImage","group","LayerGroup","SUBSURFACE","ordering","BOREHOLE","themes","values","capabilitiesUrl","legendEnabled","imageLegend","legendImage","imageWidth","opacityEnabled","layerCopyright","layerCopyrights","Geo","argName","defaultValue","index","search","RegExp","BuriedValleysLayer","BURIED_VALLEYS","PostGlacialSedimentThicknessLayer","POSTGLACIAL_SEDIMENT_THICKNESS","legendTextId","GroundPollution1Layer","GROUND_POLLUTION_1","LAYERS","POLLUTION","Miljoportal","GroundPollution2Layer","GROUND_POLLUTION_2","RawMaterialAreasLayer","RAW_MATERIALS","NEAR_TERRAIN","VarvLayer","VARV","TRANSPARENT","STYLES","Varv","DataforsyningenToken","SeaLevelOnLandLayer","SEA_LEVEL_ON_LAND","param","initSubLayers","subLayers","fallbackLayer","list","subLayer","selected","wmtsOptions","WMTS","optionsFromCapabilities","wmts","setUrls","Tile","lastValue","minimum","maximum","subLayerDescriptors","descriptor","step","round","WATER","Geodatastyrelsen","labelId","inputEnabled","unit","SliceKoteLayer","SLICE_KOTE","level","viewparams","selectedGeoModel","SliceDHMLayer","SLICE_DHM","depth","BlueSpotExtremeRain","BLUE_SPOT_EXTREME_RAIN","layerName","filter","TerrainShadows","TERRAIN_SHADOWS","transparent","GerdaLayer","GERDA","GEOPHYSICS","imageHeight","Geus","OnshoreWindmillsLayer","ONSHORE_WINDMILLS","WINDPOWER","Energistyrelsen","WaterExtractionPlantsLayer","WATER_EXTRACTION_PLANTS","ProtectedNatureTypesLayer","PROTECTED_NATURE_TYPES","NATURE","ShallowGroundwaterLayer","SHALLOW_GROUNDWATER","IceAgeLayer","TileWMS","_class","descriptors","label","subLabel","wikiKey","stepperEnabled","WindmillsAtSeaLayer","WINDMILLS_AT_SEA","BirdProtectionLayer","BIRD_PROTECTION","srs","MST","RamsarLayer","RAMSAR","HabitatProtectionLayer","HABITAT_PROTECTION","ForestProtectionLayer","FOREST_PROTECTION","WildlifeLayer","WILDLIFE","NaturaStateOwnedLayer","NATURA_STATE_OWNED","NaturaLayer","NATURA","PreQuaternaryLithologyLayer","PREQUATERNARY_LITHOLOGY","PreQuaternaryElevationLayer","PREQUATERNARY_ELEVATION","ElevationAndDepthLayer","ELEVATION_DEPTH","defaultSubLayer","SoilTypesLayer","SOIL_TYPES","radioSubLayers","sublayers","MorphologyLayer","MORPHOLOGY","SeabedSedimentsLayer","SEABED_SEDIMENTS","PesticideWaterworksLayer","PESTICIDE_WATERWORKS","PesticideWaterSupplyWellsLayer","PESTICIDE_WATER_SUPPLY_WELLS","ModelAreaLayer","_options$params","_options$params2","Number","MAX_SAFE_INTEGER","geoModels","LineString","defaultColor","setStyle","Style","stroke","Stroke","Vector","CostalLocations","COSTAL_LOCATIONS","point","coord","lon","lat","transform","Point","Icon","anchor","anchorXUnits","anchorYUnits","POINTS_OF_INTEREST","DatafordelerUsername","DatafordelerPassword","ScreenClassicLayer","SCREEN_CLASSIC","proj","BACKGROUND_MAPS","SDFI","ScreenSubduedLayer","SCREEN_SUBDUED","ScreenGreyLayer","SCREEN_GREY","OrtoBackgroundLayer","ORTO_BACKGROUND","ORTO","TopoLowBackgroundLayer","TOPO_LOW_BACKGROUND","TOPO_LOW","TopoHighBackgroundLayer","TOPO_HIGH_BACKGROUND","TOPO_HIGH","PrussianBackgroundLayer","PRUSSIAN_BACKGROUND","PRUSSIAN","OSMBackgroundLayer","OSM_BACKGROUND","OpenStreetMap","HydroModelLayer","HYDRO_MODEL","switchSubLayers","reverse","HYDROMODEL","WindSpeedLayer","WIND_SPEED","priority","defaultGroupOrdering","GENERAL","themeGroupOrdering","enabledLayers","Map","allLayerDescriptions","initialLayerParams","getGeoLayerByType","getLayersByDataTheme","getLayerDescriptionForType","layerDescription","description","mapStateInitial","showOrtoImages","mapCenter","mapCurrentZoom","enabledLayerGroups","layerParams","layerCapabilities","layerActiveViews","getLayerParamsFromType","_params$find","find","getLayerCapabilitiesFromType","_capabilities$find","capability","resetSelectedLayers","defaultLayers","tagsToAdd","flat","getSelectedHydroModelLayers","mapState","_params$switchSubLaye","Boolean","isPointIntersectingMapExtent","areBoxesIntersecting","b1","b2","isHydroModelIntersectingMapExtent","hydroModel","hydroExtend","areaInfo","ModelBbox","CLEAR_PROFILE_STATE","CURRENT_PROFILE_VIEW","DISABLE_SETTING","ENABLE_SETTING","FETCHING_PROFILE_STARTED","FETCHING_PROFILE_SUCCESS","FETCHING_PROFILE_FAILURE","SET_COORDINATES","SET_MAX_DEPTH","SET_MAX_BOREHOLE_DISTANCE","SET_CROSSHAIR_DISTANCE","profileActions","clearState","currentView","viewType","disableSetting","setting","enableSetting","fetchingProfileStarted","fetchingProfileFailure","fetchingProfileSuccess","distance","setCoordinates","setCrosshairDistance","generalState","profileState","bottomBarWidth","bottomBarHeight","wsCrossSection","profile","ProfileView","ProfileSetting","profileStateInitial","fetchProfileStatus","fetchProfileError","selectedProfile","Empty","crosshairDistance","enabledSettings","SHOW_BOREHOLE_LABEL","SHOW_FILTER_LEVEL","SHOW_GEOLOGY_LABEL","SHOW_GEO_LOGO","SHOW_PROFILE_BUFFER","SHOW_WATER_LEVEL","SHOW_WATER_LEVEL_SYMBOL","co2LevelsOrgStyle","marginTop","container","CO2LevelsOrg","divRef","script","createElement","appendChild","getIntl","cache","createIntlCache","createIntl","locale","messages","messages_da","getDataThemeName","getLayerGroupName","getBarStyle","speed","transition","getBarTransitionStyle","entering","entered","exiting","exited","unmounted","numberToHex","hex","toUpperCase","rgbToHex","numberToDecimalString","decimalPlaces","toFixed","layerLegendStyle","borderTop","borderTopStyle","borderTopColor","borderBottom","borderBottomStyle","borderBottomColor","layerWithWikiDocument","minWidth","minHeight","selectedColor","selectedDescription","fontWeight","legendText","LayerLegend","useDispatch","tokenSelector","useSelector","state","allColorsInFocus","wikiDocumentsMeta","wikiState","setColorsInFocus","legendNameToWikiDocumentKey","legendName","toLowerCase","hasDocument","legendKey","some","colors","inFocus","layerPickerStyle","Grid","legend","item","xs","numberOfColumns","LongName","Color","style","getImageStyle","_props$imageLegend","_props$imageLegend2","_props$imageLegend4","_props$imageLegend6","_props$imageLegend3","_props$imageLegend5","_props$imageLegend7","defaultProps","profileInfoStyle","figure","paddingLeft","paddingRight","overflowX","strokeWidth","progress","borderLeftColor","borderLeftWidth","borderLeftStyle","crosshairContainer","pointerEvents","crosshairHorizontal","crosshairVertical","crosshairValueXCard","crosshairValueYCard","crosshairValueX","borderRadius","crosshairValueY","crosshairValue","margin","profileWrapper","triangleTop","borderRight","borderLeft","triangleRight","NearestBoreholes","MaxBoreholeNumber","MaxDistance","HideWhiteBorehole","setCoordinate","setDistance","setLimit","limit","fetchBoreHoles","Borehole","setBoreholeId","boreholeId","setBoreholeNo","boreholeNo","fetchBorehole","BoreholeLegend","fetchBoreholeLegend","AddressReverse","setCoords","coords","fetchReverseAddress","FETCHING_BOREHOLE_STARTED","FETCHING_BOREHOLE_SUCCESS","FETCHING_BOREHOLE_FAILURE","FETCHING_ADDRESS_STARTED","FETCHING_ADDRESS_SUCCESS","FETCHING_ADDRESS_FAILURE","FETCHING_IMAGE_STARTED","FETCHING_IMAGE_SUCCESS","FETCHING_IMAGE_FAILURE","FETCHING_LEGEND_STARTED","FETCHING_LEGEND_SUCCESS","FETCHING_LEGEND_FAILURE","CLEAR_STATE","boreholeInfoActions","fetchingBoreholeStarted","fetchingBoreholeFailure","fetchingBoreholeSuccess","fetchingAddressStarted","fetchingAddressFailure","fetchingAddressSuccess","address","fetchingImageStarted","fetchingImageFailure","fetchingImageSuccess","fetchingLegendStarted","fetchingLegendFailure","fetchingLegendSuccess","wsNearestBoreholes","boreholes","wsAddressReverse","addressInfo","wsBorehole","BoreholeNumber","wsBoreholeLegend","BoreholeId","X","Y","Espg","DistanceToBorehole","DatasourceId","InfoView","infoMenuStateInitial","VirtualBorehole","showCopyright","showHeader","arrayBufferToBase64","window","btoa","fetchVirtualBorehole","arrayBuffer","CLEAR_ADDRESS_STATE","CLEAR_IMAGE_STATE","virtualBoreholeInfoActions","clearAddressState","clearImageState","updateVirtualBorehole","_getState$generalStat","currentCoords","virtualBoreholeInfoState","wsVirtualBorehole","CURRENT_VIEW","infoMenuActions","boreholeInfo","BoreholeInfo","virtualBoreholeInfo","VirtualBoreholeInfo","ProfileInfo","_props$selectedProfil","_props$selectedProfil2","_crosshairValueXCardR","_crosshairValueXCardR2","_crosshairValueYCardR","_crosshairValueYCardR2","appClasses","minX","setMinX","maxX","setMaxX","minY","setMinY","maxY","setMaxY","crossX","setCrossX","crossY","setCrossY","showCrosshair","setShowCrosshair","pixelScaleX","setPixelScaleX","pixelScaleY","setPixelScaleY","valueX","setValueX","valueY","setValueY","crosshairContainerRef","crosshairValueXCardRef","crosshairValueYCardRef","enabledProfileSettings","selectedModel","fetched","Succeeded","Failed","running","Running","isProfileSettingEnabled","enabledSetting","applyProfileViewSettings","extractGraphBoundsFromSVG","extractPixelScalesFromSVG","boringer","getElementsByClassName","boring","addEventListener","getAttribute","test","rgbComponents","getComputedStyle","fill","labels","from","querySelectorAll","geologyLabels","filterLevels","waterLevels","waterLevelSymbols","symbol","getElementById","svg","axis","fistVirticalAxis","x1","y1","y2","parseInt","lastVirticalAxis","x2","gridValuesX","gridValuesY","axisGrid","axisTexts","gridValue","innerHTML","anchorPosition","calculatePixelScale","sortedKeys","k1","k2","sortedValues","v1","v2","abs","updatingProfile","setUpdatingProfile","startUpdateProfileInterval","clearTimeout","timeout","Svg","CircularProgress","FormattedMessage","onMouseMove","_crosshairContainerRe","rect","currentTarget","getBoundingClientRect","clientX","clientY","clientHeight","_crosshairContainerRe2","graphHeight","graphX","graphY","dangerouslySetInnerHTML","__html","clientWidth","bottomBarStyle","closeButtonIcon","Graph","GraphGroup","getGraphGroups","groups","getGraphGroupDescriptionForType","getGraphsGroupsByDataTheme","CO2Levels","graphs","useContainerDimensions","dimensions","setDimensions","handleResize","getDimensions","_ref$current","_ref$current2","offsetHeight","removeEventListener","BottomBar","selectedGraph","bottomBarDragging","bottomBarTransitionStyle","bottomBarTransitionStyles","closeBarClicked","Transition","in","Rnd","disableDragging","enableResizing","maxHeight","onResizeStart","onResize","direction","delta","onResizeStop","leftSideBarStyle","tools","tool","toolDisabled","toolSelected","toolSelectedMaterial","virtualBoreholeIcon","sliderSubLabelText","layerParametersStyle","discreteSlider","slider","marksSlider","stepValueText","sliderValueText","userSelect","sliderSubLabelTextWithWikiDocument","valueStepDownButton","discreteRadio","radioGroup","radioLabel","discreteSwitch","switchLabel","inputWrapper","valueWrapper","normal","arrowButtonIcon","fontStyle","LayerParameters","setOpacityEnabled","setOpacity","depthEnabled","setDepthEnabled","setDepth","levelEnabled","setLevelEnabled","setLevel","radioSublayersEnabled","setRadioSublayersEnabled","radioSublayers","setRadioSublayers","switchSublayersEnabled","setSwitchSublayersEnabled","switchSublayers","setSwitchSublayers","subLayersEnabled","setSubLayersEnabled","setSubLayers","setSubLayerDescriptors","hydroModelState","getParameters","opacitySliderMode","getHydroModelSubLayer","WMSLayerName1","MessuringPeriode","updateParameter","commit","subLayerDescriptor","getSubLayerDescriptor","handleSliderChange","handleInputChange","event","target","validInput","isInputValid","hydroModelSubLayers","hydroModelSubLayer","handleCloseButtonClick","closeHandler","Typography","gutterBottom","Slider","valueLabelDisplay","onChange","newValue","onChangeCommitted","Input","disableUnderline","inputProps","RadioGroup","handleRadioChange","selectedSubLayer","FormControlLabel","control","Radio","Switch","checked","handleSwitchChange","marks","selectPrevSubLayer","_descriptors$sort$fin","assign","ArrowBackIos","List","disablePadding","ListItemText","handleSubLayerLabelClicked","selectNextSubLayer","_descriptors$sort$fin2","ArrowForwardIos","confirmStyle","confirmButton","Confirm","handleCancel","DialogTitle","Button","variant","handleConfirm","graphsDescription","graphsButton","legendItems","legendList","button","checkbox","listItemIcon","listTitle","groupWithLayers","groupWithSelectedLayer","nested","nestedListSubheader","nestedListSubheaderIcon","float","collapseButton","triangle","borderRightStyle","borderRightColor","firstTriangle","secondTriangle","thirdTriangle","selectedLayerParams","selectedLayerParamsActive","LayerPicker","currentGraph","setCurrentGraph","React","showWarning","setShowWarning","enabledGraphGroups","currentDataTheme","selectedBoreholeInfo","selectedBorehole","selectedVirtualBorehole","virtualBoreholePng","graphGroups","layerTypes","layerGroups","themeGroupOrder","getLayerGroups","hasParameters","hasEnabledLayers","isBackgroundLayer","isLayerLegendEnabled","isLayerInfoVisible","isLayerSelected","layerView","INFO","isLayerOpacityVisible","OPACITY","isLayerSettingsVisible","SETTINGS","selectedLayerType","isGraphGroupSelected","selectedGraphGroup","isLayerGroupSelected","selectedLayerGroup","isOpacityEnabled","showGraphClicked","toggleLayerOpacity","toggleLayerParams","ListItem","selectGroup","ExpandLess","ExpandMore","Collapse","unmountOnExit","component","dense","enabledLayer","enabledLayerDescription","layerAction","tagAction","layerClicked","ListItemIcon","Checkbox","edge","tabIndex","disableRipple","ListItemSecondaryAction","Tooltip","enterDelay","placement","toggleLayerInfo","InfoOutlined","TuneOutlined","Opacity","graphGroupDescription","graphDescription","getGraphDescriptionForType","subheader","ListSubheader","Layers","handleReset","VerticalAlignCenterOutlined","ShowChart","LeftSideBarIconType","LeftSideBarIcon","createMuiTheme","disabled","icon","Profile","viewBox","xmlns","fillRule","clipRule","strokeMiterlimit","strokeLinecap","LeftSideBar","showLeftSideBar","selectedTool","sidebarStyle","sidebarTransitionStyles","sidebarWidth","toggleSideBarClicked","infoToolClicked","profileToolClicked","PROFILE","virtualBoreholeToolClicked","VIRTUAL_BOREHOLE","_3dViewClicked","_3D_VIEW","FontAwesomeIcon","faChevronCircleLeft","faChevronCircleRight","faMousePointer","faCubes","loginDialogStyle","errorContainer","errorText","actionsContainer","LoginDialog","isLoggedIn","loginInProgress","isError","isLoginError","setUsername","setPassword","submit","handleKeyPress","Box","TextField","required","placeholder","onKeyPress","autoFocus","openLayersMapStyle","border","bottomBarOpen","bottomBarClosed","leftSideBarOpen","leftSideBarClosed","rightSideBarOpen","rightSideBarWidth","rightSideBarClosed","northIcon","copyrightWrapper","copyrightItem","textDecoration","copyright","mousePositionWrapper","mousePosition","mousePositionCoordinateSystem","olMap","olMapMoveEndListener","olPointerMoveListener","olMapClickListener","profileToolLineSource","profileToolPointSource","profileToolLineBufferSource","profileToolLineLayer","profileToolPointLayer","profileToolLineBufferLayer","olDraw","olModify","olSnap","olSelect","lastZoomLevel","onLeftClick","OpenLayersMap","mapDiv","setMap","currentMouseCoordinates","setCurrentMouseCoordinates","layerCopyrightMap","setLayerCopyrightMap","profileCoordinates","modifiedLayer","currentInfoView","infoMenuState","currentBottomView","addLayers","copyrightMap","geoLayerPromises","layersToAdd","fetchedCapabilities","WMTSCapabilities","read","getLayerCapabilities","Contents","Identifier","getSubLayersFromCapabilities","addLayerByType","has","geoLayers","all","currentZoomLevel","getView","getZoom","addLayer","enableFeatureLayerInteraction","removeLayers","layersToRemove","getLayers","getArray","removeLayer","didRemoveLayer","delete","clearFeatureLayerInteractions","bufferOp","radius","jsts","require","geom","io","GeoJSONReader","writer","GeoJSONWriter","buffered","operation","BufferParameters","DEFAULT_QUADRANT_SEGMENTS","CAP_FLAT","write","getInteractions","interaction","Select","setActive","removeInteraction","clearProfileToolInteractions","Draw","Modify","Snap","clearSources","clear","getMapExtent","calculateExtent","getSize","pointStyleFunction","resolution","Fill","Circle","Text","font","offsetY","offsetX","xStyleFunction","hitTolerance","on","addInteraction","enableProfileTool","addFeature","lineStyle","setSource","line","lineString","GeoJSON","units","helpers","normalize","featureCollection","degrees","distanceToDegrees","fc","bufferFeature","readFeature","addFeatures","getGeometry","getCoordinates","Info","getFeatures","getControlsStyling","toEPSG3857","northArrowSpan","projectionName","proj4","defs","setProj4","olLayers","zoom","controls","Rotate","autoHide","Zoom","ScaleLine","un","listener","getCenter","clickedCoordinate","getCoordinateFromPixel","pixel","setCenter","setZoom","vectorMarkerName","crosshairPoint","calculateCrosshairPoint","crossDistance","startNode","endNode","accumulatedDistance","crosshairOffset","startEndNodeDistance","oldDistance","getDistance","toLonLat","scaleFactor","deltaX","deltaY","translate","olSourceMarkerPoint","olVectorMarkerPoint","layersToEnable","currentlyEnabledLayers","addTheseLayers","removeTheseLayers","onMouseLeave","i1","i2","rel","generalStateInitial","addressQuery","innerWidth","fetchAddressesStatus","fetchAddressesError","fetchGeoModelsStatus","fetchGeoModelsError","fetchMapLegendStatus","fetchMapLegendError","rightSideBarDragging","authStateInitial","REDIRECT","REDIRECT_DONE","redirectActions","redirectDone","payload","redirectStateInitial","boreholeInfoStateInitial","fetchBoreholeStatus","fetchBoreholeError","fetchAddressStatus","fetchAddressError","fetchImageStatus","fetchImageError","boreholeSvg","fetchLegendStatus","fetchLegendError","initialAddressState","initialImageState","virtualBoreholeInfoStateInitial","hydroModelStateInitial","fetchHydroModelsStatus","fetchHydroModelsError","migrations","_persist","version","rehydrated","rootPersistConfig","storage","blacklist","migrate","createMigrate","debug","authPersistConfig","rootReducer","combineReducers","action","persistReducer","redirectState","newOpenSectionsIds","tag","newContextTags","tagToBeRemoved","findIndex","persistedReducer","middlewares","thunk","store","createStore","applyMiddleware","persistor","persistStore","mainContentViewStyle","HeightMap","mapDimension","unitSize","roughness","el","startDisplacement","mapData","random","midpointDisplacment","plot","subPlot","topLeft","topRight","bottomLeft","bottomRight","displace","amount","gVertexBufferSize","VoxelAttributes","BrickClipState","VoxelBrickIndexCompare","depth_","VoxelBrickIndex","index_","VoxelBrick","x_","y_","isCulled_","isValid_","brickClippingState_","numberOfClipEdges_","cornerPosition_","vec3","animation_","vertexBuffer_","vertexCount_","alpha_","center_","updateAnimation","getIndex","getVertexBuffer","getClippingState","updateClippingState","clippingState","setClippingState","VoxelClipPlanes","clipXMin_","clipXMax_","clipZMin_","clipZMax_","VoxelModel","glContext","resourceCache","brickDimension","brickHeight","voxelSizeInMeter","voxelHeightInMeter","context_","resourceCache_","brickDim_","brickDimension_","brickHeight_","heightOffset_","heightScale_","voxelSizeInMeter_","voxelHeightInMeter_","voxelCopyBrick_","vertexBufferData_","voxelBricks_","voxelBrickIndices_","voxelData_","voxelDimension_","voxelUpdateQueue_","WQueue","totalVertexCount_","clipPlanes_","brickClipPolygonEdges_","brickClipPolygonNormal_","numberOfClipPolyEdges_","overlayTexture_","createVoxelBricks","createShaders","VoxelBrickMesher_","VoxelBrickMesher","voxelBrickTriangulator_","voxelBrickLod1_","setVoxelData","nx","ny","nz","setTransferTexture","voxelTransferTexture","voxelTransferTexture_","getVoxelDimension","getVoxelEmpty","z","setOverlayTexture","tex","gl","vertexT","wVertexType","VT_VertexColor4","voxelVertexDescriptor","WgVertexDescriptor","brickIndex","brickSortIndex","voxelBrick","WgVertexBuffer","createVertexBuffer","DYNAMIC_DRAW","vertexLayout_","getVertexSizeInBytes","findVoxelBrickIndex","updateVoxelBrickDepths","cameraViewMatrix","voxelBrickIndex","vec4","fromValues","camPos","transformMat4","shader_","WgShader","createShaderProgram","Pos","Normal","getVoxelColor","voxelAttrib","getHeightOffset","setHeightOffset","offset","getHeightScale","setHeightScale","scale","update","isUpdated","isEmpty","peekIndex","peek","updateBrick","resetAllVoxelBricks","pushBack","updateCulling","updateClipPlane","vb","vbMinx","vbMaxx","vbMinz","vbMaxz","clipState","updateClipPolygon","clipPolygon","getNumberOfPoints","p0","getPoint","n0","getNormal","brickCorners","vec2","allPointsInside","isPointInside","boxPolygonIntersection","render","cameraViewProjection","cameraView","cameraDir","lightValue","renderPickingMode","disable","CULL_FACE","cullFace","BACK","bindProgram","activeTexture_","TEXTURE1","setTextureUniform","setUniform1i","setUniform1f","setUniformMat4fv","modelWorld","setUniform3fv","brickID","drawArrays","wgRenderingPrimitives","TRIANGLES","unbind","unbindProgram","alpha","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","createTestHeightMaps","ghMap","shMap","whMap","chMap","rhMap","grassLevel_","sandLevel_","clayLevel_","waterLevel_","rockLevel_","gh","sh","wh","grassH","sandH","clayH","waterH","rockH","updateGlobalAo","vertexCount","vertexBufferData","grid","numOcc","vao","ao","xOffset","yOffset","hmIndex","setClipPolygon","setClipPolygonNormals","setNumberOfPolygonEdges","setVoxels","setOffsetAndScale","triangulate","updateVertexBufferData","ClipPolygon","polygon_","polygonNormals_","isClosed_","closePolygonRadius_","isClockwize_","isValid","isClosed","setClosePolygonRadius","getClosePolygonRadius","addPoint","WMath","vec2Sub","closePolygon","edgeNormal","vec2GetOrthogonalNegative","vec2Normalize","validateClipPolygon","isPointInsideClosingCircle","signedArea","calculateSignedArea","changeWinding","tmpPoly","tmpPolyNormals","copy","vec2Scale","p1","getWindingNumber","v0","v3","lineLineIntersection","pointInsideBox","boxVertices","findBoxPolygonIntersectionSegments","polyEdges","numPolyEdges","edgeIntersection","b0","linePolygonIntersection","VoxelTransferElement","colorHex","longName","sortOrder","colorHex_","tmp","WColor","hexToRgb","color_","RgbToVec4","id_","name_","longName_","VoxelTransferFunction","transferFunctionColors_","transferMasks_","voxelTransferElements_","voxelNames_","loadVoxelTransfer","fileName","voxelTransferJson_","initialize","getVoxelName","MapRoot","mapElm","voxElement","wTileTypes","W3DTile","resourcePath","parentRefineStrategy","parentTileIndex","resourcePath_","json_","content_","boundingVolumeJson_","boundingVolume","refineStrategy_","refine","uri","tileDataUrl_","tileType_","findTileType","geometricError_","geometricError","transform_","mat4","hasBoundingSphere_","hasBoundingObb_","createBoundingVolume","cacheIndex_","isLoaded_","isVisible_","parentIndex_","childInidices_","vertexData_","indexData_","getName","addChildIndex","childIndex","setGeometricError","getRefineStrategy","obb_","WOrientedBox","wVec3Basics","Z","boundSphere_","WSphere","dataUrl_","loadTileData","loadB3dmTile","gltf","load","Tiles3DLoader","mesh","meshes","positionData","colorData","normalData","batchData","vertexType","stride","primitives","attributes","POSITION","hasNormals","NORMAL","hasColors","COLOR_0","hasBatchIDs","_BATCHID","vertexType_","nodes","matrix","batchid","batchTableBinary","vertices","indices","W3DTileSet","tiles_","metaData_","gisInfo_","rootTransform_","extractUrlBase","load3DTileSet","rootTile","rootTransform","childIndices","tileNode","tileNodeIndex","addChildIndexToTile","loadChildTiles","parentTile","getTile","tileIndex","filterVisibleLeaves","camera","maxDistance","vp","getViewProjection","nodeIntersection","node","hitRecord","box","bbMin","bbMax","WBox","intersectsBox","distance_","getPosition","hitNodes","isec","Worker_fn","Worker","tilesetPath","buildingsTilesetPath","gFontTextureName","aarhus_overlay_image_url","buttonEvent_","toggleDrawClipPlaneEvent_","currentClipPlaneAxis_","ClipPlaneFrameId","PickingInfoFrameId","PickingNameStr_","PickingIdStr_","clipPlanePosXIndex","clipPlanePosZIndex","PerformPickingPass","buttonCallBack","AppMode","WgApp","canvas","getContext","preserveDrawingBuffer","glContext_","WgContext","frameCount_","lastFps_","WgResourceCache","appMode_","voxelLightValue_","cameraPosition_","orbitCamera_","WOrbitCamera","nearPlane_","setViewport","getCanvasWidth","getCanvasHeight","setOrbitPivotTarget","setPerspective","setUpvector","setZoomSpeed","setCameraPosition","cameraActiveCounter_","frustum_","WFrustum","updateFromViewProjection","updateFrustumPoints","lruCache_","WLruCache","visibleTiles_","tilesMaxDistance_","buildingsShader_","boreholeShader_","boreholeIdShader_","BatchId","showTileset_","fontRender_","primRender_","wuxiRender_","wuxi_","keyboard_handler_","WKeyboardEventHandler","mouseEventHander_","WMouseEventHandler","touchEventHandler_","WTouchEventHandler","image_loader_","WImageLoader","browerInfo_","browser","winner","slider_","maxSize","appInfo_","appName","appDeveloper","fps","visibleTilesBorehole","visibleTilesBuildings","domainSize_","domainOrigin_","geoTransform_","pickingRay_","clipLine_","currentAxisClipPlane_","clipPolygon_","boxIsecPoint_","scheduleRender_","tileset_","tileLoaderWorker_","onmessage","_ref","tile","tilesetIndex_","inCache","desc","STATIC_DRAW","BYTES_PER_ELEMENT","indexBuffer_","WgBuffer","createBuffer","ELEMENT_ARRAY_BUFFER","remove","insert","addResource","setOnElementRemoved","resourceKey","findResourceByName","deleteVertexBuffer","deleteBuffer","removeResource","readBackPixelX_","readBackPixelY_","voxelSelectionPoint_","getKeyboardEventHandler","keyDown","keyUp","getMouseEventHandler","onMouseDown","onMouseUp","onMouseClick","onMouseDoubleClick","preventDefault","onMouseWheel","getTouchEventHandler","onTouchStart","onTouchEnd","onTouchCancel","onTouchMove","onMouseRightClick","lastTimeStamp_","requestAnimationFrame","timestamp","loop","deltaTime","ts","loadImageResources","verdana_png","loadBmFont","voxelModel_","voxelTransferFunction_","loadVoxelData","voxelDefinition","WgTexture","create2D","RGBA16F","uploadDataToTexture","RGBA","FLOAT","loadTileset","createFbo","WgPrimRender","WgWuxiRender","createUi","createPrimitives","mode","resp","readBackFbo_","WgFbo","readBackTexture_","RGBA8","TEXTURE0","attachTexture","createDepthStencilBuffer","sphere_","cylinder1_","WCylinder","setCenterPosition","cylinder2_","cylinder3_","cylinder4_","cylinder5_","cylinder6_","clipPlaneDrawBox_","ellipsOrientation","mat3","fromRotation","wMathConst","fPI_HALF","WUxi","addButton","addTextLabel","textLayout_","addFrame","clipPlaneFrame","findUiElement","addWidget","setColor","setFrameBorder","addClipPlane","wClipPlaneAxis","X_POS_AXIS","Y_POS_AXIS","pickingFrame","setHidden","registerButtonClickCallback","createTextureFromImage","textureName","createMipMap","texture_res","create2dFromImage","UNSIGNED_BYTE","img","crossOrigin","verdana_json","fontInfo_","WTextLayout","fontTexture","WgFontRender","aarhus_nrrd","nrrdData","nrrd","triScale","spaceDirections","sizes","spaceOrigin","bb","updateWuxi","isLeftMouseDown","cameraHasFocus","updateUiElements","getRight","uiElements","getUiElements","updateHover","wuxiElementActive","R","U","getUp","uiElement","getIsHidden","updateState","resetHover","hover_","getIsActive","hasParent","updateFromParent","updateOrientation","updateAxisClipPlane","clipX","clipZ","setLabelText","setPosition","getClipPosition","hitinfo","getIntersection","validHit_","isecPos","evaluateRay","hitTimes_","isClicked","wMouseButtons","LeftButton","scaledClipPolygon","voxelDim","handleWuxiEvents","isDown","getPickingRay","getNormX","getNormY","clampF","visibleTiles","cachedTile","loadTile","isDoubleClicked","clientX_","clientY_","flush","updatePrimRender","voxelInfoFrame","frameBottom","vec3Sub","getCenterPosition","getHeight","toFrame","lineEnd","vec3Add","clearPrimitive","addLine","vec4FromVec3","wVec4Colors","White","LightGrey","addTexture2D","cp0","cp1","initialPoint","cirlceColor","Green","addCircleWireFrameXY","polyNormal","midPoint","normLen","norm","Yellow","Red","updateWuxiRender","clearElements","addUiElement","tilesetIndex","wtile","postMessage","renderPickingFbo","clearColor","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","getDir","pixels","readPixels","idLabel","voxelNameLabel","voxelName","setFrameCenterPosition","renderTile","shader","cache_","value_","mvp","fromScaling","multiply","transparency","blendEnabled","drawElements","numberOfElements_","UNSIGNED_INT","updateFps","DEPTH_TEST","renderedTiles","shaders","timeSinceLastFpsMeasure","performance","now","resize","canvas_","setReversedZPerspective","gl_","viewport","setBuildingsEnabled","setBoreholesEnabled","setShowOverlayTexture","setClipPolygonEnabled","setClipAxis","axisId","WgAppComponent","canvasRef","createRef","app","innerHeight","heightScale","boreholesEnabled","buildingsEnabled","mapEnabled","clipAxis","clipPolygonEnabled","mapView3dStyle","appBar","MapView3D","menuRef","geoModelId","setGeoModelId","setMapEnabled","AppBar","Toolbar","justify","InputLabel","shrink","MenuItem","_e","_val","MainContentView","rightSideBarStyle","boreholeInfoStyle","noBoreholes","boreholeFigureStyle","BoreholeFigure","boreholeLegendStyle","boreholeMetaStyle","fetchedBoreholeSources","boreholeSourceDict","DataList","getBoreholeSourceById","ws","fetchDataList","boreholeSource","Datalistid","BoreholeMeta","_props$selectedBoreho2","_props$selectedBoreho3","_props$selectedBoreho4","_props$selectedBoreho5","_props$postalAddress","dataSourceName","setDataSourceName","_props$selectedBoreho","ShortName","postalAddress","betegnelse","noBoreholesFound","virtualBoreholeInfoStyle","virtualBoreholeFigureStyle","VirtualBoreholeFigure","virtualBoreholeMetaStyle","VirtualBoreholeMeta","virtualBorehole","virtualBoreholeFound","RightSideBar","closeSideBarClicked","themePickerStyle","lineHeight","themeText","iceAgeImage","climateBorder","energyBorder","environmentBorder","nnfImage","ThemePicker","fullWidth","DialogContentText","handleThemeSelected","istid","klima","energi","miljo","modelPickerStyle","formControl","modelLabel","modelSelect","ModelPicker","FormControl","displayEmpty","geoModel","toolBarStyle","borderBottomWidth","breadcrumb","breadcrumbText","textOverflow","whiteSpace","homeIcon","breadcrumbSeparator","separatorBar","toolParamsWrapper","noToolSelected","toolBarSliderStyle","alignSelf","sliderContainer","ToolBarSlider","onChangeHandler","virtualBoreholeSettingsStyle","toolIcon","VirtualBoreholeSettings","virtualBoreholeMaxDepth","virtualBoreholeCoords","updatingVirtualBorehole","setUpdatingVirtualBorehole","startUpdateVirtualBoreholeInterval","refreshVirtualBorehole","profileSettingsStyle","viewLabel","viewButton","viewSettings","viewSettingsDescription","viewSettingsLabel","spacer","ProfileSettings","profileMaxDepth","profileMaxBoreholeDistance","anchorEl","setAnchorEl","refresh","generateProfileSettingSwitch","refreshProfile","Settings","Popover","anchorOrigin","vertical","horizontal","ToolBar","themePickerOpen","setThemePickerOpen","settingsAvailable","homeButtonClicked","HomeOutlined","ChevronRight","userInfoStyle","userIcon","UserInfo","AccountCircle","Menu","getContentAnchorEl","keepMounted","transformOrigin","Person","Divider","handleLogout","ExitToApp","topBarStyle","buttons","userInfo","searchField","themeImage","wikiButton","wikiIcon","searchFieldStyle","loading","textField","SearchField","setOpen","setOptions","updatingAddresses","setUpdatingAddresses","queryRef","fullAddress","_address$data","_address$data2","_address$data3","_address$data4","_address$data5","_address$data6","vejnavn","husnr","supplerendebynavn","postnr","postnrnavn","tekst","option","Autocomplete","onOpen","getOptionSelected","getOptionLabel","loadingText","handleChange","_value$address","_value$address$data","_value$address2","_value$address2$data","onInputChange","startUpdateAddressesInterval","noOptionsText","renderInput","InputProps","endAdornment","TopBar","faIcicles","faLeaf","faCloudSunRain","faBolt","toggleWikiSideBarClicked","WikiBrowser","HelpOutlineIcon","wikiSideBarStyle","wrapper","wikiBrowserStyle","backButton","backButtonIcon","backButtonPadding","divider","disabledListItem","documentItem","topMargin","searchButton","searchButtonIcon","sectionListItem","wikiSearchStyle","WikiSearchComponent","handleKeyDown","WikiBrowserComponent","fetchStatus","relevantMeta","setRelevantMeta","otherMeta","setOtherMeta","hasRelevantMeta","contextSectionOpen","setContextSectionOpen","allSectionOpen","setAllSectionOpen","searchSelected","setSearchSelected","searchText","setSearchText","showSearchResult","filteredMeta","relevant","localeCompare","tags","metaKey","enableBackNavigation","onBackPress","ArrowBackIosIcon","enableSearch","Search","handleSearchClose","showContent","NavigateNext","mr","faFolder","wikiDocumentStyle","headerTitle","wikiSectionStyle","contentListItem","WikiSectionComponent","WikiDocumentComponent","fakeRunning","setFakeRunning","sectionId","wikiCategoryStyle","WikiCategoryComponent","navigationIndex","WikiSideBar","animateIn","setAnimateIn","showSearchIcon","setShowSearchIcon","showCloseIcon","setShowCloseIcon","currentInfoMenuView","out","RedirectRoute","da","en","messages_en","App","handleExpiredGEOToken","checkGEOToken","nowMilli","Date","getTime","interval","setInterval","IntlProvider","ThemeProvider","AccessTokenLogin","accessToken","useParams","loginError","permaToken","AppWrapper","Provider","PersistGate","Routes","Route","element","reportWebVitals","onPerfEntry","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","StrictMode","BrowserRouter"],"mappings":"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","file":"static/js/main.283baf6e.chunk.js","sourcesContent":["/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\n/* eslint-disable */\r\nvar Module = (function () {\r\n var _scriptDir =\r\n typeof document !== \"undefined\" && document.currentScript\r\n ? document.currentScript.src\r\n : undefined;\r\n\r\n return function (Module) {\r\n Module = Module || {};\r\n\r\n var Module = typeof Module !== \"undefined\" ? Module : {};\r\n var readyPromiseResolve, readyPromiseReject;\r\n Module[\"ready\"] = new Promise(function (resolve, reject) {\r\n readyPromiseResolve = resolve;\r\n readyPromiseReject = reject;\r\n });\r\n var moduleOverrides = {};\r\n var key;\r\n for (key in Module) {\r\n if (Module.hasOwnProperty(key)) {\r\n moduleOverrides[key] = Module[key];\r\n }\r\n }\r\n var arguments_ = [];\r\n var thisProgram = \"./this.program\";\r\n var quit_ = function (status, toThrow) {\r\n throw toThrow;\r\n };\r\n var ENVIRONMENT_IS_WEB = true;\r\n var ENVIRONMENT_IS_WORKER = false;\r\n var scriptDirectory = \"\";\r\n\r\n function locateFile(path) {\r\n if (Module[\"locateFile\"]) {\r\n return Module[\"locateFile\"](path, scriptDirectory);\r\n }\r\n return scriptDirectory + path;\r\n }\r\n\r\n var read_, readAsync, readBinary, setWindowTitle;\r\n if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\r\n if (ENVIRONMENT_IS_WORKER) {\r\n scriptDirectory = self.location.href;\r\n } else if (typeof document !== \"undefined\" && document.currentScript) {\r\n scriptDirectory = document.currentScript.src;\r\n }\r\n if (_scriptDir) {\r\n scriptDirectory = _scriptDir;\r\n }\r\n if (scriptDirectory.indexOf(\"blob:\") !== 0) {\r\n scriptDirectory = scriptDirectory.substr(\r\n 0,\r\n scriptDirectory.lastIndexOf(\"/\") + 1\r\n );\r\n } else {\r\n scriptDirectory = \"\";\r\n }\r\n {\r\n read_ = function (url) {\r\n try {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", url, false);\r\n xhr.send(null);\r\n return xhr.responseText;\r\n } catch (err) {\r\n var data = tryParseAsDataURI(url);\r\n if (data) {\r\n return intArrayToString(data);\r\n }\r\n throw err;\r\n }\r\n };\r\n if (ENVIRONMENT_IS_WORKER) {\r\n readBinary = function (url) {\r\n try {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", url, false);\r\n xhr.responseType = \"arraybuffer\";\r\n xhr.send(null);\r\n return new Uint8Array(xhr.response);\r\n } catch (err) {\r\n var data = tryParseAsDataURI(url);\r\n if (data) {\r\n return data;\r\n }\r\n throw err;\r\n }\r\n };\r\n }\r\n readAsync = function (url, onload, onerror) {\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"GET\", url, true);\r\n xhr.responseType = \"arraybuffer\";\r\n xhr.onload = function () {\r\n if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {\r\n onload(xhr.response);\r\n return;\r\n }\r\n var data = tryParseAsDataURI(url);\r\n if (data) {\r\n onload(data.buffer);\r\n return;\r\n }\r\n onerror();\r\n };\r\n xhr.onerror = onerror;\r\n xhr.send(null);\r\n };\r\n }\r\n setWindowTitle = function (title) {\r\n document.title = title;\r\n };\r\n } else {\r\n }\r\n var out = Module[\"print\"] || console.log.bind(console);\r\n var err = Module[\"printErr\"] || console.warn.bind(console);\r\n for (key in moduleOverrides) {\r\n if (moduleOverrides.hasOwnProperty(key)) {\r\n Module[key] = moduleOverrides[key];\r\n }\r\n }\r\n moduleOverrides = null;\r\n if (Module[\"arguments\"]) {\r\n arguments_ = Module[\"arguments\"];\r\n }\r\n if (Module[\"thisProgram\"]) {\r\n thisProgram = Module[\"thisProgram\"];\r\n }\r\n if (Module[\"quit\"]) {\r\n quit_ = Module[\"quit\"];\r\n }\r\n var wasmBinary;\r\n if (Module[\"wasmBinary\"]) {\r\n wasmBinary = Module[\"wasmBinary\"];\r\n }\r\n var noExitRuntime = Module[\"noExitRuntime\"] || true;\r\n if (typeof WebAssembly !== \"object\") {\r\n abort(\"no native wasm support detected\");\r\n }\r\n var wasmMemory;\r\n var ABORT = false;\r\n var EXITSTATUS;\r\n\r\n function assert(condition, text) {\r\n if (!condition) {\r\n abort(\"Assertion failed: \" + text);\r\n }\r\n }\r\n\r\n var UTF8Decoder =\r\n typeof TextDecoder !== \"undefined\" ? new TextDecoder(\"utf8\") : undefined;\r\n\r\n function UTF8ArrayToString(heap, idx, maxBytesToRead) {\r\n var endIdx = idx + maxBytesToRead;\r\n var endPtr = idx;\r\n while (heap[endPtr] && !(endPtr >= endIdx)) {\r\n ++endPtr;\r\n }\r\n if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {\r\n return UTF8Decoder.decode(heap.subarray(idx, endPtr));\r\n } else {\r\n var str = \"\";\r\n while (idx < endPtr) {\r\n var u0 = heap[idx++];\r\n if (!(u0 & 128)) {\r\n str += String.fromCharCode(u0);\r\n continue;\r\n }\r\n var u1 = heap[idx++] & 63;\r\n if ((u0 & 224) == 192) {\r\n str += String.fromCharCode(((u0 & 31) << 6) | u1);\r\n continue;\r\n }\r\n var u2 = heap[idx++] & 63;\r\n if ((u0 & 240) == 224) {\r\n u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63);\r\n }\r\n if (u0 < 65536) {\r\n str += String.fromCharCode(u0);\r\n } else {\r\n var ch = u0 - 65536;\r\n str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\r\n }\r\n }\r\n }\r\n return str;\r\n }\r\n\r\n function UTF8ToString(ptr, maxBytesToRead) {\r\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : \"\";\r\n }\r\n\r\n function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {\r\n if (!(maxBytesToWrite > 0)) {\r\n return 0;\r\n }\r\n var startIdx = outIdx;\r\n var endIdx = outIdx + maxBytesToWrite - 1;\r\n for (var i = 0; i < str.length; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 55296 && u <= 57343) {\r\n var u1 = str.charCodeAt(++i);\r\n u = (65536 + ((u & 1023) << 10)) | (u1 & 1023);\r\n }\r\n if (u <= 127) {\r\n if (outIdx >= endIdx) {\r\n break;\r\n }\r\n heap[outIdx++] = u;\r\n } else if (u <= 2047) {\r\n if (outIdx + 1 >= endIdx) {\r\n break;\r\n }\r\n heap[outIdx++] = 192 | (u >> 6);\r\n heap[outIdx++] = 128 | (u & 63);\r\n } else if (u <= 65535) {\r\n if (outIdx + 2 >= endIdx) {\r\n break;\r\n }\r\n heap[outIdx++] = 224 | (u >> 12);\r\n heap[outIdx++] = 128 | ((u >> 6) & 63);\r\n heap[outIdx++] = 128 | (u & 63);\r\n } else {\r\n if (outIdx + 3 >= endIdx) {\r\n break;\r\n }\r\n heap[outIdx++] = 240 | (u >> 18);\r\n heap[outIdx++] = 128 | ((u >> 12) & 63);\r\n heap[outIdx++] = 128 | ((u >> 6) & 63);\r\n heap[outIdx++] = 128 | (u & 63);\r\n }\r\n }\r\n heap[outIdx] = 0;\r\n return outIdx - startIdx;\r\n }\r\n\r\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\r\n return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\r\n }\r\n\r\n function lengthBytesUTF8(str) {\r\n var len = 0;\r\n for (var i = 0; i < str.length; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 55296 && u <= 57343) {\r\n u = (65536 + ((u & 1023) << 10)) | (str.charCodeAt(++i) & 1023);\r\n }\r\n if (u <= 127) {\r\n ++len;\r\n } else {\r\n if (u <= 2047) {\r\n len += 2;\r\n } else {\r\n if (u <= 65535) {\r\n len += 3;\r\n } else {\r\n len += 4;\r\n }\r\n }\r\n }\r\n }\r\n return len;\r\n }\r\n\r\n var UTF16Decoder =\r\n typeof TextDecoder !== \"undefined\"\r\n ? new TextDecoder(\"utf-16le\")\r\n : undefined;\r\n\r\n function UTF16ToString(ptr, maxBytesToRead) {\r\n var endPtr = ptr;\r\n var idx = endPtr >> 1;\r\n var maxIdx = idx + maxBytesToRead / 2;\r\n while (!(idx >= maxIdx) && HEAPU16[idx]) {\r\n ++idx;\r\n }\r\n endPtr = idx << 1;\r\n if (endPtr - ptr > 32 && UTF16Decoder) {\r\n return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));\r\n } else {\r\n var str = \"\";\r\n for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {\r\n var codeUnit = HEAP16[(ptr + i * 2) >> 1];\r\n if (codeUnit == 0) {\r\n break;\r\n }\r\n str += String.fromCharCode(codeUnit);\r\n }\r\n return str;\r\n }\r\n }\r\n\r\n function stringToUTF16(str, outPtr, maxBytesToWrite) {\r\n if (maxBytesToWrite === undefined) {\r\n maxBytesToWrite = 2147483647;\r\n }\r\n if (maxBytesToWrite < 2) {\r\n return 0;\r\n }\r\n maxBytesToWrite -= 2;\r\n var startPtr = outPtr;\r\n var numCharsToWrite =\r\n maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;\r\n for (var i = 0; i < numCharsToWrite; ++i) {\r\n var codeUnit = str.charCodeAt(i);\r\n HEAP16[outPtr >> 1] = codeUnit;\r\n outPtr += 2;\r\n }\r\n HEAP16[outPtr >> 1] = 0;\r\n return outPtr - startPtr;\r\n }\r\n\r\n function lengthBytesUTF16(str) {\r\n return str.length * 2;\r\n }\r\n\r\n function UTF32ToString(ptr, maxBytesToRead) {\r\n var i = 0;\r\n var str = \"\";\r\n while (!(i >= maxBytesToRead / 4)) {\r\n var utf32 = HEAP32[(ptr + i * 4) >> 2];\r\n if (utf32 == 0) {\r\n break;\r\n }\r\n ++i;\r\n if (utf32 >= 65536) {\r\n var ch = utf32 - 65536;\r\n str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\r\n } else {\r\n str += String.fromCharCode(utf32);\r\n }\r\n }\r\n return str;\r\n }\r\n\r\n function stringToUTF32(str, outPtr, maxBytesToWrite) {\r\n if (maxBytesToWrite === undefined) {\r\n maxBytesToWrite = 2147483647;\r\n }\r\n if (maxBytesToWrite < 4) {\r\n return 0;\r\n }\r\n var startPtr = outPtr;\r\n var endPtr = startPtr + maxBytesToWrite - 4;\r\n for (var i = 0; i < str.length; ++i) {\r\n var codeUnit = str.charCodeAt(i);\r\n if (codeUnit >= 55296 && codeUnit <= 57343) {\r\n var trailSurrogate = str.charCodeAt(++i);\r\n codeUnit =\r\n (65536 + ((codeUnit & 1023) << 10)) | (trailSurrogate & 1023);\r\n }\r\n HEAP32[outPtr >> 2] = codeUnit;\r\n outPtr += 4;\r\n if (outPtr + 4 > endPtr) {\r\n break;\r\n }\r\n }\r\n HEAP32[outPtr >> 2] = 0;\r\n return outPtr - startPtr;\r\n }\r\n\r\n function lengthBytesUTF32(str) {\r\n var len = 0;\r\n for (var i = 0; i < str.length; ++i) {\r\n var codeUnit = str.charCodeAt(i);\r\n if (codeUnit >= 55296 && codeUnit <= 57343) {\r\n ++i;\r\n }\r\n len += 4;\r\n }\r\n return len;\r\n }\r\n\r\n function alignUp(x, multiple) {\r\n if (x % multiple > 0) {\r\n x += multiple - (x % multiple);\r\n }\r\n return x;\r\n }\r\n\r\n var buffer,\r\n HEAP8,\r\n HEAPU8,\r\n HEAP16,\r\n HEAPU16,\r\n HEAP32,\r\n HEAPU32,\r\n HEAPF32,\r\n HEAPF64;\r\n\r\n function updateGlobalBufferAndViews(buf) {\r\n buffer = buf;\r\n Module[\"HEAP8\"] = HEAP8 = new Int8Array(buf);\r\n Module[\"HEAP16\"] = HEAP16 = new Int16Array(buf);\r\n Module[\"HEAP32\"] = HEAP32 = new Int32Array(buf);\r\n Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(buf);\r\n Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(buf);\r\n Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(buf);\r\n Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(buf);\r\n Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(buf);\r\n }\r\n\r\n var INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 16777216;\r\n var wasmTable;\r\n var __ATPRERUN__ = [];\r\n var __ATINIT__ = [];\r\n var __ATPOSTRUN__ = [];\r\n var runtimeInitialized = false;\r\n\r\n function preRun() {\r\n if (Module[\"preRun\"]) {\r\n if (typeof Module[\"preRun\"] == \"function\") {\r\n Module[\"preRun\"] = [Module[\"preRun\"]];\r\n }\r\n while (Module[\"preRun\"].length) {\r\n addOnPreRun(Module[\"preRun\"].shift());\r\n }\r\n }\r\n callRuntimeCallbacks(__ATPRERUN__);\r\n }\r\n\r\n function initRuntime() {\r\n runtimeInitialized = true;\r\n callRuntimeCallbacks(__ATINIT__);\r\n }\r\n\r\n function postRun() {\r\n if (Module[\"postRun\"]) {\r\n if (typeof Module[\"postRun\"] == \"function\") {\r\n Module[\"postRun\"] = [Module[\"postRun\"]];\r\n }\r\n while (Module[\"postRun\"].length) {\r\n addOnPostRun(Module[\"postRun\"].shift());\r\n }\r\n }\r\n callRuntimeCallbacks(__ATPOSTRUN__);\r\n }\r\n\r\n function addOnPreRun(cb) {\r\n __ATPRERUN__.unshift(cb);\r\n }\r\n\r\n function addOnInit(cb) {\r\n __ATINIT__.unshift(cb);\r\n }\r\n\r\n function addOnPostRun(cb) {\r\n __ATPOSTRUN__.unshift(cb);\r\n }\r\n\r\n var runDependencies = 0;\r\n var runDependencyWatcher = null;\r\n var dependenciesFulfilled = null;\r\n\r\n function addRunDependency(id) {\r\n runDependencies++;\r\n if (Module[\"monitorRunDependencies\"]) {\r\n Module[\"monitorRunDependencies\"](runDependencies);\r\n }\r\n }\r\n\r\n function removeRunDependency(id) {\r\n runDependencies--;\r\n if (Module[\"monitorRunDependencies\"]) {\r\n Module[\"monitorRunDependencies\"](runDependencies);\r\n }\r\n if (runDependencies == 0) {\r\n if (runDependencyWatcher !== null) {\r\n clearInterval(runDependencyWatcher);\r\n runDependencyWatcher = null;\r\n }\r\n if (dependenciesFulfilled) {\r\n var callback = dependenciesFulfilled;\r\n dependenciesFulfilled = null;\r\n callback();\r\n }\r\n }\r\n }\r\n\r\n Module[\"preloadedImages\"] = {};\r\n Module[\"preloadedAudios\"] = {};\r\n\r\n function abort(what) {\r\n {\r\n if (Module[\"onAbort\"]) {\r\n Module[\"onAbort\"](what);\r\n }\r\n }\r\n what += \"\";\r\n err(what);\r\n ABORT = true;\r\n EXITSTATUS = 1;\r\n what = \"abort(\" + what + \"). Build with -s ASSERTIONS=1 for more info.\";\r\n var e = new WebAssembly.RuntimeError(what);\r\n readyPromiseReject(e);\r\n throw e;\r\n }\r\n\r\n var dataURIPrefix = \"data:application/octet-stream;base64,\";\r\n\r\n function isDataURI(filename) {\r\n return filename.startsWith(dataURIPrefix);\r\n }\r\n\r\n var wasmBinaryFile;\r\n wasmBinaryFile =\r\n \"data:application/octet-stream;base64,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KAIkQQFqNgIkCws2AQJ/IABBlB42AgACfyAAKAIEQQxrIgIiASABKAIIQQFrIgE2AgggAUF/TAsEQCACEBQLIAALCABB3gkQGwAL3xgCCn8DfSMAQRBrIgIkAANAIAFBBGshCiABQRBrIQcDQAJAAkACQAJAAkACQCABIABrIgRBBHUiAw4GBQUAAQIDBAsgAUEEayoCACAAKgIMXUUNBCACIABBCGopAgA3AwggAiAAKQIANwMAIAAgAUEQayIBIgRBCGopAgA3AgggACABKQIANwIAIAQgAikDCDcCCCABIAIpAwA3AgAMBAsgAUEQayEDIABBEGohBCABQQRrIgEqAgAhDCAAKgIcIg0gACoCDF1FBEAgDCANXUUNBCACIAQpAgg3AwggAiAEKQIANwMAIAQgAykCCDcCCCAEIAMpAgA3AgAgAyACKQMINwIIIAMgAikDADcCACAAKgIcIAAqAgxdRQ0EIAIgAEEIaikCADcDCCACIAApAgA3AwAgACAEKQIINwIIIAAgBCkCADcCACAEIAIpAwg3AgggBCACKQMANwIADAQLIAwgDV0EQCACIABBCGopAgA3AwggAiAAKQIANwMAIAAgAykCCDcCCCAAIAMpAgA3AgAgAyACKQMINwIIIAMgAikDADcCAAwECyACIABBCGopAgA3AwggAiAAKQIANwMAIAAgBCkCCDcCCCAAIAQpAgA3AgAgBCACKQMINwIIIAQgAikDADcCACABKgIAIAAqAhxdRQ0DIAIgBCkCCDcDCCACIAQpAgA3AwAgBCADKQIINwIIIAQgAykCADcCACADIAIpAwg3AgggAyACKQMANwIADAMLIAAgAEEQaiAAQSBqIAFBEGsQIBoMAgsgACAAQRBqIgQgAEEgaiIDIABBMGoiBhAgGiABQQRrKgIAIABBPGoqAgBdRQ0BIAIgBikCCDcDCCACIAYpAgA3AwAgBiABQRBrIgEiBUEIaikCADcCCCAGIAEpAgA3AgAgBSACKQMINwIIIAEgAikDADcCACAAKgI8IABBLGoqAgBdRQ0BIAIgAykCCDcDCCACIAMpAgA3AwAgAyAGKQIINwIIIAMgBikCADcCACAGIAIpAwg3AgggBiACKQMANwIAIAAqAiwgAEEcaioCAF1FDQEgAiAEKQIINwMIIAIgBCkCADcDACAEIAMpAgg3AgggBCADKQIANwIAIAMgAikDCDcCCCADIAIpAwA3AgAgACoCHCAAKgIMXUUNASACIABBCGopAgA3AwggAiAAKQIANwMAIAAgBCkCCDcCCCAAIAQpAgA3AgAgBCACKQMINwIIIAQgAikDADcCAAwBCyAEQe8DTARAIABBEGohBCAAQSBqIQMgACoCLCEMAkAgACoCHCINIAAqAgwiDl1FBEAgDCANXUUNASACIAQpAgg3AwggAiAEKQIANwMAIAQgA0EIaikCADcCCCAEIAMpAgA3AgAgAyACKQMINwIIIAMgAikDADcCACAAKgIcIA5dRQ0BIAIgAEEIaikCADcDCCACIAApAgA3AwAgACAEKQIINwIIIAAgBCkCADcCACAEIAIpAwg3AgggBCACKQMANwIADAELIAwgDV0EQCACIABBCGopAgA3AwggAiAAKQIANwMAIAAgA0EIaikCADcCCCAAIAMpAgA3AgAgAyACKQMINwIIIAMgAikDADcCAAwBCyACIABBCGopAgA3AwggAiAAKQIANwMAIAAgBCkCCDcCCCAAIAQpAgA3AgAgBCACKQMINwIIIAQgAikDADcCACAMIAAqAhxdRQ0AIAIgBCkCCDcDCCACIAQpAgA3AwAgBCADQQhqKQIANwIIIAQgAykCADcCACADIAIpAwg3AgggAyACKQMANwIACyAAQTBqIgQgAUYNAQNAIAQiBioCDCIMIAMqAgxdBEAgAiAGKAIINgIIIAIgBikCADcDACAGIQUDQAJAIAUgAyIEKQIANwIAIAUgAykCCDcCCCAAIANGBEAgACEEDAELIARBEGshAyAEIQUgDCAEQQRrKgIAXQ0BCwsgBCACKQMANwIAIAQgAigCCDYCCCAEIAw4AgwLIAEgBiIDQRBqIgRHDQALDAELIAAgA0ECbUEEdCIGaiEFAkAgBEHx/ABOBEAgACAAIANBBG1BBHQiA2oiBCAFIAMgBWoiAxAgIQggCioCACADKgIMXUUNASACIAMpAgg3AwggAiADKQIANwMAIAMgBykCCDcCCCADIAcpAgA3AgAgByACKQMINwIIIAcgAikDADcCACADKgIMIAAgBmoiCUEMaioCAF1FBEAgCEEBaiEIDAILIAIgBUEIaikCADcDCCACIAUpAgA3AwAgBSADKQIINwIIIAUgAykCADcCACADIAIpAwg3AgggAyACKQMANwIAIAkqAgwgBCoCDF1FBEAgCEECaiEIDAILIAIgBCkCCDcDCCACIAQpAgA3AwAgBCAFKQIINwIIIAQgBSkCADcCACAFIAIpAwg3AgggBSACKQMANwIAIAQqAgwgACoCDF1FBEAgCEEDaiEIDAILIAIgAEEIaikCADcDCCACIAApAgA3AwAgACAEKQIINwIIIAAgBCkCADcCACAEIAIpAwg3AgggBCACKQMANwIAIAhBBGohCAwBCyAKKgIAIQwCQCAAIAZqIgRBDGoqAgAiDSAAQQxqKgIAXUUEQEEAIQggDCANXUUNAiACIAVBCGopAgA3AwggAiAFKQIANwMAIAUgBykCCDcCCCAFIAcpAgA3AgAgByACKQMINwIIIAcgAikDADcCAEEBIQggBCoCDCAAKgIMXUUNAiACIABBCGopAgA3AwggAiAAKQIANwMAIAAgBSkCCDcCCCAAIAUpAgA3AgAgBSACKQMINwIIIAUgAikDADcCAAwBCyAMIA1dBEAgAiAAQQhqKQIANwMIIAIgACkCADcDACAAIAcpAgg3AgggACAHKQIANwIAIAcgAikDCDcCCCAHIAIpAwA3AgBBASEIDAILIAIgAEEIaikCADcDCCACIAApAgA3AwAgACAFQQhqKQIANwIIIAAgBSkCADcCACAFIAIpAwg3AgggBSACKQMANwIAQQEhCCAKKgIAIAQqAgxdRQ0BIAIgBSkCCDcDCCACIAUpAgA3AwAgBSAHKQIINwIIIAUgBykCADcCACAHIAIpAwg3AgggByACKQMANwIAC0ECIQgLIAchBAJ/AkACQCAAQQxqKgIAIgwgACAGaioCDCINXQRAIAchBgwBCwNAIARBEGsiBiAARgRAIABBEGohAyAMIAoqAgBdDQMgAyAHRg0FA0AgAyoCDCAMXgRAIAIgA0EIaikCADcDCCACIAMpAgA3AwAgAyAHKQIINwIIIAMgBykCADcCACAHIAIpAwg3AgggByACKQMANwIAIANBEGohAwwFCyAHIANBEGoiA0cNAAsMBQsgBEEEayEDIAYhBCADKgIAIA1dRQ0ACyACIABBCGopAgA3AwggAiAAKQIANwMAIAAgBkEIaikCADcCCCAAIAYpAgA3AgAgBiACKQMINwIIIAYgAikDADcCACAIQQFqIQgLIAYgAEEQ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IAAgATYCBAwBCyAAIAE6AAsLIAZBADoADyACIANqIAYtAA86AAAMAQsjAEEQayIDJAACQCABIAVqIAJrIgQgAkF/c0ERa00EQAJ/IAAtAAtBB3YEQCAAKAIADAELIAALIQcCfyACQef///8HSQRAIAMgAkEBdDYCCCADIAIgBGo2AgwCfyMAQRBrIgQkACADQQxqIgooAgAgA0EIaiIMKAIASSENIARBEGokACAMIAogDRsoAgAiBEELTwsEfyAEQRBqQXBxIgQgBEEBayIEIARBC0YbBUEKCwwBC0FuC0EBaiIKEBYhBCABBEAgBCAHIAEQHwsgBQRAIAEgBGogCCAFEB8LQQAiCARAIAEgBGogBWogASAHaiAIEB8LIAJBCkcEQCAHEBQLIAAgBDYCACAAIApBgICAgHhyNgIIIAAgASAFaiAIaiIANgIEIANBADoAByAAIARqIAMtAAc6AAAgA0EQaiQADAELECsACwsgBkEQaiQAIAtBEGokAAJ/IAktAAtBB3YEQCAJKAIADAELQQALGhADAAsgCUEQaiQAIAMsAAtBf0wEQCADKAIAEBQLQdglQoCAgPyLgIDAPzcCAEHgJUKAgICAgICAwD83AgAgA0EQaiQAQeglQRERAQAaCxwAIAAgAUEIIAKnIAJCIIinIAOnIANCIIinEA4LSwEBfwJAIAFFDQAgAUGsIRAYIgFFDQAgASgCCCAAKAIIQX9zcQ0AIAAoAgwgASgCDEEAEBdFDQAgACgCECABKAIQQQAQFyECCyACC1IBAX8gACgCBCEEIAAoAgAiACABAn9BACACRQ0AGiAEQQh1IgEgBEEBcUUNABogASACKAIAaigCAAsgAmogA0ECIARBAnEbIAAoAgAoAhwRBgALBAAgAAsnAQF/IwBBEGsiASQAIAEgADYCDEHgHEEFIAEoAgwQACABQRBqJAALJwEBfyMAQRBrIgEkACABIAA2AgxBuBxBBCABKAIMEAAgAUEQaiQACycBAX8jAEEQayIBJAAgASAANgIMQZAcQQMgASgCDBAAIAFBEGokAAsnAQF/IwBBEGsiASQAIAEgADYCDEHoG0ECIAEoAgwQACABQRBqJAALJwEBfyMAQRBrIgEkACABIAA2AgxBwBtBASABKAIMEAAgAUEQaiQACycBAX8jAEEQayIBJAAgASAANgIMQZgbQQAgASgCDBAAIAFBEGokAAvpBgEBf0GMIkH+ChAIQaQiQaMJQQFBAUEAEAcjAEEQayIAJAAgAEHzCDYCDEGwIiAAKAIMQQFBgH9B/wAQASAAQRBqJAAjAEEQayIAJAAgAEHsCDYCDEHIIiAAKAIMQQFBgH9B/wAQASAAQRBqJAAjAEEQayIAJAAgAEHqCDYCDEG8IiAAKAIMQQFBAEH/ARABIABBEGokACMAQRBrIgAkACAAQYkINgIMQdQiIAAoAgxBAkGAgH5B//8BEAEgAEEQaiQAIwBBEGsiACQAIABBgAg2AgxB4CIgACgCDEECQQBB//8DEAEgAEEQaiQAIwBBEGsiACQAIABBmAg2AgxB7CIgACgCDEEEQYCAgIB4Qf////8HEAEgAEEQaiQAIwBBEGsiACQAIABBjwg2AgxB+CIgACgCDEEEQQBBfxABIABBEGokACMAQRBrIgAkACAAQcwJNgIMQYQjIAAoAgxBBEGAgICAeEH/////BxABIABBEGokACMAQRBrIgAkACAAQcMJNgIMQZAjIAAoAgxBBEEAQX8QASAAQRBqJAAjAEEQayIAJAAgAEGjCDYCDEGcIyAAKAIMQoCAgICAgICAgH9C////////////ABAvIABBEGokACMAQRBrIgAkACAAQaIINgIMQagjIAAoAgxCAEJ/EC8gAEEQaiQAIwBBEGsiACQAIABBnAg2AgxBtCMgACgCDEEEEAUgAEEQaiQAIwBBEGsiACQAIABB5Qo2AgxBwCMgACgCDEEIEAUgAEEQaiQAQcASQesJEAZBqBhBuA4QBkGAGUEEQdEJEARB3BlBAkH3CRAEQbgaQQRBhgoQBEG4EUGoCRARIwBBEGsiACQAIABB8w02AgxB8BpBACAAKAIMEAAgAEEQaiQAQdkOEDhBkQ4QN0GDCxA2QaILEDVBygsQNEHnCxAzIwBBEGsiACQAIABB/g42AgxBiB1BBCAAKAIMEAAgAEEQaiQAIwBBEGsiACQAIABBnA82AgxBsB1BBSAAKAIMEAAgAEEQaiQAQc0MEDhBrAwQN0GPDRA2Qe0MEDVB0g0QNEGwDRAzIwBBEGsiACQAIABBjQw2AgxBoBBBBiAAKAIMEAAgAEEQaiQAIwBBEGsiACQAIABBww82AgxB2B1BByAAKAIMEAAgAEEQaiQAC9ULAgZ/A30jAEEQayICJABBASEGAkACQAJAAkACQAJAIAEgAGtBBHUOBgUFAAECAwQLIAFBBGsqAgAgACoCDF1FDQQgAiAAKQIINwMIIAIgACkCADcDACAAIAFBEGsiASIDQQhqKQIANwIIIAAgASkCADcCACADIAIpAwg3AgggASACKQMANwIADAQLIAFBEGshBCAAQRBqIQMgAUEEayIBKgIAIQggACoCHCIJIAAqAgxdRQRAIAggCV1FDQQgAiADKQIINwMIIAIgAykCADcDACADIAQpAgg3AgggAyAEKQIANwIAIAQgAikDCDcCCCAEIAIpAwA3AgAgACoCHCAAKgIMXUUNBCACIAApAgg3AwggAiAAKQIANwMAIAAgAykCCDcCCCAAIAMpAgA3AgAgAyACKQMINwIIIAMgAikDADcCAAwECyAIIAldBEAgAiAAKQIINwMIIAIgACkCADcDACAAIAQpAgg3AgggACAEKQIANwIAIAQgAikDCDcCCCAEIAIpAwA3AgAMBAsgAiAAKQIINwMIIAIgACkCADcDACAAIAMpAgg3AgggACADKQIANwIAIAMgAikDCDcCCCADIAIpAwA3AgAgASoCACAAKgIcXUUNAyACIAMpAgg3AwggAiADKQIANwMAIAMgBCkCCDcCCCADIAQpAgA3AgAgBCACKQMINwIIIAQgAikDADcCAAwDCyAAIABBEGogAEEgaiABQRBrECAaDAILIAAgAEEQaiIDIABBIGoiBCAAQTBqIgUQIBogAUEEayoCACAAKgI8XUUNASACIAUpAgg3AwggAiAFKQIANwMAIAUgAUEQayIBIgdBCGopAgA3AgggBSABKQIANwIAIAcgAikDCDcCCCABIAIpAwA3AgAgACoCPCAAKgIsXUUNASACIAQpAgg3AwggAiAEKQIANwMAIAQgBSkCCDcCCCAEIAUpAgA3AgAgBSACKQMINwIIIAUgAikDADcCACAAKgIsIAAqAhxdRQ0BIAIgAykCCDcDCCACIAMpAgA3AwAgAyAEKQIINwIIIAMgBCkCADcCACAEIAIpAwg3AgggBCACKQMANwIAIAAqAhwgACoCDF1FDQEgAiAAKQIINwMIIAIgACkCADcDACAAIAMpAgg3AgggACADKQIANwIAIAMgAikDCDcCCCADIAIpAwA3AgAMAQsgAEEQaiEDIABBIGohBSAAKgIsIQgCQCAAKgIcIgkgACoCDCIKXUUEQCAIIAldRQ0BIAIgAykCCDcDCCACIAMpAgA3AwAgAyAFQQhqKQIANwIIIAMgBSkCADcCACAFIAIpAwg3AgggBSACKQMANwIAIAAqAhwgCl1FDQEgAiAAKQIINwMIIAIgACkCADcDACAAIAMpAgg3AgggACADKQIANwIAIAMgAikDCDcCCCADIAIpAwA3AgAMAQsgCCAJXQRAIAIgACkCCDcDCCACIAApAgA3AwAgACAFQQhqKQIANwIIIAAgBSkCADcCACAFIAIpAwg3AgggBSACKQMANwIADAELIAIgACkCCDcDCCACIAApAgA3AwAgACADKQIINwIIIAAgAykCADcCACADIAIpAwg3AgggAyACKQMANwIAIAggACoCHF1FDQAgAiADKQIINwMIIAIgAykCADcDACADIAVBCGopAgA3AgggAyAFKQIANwIAIAUgAikDCDcCCCAFIAIpAwA3AgALIABBMGoiAyABRg0AAkADQCADIgQqAgwiCCAFKgIMXQRAIAIgBCgCCDYCCCACIAQpAgA3AwAgBCEGA0ACQCAGIAUiAykCADcCACAGIAMpAgg3AgggACADRgRAIAAhAwwBCyADQRBrIQUgAyEGIAggA0EEayoCAF0NAQsLIAMgAikDADcCACADIAIoAgg2AgggAyAIOAIMIAdBAWoiB0EIRg0CCyAEIgVBEGoiAyABRw0AC0EBIQYMAQsgBEEQaiABRiEGCyACQRBqJAAgBgswAQF/IAAoAgwgASgCACABIAEtAAsiAEEYdEEYdUEASCICGyABKAIEIAAgAhsQFRoLywEBBH8jAEEQayIDJAAgASAAKAIEIgVBAXVqIQYgACgCACEEIAVBAXEEQCAGKAIAIARqKAIAIQQLIAIoAgAiAEFwSQRAAkACQCAAQQtPBEAgAEEQakFwcSIFEBYhASADIAVBgICAgHhyNgIIIAMgATYCACADIAA2AgQMAQsgAyAAOgALIAMhASAARQ0BCyABIAJBBGogABAVGgsgACABakEAOgAAIAYgAyAEEQIAIAMsAAtBf0wEQCADKAIAEBQLIANBEGokAA8LECsACzABAX8gACgCACABKAIAIAEgAS0ACyIAQRh0QRh1QQBIIgIbIAEoAgQgACACGxAVGgsaACAAIAEoAggg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BCIFIAooAggiAUkEQCAFIDA4AgwgBSAjOAIIIAUgIjgCBCAFICE4AgAgCiAFQRBqIgE2AgQMAQsgBSAKKAIAIglrIgxBBHUiAkEBaiIDQYCAgIABTw0IIAMgASAJayIFQQN1IgEgASADSRtB/////wAgBUEEdUH///8/SRsiAUGAgICAAU8NCSABQQR0IgUQFiIDIAJBBHRqIgEgMDgCDCABICM4AgggASAiOAIEIAEgITgCACABQRBqIQEgDEEBTgRAIAMgCSAMEBUaCyAKIAMgBWo2AgggCiABNgIEIAogAzYCACAJRQ0AIAkQFCAKKAIEIQELAkAgCigCCCIFIAFLBEAgAUGAgID8ezYCDCABIC04AgggASAnOAIEIAEgKzgCACAKIAFBEGoiATYCBAwBCyABIAooAgAiCWsiDEEEdSICQQFqIgNBgICAgAFPDQggAyAFIAlrIgVBA3UiASABIANJG0H/////ACAFQQR1Qf///z9JGyIBQYCAgIABTw0JIAFBBHQiBRAWIgMgAkEEdGoiAUGAgID8ezYCDCABIC04AgggASAnOAIEIAEgKzgCACABQRBqIQEgDEEBTgRAIAMgCSAMEBUaCyAKIAMgBWo2AgggCiABNgIEIAogAzYCACAJRQ0AIAkQFCAKKAIEIQELAkAgCigCCCIFIAFLBEAgASAwOAIMIAEgKTgCCCABICo4AgQgASAmOAIAIAogAUEQaiIBNgIEDAELIAEgCigCACIJayIMQQR1IgJBAWoiA0GAgICAAU8NCCADIAUgCWsiBUEDdSIBIAEgA0kbQf////8AIAVBBHVB////P0kbIgFBgICAgAFPDQkgAUEEdCIFEBYiAyACQQR0aiIBIDA4AgwgASApOAIIIAEgKjgCBCABICY4AgAgAUEQaiEBIAxBAU4EQCADIAkgDBAVGgsgCiADIAVqNgIIIAogATYCBCAKIAM2AgAgCUUNACAJEBQgCigCBCEBCwJAIAooAggiBSABSwRAIAFBgICA/Hs2AgwgASAtOAIIIAEgJzgCBCABICs4AgAgCiABQRBqIgE2AgQMAQsgASAKKAIAIglrIgxBBHUiAkEBaiIDQYCAgIABTw0IIAMgBSAJayIFQQN1IgEgASADSRtB/////wAgBUEEdUH///8/SRsiAUGAgICAAU8NCSABQQR0IgUQFiIDIAJBBHRqIgFBgICA/Hs2AgwgASAtOAIIIAEgJzgCBCABICs4AgAgAUEQaiEBIAxBAU4EQCADIAkgDBAVGgsgCiADIAVqNgIIIAogATYCBCAKIAM2AgAgCUUNACAJEBQgCigCBCEBCwJAIAooAggiBSABSwRAIAEgMDgCDCABICU4AgggASAoOAIEIAEgJDgCACAKIAFBEGoiATYCBAwBCyABIAooAgAiCWsiDEEEdSICQQFqIgNBgICAgAFPDQggAyAFIAlrIgVBA3UiASABIANJG0H/////ACAFQQR1Qf///z9JGyIBQYCAgIABTw0JIAFBBHQiBRAWIgMgAkEEdGoiASAwOAIMIAEgJTgCCCABICg4AgQgASAkOAIAIAFBEGohASAMQQFOBEAgAyAJIAwQFRoLIAogAyAFajYCCCAKIAE2AgQgCiADNgIAIAlFDQAgCRAUIAooAgQhAQsCQCAKKAIIIgUgAUsEQCABQYCAgPx7NgIMIAEgLTgCCCABICc4AgQgASArOAIAIAogAUEQajYCBAwBCyABIAooAgAiCWsiDEEEdSICQQFqIgNBgICAgAFPDQggAyAFIAlrIgVBA3UiASABIANJG0H/////ACAFQQR1Qf///z9JGyIBQYCAgIABTw0JIAFBBHQiARAWIgUgAkEEdGoiAkGAgID8ezYCDCACIC04AgggAiAnOAIEIAIgKzgCACAMQQFOBEAgBSAJIAwQFRoLIAogASAFajYCCCAKIAJBEGo2AgQgCiAFNgIAIAlFDQAgCRAUCyAEIAYoAgwgBigCCCIBa0EEdUEBa0gNAAsLIAEEQCAGIAE2AgwgARAUCyAGKALwAiETCyATBEAgBiATNgL0AiATEBQLIAYoAoADIgEEQCAGIAE2AoQDIAEQFAsgBigCkAMiAQRAIAYgATYClAMgARAUCyAGQaADaiQACyAUQQFqIhQgDSgCMCANKAIsIhVrQQR1SA0ACwsgEUHwAGokAAsgEigCECIBBEAgEiABNgIUIAEQFAsgEigCMCIBBEAgEiABNgI0IAEQFAsgEigCICIBBEAgEiABNgIkIAEQFAsgEkFAayQAIBkoAgwhBSAZIBkoAggiATYCHCAZIAUgAWtBAnU2AhggAEGgECAZQRhqEBM2AgAgGSgCCCIABEAgGSAANgIMIAAQFAsgGUEgaiQADwsQGQALQZUKEBsACwv4HBAAQYAIC5QLdW5zaWduZWQgc2hvcnQAdW5zaWduZWQgaW50AGZsb2F0AHVpbnQ2NF90AHNldFZveGVscwBzZXRDbGlwUG9seWdvbk5vcm1hbHMAc2V0TnVtYmVyT2ZQb2x5Z29uRWRnZXMAdmVjdG9yAHVuc2lnbmVkIGNoYXIAc3RkOjpleGNlcHRpb24Ac2V0Q2xpcFBvbHlnb24AL2Rldi91cmFuZG9tAGJvb2wAZW1zY3JpcHRlbjo6dmFsAFZveGVsQnJpY2sAdW5zaWduZWQgbG9uZwBzdGQ6OndzdHJpbmcAYmFzaWNfc3RyaW5nAHN0ZDo6c3RyaW5nAHN0ZDo6dTE2c3RyaW5nAHN0ZDo6dTMyc3RyaW5nAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUAdHJpYW5ndWxhdGUAZG91YmxlAHNldE9mZnNldEFuZFNjYWxlAHZvaWQAZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2hvcnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVuc2lnbmVkIGludD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZmxvYXQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDhfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dWludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGludDE2X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQzMl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBjaGFyPgBzdGQ6OmJhc2ljX3N0cmluZzx1bnNpZ25lZCBjaGFyPgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxzaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8bG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgbG9uZz4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8ZG91YmxlPgByYW5kb20gZGV2aWNlIG5vdCBzdXBwb3J0ZWQgAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWZFRQAA0BEAAAAIAAAxMFZveGVsQnJpY2sAAAAA0BEAACgIAABQMTBWb3hlbEJyaWNrAAAAsBIAAEAIAAAAAAAAOAgAAFBLMTBWb3hlbEJyaWNrAACwEgAAYAgAAAEAAAA4CAAAaWkAdgB2aQBQCAAAbBEAAGwRAABpaWlpAAAAALgIAAA4CAAATjEwZW1zY3JpcHRlbjN2YWxFAADQEQAApAgAAGlpaQAMEQAAUAgAAEAJAABOU3QzX18yMTJiYXNpY19zdHJpbmdJY05TXzExY2hhcl90cmFpdHNJY0VFTlNfOWFsbG9jYXRvckljRUVFRQBOU3QzX18yMjFfX2Jhc2ljX3N0cmluZ19jb21tb25JTGIxRUVFAAAAANARAAAPCQAAVBIAANAIAAAAAAAAAQAAADgJAAAAAAAAdmlpaQAAAAAMEQAAUAgAAGwRAAAAAAAADBEAAFAIAAC0EQAAtBEAALQRAAC0EQAAdmlpZmZmZgAAAIC/AEGeEwsCgD8AQbITCwKAvwBBvhMLCoA/AAAAAAAAgL8AQdITCwKAPwBB5hMLAoA/AEHyEwsKgD8AAAAAAACAPwBBhhQLV4A/AAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAACAPwAAgD8AAIA/AAAAAAAAgD8AAIA/AAAAAAAAAAD/////AAAAAAAAAAABAAAA/////wAAAAAAAAAAAQBB7BQLDf////8AAAAAAAAAAAEAQYQVC1kBAAAABQAAAAQAAAACAAAAAwAAAAcAAAAGAAAAAwAAAAAAAAAEAAAABwAAAAIAAAABAAAABQAAAAYAAAADAAAAAgAAAAEAAAAAAAAABwAAAAYAAAAFAAAABABB7hULAoA/AEH6FQsKgD8AAAAAAACAPwBBjhYLV4A/AAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAACAPwAAgD8AAIA/AAAAAAAAgD8AAIA/AAAAAAAAAAD/////AAAAAAAAAAABAAAA/////wAAAAAAAAAAAQBB9BYLDf////8AAAAAAAAAAAEAQYwXC7UOAQAAAAUAAAAEAAAAAgAAAAMAAAAHAAAABgAAAAMAAAAAAAAABAAAAAcAAAACAAAAAQAAAAUAAAAGAAAAAwAAAAIAAAABAAAAAAAAAAcAAAAGAAAABQAAAAQAAABOU3QzX18yMTJiYXNpY19zdHJpbmdJaE5TXzExY2hhcl90cmFpdHNJaEVFTlNfOWFsbG9jYXRvckloRUVFRQAAVBIAAOgLAAAAAAAAAQAAADgJAAAAAAAATlN0M19fMjEyYmFzaWNfc3RyaW5nSXdOU18xMWNoYXJfdHJhaXRzSXdFRU5TXzlhbGxvY2F0b3JJd0VFRUUAAFQSAABADAAAAAAAAAEAAAA4CQAAAAAAAE5TdDNfXzIxMmJhc2ljX3N0cmluZ0lEc05TXzExY2hhcl90cmFpdHNJRHNFRU5TXzlhbGxvY2F0b3JJRHNFRUVFAAAAVBIAAJgMAAAAAAAAAQAAADgJAAAAAAAATlN0M19fMjEyYmFzaWNfc3RyaW5nSURpTlNfMTFjaGFyX3RyYWl0c0lEaUVFTlNfOWFsbG9jYXRvcklEaUVFRUUAAABUEgAA9AwAAAAAAAABAAAAOAkAAAAAAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0ljRUUAANARAABQDQAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJYUVFAADQEQAAeA0AAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWhFRQAA0BEAAKANAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lzRUUAANARAADIDQAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJdEVFAADQEQAA8A0AAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SWlFRQAA0BEAABgOAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lqRUUAANARAABADgAATjEwZW1zY3JpcHRlbjExbWVtb3J5X3ZpZXdJbEVFAADQEQAAaA4AAE4xMGVtc2NyaXB0ZW4xMW1lbW9yeV92aWV3SW1FRQAA0BEAAJAOAABOMTBlbXNjcmlwdGVuMTFtZW1vcnlfdmlld0lkRUUAANARAAC4DgAAAAAAAAQPAAASAAAAEwAAABQAAABTdDlleGNlcHRpb24AAAAA0BEAAPQOAAAAAAAAMA8AAA8AAAAVAAAAFgAAAFN0MTFsb2dpY19lcnJvcgD4EQAAIA8AAAQPAAAAAAAAZA8AAA8AAAAXAAAAFgAAAFN0MTJsZW5ndGhfZXJyb3IAAAAA+BEAAFAPAAAwDwAAU3Q5dHlwZV9pbmZvAAAAANARAABwDwAATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAAAAA+BEAAIgPAACADwAATjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9FAAAA+BEAALgPAACsDwAATjEwX19jeHhhYml2MTE3X19wYmFzZV90eXBlX2luZm9FAAAA+BEAAOgPAACsDwAATjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0UA+BEAABgQAAAMEAAATjEwX19jeHhhYml2MTIwX19mdW5jdGlvbl90eXBlX2luZm9FAAAAAPgRAABIEAAArA8AAE4xMF9fY3h4YWJpdjEyOV9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvRQAAAPgRAAB8EAAADBAAAAAAAAD8EAAAGAAAABkAAAAaAAAAGwAAABwAAABOMTBfX2N4eGFiaXYxMjNfX2Z1bmRhbWVudGFsX3R5cGVfaW5mb0UA+BEAANQQAACsDwAAdgAAAMAQAAAIEQAARG4AAMAQAAAUEQAAYgAAAMAQAAAgEQAAYwAAAMAQAAAsEQAAaAAAAMAQAAA4EQAAYQAAAMAQAABEEQAAcwAAAMAQAABQEQAAdAAAAMAQAABcEQAAaQAAAMAQAABoEQAAagAAAMAQAAB0EQAAbAAAAMAQAACAEQAAbQAAAMAQAACMEQAAeAAAAMAQAACYEQAAeQAAAMAQAACkEQAAZgAAAMAQAACwEQAAZAAAAMAQAAC8EQAAAAAAANwPAAAYAAAAHQAAABoAAAAbAAAAHgAAAB8AAAAgAAAAIQAAAAAAAABAEgAAGAAAACIAAAAaAAAAGwAAAB4AAAAjAAAAJAAAACUAAABOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UAAAAA+BEAABgSAADcDwAAAAAAAJwSAAAYAAAAJgAAABoAAAAbAAAAHgAAACcAAAAoAAAAKQAAAE4xMF9fY3h4YWJpdjEyMV9fdm1pX2NsYXNzX3R5cGVfaW5mb0UAAAD4EQAAdBIAANwPAAAAAAAAPBAAABgAAAAqAAAAGgAAABsAAAArAEHEJQsD8BRQ\";\r\n if (!isDataURI(wasmBinaryFile)) {\r\n wasmBinaryFile = locateFile(wasmBinaryFile);\r\n }\r\n\r\n function getBinary(file) {\r\n try {\r\n if (file == wasmBinaryFile && wasmBinary) {\r\n return new Uint8Array(wasmBinary);\r\n }\r\n var binary = tryParseAsDataURI(file);\r\n if (binary) {\r\n return binary;\r\n }\r\n if (readBinary) {\r\n return readBinary(file);\r\n } else {\r\n throw \"both async and sync fetching of the wasm failed\";\r\n }\r\n } catch (err) {\r\n abort(err);\r\n }\r\n }\r\n\r\n function getBinaryPromise() {\r\n if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {\r\n if (typeof fetch === \"function\") {\r\n return fetch(wasmBinaryFile, { credentials: \"same-origin\" })\r\n .then(function (response) {\r\n if (!response[\"ok\"]) {\r\n throw (\r\n \"failed to load wasm binary file at '\" + wasmBinaryFile + \"'\"\r\n );\r\n }\r\n return response[\"arrayBuffer\"]();\r\n })\r\n .catch(function () {\r\n return getBinary(wasmBinaryFile);\r\n });\r\n }\r\n }\r\n return Promise.resolve().then(function () {\r\n return getBinary(wasmBinaryFile);\r\n });\r\n }\r\n\r\n function createWasm() {\r\n var info = { a: asmLibraryArg };\r\n\r\n function receiveInstance(instance, module) {\r\n var exports = instance.exports;\r\n Module[\"asm\"] = exports;\r\n wasmMemory = Module[\"asm\"][\"u\"];\r\n updateGlobalBufferAndViews(wasmMemory.buffer);\r\n wasmTable = Module[\"asm\"][\"w\"];\r\n addOnInit(Module[\"asm\"][\"v\"]);\r\n removeRunDependency(\"wasm-instantiate\");\r\n }\r\n\r\n addRunDependency(\"wasm-instantiate\");\r\n\r\n function receiveInstantiationResult(result) {\r\n receiveInstance(result[\"instance\"]);\r\n }\r\n\r\n function instantiateArrayBuffer(receiver) {\r\n return getBinaryPromise()\r\n .then(function (binary) {\r\n return WebAssembly.instantiate(binary, info);\r\n })\r\n .then(function (instance) {\r\n return instance;\r\n })\r\n .then(receiver, function (reason) {\r\n err(\"failed to asynchronously prepare wasm: \" + reason);\r\n abort(reason);\r\n });\r\n }\r\n\r\n function instantiateAsync() {\r\n if (\r\n !wasmBinary &&\r\n typeof WebAssembly.instantiateStreaming === \"function\" &&\r\n !isDataURI(wasmBinaryFile) &&\r\n typeof fetch === \"function\"\r\n ) {\r\n return fetch(wasmBinaryFile, { credentials: \"same-origin\" }).then(\r\n function (response) {\r\n var result = WebAssembly.instantiateStreaming(response, info);\r\n return result.then(receiveInstantiationResult, function (reason) {\r\n err(\"wasm streaming compile failed: \" + reason);\r\n err(\"falling back to ArrayBuffer instantiation\");\r\n return instantiateArrayBuffer(receiveInstantiationResult);\r\n });\r\n }\r\n );\r\n } else {\r\n return instantiateArrayBuffer(receiveInstantiationResult);\r\n }\r\n }\r\n\r\n if (Module[\"instantiateWasm\"]) {\r\n try {\r\n var exports = Module[\"instantiateWasm\"](info, receiveInstance);\r\n return exports;\r\n } catch (e) {\r\n err(\"Module.instantiateWasm callback failed with error: \" + e);\r\n return false;\r\n }\r\n }\r\n instantiateAsync().catch(readyPromiseReject);\r\n return {};\r\n }\r\n\r\n function callRuntimeCallbacks(callbacks) {\r\n while (callbacks.length > 0) {\r\n var callback = callbacks.shift();\r\n if (typeof callback == \"function\") {\r\n callback(Module);\r\n continue;\r\n }\r\n var func = callback.func;\r\n if (typeof func === \"number\") {\r\n if (callback.arg === undefined) {\r\n wasmTable.get(func)();\r\n } else {\r\n wasmTable.get(func)(callback.arg);\r\n }\r\n } else {\r\n func(callback.arg === undefined ? null : callback.arg);\r\n }\r\n }\r\n }\r\n\r\n function ___cxa_allocate_exception(size) {\r\n return _malloc(size + 16) + 16;\r\n }\r\n\r\n function ExceptionInfo(excPtr) {\r\n this.excPtr = excPtr;\r\n this.ptr = excPtr - 16;\r\n this.set_type = function (type) {\r\n HEAP32[(this.ptr + 4) >> 2] = type;\r\n };\r\n this.get_type = function () {\r\n return HEAP32[(this.ptr + 4) >> 2];\r\n };\r\n this.set_destructor = function (destructor) {\r\n HEAP32[(this.ptr + 8) >> 2] = destructor;\r\n };\r\n this.get_destructor = function () {\r\n return HEAP32[(this.ptr + 8) >> 2];\r\n };\r\n this.set_refcount = function (refcount) {\r\n HEAP32[this.ptr >> 2] = refcount;\r\n };\r\n this.set_caught = function (caught) {\r\n caught = caught ? 1 : 0;\r\n HEAP8[(this.ptr + 12) >> 0] = caught;\r\n };\r\n this.get_caught = function () {\r\n return HEAP8[(this.ptr + 12) >> 0] != 0;\r\n };\r\n this.set_rethrown = function (rethrown) {\r\n rethrown = rethrown ? 1 : 0;\r\n HEAP8[(this.ptr + 13) >> 0] = rethrown;\r\n };\r\n this.get_rethrown = function () {\r\n return HEAP8[(this.ptr + 13) >> 0] != 0;\r\n };\r\n this.init = function (type, destructor) {\r\n this.set_type(type);\r\n this.set_destructor(destructor);\r\n this.set_refcount(0);\r\n this.set_caught(false);\r\n this.set_rethrown(false);\r\n };\r\n this.add_ref = function () {\r\n var value = HEAP32[this.ptr >> 2];\r\n HEAP32[this.ptr >> 2] = value + 1;\r\n };\r\n this.release_ref = function () {\r\n var prev = HEAP32[this.ptr >> 2];\r\n HEAP32[this.ptr >> 2] = prev - 1;\r\n return prev === 1;\r\n };\r\n }\r\n\r\n var exceptionLast = 0;\r\n var uncaughtExceptionCount = 0;\r\n\r\n function ___cxa_throw(ptr, type, destructor) {\r\n var info = new ExceptionInfo(ptr);\r\n info.init(type, destructor);\r\n exceptionLast = ptr;\r\n uncaughtExceptionCount++;\r\n throw ptr;\r\n }\r\n\r\n function __embind_register_bigint(\r\n primitiveType,\r\n name,\r\n size,\r\n minRange,\r\n maxRange\r\n ) {}\r\n\r\n function getShiftFromSize(size) {\r\n switch (size) {\r\n case 1:\r\n return 0;\r\n case 2:\r\n return 1;\r\n case 4:\r\n return 2;\r\n case 8:\r\n return 3;\r\n default:\r\n throw new TypeError(\"Unknown type size: \" + size);\r\n }\r\n }\r\n\r\n function embind_init_charCodes() {\r\n var codes = new Array(256);\r\n for (var i = 0; i < 256; ++i) {\r\n codes[i] = String.fromCharCode(i);\r\n }\r\n embind_charCodes = codes;\r\n }\r\n\r\n var embind_charCodes = undefined;\r\n\r\n function readLatin1String(ptr) {\r\n var ret = \"\";\r\n var c = ptr;\r\n while (HEAPU8[c]) {\r\n ret += embind_charCodes[HEAPU8[c++]];\r\n }\r\n return ret;\r\n }\r\n\r\n var awaitingDependencies = {};\r\n var registeredTypes = {};\r\n var typeDependencies = {};\r\n var char_0 = 48;\r\n var char_9 = 57;\r\n\r\n function makeLegalFunctionName(name) {\r\n if (undefined === name) {\r\n return \"_unknown\";\r\n }\r\n name = name.replace(/[^a-zA-Z0-9_]/g, \"$\");\r\n var f = name.charCodeAt(0);\r\n if (f >= char_0 && f <= char_9) {\r\n return \"_\" + name;\r\n } else {\r\n return name;\r\n }\r\n }\r\n\r\n function createNamedFunction(name, body) {\r\n name = makeLegalFunctionName(name);\r\n return new Function(\r\n \"body\",\r\n \"return function \" +\r\n name +\r\n \"() {\\n\" +\r\n ' \"use strict\";' +\r\n \" return body.apply(this, arguments);\\n\" +\r\n \"};\\n\"\r\n )(body);\r\n }\r\n\r\n function extendError(baseErrorType, errorName) {\r\n var errorClass = createNamedFunction(errorName, function (message) {\r\n this.name = errorName;\r\n this.message = message;\r\n var stack = new Error(message).stack;\r\n if (stack !== undefined) {\r\n this.stack =\r\n this.toString() + \"\\n\" + stack.replace(/^Error(:[^\\n]*)?\\n/, \"\");\r\n }\r\n });\r\n errorClass.prototype = Object.create(baseErrorType.prototype);\r\n errorClass.prototype.constructor = errorClass;\r\n errorClass.prototype.toString = function () {\r\n if (this.message === undefined) {\r\n return this.name;\r\n } else {\r\n return this.name + \": \" + this.message;\r\n }\r\n };\r\n return errorClass;\r\n }\r\n\r\n var BindingError = undefined;\r\n\r\n function throwBindingError(message) {\r\n throw new BindingError(message);\r\n }\r\n\r\n var InternalError = undefined;\r\n\r\n function throwInternalError(message) {\r\n throw new InternalError(message);\r\n }\r\n\r\n function whenDependentTypesAreResolved(\r\n myTypes,\r\n dependentTypes,\r\n getTypeConverters\r\n ) {\r\n myTypes.forEach(function (type) {\r\n typeDependencies[type] = dependentTypes;\r\n });\r\n\r\n function onComplete(typeConverters) {\r\n var myTypeConverters = getTypeConverters(typeConverters);\r\n if (myTypeConverters.length !== myTypes.length) {\r\n throwInternalError(\"Mismatched type converter count\");\r\n }\r\n for (var i = 0; i < myTypes.length; ++i) {\r\n registerType(myTypes[i], myTypeConverters[i]);\r\n }\r\n }\r\n\r\n var typeConverters = new Array(dependentTypes.length);\r\n var unregisteredTypes = [];\r\n var registered = 0;\r\n dependentTypes.forEach(function (dt, i) {\r\n if (registeredTypes.hasOwnProperty(dt)) {\r\n typeConverters[i] = registeredTypes[dt];\r\n } else {\r\n unregisteredTypes.push(dt);\r\n if (!awaitingDependencies.hasOwnProperty(dt)) {\r\n awaitingDependencies[dt] = [];\r\n }\r\n awaitingDependencies[dt].push(function () {\r\n typeConverters[i] = registeredTypes[dt];\r\n ++registered;\r\n if (registered === unregisteredTypes.length) {\r\n onComplete(typeConverters);\r\n }\r\n });\r\n }\r\n });\r\n if (0 === unregisteredTypes.length) {\r\n onComplete(typeConverters);\r\n }\r\n }\r\n\r\n function registerType(rawType, registeredInstance, options) {\r\n options = options || {};\r\n if (!(\"argPackAdvance\" in registeredInstance)) {\r\n throw new TypeError(\r\n \"registerType registeredInstance requires argPackAdvance\"\r\n );\r\n }\r\n var name = registeredInstance.name;\r\n if (!rawType) {\r\n throwBindingError(\r\n 'type \"' + name + '\" must have a positive integer typeid pointer'\r\n );\r\n }\r\n if (registeredTypes.hasOwnProperty(rawType)) {\r\n if (options.ignoreDuplicateRegistrations) {\r\n return;\r\n } else {\r\n throwBindingError(\"Cannot register type '\" + name + \"' twice\");\r\n }\r\n }\r\n registeredTypes[rawType] = registeredInstance;\r\n delete typeDependencies[rawType];\r\n if (awaitingDependencies.hasOwnProperty(rawType)) {\r\n var callbacks = awaitingDependencies[rawType];\r\n delete awaitingDependencies[rawType];\r\n callbacks.forEach(function (cb) {\r\n cb();\r\n });\r\n }\r\n }\r\n\r\n function __embind_register_bool(\r\n rawType,\r\n name,\r\n size,\r\n trueValue,\r\n falseValue\r\n ) {\r\n var shift = getShiftFromSize(size);\r\n name = readLatin1String(name);\r\n registerType(rawType, {\r\n name: name,\r\n fromWireType: function (wt) {\r\n return !!wt;\r\n },\r\n toWireType: function (destructors, o) {\r\n return o ? trueValue : falseValue;\r\n },\r\n argPackAdvance: 8,\r\n readValueFromPointer: function (pointer) {\r\n var heap;\r\n if (size === 1) {\r\n heap = HEAP8;\r\n } else if (size === 2) {\r\n heap = HEAP16;\r\n } else if (size === 4) {\r\n heap = HEAP32;\r\n } else {\r\n throw new TypeError(\"Unknown boolean type size: \" + name);\r\n }\r\n return this[\"fromWireType\"](heap[pointer >> shift]);\r\n },\r\n destructorFunction: null,\r\n });\r\n }\r\n\r\n function ClassHandle_isAliasOf(other) {\r\n if (!(this instanceof ClassHandle)) {\r\n return false;\r\n }\r\n if (!(other instanceof ClassHandle)) {\r\n return false;\r\n }\r\n var leftClass = this.$$.ptrType.registeredClass;\r\n var left = this.$$.ptr;\r\n var rightClass = other.$$.ptrType.registeredClass;\r\n var right = other.$$.ptr;\r\n while (leftClass.baseClass) {\r\n left = leftClass.upcast(left);\r\n leftClass = leftClass.baseClass;\r\n }\r\n while (rightClass.baseClass) {\r\n right = rightClass.upcast(right);\r\n rightClass = rightClass.baseClass;\r\n }\r\n return leftClass === rightClass && left === right;\r\n }\r\n\r\n function shallowCopyInternalPointer(o) {\r\n return {\r\n count: o.count,\r\n deleteScheduled: o.deleteScheduled,\r\n preservePointerOnDelete: o.preservePointerOnDelete,\r\n ptr: o.ptr,\r\n ptrType: o.ptrType,\r\n smartPtr: o.smartPtr,\r\n smartPtrType: o.smartPtrType,\r\n };\r\n }\r\n\r\n function throwInstanceAlreadyDeleted(obj) {\r\n function getInstanceTypeName(handle) {\r\n return handle.$$.ptrType.registeredClass.name;\r\n }\r\n\r\n throwBindingError(getInstanceTypeName(obj) + \" instance already deleted\");\r\n }\r\n\r\n var finalizationGroup = false;\r\n\r\n function detachFinalizer(handle) {}\r\n\r\n function runDestructor($$) {\r\n if ($$.smartPtr) {\r\n $$.smartPtrType.rawDestructor($$.smartPtr);\r\n } else {\r\n $$.ptrType.registeredClass.rawDestructor($$.ptr);\r\n }\r\n }\r\n\r\n function releaseClassHandle($$) {\r\n $$.count.value -= 1;\r\n var toDelete = 0 === $$.count.value;\r\n if (toDelete) {\r\n runDestructor($$);\r\n }\r\n }\r\n\r\n function attachFinalizer(handle) {\r\n if (\"undefined\" === typeof FinalizationGroup) {\r\n attachFinalizer = function (handle) {\r\n return handle;\r\n };\r\n return handle;\r\n }\r\n finalizationGroup = new FinalizationGroup(function (iter) {\r\n for (var result = iter.next(); !result.done; result = iter.next()) {\r\n var $$ = result.value;\r\n if (!$$.ptr) {\r\n console.warn(\"object already deleted: \" + $$.ptr);\r\n } else {\r\n releaseClassHandle($$);\r\n }\r\n }\r\n });\r\n attachFinalizer = function (handle) {\r\n finalizationGroup.register(handle, handle.$$, handle.$$);\r\n return handle;\r\n };\r\n detachFinalizer = function (handle) {\r\n finalizationGroup.unregister(handle.$$);\r\n };\r\n return attachFinalizer(handle);\r\n }\r\n\r\n function ClassHandle_clone() {\r\n if (!this.$$.ptr) {\r\n throwInstanceAlreadyDeleted(this);\r\n }\r\n if (this.$$.preservePointerOnDelete) {\r\n this.$$.count.value += 1;\r\n return this;\r\n } else {\r\n var clone = attachFinalizer(\r\n Object.create(Object.getPrototypeOf(this), {\r\n $$: {\r\n value: shallowCopyInternalPointer(this.$$),\r\n },\r\n })\r\n );\r\n clone.$$.count.value += 1;\r\n clone.$$.deleteScheduled = false;\r\n return clone;\r\n }\r\n }\r\n\r\n function ClassHandle_delete() {\r\n if (!this.$$.ptr) {\r\n throwInstanceAlreadyDeleted(this);\r\n }\r\n if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {\r\n throwBindingError(\"Object already scheduled for deletion\");\r\n }\r\n detachFinalizer(this);\r\n releaseClassHandle(this.$$);\r\n if (!this.$$.preservePointerOnDelete) {\r\n this.$$.smartPtr = undefined;\r\n this.$$.ptr = undefined;\r\n }\r\n }\r\n\r\n function ClassHandle_isDeleted() {\r\n return !this.$$.ptr;\r\n }\r\n\r\n var delayFunction = undefined;\r\n var deletionQueue = [];\r\n\r\n function flushPendingDeletes() {\r\n while (deletionQueue.length) {\r\n var obj = deletionQueue.pop();\r\n obj.$$.deleteScheduled = false;\r\n obj[\"delete\"]();\r\n }\r\n }\r\n\r\n function ClassHandle_deleteLater() {\r\n if (!this.$$.ptr) {\r\n throwInstanceAlreadyDeleted(this);\r\n }\r\n if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {\r\n throwBindingError(\"Object already scheduled for deletion\");\r\n }\r\n deletionQueue.push(this);\r\n if (deletionQueue.length === 1 && delayFunction) {\r\n delayFunction(flushPendingDeletes);\r\n }\r\n this.$$.deleteScheduled = true;\r\n return this;\r\n }\r\n\r\n function init_ClassHandle() {\r\n ClassHandle.prototype[\"isAliasOf\"] = ClassHandle_isAliasOf;\r\n ClassHandle.prototype[\"clone\"] = ClassHandle_clone;\r\n ClassHandle.prototype[\"delete\"] = ClassHandle_delete;\r\n ClassHandle.prototype[\"isDeleted\"] = ClassHandle_isDeleted;\r\n ClassHandle.prototype[\"deleteLater\"] = ClassHandle_deleteLater;\r\n }\r\n\r\n function ClassHandle() {}\r\n\r\n var registeredPointers = {};\r\n\r\n function ensureOverloadTable(proto, methodName, humanName) {\r\n if (undefined === proto[methodName].overloadTable) {\r\n var prevFunc = proto[methodName];\r\n proto[methodName] = function () {\r\n if (\r\n !proto[methodName].overloadTable.hasOwnProperty(arguments.length)\r\n ) {\r\n throwBindingError(\r\n \"Function '\" +\r\n humanName +\r\n \"' called with an invalid number of arguments (\" +\r\n arguments.length +\r\n \") - expects one of (\" +\r\n proto[methodName].overloadTable +\r\n \")!\"\r\n );\r\n }\r\n return proto[methodName].overloadTable[arguments.length].apply(\r\n this,\r\n arguments\r\n );\r\n };\r\n proto[methodName].overloadTable = [];\r\n proto[methodName].overloadTable[prevFunc.argCount] = prevFunc;\r\n }\r\n }\r\n\r\n function exposePublicSymbol(name, value, numArguments) {\r\n if (Module.hasOwnProperty(name)) {\r\n if (\r\n undefined === numArguments ||\r\n (undefined !== Module[name].overloadTable &&\r\n undefined !== Module[name].overloadTable[numArguments])\r\n ) {\r\n throwBindingError(\"Cannot register public name '\" + name + \"' twice\");\r\n }\r\n ensureOverloadTable(Module, name, name);\r\n if (Module.hasOwnProperty(numArguments)) {\r\n throwBindingError(\r\n \"Cannot register multiple overloads of a function with the same number of arguments (\" +\r\n numArguments +\r\n \")!\"\r\n );\r\n }\r\n Module[name].overloadTable[numArguments] = value;\r\n } else {\r\n Module[name] = value;\r\n if (undefined !== numArguments) {\r\n Module[name].numArguments = numArguments;\r\n }\r\n }\r\n }\r\n\r\n function RegisteredClass(\r\n name,\r\n constructor,\r\n instancePrototype,\r\n rawDestructor,\r\n baseClass,\r\n getActualType,\r\n upcast,\r\n downcast\r\n ) {\r\n this.name = name;\r\n this.constructor = constructor;\r\n this.instancePrototype = instancePrototype;\r\n this.rawDestructor = rawDestructor;\r\n this.baseClass = baseClass;\r\n this.getActualType = getActualType;\r\n this.upcast = upcast;\r\n this.downcast = downcast;\r\n this.pureVirtualFunctions = [];\r\n }\r\n\r\n function upcastPointer(ptr, ptrClass, desiredClass) {\r\n while (ptrClass !== desiredClass) {\r\n if (!ptrClass.upcast) {\r\n throwBindingError(\r\n \"Expected null or instance of \" +\r\n desiredClass.name +\r\n \", got an instance of \" +\r\n ptrClass.name\r\n );\r\n }\r\n ptr = ptrClass.upcast(ptr);\r\n ptrClass = ptrClass.baseClass;\r\n }\r\n return ptr;\r\n }\r\n\r\n function constNoSmartPtrRawPointerToWireType(destructors, handle) {\r\n if (handle === null) {\r\n if (this.isReference) {\r\n throwBindingError(\"null is not a valid \" + this.name);\r\n }\r\n return 0;\r\n }\r\n if (!handle.$$) {\r\n throwBindingError(\r\n 'Cannot pass \"' + _embind_repr(handle) + '\" as a ' + this.name\r\n );\r\n }\r\n if (!handle.$$.ptr) {\r\n throwBindingError(\r\n \"Cannot pass deleted object as a pointer of type \" + this.name\r\n );\r\n }\r\n var handleClass = handle.$$.ptrType.registeredClass;\r\n var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);\r\n return ptr;\r\n }\r\n\r\n function genericPointerToWireType(destructors, handle) {\r\n var ptr;\r\n if (handle === null) {\r\n if (this.isReference) {\r\n throwBindingError(\"null is not a valid \" + this.name);\r\n }\r\n if (this.isSmartPointer) {\r\n ptr = this.rawConstructor();\r\n if (destructors !== null) {\r\n destructors.push(this.rawDestructor, ptr);\r\n }\r\n return ptr;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n if (!handle.$$) {\r\n throwBindingError(\r\n 'Cannot pass \"' + _embind_repr(handle) + '\" as a ' + this.name\r\n );\r\n }\r\n if (!handle.$$.ptr) {\r\n throwBindingError(\r\n \"Cannot pass deleted object as a pointer of type \" + this.name\r\n );\r\n }\r\n if (!this.isConst && handle.$$.ptrType.isConst) {\r\n throwBindingError(\r\n \"Cannot convert argument of type \" +\r\n (handle.$$.smartPtrType\r\n ? handle.$$.smartPtrType.name\r\n : handle.$$.ptrType.name) +\r\n \" to parameter type \" +\r\n this.name\r\n );\r\n }\r\n var handleClass = handle.$$.ptrType.registeredClass;\r\n ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);\r\n if (this.isSmartPointer) {\r\n if (undefined === handle.$$.smartPtr) {\r\n throwBindingError(\"Passing raw pointer to smart pointer is illegal\");\r\n }\r\n switch (this.sharingPolicy) {\r\n case 0:\r\n if (handle.$$.smartPtrType === this) {\r\n ptr = handle.$$.smartPtr;\r\n } else {\r\n throwBindingError(\r\n \"Cannot convert argument of type \" +\r\n (handle.$$.smartPtrType\r\n ? handle.$$.smartPtrType.name\r\n : handle.$$.ptrType.name) +\r\n \" to parameter type \" +\r\n this.name\r\n );\r\n }\r\n break;\r\n case 1:\r\n ptr = handle.$$.smartPtr;\r\n break;\r\n case 2:\r\n if (handle.$$.smartPtrType === this) {\r\n ptr = handle.$$.smartPtr;\r\n } else {\r\n var clonedHandle = handle[\"clone\"]();\r\n ptr = this.rawShare(\r\n ptr,\r\n __emval_register(function () {\r\n clonedHandle[\"delete\"]();\r\n })\r\n );\r\n if (destructors !== null) {\r\n destructors.push(this.rawDestructor, ptr);\r\n }\r\n }\r\n break;\r\n default:\r\n throwBindingError(\"Unsupporting sharing policy\");\r\n }\r\n }\r\n return ptr;\r\n }\r\n\r\n function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {\r\n if (handle === null) {\r\n if (this.isReference) {\r\n throwBindingError(\"null is not a valid \" + this.name);\r\n }\r\n return 0;\r\n }\r\n if (!handle.$$) {\r\n throwBindingError(\r\n 'Cannot pass \"' + _embind_repr(handle) + '\" as a ' + this.name\r\n );\r\n }\r\n if (!handle.$$.ptr) {\r\n throwBindingError(\r\n \"Cannot pass deleted object as a pointer of type \" + this.name\r\n );\r\n }\r\n if (handle.$$.ptrType.isConst) {\r\n throwBindingError(\r\n \"Cannot convert argument of type \" +\r\n handle.$$.ptrType.name +\r\n \" to parameter type \" +\r\n this.name\r\n );\r\n }\r\n var handleClass = handle.$$.ptrType.registeredClass;\r\n var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);\r\n return ptr;\r\n }\r\n\r\n function simpleReadValueFromPointer(pointer) {\r\n return this[\"fromWireType\"](HEAPU32[pointer >> 2]);\r\n }\r\n\r\n function RegisteredPointer_getPointee(ptr) {\r\n if (this.rawGetPointee) {\r\n ptr = this.rawGetPointee(ptr);\r\n }\r\n return ptr;\r\n }\r\n\r\n function RegisteredPointer_destructor(ptr) {\r\n if (this.rawDestructor) {\r\n this.rawDestructor(ptr);\r\n }\r\n }\r\n\r\n function RegisteredPointer_deleteObject(handle) {\r\n if (handle !== null) {\r\n handle[\"delete\"]();\r\n }\r\n }\r\n\r\n function downcastPointer(ptr, ptrClass, desiredClass) {\r\n if (ptrClass === desiredClass) {\r\n return ptr;\r\n }\r\n if (undefined === desiredClass.baseClass) {\r\n return null;\r\n }\r\n var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass);\r\n if (rv === null) {\r\n return null;\r\n }\r\n return desiredClass.downcast(rv);\r\n }\r\n\r\n function getInheritedInstanceCount() {\r\n return Object.keys(registeredInstances).length;\r\n }\r\n\r\n function getLiveInheritedInstances() {\r\n var rv = [];\r\n for (var k in registeredInstances) {\r\n if (registeredInstances.hasOwnProperty(k)) {\r\n rv.push(registeredInstances[k]);\r\n }\r\n }\r\n return rv;\r\n }\r\n\r\n function setDelayFunction(fn) {\r\n delayFunction = fn;\r\n if (deletionQueue.length && delayFunction) {\r\n delayFunction(flushPendingDeletes);\r\n }\r\n }\r\n\r\n function init_embind() {\r\n Module[\"getInheritedInstanceCount\"] = getInheritedInstanceCount;\r\n Module[\"getLiveInheritedInstances\"] = getLiveInheritedInstances;\r\n Module[\"flushPendingDeletes\"] = flushPendingDeletes;\r\n Module[\"setDelayFunction\"] = setDelayFunction;\r\n }\r\n\r\n var registeredInstances = {};\r\n\r\n function getBasestPointer(class_, ptr) {\r\n if (ptr === undefined) {\r\n throwBindingError(\"ptr should not be undefined\");\r\n }\r\n while (class_.baseClass) {\r\n ptr = class_.upcast(ptr);\r\n class_ = class_.baseClass;\r\n }\r\n return ptr;\r\n }\r\n\r\n function getInheritedInstance(class_, ptr) {\r\n ptr = getBasestPointer(class_, ptr);\r\n return registeredInstances[ptr];\r\n }\r\n\r\n function makeClassHandle(prototype, record) {\r\n if (!record.ptrType || !record.ptr) {\r\n throwInternalError(\"makeClassHandle requires ptr and ptrType\");\r\n }\r\n var hasSmartPtrType = !!record.smartPtrType;\r\n var hasSmartPtr = !!record.smartPtr;\r\n if (hasSmartPtrType !== hasSmartPtr) {\r\n throwInternalError(\"Both smartPtrType and smartPtr must be specified\");\r\n }\r\n record.count = { value: 1 };\r\n return attachFinalizer(\r\n Object.create(prototype, { $$: { value: record } })\r\n );\r\n }\r\n\r\n function RegisteredPointer_fromWireType(ptr) {\r\n var rawPointer = this.getPointee(ptr);\r\n if (!rawPointer) {\r\n this.destructor(ptr);\r\n return null;\r\n }\r\n var registeredInstance = getInheritedInstance(\r\n this.registeredClass,\r\n rawPointer\r\n );\r\n if (undefined !== registeredInstance) {\r\n if (0 === registeredInstance.$$.count.value) {\r\n registeredInstance.$$.ptr = rawPointer;\r\n registeredInstance.$$.smartPtr = ptr;\r\n return registeredInstance[\"clone\"]();\r\n } else {\r\n var rv = registeredInstance[\"clone\"]();\r\n this.destructor(ptr);\r\n return rv;\r\n }\r\n }\r\n\r\n function makeDefaultHandle() {\r\n if (this.isSmartPointer) {\r\n return makeClassHandle(this.registeredClass.instancePrototype, {\r\n ptrType: this.pointeeType,\r\n ptr: rawPointer,\r\n smartPtrType: this,\r\n smartPtr: ptr,\r\n });\r\n } else {\r\n return makeClassHandle(this.registeredClass.instancePrototype, {\r\n ptrType: this,\r\n ptr: ptr,\r\n });\r\n }\r\n }\r\n\r\n var actualType = this.registeredClass.getActualType(rawPointer);\r\n var registeredPointerRecord = registeredPointers[actualType];\r\n if (!registeredPointerRecord) {\r\n return makeDefaultHandle.call(this);\r\n }\r\n var toType;\r\n if (this.isConst) {\r\n toType = registeredPointerRecord.constPointerType;\r\n } else {\r\n toType = registeredPointerRecord.pointerType;\r\n }\r\n var dp = downcastPointer(\r\n rawPointer,\r\n this.registeredClass,\r\n toType.registeredClass\r\n );\r\n if (dp === null) {\r\n return makeDefaultHandle.call(this);\r\n }\r\n if (this.isSmartPointer) {\r\n return makeClassHandle(toType.registeredClass.instancePrototype, {\r\n ptrType: toType,\r\n ptr: dp,\r\n smartPtrType: this,\r\n smartPtr: ptr,\r\n });\r\n } else {\r\n return makeClassHandle(toType.registeredClass.instancePrototype, {\r\n ptrType: toType,\r\n ptr: dp,\r\n });\r\n }\r\n }\r\n\r\n function init_RegisteredPointer() {\r\n RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;\r\n RegisteredPointer.prototype.destructor = RegisteredPointer_destructor;\r\n RegisteredPointer.prototype[\"argPackAdvance\"] = 8;\r\n RegisteredPointer.prototype[\"readValueFromPointer\"] =\r\n simpleReadValueFromPointer;\r\n RegisteredPointer.prototype[\"deleteObject\"] =\r\n RegisteredPointer_deleteObject;\r\n RegisteredPointer.prototype[\"fromWireType\"] =\r\n RegisteredPointer_fromWireType;\r\n }\r\n\r\n function RegisteredPointer(\r\n name,\r\n registeredClass,\r\n isReference,\r\n isConst,\r\n isSmartPointer,\r\n pointeeType,\r\n sharingPolicy,\r\n rawGetPointee,\r\n rawConstructor,\r\n rawShare,\r\n rawDestructor\r\n ) {\r\n this.name = name;\r\n this.registeredClass = registeredClass;\r\n this.isReference = isReference;\r\n this.isConst = isConst;\r\n this.isSmartPointer = isSmartPointer;\r\n this.pointeeType = pointeeType;\r\n this.sharingPolicy = sharingPolicy;\r\n this.rawGetPointee = rawGetPointee;\r\n this.rawConstructor = rawConstructor;\r\n this.rawShare = rawShare;\r\n this.rawDestructor = rawDestructor;\r\n if (!isSmartPointer && registeredClass.baseClass === undefined) {\r\n if (isConst) {\r\n this[\"toWireType\"] = constNoSmartPtrRawPointerToWireType;\r\n this.destructorFunction = null;\r\n } else {\r\n this[\"toWireType\"] = nonConstNoSmartPtrRawPointerToWireType;\r\n this.destructorFunction = null;\r\n }\r\n } else {\r\n this[\"toWireType\"] = genericPointerToWireType;\r\n }\r\n }\r\n\r\n function replacePublicSymbol(name, value, numArguments) {\r\n if (!Module.hasOwnProperty(name)) {\r\n throwInternalError(\"Replacing nonexistant public symbol\");\r\n }\r\n if (\r\n undefined !== Module[name].overloadTable &&\r\n undefined !== numArguments\r\n ) {\r\n Module[name].overloadTable[numArguments] = value;\r\n } else {\r\n Module[name] = value;\r\n Module[name].argCount = numArguments;\r\n }\r\n }\r\n\r\n function dynCallLegacy(sig, ptr, args) {\r\n var f = Module[\"dynCall_\" + sig];\r\n return args && args.length\r\n ? f.apply(null, [ptr].concat(args))\r\n : f.call(null, ptr);\r\n }\r\n\r\n function dynCall(sig, ptr, args) {\r\n if (sig.includes(\"j\")) {\r\n return dynCallLegacy(sig, ptr, args);\r\n }\r\n return wasmTable.get(ptr).apply(null, args);\r\n }\r\n\r\n function getDynCaller(sig, ptr) {\r\n var argCache = [];\r\n return function () {\r\n argCache.length = arguments.length;\r\n for (var i = 0; i < arguments.length; i++) {\r\n argCache[i] = arguments[i];\r\n }\r\n return dynCall(sig, ptr, argCache);\r\n };\r\n }\r\n\r\n function embind__requireFunction(signature, rawFunction) {\r\n signature = readLatin1String(signature);\r\n\r\n function makeDynCaller() {\r\n if (signature.includes(\"j\")) {\r\n return getDynCaller(signature, rawFunction);\r\n }\r\n return wasmTable.get(rawFunction);\r\n }\r\n\r\n var fp = makeDynCaller();\r\n if (typeof fp !== \"function\") {\r\n throwBindingError(\r\n \"unknown function pointer with signature \" +\r\n signature +\r\n \": \" +\r\n rawFunction\r\n );\r\n }\r\n return fp;\r\n }\r\n\r\n var UnboundTypeError = undefined;\r\n\r\n function getTypeName(type) {\r\n var ptr = ___getTypeName(type);\r\n var rv = readLatin1String(ptr);\r\n _free(ptr);\r\n return rv;\r\n }\r\n\r\n function throwUnboundTypeError(message, types) {\r\n var unboundTypes = [];\r\n var seen = {};\r\n\r\n function visit(type) {\r\n if (seen[type]) {\r\n return;\r\n }\r\n if (registeredTypes[type]) {\r\n return;\r\n }\r\n if (typeDependencies[type]) {\r\n typeDependencies[type].forEach(visit);\r\n return;\r\n }\r\n unboundTypes.push(type);\r\n seen[type] = true;\r\n }\r\n\r\n types.forEach(visit);\r\n throw new UnboundTypeError(\r\n message + \": \" + unboundTypes.map(getTypeName).join([\", \"])\r\n );\r\n }\r\n\r\n function __embind_register_class(\r\n rawType,\r\n rawPointerType,\r\n rawConstPointerType,\r\n baseClassRawType,\r\n getActualTypeSignature,\r\n getActualType,\r\n upcastSignature,\r\n upcast,\r\n downcastSignature,\r\n downcast,\r\n name,\r\n destructorSignature,\r\n rawDestructor\r\n ) {\r\n name = readLatin1String(name);\r\n getActualType = embind__requireFunction(\r\n getActualTypeSignature,\r\n getActualType\r\n );\r\n if (upcast) {\r\n upcast = embind__requireFunction(upcastSignature, upcast);\r\n }\r\n if (downcast) {\r\n downcast = embind__requireFunction(downcastSignature, downcast);\r\n }\r\n rawDestructor = embind__requireFunction(\r\n destructorSignature,\r\n rawDestructor\r\n );\r\n var legalFunctionName = makeLegalFunctionName(name);\r\n exposePublicSymbol(legalFunctionName, function () {\r\n throwUnboundTypeError(\r\n \"Cannot construct \" + name + \" due to unbound types\",\r\n [baseClassRawType]\r\n );\r\n });\r\n whenDependentTypesAreResolved(\r\n [rawType, rawPointerType, rawConstPointerType],\r\n baseClassRawType ? [baseClassRawType] : [],\r\n function (base) {\r\n base = base[0];\r\n var baseClass;\r\n var basePrototype;\r\n if (baseClassRawType) {\r\n baseClass = base.registeredClass;\r\n basePrototype = baseClass.instancePrototype;\r\n } else {\r\n basePrototype = ClassHandle.prototype;\r\n }\r\n var constructor = createNamedFunction(legalFunctionName, function () {\r\n if (Object.getPrototypeOf(this) !== instancePrototype) {\r\n throw new BindingError(\"Use 'new' to construct \" + name);\r\n }\r\n if (undefined === registeredClass.constructor_body) {\r\n throw new BindingError(name + \" has no accessible constructor\");\r\n }\r\n var body = registeredClass.constructor_body[arguments.length];\r\n if (undefined === body) {\r\n throw new BindingError(\r\n \"Tried to invoke ctor of \" +\r\n name +\r\n \" with invalid number of parameters (\" +\r\n arguments.length +\r\n \") - expected (\" +\r\n Object.keys(registeredClass.constructor_body).toString() +\r\n \") parameters instead!\"\r\n );\r\n }\r\n return body.apply(this, arguments);\r\n });\r\n var instancePrototype = Object.create(basePrototype, {\r\n constructor: { value: constructor },\r\n });\r\n constructor.prototype = instancePrototype;\r\n var registeredClass = new RegisteredClass(\r\n name,\r\n constructor,\r\n instancePrototype,\r\n rawDestructor,\r\n baseClass,\r\n getActualType,\r\n upcast,\r\n downcast\r\n );\r\n var referenceConverter = new RegisteredPointer(\r\n name,\r\n registeredClass,\r\n true,\r\n false,\r\n false\r\n );\r\n var pointerConverter = new RegisteredPointer(\r\n name + \"*\",\r\n registeredClass,\r\n false,\r\n false,\r\n false\r\n );\r\n var constPointerConverter = new RegisteredPointer(\r\n name + \" const*\",\r\n registeredClass,\r\n false,\r\n true,\r\n false\r\n );\r\n registeredPointers[rawType] = {\r\n pointerType: pointerConverter,\r\n constPointerType: constPointerConverter,\r\n };\r\n replacePublicSymbol(legalFunctionName, constructor);\r\n return [referenceConverter, pointerConverter, constPointerConverter];\r\n }\r\n );\r\n }\r\n\r\n function heap32VectorToArray(count, firstElement) {\r\n var array = [];\r\n for (var i = 0; i < count; i++) {\r\n array.push(HEAP32[(firstElement >> 2) + i]);\r\n }\r\n return array;\r\n }\r\n\r\n function runDestructors(destructors) {\r\n while (destructors.length) {\r\n var ptr = destructors.pop();\r\n var del = destructors.pop();\r\n del(ptr);\r\n }\r\n }\r\n\r\n function __embind_register_class_constructor(\r\n rawClassType,\r\n argCount,\r\n rawArgTypesAddr,\r\n invokerSignature,\r\n invoker,\r\n rawConstructor\r\n ) {\r\n assert(argCount > 0);\r\n var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);\r\n invoker = embind__requireFunction(invokerSignature, invoker);\r\n whenDependentTypesAreResolved([], [rawClassType], function (classType) {\r\n classType = classType[0];\r\n var humanName = \"constructor \" + classType.name;\r\n if (undefined === classType.registeredClass.constructor_body) {\r\n classType.registeredClass.constructor_body = [];\r\n }\r\n if (\r\n undefined !== classType.registeredClass.constructor_body[argCount - 1]\r\n ) {\r\n throw new BindingError(\r\n \"Cannot register multiple constructors with identical number of parameters (\" +\r\n (argCount - 1) +\r\n \") for class '\" +\r\n classType.name +\r\n \"'! Overload resolution is currently only performed using the parameter count, not actual type info!\"\r\n );\r\n }\r\n classType.registeredClass.constructor_body[argCount - 1] =\r\n function unboundTypeHandler() {\r\n throwUnboundTypeError(\r\n \"Cannot construct \" + classType.name + \" due to unbound types\",\r\n rawArgTypes\r\n );\r\n };\r\n whenDependentTypesAreResolved([], rawArgTypes, function (argTypes) {\r\n argTypes.splice(1, 0, null);\r\n classType.registeredClass.constructor_body[argCount - 1] =\r\n craftInvokerFunction(\r\n humanName,\r\n argTypes,\r\n null,\r\n invoker,\r\n rawConstructor\r\n );\r\n return [];\r\n });\r\n return [];\r\n });\r\n }\r\n\r\n function new_(constructor, argumentList) {\r\n if (!(constructor instanceof Function)) {\r\n throw new TypeError(\r\n \"new_ called with constructor type \" +\r\n typeof constructor +\r\n \" which is not a function\"\r\n );\r\n }\r\n var dummy = createNamedFunction(\r\n constructor.name || \"unknownFunctionName\",\r\n function () {}\r\n );\r\n dummy.prototype = constructor.prototype;\r\n var obj = new dummy();\r\n var r = constructor.apply(obj, argumentList);\r\n return r instanceof Object ? r : obj;\r\n }\r\n\r\n function craftInvokerFunction(\r\n humanName,\r\n argTypes,\r\n classType,\r\n cppInvokerFunc,\r\n cppTargetFunc\r\n ) {\r\n var argCount = argTypes.length;\r\n if (argCount < 2) {\r\n throwBindingError(\r\n \"argTypes array size mismatch! Must at least get return value and 'this' types!\"\r\n );\r\n }\r\n var isClassMethodFunc = argTypes[1] !== null && classType !== null;\r\n var needsDestructorStack = false;\r\n for (var i = 1; i < argTypes.length; ++i) {\r\n if (\r\n argTypes[i] !== null &&\r\n argTypes[i].destructorFunction === undefined\r\n ) {\r\n needsDestructorStack = true;\r\n break;\r\n }\r\n }\r\n var returns = argTypes[0].name !== \"void\";\r\n var argsList = \"\";\r\n var argsListWired = \"\";\r\n for (var i = 0; i < argCount - 2; ++i) {\r\n argsList += (i !== 0 ? \", \" : \"\") + \"arg\" + i;\r\n argsListWired += (i !== 0 ? \", \" : \"\") + \"arg\" + i + \"Wired\";\r\n }\r\n var invokerFnBody =\r\n \"return function \" +\r\n makeLegalFunctionName(humanName) +\r\n \"(\" +\r\n argsList +\r\n \") {\\n\" +\r\n \"if (arguments.length !== \" +\r\n (argCount - 2) +\r\n \") {\\n\" +\r\n \"throwBindingError('function \" +\r\n humanName +\r\n \" called with ' + arguments.length + ' arguments, expected \" +\r\n (argCount - 2) +\r\n \" args!');\\n\" +\r\n \"}\\n\";\r\n if (needsDestructorStack) {\r\n invokerFnBody += \"var destructors = [];\\n\";\r\n }\r\n var dtorStack = needsDestructorStack ? \"destructors\" : \"null\";\r\n var args1 = [\r\n \"throwBindingError\",\r\n \"invoker\",\r\n \"fn\",\r\n \"runDestructors\",\r\n \"retType\",\r\n \"classParam\",\r\n ];\r\n var args2 = [\r\n throwBindingError,\r\n cppInvokerFunc,\r\n cppTargetFunc,\r\n runDestructors,\r\n argTypes[0],\r\n argTypes[1],\r\n ];\r\n if (isClassMethodFunc) {\r\n invokerFnBody +=\r\n \"var thisWired = classParam.toWireType(\" + dtorStack + \", this);\\n\";\r\n }\r\n for (var i = 0; i < argCount - 2; ++i) {\r\n invokerFnBody +=\r\n \"var arg\" +\r\n i +\r\n \"Wired = argType\" +\r\n i +\r\n \".toWireType(\" +\r\n dtorStack +\r\n \", arg\" +\r\n i +\r\n \"); // \" +\r\n argTypes[i + 2].name +\r\n \"\\n\";\r\n args1.push(\"argType\" + i);\r\n args2.push(argTypes[i + 2]);\r\n }\r\n if (isClassMethodFunc) {\r\n argsListWired =\r\n \"thisWired\" + (argsListWired.length > 0 ? \", \" : \"\") + argsListWired;\r\n }\r\n invokerFnBody +=\r\n (returns ? \"var rv = \" : \"\") +\r\n \"invoker(fn\" +\r\n (argsListWired.length > 0 ? \", \" : \"\") +\r\n argsListWired +\r\n \");\\n\";\r\n if (needsDestructorStack) {\r\n invokerFnBody += \"runDestructors(destructors);\\n\";\r\n } else {\r\n for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {\r\n var paramName = i === 1 ? \"thisWired\" : \"arg\" + (i - 2) + \"Wired\";\r\n if (argTypes[i].destructorFunction !== null) {\r\n invokerFnBody +=\r\n paramName +\r\n \"_dtor(\" +\r\n paramName +\r\n \"); // \" +\r\n argTypes[i].name +\r\n \"\\n\";\r\n args1.push(paramName + \"_dtor\");\r\n args2.push(argTypes[i].destructorFunction);\r\n }\r\n }\r\n }\r\n if (returns) {\r\n invokerFnBody +=\r\n \"var ret = retType.fromWireType(rv);\\n\" + \"return ret;\\n\";\r\n } else {\r\n }\r\n invokerFnBody += \"}\\n\";\r\n args1.push(invokerFnBody);\r\n var invokerFunction = new_(Function, args1).apply(null, args2);\r\n return invokerFunction;\r\n }\r\n\r\n function __embind_register_class_function(\r\n rawClassType,\r\n methodName,\r\n argCount,\r\n rawArgTypesAddr,\r\n invokerSignature,\r\n rawInvoker,\r\n context,\r\n isPureVirtual\r\n ) {\r\n var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);\r\n methodName = readLatin1String(methodName);\r\n rawInvoker = embind__requireFunction(invokerSignature, rawInvoker);\r\n whenDependentTypesAreResolved([], [rawClassType], function (classType) {\r\n classType = classType[0];\r\n var humanName = classType.name + \".\" + methodName;\r\n if (methodName.startsWith(\"@@\")) {\r\n methodName = Symbol[methodName.substring(2)];\r\n }\r\n if (isPureVirtual) {\r\n classType.registeredClass.pureVirtualFunctions.push(methodName);\r\n }\r\n\r\n function unboundTypesHandler() {\r\n throwUnboundTypeError(\r\n \"Cannot call \" + humanName + \" due to unbound types\",\r\n rawArgTypes\r\n );\r\n }\r\n\r\n var proto = classType.registeredClass.instancePrototype;\r\n var method = proto[methodName];\r\n if (\r\n undefined === method ||\r\n (undefined === method.overloadTable &&\r\n method.className !== classType.name &&\r\n method.argCount === argCount - 2)\r\n ) {\r\n unboundTypesHandler.argCount = argCount - 2;\r\n unboundTypesHandler.className = classType.name;\r\n proto[methodName] = unboundTypesHandler;\r\n } else {\r\n ensureOverloadTable(proto, methodName, humanName);\r\n proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler;\r\n }\r\n whenDependentTypesAreResolved([], rawArgTypes, function (argTypes) {\r\n var memberFunction = craftInvokerFunction(\r\n humanName,\r\n argTypes,\r\n classType,\r\n rawInvoker,\r\n context\r\n );\r\n if (undefined === proto[methodName].overloadTable) {\r\n memberFunction.argCount = argCount - 2;\r\n proto[methodName] = memberFunction;\r\n } else {\r\n proto[methodName].overloadTable[argCount - 2] = memberFunction;\r\n }\r\n return [];\r\n });\r\n return [];\r\n });\r\n }\r\n\r\n var emval_free_list = [];\r\n var emval_handle_array = [\r\n {},\r\n { value: undefined },\r\n { value: null },\r\n { value: true },\r\n { value: false },\r\n ];\r\n\r\n function __emval_decref(handle) {\r\n if (handle > 4 && 0 === --emval_handle_array[handle].refcount) {\r\n emval_handle_array[handle] = undefined;\r\n emval_free_list.push(handle);\r\n }\r\n }\r\n\r\n function count_emval_handles() {\r\n var count = 0;\r\n for (var i = 5; i < emval_handle_array.length; ++i) {\r\n if (emval_handle_array[i] !== undefined) {\r\n ++count;\r\n }\r\n }\r\n return count;\r\n }\r\n\r\n function get_first_emval() {\r\n for (var i = 5; i < emval_handle_array.length; ++i) {\r\n if (emval_handle_array[i] !== undefined) {\r\n return emval_handle_array[i];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function init_emval() {\r\n Module[\"count_emval_handles\"] = count_emval_handles;\r\n Module[\"get_first_emval\"] = get_first_emval;\r\n }\r\n\r\n function __emval_register(value) {\r\n switch (value) {\r\n case undefined: {\r\n return 1;\r\n }\r\n case null: {\r\n return 2;\r\n }\r\n case true: {\r\n return 3;\r\n }\r\n case false: {\r\n return 4;\r\n }\r\n default: {\r\n var handle = emval_free_list.length\r\n ? emval_free_list.pop()\r\n : emval_handle_array.length;\r\n emval_handle_array[handle] = { refcount: 1, value: value };\r\n return handle;\r\n }\r\n }\r\n }\r\n\r\n function __embind_register_emval(rawType, name) {\r\n name = readLatin1String(name);\r\n registerType(rawType, {\r\n name: name,\r\n fromWireType: function (handle) {\r\n var rv = emval_handle_array[handle].value;\r\n __emval_decref(handle);\r\n return rv;\r\n },\r\n toWireType: function (destructors, value) {\r\n return __emval_register(value);\r\n },\r\n argPackAdvance: 8,\r\n readValueFromPointer: simpleReadValueFromPointer,\r\n destructorFunction: null,\r\n });\r\n }\r\n\r\n function _embind_repr(v) {\r\n if (v === null) {\r\n return \"null\";\r\n }\r\n var t = typeof v;\r\n if (t === \"object\" || t === \"array\" || t === \"function\") {\r\n return v.toString();\r\n } else {\r\n return \"\" + v;\r\n }\r\n }\r\n\r\n function floatReadValueFromPointer(name, shift) {\r\n switch (shift) {\r\n case 2:\r\n return function (pointer) {\r\n return this[\"fromWireType\"](HEAPF32[pointer >> 2]);\r\n };\r\n case 3:\r\n return function (pointer) {\r\n return this[\"fromWireType\"](HEAPF64[pointer >> 3]);\r\n };\r\n default:\r\n throw new TypeError(\"Unknown float type: \" + name);\r\n }\r\n }\r\n\r\n function __embind_register_float(rawType, name, size) {\r\n var shift = getShiftFromSize(size);\r\n name = readLatin1String(name);\r\n registerType(rawType, {\r\n name: name,\r\n fromWireType: function (value) {\r\n return value;\r\n },\r\n toWireType: function (destructors, value) {\r\n if (typeof value !== \"number\" && typeof value !== \"boolean\") {\r\n throw new TypeError(\r\n 'Cannot convert \"' + _embind_repr(value) + '\" to ' + this.name\r\n );\r\n }\r\n return value;\r\n },\r\n argPackAdvance: 8,\r\n readValueFromPointer: floatReadValueFromPointer(name, shift),\r\n destructorFunction: null,\r\n });\r\n }\r\n\r\n function integerReadValueFromPointer(name, shift, signed) {\r\n switch (shift) {\r\n case 0:\r\n return signed\r\n ? function readS8FromPointer(pointer) {\r\n return HEAP8[pointer];\r\n }\r\n : function readU8FromPointer(pointer) {\r\n return HEAPU8[pointer];\r\n };\r\n case 1:\r\n return signed\r\n ? function readS16FromPointer(pointer) {\r\n return HEAP16[pointer >> 1];\r\n }\r\n : function readU16FromPointer(pointer) {\r\n return HEAPU16[pointer >> 1];\r\n };\r\n case 2:\r\n return signed\r\n ? function readS32FromPointer(pointer) {\r\n return HEAP32[pointer >> 2];\r\n }\r\n : function readU32FromPointer(pointer) {\r\n return HEAPU32[pointer >> 2];\r\n };\r\n default:\r\n throw new TypeError(\"Unknown integer type: \" + name);\r\n }\r\n }\r\n\r\n function __embind_register_integer(\r\n primitiveType,\r\n name,\r\n size,\r\n minRange,\r\n maxRange\r\n ) {\r\n name = readLatin1String(name);\r\n if (maxRange === -1) {\r\n maxRange = 4294967295;\r\n }\r\n var shift = getShiftFromSize(size);\r\n var fromWireType = function (value) {\r\n return value;\r\n };\r\n if (minRange === 0) {\r\n var bitshift = 32 - 8 * size;\r\n fromWireType = function (value) {\r\n return (value << bitshift) >>> bitshift;\r\n };\r\n }\r\n var isUnsignedType = name.includes(\"unsigned\");\r\n registerType(primitiveType, {\r\n name: name,\r\n fromWireType: fromWireType,\r\n toWireType: function (destructors, value) {\r\n if (typeof value !== \"number\" && typeof value !== \"boolean\") {\r\n throw new TypeError(\r\n 'Cannot convert \"' + _embind_repr(value) + '\" to ' + this.name\r\n );\r\n }\r\n if (value < minRange || value > maxRange) {\r\n throw new TypeError(\r\n 'Passing a number \"' +\r\n _embind_repr(value) +\r\n '\" from JS side to C/C++ side to an argument of type \"' +\r\n name +\r\n '\", which is outside the valid range [' +\r\n minRange +\r\n \", \" +\r\n maxRange +\r\n \"]!\"\r\n );\r\n }\r\n return isUnsignedType ? value >>> 0 : value | 0;\r\n },\r\n argPackAdvance: 8,\r\n readValueFromPointer: integerReadValueFromPointer(\r\n name,\r\n shift,\r\n minRange !== 0\r\n ),\r\n destructorFunction: null,\r\n });\r\n }\r\n\r\n function __embind_register_memory_view(rawType, dataTypeIndex, name) {\r\n var typeMapping = [\r\n Int8Array,\r\n Uint8Array,\r\n Int16Array,\r\n Uint16Array,\r\n Int32Array,\r\n Uint32Array,\r\n Float32Array,\r\n Float64Array,\r\n ];\r\n var TA = typeMapping[dataTypeIndex];\r\n\r\n function decodeMemoryView(handle) {\r\n handle = handle >> 2;\r\n var heap = HEAPU32;\r\n var size = heap[handle];\r\n var data = heap[handle + 1];\r\n return new TA(buffer, data, size);\r\n }\r\n\r\n name = readLatin1String(name);\r\n registerType(\r\n rawType,\r\n {\r\n name: name,\r\n fromWireType: decodeMemoryView,\r\n argPackAdvance: 8,\r\n readValueFromPointer: decodeMemoryView,\r\n },\r\n { ignoreDuplicateRegistrations: true }\r\n );\r\n }\r\n\r\n function __embind_register_std_string(rawType, name) {\r\n name = readLatin1String(name);\r\n var stdStringIsUTF8 = name === \"std::string\";\r\n registerType(rawType, {\r\n name: name,\r\n fromWireType: function (value) {\r\n var length = HEAPU32[value >> 2];\r\n var str;\r\n if (stdStringIsUTF8) {\r\n var decodeStartPtr = value + 4;\r\n for (var i = 0; i <= length; ++i) {\r\n var currentBytePtr = value + 4 + i;\r\n if (i == length || HEAPU8[currentBytePtr] == 0) {\r\n var maxRead = currentBytePtr - decodeStartPtr;\r\n var stringSegment = UTF8ToString(decodeStartPtr, maxRead);\r\n if (str === undefined) {\r\n str = stringSegment;\r\n } else {\r\n str += String.fromCharCode(0);\r\n str += stringSegment;\r\n }\r\n decodeStartPtr = currentBytePtr + 1;\r\n }\r\n }\r\n } else {\r\n var a = new Array(length);\r\n for (var i = 0; i < length; ++i) {\r\n a[i] = String.fromCharCode(HEAPU8[value + 4 + i]);\r\n }\r\n str = a.join(\"\");\r\n }\r\n _free(value);\r\n return str;\r\n },\r\n toWireType: function (destructors, value) {\r\n if (value instanceof ArrayBuffer) {\r\n value = new Uint8Array(value);\r\n }\r\n var getLength;\r\n var valueIsOfTypeString = typeof value === \"string\";\r\n if (\r\n !(\r\n valueIsOfTypeString ||\r\n value instanceof Uint8Array ||\r\n value instanceof Uint8ClampedArray ||\r\n value instanceof Int8Array\r\n )\r\n ) {\r\n throwBindingError(\"Cannot pass non-string to std::string\");\r\n }\r\n if (stdStringIsUTF8 && valueIsOfTypeString) {\r\n getLength = function () {\r\n return lengthBytesUTF8(value);\r\n };\r\n } else {\r\n getLength = function () {\r\n return value.length;\r\n };\r\n }\r\n var length = getLength();\r\n var ptr = _malloc(4 + length + 1);\r\n HEAPU32[ptr >> 2] = length;\r\n if (stdStringIsUTF8 && valueIsOfTypeString) {\r\n stringToUTF8(value, ptr + 4, length + 1);\r\n } else {\r\n if (valueIsOfTypeString) {\r\n for (var i = 0; i < length; ++i) {\r\n var charCode = value.charCodeAt(i);\r\n if (charCode > 255) {\r\n _free(ptr);\r\n throwBindingError(\r\n \"String has UTF-16 code units that do not fit in 8 bits\"\r\n );\r\n }\r\n HEAPU8[ptr + 4 + i] = charCode;\r\n }\r\n } else {\r\n for (var i = 0; i < length; ++i) {\r\n HEAPU8[ptr + 4 + i] = value[i];\r\n }\r\n }\r\n }\r\n if (destructors !== null) {\r\n destructors.push(_free, ptr);\r\n }\r\n return ptr;\r\n },\r\n argPackAdvance: 8,\r\n readValueFromPointer: simpleReadValueFromPointer,\r\n destructorFunction: function (ptr) {\r\n _free(ptr);\r\n },\r\n });\r\n }\r\n\r\n function __embind_register_std_wstring(rawType, charSize, name) {\r\n name = readLatin1String(name);\r\n var decodeString, encodeString, getHeap, lengthBytesUTF, shift;\r\n if (charSize === 2) {\r\n decodeString = UTF16ToString;\r\n encodeString = stringToUTF16;\r\n lengthBytesUTF = lengthBytesUTF16;\r\n getHeap = function () {\r\n return HEAPU16;\r\n };\r\n shift = 1;\r\n } else if (charSize === 4) {\r\n decodeString = UTF32ToString;\r\n encodeString = stringToUTF32;\r\n lengthBytesUTF = lengthBytesUTF32;\r\n getHeap = function () {\r\n return HEAPU32;\r\n };\r\n shift = 2;\r\n }\r\n registerType(rawType, {\r\n name: name,\r\n fromWireType: function (value) {\r\n var length = HEAPU32[value >> 2];\r\n var HEAP = getHeap();\r\n var str;\r\n var decodeStartPtr = value + 4;\r\n for (var i = 0; i <= length; ++i) {\r\n var currentBytePtr = value + 4 + i * charSize;\r\n if (i == length || HEAP[currentBytePtr >> shift] == 0) {\r\n var maxReadBytes = currentBytePtr - decodeStartPtr;\r\n var stringSegment = decodeString(decodeStartPtr, maxReadBytes);\r\n if (str === undefined) {\r\n str = stringSegment;\r\n } else {\r\n str += String.fromCharCode(0);\r\n str += stringSegment;\r\n }\r\n decodeStartPtr = currentBytePtr + charSize;\r\n }\r\n }\r\n _free(value);\r\n return str;\r\n },\r\n toWireType: function (destructors, value) {\r\n if (!(typeof value === \"string\")) {\r\n throwBindingError(\r\n \"Cannot pass non-string to C++ string type \" + name\r\n );\r\n }\r\n var length = lengthBytesUTF(value);\r\n var ptr = _malloc(4 + length + charSize);\r\n HEAPU32[ptr >> 2] = length >> shift;\r\n encodeString(value, ptr + 4, length + charSize);\r\n if (destructors !== null) {\r\n destructors.push(_free, ptr);\r\n }\r\n return ptr;\r\n },\r\n argPackAdvance: 8,\r\n readValueFromPointer: simpleReadValueFromPointer,\r\n destructorFunction: function (ptr) {\r\n _free(ptr);\r\n },\r\n });\r\n }\r\n\r\n function __embind_register_void(rawType, name) {\r\n name = readLatin1String(name);\r\n registerType(rawType, {\r\n isVoid: true,\r\n name: name,\r\n argPackAdvance: 0,\r\n fromWireType: function () {\r\n return undefined;\r\n },\r\n toWireType: function (destructors, o) {\r\n return undefined;\r\n },\r\n });\r\n }\r\n\r\n function __emval_incref(handle) {\r\n if (handle > 4) {\r\n emval_handle_array[handle].refcount += 1;\r\n }\r\n }\r\n\r\n function requireRegisteredType(rawType, humanName) {\r\n var impl = registeredTypes[rawType];\r\n if (undefined === impl) {\r\n throwBindingError(\r\n humanName + \" has unknown type \" + getTypeName(rawType)\r\n );\r\n }\r\n return impl;\r\n }\r\n\r\n function __emval_take_value(type, argv) {\r\n type = requireRegisteredType(type, \"_emval_take_value\");\r\n var v = type[\"readValueFromPointer\"](argv);\r\n return __emval_register(v);\r\n }\r\n\r\n function _abort() {\r\n abort();\r\n }\r\n\r\n function _emscripten_memcpy_big(dest, src, num) {\r\n HEAPU8.copyWithin(dest, src, src + num);\r\n }\r\n\r\n function emscripten_realloc_buffer(size) {\r\n try {\r\n wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16);\r\n updateGlobalBufferAndViews(wasmMemory.buffer);\r\n return 1;\r\n } catch (e) {}\r\n }\r\n\r\n function _emscripten_resize_heap(requestedSize) {\r\n var oldSize = HEAPU8.length;\r\n requestedSize = requestedSize >>> 0;\r\n var maxHeapSize = 2147483648;\r\n if (requestedSize > maxHeapSize) {\r\n return false;\r\n }\r\n for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\r\n var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\r\n overGrownHeapSize = Math.min(\r\n overGrownHeapSize,\r\n requestedSize + 100663296\r\n );\r\n var newSize = Math.min(\r\n maxHeapSize,\r\n alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)\r\n );\r\n var replacement = emscripten_realloc_buffer(newSize);\r\n if (replacement) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n embind_init_charCodes();\r\n BindingError = Module[\"BindingError\"] = extendError(Error, \"BindingError\");\r\n InternalError = Module[\"InternalError\"] = extendError(\r\n Error,\r\n \"InternalError\"\r\n );\r\n init_ClassHandle();\r\n init_RegisteredPointer();\r\n init_embind();\r\n UnboundTypeError = Module[\"UnboundTypeError\"] = extendError(\r\n Error,\r\n \"UnboundTypeError\"\r\n );\r\n init_emval();\r\n var ASSERTIONS = false;\r\n\r\n function intArrayToString(array) {\r\n var ret = [];\r\n for (var i = 0; i < array.length; i++) {\r\n var chr = array[i];\r\n if (chr > 255) {\r\n if (ASSERTIONS) {\r\n assert(\r\n false,\r\n \"Character code \" +\r\n chr +\r\n \" (\" +\r\n String.fromCharCode(chr) +\r\n \") at offset \" +\r\n i +\r\n \" not in 0x00-0xFF.\"\r\n );\r\n }\r\n chr &= 255;\r\n }\r\n ret.push(String.fromCharCode(chr));\r\n }\r\n return ret.join(\"\");\r\n }\r\n\r\n var decodeBase64 =\r\n typeof atob === \"function\"\r\n ? atob\r\n : function (input) {\r\n var keyStr =\r\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n var output = \"\";\r\n var chr1, chr2, chr3;\r\n var enc1, enc2, enc3, enc4;\r\n var i = 0;\r\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\r\n do {\r\n enc1 = keyStr.indexOf(input.charAt(i++));\r\n enc2 = keyStr.indexOf(input.charAt(i++));\r\n enc3 = keyStr.indexOf(input.charAt(i++));\r\n enc4 = keyStr.indexOf(input.charAt(i++));\r\n chr1 = (enc1 << 2) | (enc2 >> 4);\r\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\r\n chr3 = ((enc3 & 3) << 6) | enc4;\r\n output = output + String.fromCharCode(chr1);\r\n if (enc3 !== 64) {\r\n output = output + String.fromCharCode(chr2);\r\n }\r\n if (enc4 !== 64) {\r\n output = output + String.fromCharCode(chr3);\r\n }\r\n } while (i < input.length);\r\n return output;\r\n };\r\n\r\n function intArrayFromBase64(s) {\r\n try {\r\n var decoded = decodeBase64(s);\r\n var bytes = new Uint8Array(decoded.length);\r\n for (var i = 0; i < decoded.length; ++i) {\r\n bytes[i] = decoded.charCodeAt(i);\r\n }\r\n return bytes;\r\n } catch (_) {\r\n throw new Error(\"Converting base64 string to bytes failed.\");\r\n }\r\n }\r\n\r\n function tryParseAsDataURI(filename) {\r\n if (!isDataURI(filename)) {\r\n return;\r\n }\r\n return intArrayFromBase64(filename.slice(dataURIPrefix.length));\r\n }\r\n\r\n var asmLibraryArg = {\r\n m: ___cxa_allocate_exception,\r\n l: ___cxa_throw,\r\n o: __embind_register_bigint,\r\n h: __embind_register_bool,\r\n s: __embind_register_class,\r\n n: __embind_register_class_constructor,\r\n c: __embind_register_class_function,\r\n r: __embind_register_emval,\r\n f: __embind_register_float,\r\n b: __embind_register_integer,\r\n a: __embind_register_memory_view,\r\n g: __embind_register_std_string,\r\n e: __embind_register_std_wstring,\r\n i: __embind_register_void,\r\n j: __emval_decref,\r\n k: __emval_incref,\r\n t: __emval_take_value,\r\n d: _abort,\r\n p: _emscripten_memcpy_big,\r\n q: _emscripten_resize_heap,\r\n };\r\n var asm = createWasm();\r\n var ___wasm_call_ctors = (Module[\"___wasm_call_ctors\"] = function () {\r\n return (___wasm_call_ctors = Module[\"___wasm_call_ctors\"] =\r\n Module[\"asm\"][\"v\"]).apply(null, arguments);\r\n });\r\n var ___getTypeName = (Module[\"___getTypeName\"] = function () {\r\n return (___getTypeName = Module[\"___getTypeName\"] =\r\n Module[\"asm\"][\"x\"]).apply(null, arguments);\r\n });\r\n var ___embind_register_native_and_builtin_types = (Module[\r\n \"___embind_register_native_and_builtin_types\"\r\n ] = function () {\r\n return (___embind_register_native_and_builtin_types = Module[\r\n \"___embind_register_native_and_builtin_types\"\r\n ] =\r\n Module[\"asm\"][\"y\"]).apply(null, arguments);\r\n });\r\n var _malloc = (Module[\"_malloc\"] = function () {\r\n return (_malloc = Module[\"_malloc\"] = Module[\"asm\"][\"z\"]).apply(\r\n null,\r\n arguments\r\n );\r\n });\r\n var _free = (Module[\"_free\"] = function () {\r\n return (_free = Module[\"_free\"] = Module[\"asm\"][\"A\"]).apply(\r\n null,\r\n arguments\r\n );\r\n });\r\n var calledRun;\r\n dependenciesFulfilled = function runCaller() {\r\n if (!calledRun) {\r\n run();\r\n }\r\n if (!calledRun) {\r\n dependenciesFulfilled = runCaller;\r\n }\r\n };\r\n\r\n function run(args) {\r\n args = args || arguments_;\r\n if (runDependencies > 0) {\r\n return;\r\n }\r\n preRun();\r\n if (runDependencies > 0) {\r\n return;\r\n }\r\n\r\n function doRun() {\r\n if (calledRun) {\r\n return;\r\n }\r\n calledRun = true;\r\n Module[\"calledRun\"] = true;\r\n if (ABORT) {\r\n return;\r\n }\r\n initRuntime();\r\n readyPromiseResolve(Module);\r\n if (Module[\"onRuntimeInitialized\"]) {\r\n Module[\"onRuntimeInitialized\"]();\r\n }\r\n postRun();\r\n }\r\n\r\n if (Module[\"setStatus\"]) {\r\n Module[\"setStatus\"](\"Running...\");\r\n setTimeout(function () {\r\n setTimeout(function () {\r\n Module[\"setStatus\"](\"\");\r\n }, 1);\r\n doRun();\r\n }, 1);\r\n } else {\r\n doRun();\r\n }\r\n }\r\n\r\n Module[\"run\"] = run;\r\n if (Module[\"preInit\"]) {\r\n if (typeof Module[\"preInit\"] == \"function\") {\r\n Module[\"preInit\"] = [Module[\"preInit\"]];\r\n }\r\n while (Module[\"preInit\"].length > 0) {\r\n Module[\"preInit\"].pop()();\r\n }\r\n }\r\n run();\r\n\r\n return Module.ready;\r\n };\r\n})();\r\nif (typeof exports === \"object\" && typeof module === \"object\") {\r\n module.exports = Module;\r\n} else {\r\n if (typeof define === \"function\" && define[\"amd\"]) {\r\n define([], function () {\r\n return Module;\r\n });\r\n } else {\r\n if (typeof exports === \"object\") {\r\n exports[\"Module\"] = Module;\r\n }\r\n }\r\n}\r\n","/**\r\n * Abstract base class for all web service clients.\r\n */\r\nexport class WebServiceClient {\r\n private readonly baseUrl: string\r\n private params: { [ key: string ]: string }\r\n private path: string\r\n\r\n /**\r\n * Construct a base webservice.\r\n * @param baseUrl The base URL of the webservice (without any parameters).\r\n * @param params The parameters given to the webservice. These will be URI\r\n * encoded automatically so there is no need for encoding in this argument.\r\n */\r\n constructor (baseUrl: string, params: { [key: string ]: string } | undefined) {\r\n this.baseUrl = baseUrl\r\n this.path = ''\r\n if (params === undefined) {\r\n this.params = {}\r\n } else {\r\n this.params = params\r\n }\r\n }\r\n\r\n /**\r\n * Add a path to the base URL.\r\n * @param path The path to add.\r\n */\r\n public setPath (path: string): void {\r\n this.path = path\r\n }\r\n\r\n /**\r\n * Sets the given parameters.\r\n * @param params The parameters to be set. These will be URI\r\n * encoded automatically so there is no need for encoding in this argument.\r\n */\r\n public setParams (params: { [key: string ]: string }): void {\r\n this.params = params\r\n }\r\n\r\n /**\r\n * Add a single parameter to the list of parameters. If a parameter\r\n * with the given key already exists it will be overwritten.\r\n * @param key The key of the parameter to add.\r\n * @param value The value of the parameter to add.\r\n */\r\n public addParam (key: string, value: string): void {\r\n this.params[key] = value\r\n }\r\n\r\n /**\r\n * Check whether a given parameter is present.\r\n * @param key The key to search for.\r\n * @returns Whether or not the parameter list contains the given key.\r\n */\r\n public hasParam (key: string): boolean {\r\n return key in this.params\r\n }\r\n\r\n /**\r\n * Getter for the entire URL needed to invoke the web service\r\n * with the given parameters.\r\n */\r\n public url (): string {\r\n return `${this.baseUrl}${this.path}?${this.urlEncodedParams}`\r\n }\r\n\r\n /**\r\n * Getter for the parameter string.\r\n */\r\n private get urlEncodedParams (): string {\r\n const paramTokens = Object.keys(this.params)\r\n .reduce((acc: string[], val: string): string[] => {\r\n let token = `${encodeURIComponent(val)}`\r\n if (this.params[val] !== '') {\r\n token = `${token}=${encodeURIComponent(this.params[val])}`\r\n }\r\n return acc.concat([token])\r\n }, [])\r\n const paramString = paramTokens.join('&')\r\n return paramString\r\n }\r\n}\r\n","import { WebServiceClient } from '../WebServiceClient'\r\n\r\nexport default class GeoAuth extends WebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/token' }\r\n\r\n constructor (params: {username: string, password: string, role: string} | {permaToken: string}) {\r\n super(GeoAuth.URL, params)\r\n }\r\n\r\n async fetchToken (): Promise<string> {\r\n const response: Response = await fetch(this.url())\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n const tokenData = await response.text()\r\n if (tokenData.length < 3) {\r\n throw new Error('Token of invalid length received.')\r\n }\r\n\r\n return tokenData.slice(1,-1);\r\n }\r\n}\r\n","import { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { AnyAction } from 'redux'\r\nimport GeoAuth from '../dataSources/geo/GeoAuth'\r\nimport jwtDecode, { JwtPayload } from 'jwt-decode'\r\nimport { DataAction, EmptyAction, MessageAction } from 'src/CustomTypes'\r\n\r\nexport const SET_TOKEN = 'AUTH_ACTION_SET_TOKEN'\r\nexport const SET_USER_CREDENTIALS = 'AUTH_ACTION_SET_USER_CREDENTIALS'\r\nexport const SET_TOKEN_EXPIRED = 'AUTH_ACTION_SET_TOKEN_EXPIRED'\r\nexport const LOGIN_STARTED = 'AUTH_ACTION_LOGIN_STARTED'\r\nexport const LOGIN_FAILURE = 'AUTH_ACTION_LOGIN_FAILURE'\r\nexport const LOGIN_SUCCESS = 'AUTH_ACTION_LOGIN_SUCCESS'\r\nexport const LOGOUT = 'AUTH_ACTION_LOGOUT'\r\n\r\nexport interface TokenBundle {\r\n token: string\r\n tokenExpirationTimestamp: number\r\n}\r\n\r\nexport interface UserCredentials {\r\n username: string\r\n password: string\r\n}\r\n\r\ninterface AuthActions {\r\n setToken: (token: string, tokenExpirationTimestamp: number) => DataAction<TokenBundle>\r\n setUserCredentials: (username: string, password: string) => DataAction<UserCredentials>\r\n setTokenExpired: () => EmptyAction\r\n loginStarted: () => EmptyAction\r\n loginFailure: (errorMessage: string) => MessageAction\r\n loginSuccess: () => EmptyAction\r\n logout: () => EmptyAction\r\n\r\n // Thunk actions.\r\n login: (credentials: {username: string, password: string} | {permaToken: string}) => ThunkAction<Promise<void>, {}, {}, AnyAction>\r\n}\r\n\r\nexport const authActions: AuthActions = {\r\n setToken: (token: string, tokenExpirationTimestamp: number): DataAction<TokenBundle> => {\r\n return {\r\n type: SET_TOKEN,\r\n data: { token, tokenExpirationTimestamp }\r\n }\r\n },\r\n setUserCredentials: (username: string, password: string): DataAction<UserCredentials> => {\r\n return {\r\n type: SET_USER_CREDENTIALS,\r\n data: { username, password }\r\n }\r\n },\r\n setTokenExpired: (): EmptyAction => {\r\n return {\r\n type: SET_TOKEN_EXPIRED\r\n }\r\n },\r\n loginStarted: (): EmptyAction => {\r\n return {\r\n type: LOGIN_STARTED\r\n }\r\n },\r\n loginFailure: (errorMessage: string): MessageAction => {\r\n return {\r\n type: LOGIN_FAILURE,\r\n message: errorMessage\r\n }\r\n },\r\n loginSuccess: (): EmptyAction => {\r\n return {\r\n type: LOGIN_SUCCESS\r\n }\r\n },\r\n logout: (): EmptyAction => {\r\n return {\r\n type: LOGOUT\r\n }\r\n },\r\n login: (credentials: {username: string, password: string} | {permaToken: string}): ThunkAction<Promise<void>, {}, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<{}, {}, AnyAction>): Promise<void> => {\r\n return await new Promise<void>(resolve => {\r\n dispatch(authActions.loginStarted())\r\n const usingPermaToken = 'permaToken' in credentials\r\n const authParams = usingPermaToken ? credentials : {...credentials, role: 'Undervisningsplatform'}\r\n const auth = new GeoAuth(authParams)\r\n auth.fetchToken()\r\n .then(token => {\r\n const parsedToken = jwtDecode<JwtPayload>(token)\r\n if (parsedToken.exp === undefined) {\r\n dispatch(authActions.loginFailure('Invalid expiration timestamp!'))\r\n return\r\n }\r\n\r\n if (usingPermaToken) {\r\n dispatch(authActions.setUserCredentials((parsedToken as any)[\"GAL.UserName\"], 'using-accesstoken'))\r\n }\r\n else {\r\n dispatch(authActions.setUserCredentials(credentials.username, credentials.password))\r\n }\r\n dispatch(authActions.setToken(token, parsedToken.exp * 1000)) // multiply by 1000 to get milliseconds\r\n dispatch(authActions.loginSuccess())\r\n })\r\n .catch(err => {\r\n dispatch(authActions.loginFailure(err.toString()))\r\n })\r\n })\r\n }\r\n }\r\n}\r\n","import { WebServiceClient } from '../WebServiceClient'\r\n\r\nexport class GeoWebServiceClient extends WebServiceClient {\r\n private _token: string\r\n\r\n constructor (baseUrl: string, token: string | undefined, params: {[key: string]: string} | undefined) {\r\n const geoParams = {\r\n ...params,\r\n geoAreaId: '1'\r\n }\r\n super(baseUrl, geoParams)\r\n this._token = token === undefined ? '' : token\r\n }\r\n\r\n get token (): string {\r\n return this._token\r\n }\r\n\r\n set token (token: string) {\r\n this._token = token\r\n }\r\n}\r\n","/**\r\nService for fetching a map legend for a given geo model layer.\r\n\r\nReturn a list of layers i JSON format with color, long name, name and sort oder.\r\n*/\r\n\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * Object type describing the properties of the available layers.\r\n */\r\nexport interface MapLegendObject {\r\n Color: string\r\n Name: string\r\n LongName: string\r\n SortOrder: string\r\n}\r\n\r\n/**\r\n * Web service for fetching a map legend for a given geo model layer.\r\n * The following parameter is required: 'ModelId' ( @see setModelId ).\r\n */\r\nexport class MapLegend extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/maplegend' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n super(MapLegend.URL, token, {})\r\n }\r\n\r\n /**\r\n * [Required*] Setter for the model id.\r\n * @param modelId The model id.\r\n */\r\n setModelId (modelId: string): void {\r\n this.addParam('ModelId', modelId.toString())\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n */\r\n private validateParams (): void {\r\n if (!(this.hasParam('ModelId'))) {\r\n throw new Error('Parameter mismatch: The modelId param must be set.')\r\n }\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the map legend.\r\n */\r\n async fetchMapLegend (): Promise<MapLegendObject[]> {\r\n this.validateParams()\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n return await response.json()\r\n }\r\n}\r\n","import { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * Interface for representing a 2D bounding box on the map.\r\n */\r\nexport interface GeoModelBoundingBox {\r\n MinX: number\r\n MinY: number\r\n MaxX: number\r\n MaxY: number\r\n Srid: number\r\n}\r\n\r\n/**\r\n * Interface for the objects that come out of the 'geomodel'\r\n * webservice on Geo's servers.\r\n */\r\nexport interface GeoModel {\r\n ID: string\r\n Name: string\r\n Description: string\r\n BoundingBox: GeoModelBoundingBox\r\n Type: number\r\n Priority: number\r\n Geometry: GeoGeometry\r\n}\r\n\r\n/**\r\n * Interface for the geometry part of the Geo models.\r\n */\r\nexport interface GeoGeometry {\r\n type: string\r\n coordinates: ol.Coordinate[][]\r\n}\r\n\r\n/**\r\n * Web service client for fetching the model areas within Geo's\r\n * system (used for profile tool, virtual boring, and the slice layers).\r\n */\r\nexport class GeoModelService extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/geomodel' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n super(GeoModelService.URL, token, { format: 'geojson' })\r\n }\r\n\r\n /**\r\n * [Required] Setter for the x coordinate.\r\n * @param x The x coordinate.\r\n */\r\n setX (x: number): void {\r\n this.addParam('x', x.toString())\r\n }\r\n\r\n /**\r\n * [Required] Setter for the y coordinate.\r\n * @param y The y coordinate.\r\n */\r\n setY (y: number): void {\r\n this.addParam('y', y.toString())\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n * In this case that means that we check that either none of\r\n * x and y are set, or that they both are set.\r\n */\r\n private validateParams (): void {\r\n const hasX = this.hasParam('x')\r\n const hasY = this.hasParam('y')\r\n if ((hasX || hasY) && !(hasX && hasY)) {\r\n throw new Error('Parameter mismatch: Both x and y are needed.')\r\n }\r\n }\r\n\r\n /**\r\n * For some reason, the Geo webservice returns the models as an escaped\r\n * GeoJSON object, i.e. it has been placed within a string and all\r\n * \"-characters have been escaped. This method unwraps such objects.\r\n * @param stringRepr The escaped string representation of a JSON object.\r\n * @returns The unpacked JSON object.\r\n */\r\n private parseGeojsonString (stringRepr: string): any {\r\n stringRepr = stringRepr.replaceAll('\\\\\"', '\"') // Unescape the \" character.\r\n stringRepr = stringRepr.substring(1, stringRepr.length - 1) // Remove the leading and trailing \" character.\r\n return JSON.parse(stringRepr) // And finally parse the JSON inside.\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the model area objects.\r\n * @throws An Error if an invalid response object is returned.\r\n */\r\n async fetchModels (): Promise<GeoModel[]> {\r\n this.validateParams()\r\n\r\n // Fetch the full GEOJSON model list.\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n const responseData = await response.text()\r\n const jsonResponse = this.parseGeojsonString(responseData)\r\n const models: GeoModel[] = []\r\n jsonResponse.features.forEach((feature: any) => {\r\n models.push({\r\n ID: feature.properties.Id,\r\n Name: feature.properties.Name,\r\n Description: feature.properties.Description,\r\n BoundingBox: {\r\n MinX: feature.properties.BoundingBox.MinX,\r\n MinY: feature.properties.BoundingBox.MinY,\r\n MaxX: feature.properties.BoundingBox.MaxX,\r\n MaxY: feature.properties.BoundingBox.MaxY,\r\n Srid: feature.properties.BoundingBox.Srid\r\n },\r\n Type: feature.properties.Type,\r\n Priority: feature.properties.Priority,\r\n Geometry: feature.geometry\r\n })\r\n })\r\n\r\n return models\r\n }\r\n}\r\n","/**\r\n * Web service for fetching addresses based on a query string.\r\n *\r\n * Example output:\r\n *\r\n * curl https://api.dataforsyningen.dk/adgangsadresser?vejnavn=Aabogade&husnr=34&struktur=mini\r\n *\r\n * {\r\n \"id\": \"0a3f5097-3266-32b8-e044-0003ba298018\",\r\n \"status\": 1,\r\n \"darstatus\": 3,\r\n \"vejkode\": \"9651\",\r\n \"vejnavn\": \"Åbogade\",\r\n \"adresseringsvejnavn\": \"Åbogade\",\r\n \"husnr\": \"34\",\r\n \"supplerendebynavn\": null,\r\n \"postnr\": \"8200\",\r\n \"postnrnavn\": \"Aarhus N\",\r\n \"stormodtagerpostnr\": null,\r\n \"stormodtagerpostnrnavn\": null,\r\n \"kommunekode\": \"0751\",\r\n \"x\": 10.18832178,\r\n \"y\": 56.17211123,\r\n \"href\": \"https://api.dataforsyningen.dk/adgangsadresser/0a3f5097-3266-32b8-e044-0003ba298018\",\r\n \"betegnelse\": \"Åbogade 34, 8200 Aarhus N\"\r\n }\r\n */\r\nimport { WebServiceClient } from '../WebServiceClient'\r\n\r\nexport interface AddressResult {\r\n data?: {\r\n id: string\r\n vejnavn?: string\r\n husnr?: string\r\n postnr?: string\r\n postnrnavn?: string\r\n betegnelse?: string\r\n supplerendebynavn?: string\r\n x?: number\r\n y?: number\r\n }\r\n tekst?: string\r\n}\r\n\r\nexport class Address extends WebServiceClient {\r\n static get URL (): string { return 'https://api.dataforsyningen.dk/autocomplete' }\r\n\r\n constructor () {\r\n const defaultParams = {\r\n srid: '25832',\r\n type: 'adresse',\r\n noFormat: '',\r\n struktur: 'mini',\r\n fuzzy: 'true',\r\n autocomplete: 'true'\r\n }\r\n super(Address.URL, defaultParams)\r\n }\r\n\r\n setQuery (query: string): void {\r\n this.addParam('q', query)\r\n }\r\n\r\n async fetchAddresses (): Promise<AddressResult[]> {\r\n const response: Response = await fetch(this.url())\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n return await response.json()\r\n }\r\n}\r\n","import { DataAction, EmptyAction, MessageAction } from 'src/CustomTypes'\r\nimport { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { AnyAction } from 'redux'\r\nimport { RootState } from 'src/Store'\r\nimport { MapLegend, MapLegendObject } from 'src/dataSources/geo/MapLegend'\r\nimport { DataTheme, ToolType } from 'src/Enums'\r\nimport { GeoModel, GeoModelService } from 'src/dataSources/geo/GeoModel'\r\nimport { Address, AddressResult } from 'src/dataSources/dataforsyningen/Address'\r\nimport { Graph } from 'src/dataSources/graphs/GraphRegistry'\r\n\r\nexport const ADD_GRAPH_GROUP = 'GENERAL_ACTIONS_ADD_GRAPH_GROUP'\r\nexport const FETCHING_ADDRESSES_STARTED = 'GENERAL_ACTIONS_FETCHING_ADDRESSES_STARTED'\r\nexport const FETCHING_ADDRESSES_SUCCESS = 'GENERAL_ACTIONS_FETCHING_ADDRESSES_SUCCESS'\r\nexport const FETCHING_ADDRESSES_FAILURE = 'GENERAL_ACTIONS_FETCHING_ADDRESSES_FAILURE'\r\nexport const FETCHING_GEO_MODELS_STARTED = 'GENERAL_ACTIONS_FETCHING_GEO_MODELS_STARTED'\r\nexport const FETCHING_GEO_MODELS_SUCCESS = 'GENERAL_ACTIONS_FETCHING_GEO_MODELS_SUCCESS'\r\nexport const FETCHING_GEO_MODELS_FAILURE = 'GENERAL_ACTIONS_FETCHING_GEO_MODELS_FAILURE'\r\nexport const FETCHING_MAP_LEGEND_STARTED = 'GENERAL_ACTIONS_FETCHING_MAP_LEGEND_STARTED'\r\nexport const FETCHING_MAP_LEGEND_SUCCESS = 'GENERAL_ACTIONS_FETCHING_MAP_LEGEND_SUCCESS'\r\nexport const FETCHING_MAP_LEGEND_FAILURE = 'GENERAL_ACTIONS_FETCHING_MAP_LEGEND_FAILURE'\r\nexport const REMOVE_GRAPH_GROUP = 'GENERAL_ACTIONS_REMOVE_GRAPH_GROUP'\r\nexport const SET_ADDRESS_QUERY = 'GENERAL_ACTIONS_SET_ADDRESS_QUERY'\r\nexport const SET_ADDRESSES = 'GENERAL_ACTIONS_SET_ADDRESSES'\r\nexport const SET_BOTTOM_BAR_DRAGGING = 'GENERAL_ACTIONS_SET_BOTTOM_BAR_DRAGGING'\r\nexport const SET_BOTTOM_BAR_HEIGHT = 'GENERAL_ACTIONS_SET_BOTTOM_BAR_HEIGHT'\r\nexport const SET_BOTTOM_BAR_WIDTH = 'GENERAL_ACTIONS_SET_BOTTOM_BAR_WIDTH'\r\nexport const SET_DATA_THEME = 'GENERAL_ACTIONS_SET_DATA_THEME'\r\nexport const SET_RIGHT_SIDE_BAR_DRAGGING = 'GENERAL_ACTIONS_SET_RIGHT_SIDE_BAR_DRAGGING'\r\nexport const SET_RIGHT_SIDE_BAR_WIDTH = 'GENERAL_ACTIONS_SET_RIGHT_SIDE_BAR_WIDTH'\r\nexport const SET_SELECTED_GEO_MODEL = 'GENERAL_ACTIONS_SET_SELECTED_GEO_MODEL'\r\nexport const SET_SELECTED_GRAPH = 'GENERAL_ACTIONS_SET_SELECTED_GRAPH'\r\nexport const SET_SELECTED_TOOL = 'GENERAL_ACTIONS_SET_SELECTED_TOOL'\r\nexport const SET_SHOW_CO2LEVELSORG_GRAPHS = 'GENERAL_ACTIONS_SET_SHOW_CO2LEVELSORG_GRAPHS'\r\nexport const SET_SHOW_LEFT_SIDE_BAR = 'GENERAL_ACTIONS_SET_SHOW_LEFT_SIDE_BAR'\r\n\r\ninterface GeneralActions {\r\n addGraphGroup: (graphGroup: string) => DataAction<string>\r\n fetchingAddressesStarted: () => EmptyAction\r\n fetchingAddressesFailure: (message: string) => MessageAction\r\n fetchingAddressesSuccess: (addresses: AddressResult[]) => DataAction<AddressResult[]>\r\n fetchingGeoModelsStarted: () => EmptyAction\r\n fetchingGeoModelsFailure: (message: string) => MessageAction\r\n fetchingGeoModelsSuccess: (geoModels: GeoModel[] | null) => DataAction<GeoModel[] | null>\r\n fetchingMapLegendStarted: () => EmptyAction\r\n fetchingMapLegendFailure: (message: string) => MessageAction\r\n fetchingMapLegendSuccess: (mapLegend: MapLegendObject[] | null) => DataAction<MapLegendObject[] | null>\r\n removeGraphGroup: (graph: string) => DataAction<string>\r\n setAddressQuery: (query: string) => DataAction<string>\r\n setBottomBarHeight: (height: number) => DataAction<number>\r\n setBottomBarWidth: (width: number) => DataAction<number>\r\n setBottomBarDragging: (dragging: Boolean) => DataAction<Boolean>\r\n setDataTheme: (dataTheme: DataTheme) => DataAction<DataTheme>\r\n setRightSideBarDragging: (dragging: Boolean) => DataAction<Boolean>\r\n setRightSideBarWidth: (width: number) => DataAction<number>\r\n setSelectedGeoModel: (model: GeoModel | undefined) => DataAction<GeoModel | undefined>\r\n setSelectedGraph: (graph: Graph | undefined) => DataAction<Graph | undefined>\r\n setSelectedTool: (toolType: ToolType) => DataAction<ToolType>\r\n setShowLeftSideBar: (show: boolean) => DataAction<boolean>\r\n\r\n // Thunk actions.\r\n fetchAddresses: (query: string) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n fetchGeoModels: (x: number | undefined, y: number | undefined) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n fetchMapLegend: (modelId: string) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const generalActions: GeneralActions = {\r\n addGraphGroup: (graphGroup: string): DataAction<string> => {\r\n return {\r\n type: ADD_GRAPH_GROUP,\r\n data: graphGroup\r\n }\r\n },\r\n fetchingAddressesStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_ADDRESSES_STARTED\r\n }\r\n },\r\n fetchingAddressesFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_ADDRESSES_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingAddressesSuccess: (addresses: AddressResult[]): DataAction<AddressResult[]> => {\r\n return {\r\n type: FETCHING_ADDRESSES_SUCCESS,\r\n data: addresses\r\n }\r\n },\r\n fetchingGeoModelsStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_GEO_MODELS_STARTED\r\n }\r\n },\r\n fetchingGeoModelsFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_GEO_MODELS_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingGeoModelsSuccess: (models: GeoModel[] | null): DataAction<GeoModel[] | null> => {\r\n return {\r\n type: FETCHING_GEO_MODELS_SUCCESS,\r\n data: models\r\n }\r\n },\r\n fetchAddresses: (query: string): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Fetch addresses\r\n dispatch(generalActions.fetchingAddressesStarted())\r\n const wsAddress = new Address()\r\n wsAddress.setQuery(query)\r\n let addresses: AddressResult[]\r\n try {\r\n addresses = await wsAddress.fetchAddresses()\r\n dispatch(generalActions.fetchingAddressesSuccess(addresses))\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(generalActions.fetchingAddressesFailure(errorMessage))\r\n }\r\n }\r\n },\r\n fetchGeoModels: (x: number | undefined, y: number | undefined): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Fetch models.\r\n const token = getState().authState.token\r\n dispatch(generalActions.fetchingGeoModelsStarted())\r\n const wsGeoModels = new GeoModelService(token)\r\n if (x !== undefined && y !== undefined) {\r\n wsGeoModels.setX(x)\r\n wsGeoModels.setY(y)\r\n }\r\n let models: GeoModel[]\r\n try {\r\n models = await wsGeoModels.fetchModels()\r\n dispatch(generalActions.fetchingGeoModelsSuccess(models))\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(generalActions.fetchingGeoModelsFailure(errorMessage))\r\n }\r\n }\r\n },\r\n fetchingMapLegendStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_MAP_LEGEND_STARTED\r\n }\r\n },\r\n fetchingMapLegendFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_MAP_LEGEND_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingMapLegendSuccess: (borehole: MapLegendObject[] | null): DataAction<MapLegendObject[] | null> => {\r\n return {\r\n type: FETCHING_MAP_LEGEND_SUCCESS,\r\n data: borehole\r\n }\r\n },\r\n fetchMapLegend: (modelId: string): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Fetch map legend.\r\n const token = getState().authState.token\r\n dispatch(generalActions.fetchingMapLegendStarted())\r\n const wsMapLegend = new MapLegend(token)\r\n wsMapLegend.setModelId(modelId)\r\n let mapLegend: MapLegendObject[]\r\n try {\r\n mapLegend = await wsMapLegend.fetchMapLegend()\r\n dispatch(generalActions.fetchingMapLegendSuccess(mapLegend))\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(generalActions.fetchingMapLegendFailure(errorMessage))\r\n }\r\n }\r\n },\r\n removeGraphGroup: (graphGroup: string): DataAction<string> => {\r\n return {\r\n type: REMOVE_GRAPH_GROUP,\r\n data: graphGroup\r\n }\r\n },\r\n setAddressQuery: (query: string): DataAction<string> => {\r\n return {\r\n type: SET_ADDRESS_QUERY,\r\n data: query\r\n }\r\n },\r\n setBottomBarHeight: (height: number): DataAction<number> => {\r\n return {\r\n type: SET_BOTTOM_BAR_HEIGHT,\r\n data: height\r\n }\r\n },\r\n setBottomBarWidth: (width: number): DataAction<number> => {\r\n return {\r\n type: SET_BOTTOM_BAR_WIDTH,\r\n data: width\r\n }\r\n },\r\n setBottomBarDragging: (dragging: Boolean): DataAction<Boolean> => {\r\n return {\r\n type: SET_BOTTOM_BAR_DRAGGING,\r\n data: dragging\r\n }\r\n },\r\n setDataTheme: (dataTheme: DataTheme): DataAction<DataTheme> => {\r\n return {\r\n type: SET_DATA_THEME,\r\n data: dataTheme\r\n }\r\n },\r\n setRightSideBarDragging: (dragging: Boolean): DataAction<Boolean> => {\r\n return {\r\n type: SET_RIGHT_SIDE_BAR_DRAGGING,\r\n data: dragging\r\n }\r\n },\r\n setRightSideBarWidth: (width: number): DataAction<number> => {\r\n return {\r\n type: SET_RIGHT_SIDE_BAR_WIDTH,\r\n data: width\r\n }\r\n },\r\n setSelectedGeoModel: (model: GeoModel | undefined): DataAction<GeoModel | undefined> => {\r\n return {\r\n type: SET_SELECTED_GEO_MODEL,\r\n data: model\r\n }\r\n },\r\n setSelectedGraph: (graph: Graph | undefined): DataAction<Graph | undefined> => {\r\n return {\r\n type: SET_SELECTED_GRAPH,\r\n data: graph\r\n }\r\n },\r\n setSelectedTool: (toolType: ToolType): DataAction<ToolType> => {\r\n return {\r\n type: SET_SELECTED_TOOL,\r\n data: toolType\r\n }\r\n },\r\n setShowLeftSideBar: (show: boolean): DataAction<boolean> => {\r\n return {\r\n type: SET_SHOW_LEFT_SIDE_BAR,\r\n data: show\r\n }\r\n }\r\n}\r\n","/**\r\nService for fetching a list of hydro models.\r\n*/\r\n\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * Object type describing the returned hydro models.\r\n */\r\nexport interface HydroModelObject {\r\n Id: number\r\n Name: string\r\n LongName: string\r\n Color: string\r\n EndDate: string\r\n MessuringPeriode: string\r\n WMSLayerName1: string\r\n WMSLayerName2: string\r\n WMSShapeUrl1: string\r\n WMSShapeUrl2: string\r\n areaInfo: {\r\n Description: string\r\n Id: number\r\n ModelBbox: {\r\n MinX: number\r\n MinY: number\r\n MaxX: number\r\n MaxY: number\r\n Srid: number\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Web service for fetching a list of hydro models.\r\n */\r\nexport class HydroModel extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/hydromodel' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n const defaultParams = {\r\n srid: '25832',\r\n geoareaid: '1'\r\n }\r\n super(HydroModel.URL, token, defaultParams)\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n */\r\n private validateParams (): void {\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing a list of hydro model object.\r\n */\r\n async fetchHydroModels (): Promise<HydroModelObject[]> {\r\n this.validateParams()\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n return await response.json()\r\n }\r\n}\r\n","import { AnyAction } from 'redux'\r\nimport { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { DataAction, EmptyAction, MessageAction } from 'src/CustomTypes'\r\nimport { HydroModel, HydroModelObject } from 'src/dataSources/geo/HydroModel'\r\nimport { RootState } from 'src/Store'\r\n\r\nexport const FETCHING_HYDRO_MODELS_STARTED =\r\n 'HYDRO_MODELS_ACTIONS_FETCHING_HYDRO_MODELS_STARTED'\r\nexport const FETCHING_HYDRO_MODELS_SUCCESS =\r\n 'HYDRO_MODELS_ACTIONS_FETCHING_HYDRO_MODELS_SUCCESS'\r\nexport const FETCHING_HYDRO_MODELS_FAILURE =\r\n 'HYDRO_MODELS_ACTIONS_FETCHING_HYDRO_MODELS_FAILURE'\r\n\r\ninterface HydroModelActions {\r\n fetchingHydroModelsStarted: () => EmptyAction\r\n fetchingHydroModelsFailure: (message: string) => MessageAction\r\n fetchingHydroModelsSuccess: (profile: HydroModelObject[]) => DataAction<HydroModelObject[]>\r\n\r\n // Thunk actions\r\n fetchHydroModels: () => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const hydroModelActions: HydroModelActions = {\r\n fetchingHydroModelsStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_HYDRO_MODELS_STARTED\r\n }\r\n },\r\n fetchingHydroModelsFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_HYDRO_MODELS_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingHydroModelsSuccess: (hydroModels: HydroModelObject[]): DataAction<HydroModelObject[]> => {\r\n return {\r\n type: FETCHING_HYDRO_MODELS_SUCCESS,\r\n data: hydroModels\r\n }\r\n },\r\n fetchHydroModels: (): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Fetch hydro models\r\n const token = getState().authState.token\r\n dispatch(hydroModelActions.fetchingHydroModelsStarted())\r\n\r\n const wsHydroModel = new HydroModel(token)\r\n try {\r\n let hydroModels = await wsHydroModel.fetchHydroModels()\r\n\r\n // Sort hydromodels alphabetically\r\n hydroModels = hydroModels.sort((a, b) => (a.Name > b.Name) ? 1 : ((b.Name > a.Name) ? -1 : 0))\r\n dispatch(hydroModelActions.fetchingHydroModelsSuccess(hydroModels))\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(hydroModelActions.fetchingHydroModelsFailure(errorMessage))\r\n }\r\n }\r\n }\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const wikiContentStyle = makeStyles(theme => ({\r\n image: {\r\n width: '100%',\r\n cursor: 'pointer'\r\n },\r\n root: {\r\n width: '100%',\r\n paddingTop: theme.spacing(2)\r\n },\r\n subtitle: {\r\n fontSize: '0.7rem'\r\n },\r\n text: {\r\n fontSize: '0.9rem'\r\n },\r\n video: {\r\n width: '100%'\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const videoEmbedStyle = makeStyles(theme => ({\r\n videoResponsive: {\r\n overflow: 'hidden',\r\n paddingBottom: '56.25%',\r\n position: 'relative',\r\n height: 0\r\n },\r\n iframe: {\r\n left: 0,\r\n top: 0,\r\n height: '100%',\r\n width: '100%',\r\n position: 'absolute'\r\n }\r\n}))\r\n","import { FC } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport { videoEmbedStyle } from './VideoEmbed.style'\r\n\r\n/**\r\n * VideoEmbedProps contains properties for the component.\r\n */\r\nexport interface VideoEmbedProps {\r\n url: string\r\n}\r\n\r\n/**\r\n * VideoEmbed embeds a video\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const VideoEmbed: FC<VideoEmbedProps> = (props: VideoEmbedProps) => {\r\n const classes = videoEmbedStyle()\r\n const intl = useIntl()\r\n\r\n return (\r\n <div className={classes.videoResponsive}>\r\n <iframe\r\n className={classes.iframe}\r\n src={props.url}\r\n frameBorder='0'\r\n allow='accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture'\r\n allowFullScreen\r\n title={intl.formatMessage({ id: 'embeddedvideo.title' })}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default VideoEmbed\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const fullSizeDialogStyle = makeStyles(theme => ({\r\n actions: {\r\n padding: '0px !important'\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n top: theme.spacing(-2.5),\r\n right: theme.spacing(-2.5),\r\n backgroundColor: theme.palette.geoColors.toolBar.light,\r\n color: theme.palette.geoColors.toolBar.main,\r\n '&:hover': {\r\n backgroundColor: `${theme.palette.geoColors.toolBar.light}cc`\r\n }\r\n },\r\n content: {\r\n padding: `${theme.spacing(1)}px !important`,\r\n paddingBottom: `${theme.spacing(0.5)}px !important`\r\n },\r\n root: {\r\n overflowY: 'unset'\r\n }\r\n}))\r\n","import { FC } from 'react'\r\nimport { Dialog, DialogContent, DialogActions, IconButton } from '@material-ui/core'\r\nimport { fullSizeDialogStyle } from './FullSizeDialog.style'\r\nimport { useIntl } from 'react-intl'\r\nimport { WikiService } from 'src/dataSources/wiki/Wiki'\r\nimport { Close } from '@material-ui/icons'\r\n\r\n/**\r\n * FullSizeDialogProps contains properties for the component.\r\n */\r\nexport interface FullSizeDialogProps {\r\n open: boolean\r\n imageKey: string\r\n handleClose: () => void\r\n}\r\n\r\n/**\r\n * FullSizeDialog displays an image in its original size up to a max width\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const FullSizeDialog: FC<FullSizeDialogProps> = (props: FullSizeDialogProps) => {\r\n const classes = fullSizeDialogStyle()\r\n const intl = useIntl()\r\n\r\n const wikiService = new WikiService()\r\n\r\n return (\r\n <Dialog\r\n open={props.open}\r\n onClose={props.handleClose}\r\n classes={{ paper: classes.root }}\r\n maxWidth='xl'\r\n >\r\n <DialogContent className={classes.content}>\r\n <img src={wikiService.getImageUrl(props.imageKey)} alt={intl.formatMessage({ id: 'wiki.content.image' })} />\r\n </DialogContent>\r\n <DialogActions className={classes.actions}>\r\n <IconButton\r\n className={classes.closeButton}\r\n size='small'\r\n onClick={props.handleClose}\r\n >\r\n <Close />\r\n </IconButton>\r\n </DialogActions>\r\n </Dialog>\r\n )\r\n}\r\n\r\nexport default FullSizeDialog\r\n","import { FC, useEffect, useRef, useState } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport { wikiContentStyle } from './WikiContent.style'\r\nimport VideoEmbed from './videoembed/VideoEmbed'\r\nimport ReactMarkdown from 'react-markdown'\r\nimport { WikiService } from 'src/dataSources/wiki/Wiki'\r\nimport FullSizeDialog from './fullsizedialog/FullSizeDialog'\r\n\r\n/*\r\n* Enum describing the allowed types of a WikiContent object\r\n*/\r\nexport enum WikiContentType {\r\n TEXT = 'TEXT',\r\n IMAGE = 'IMAGE',\r\n VIDEO = 'VIDEO'\r\n}\r\n\r\n/**\r\n * Object type describing a Wiki Content\r\n */\r\nexport interface WikiContent {\r\n key?: string\r\n type: WikiContentType\r\n text: string\r\n url?: string\r\n}\r\n\r\n/**\r\n * WikiContentComponentProps contains properties for the component.\r\n */\r\nexport interface WikiContentComponentProps {\r\n content: WikiContent\r\n}\r\n\r\n/**\r\n * WikiContentComponent displays a content object from a WikiSection\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const WikiContentComponent: FC<WikiContentComponentProps> = (props: WikiContentComponentProps) => {\r\n const classes = wikiContentStyle()\r\n const intl = useIntl()\r\n\r\n const wikiService = new WikiService()\r\n const rootRef = useRef<HTMLDivElement>(null)\r\n\r\n const [rootWidth, setRootWidth] = useState<number>(0)\r\n const [fullSizeKey, setFullSizeKey] = useState<string|undefined>(undefined)\r\n\r\n useEffect(() => {\r\n const width = rootRef.current?.offsetWidth === undefined ? 0 : rootRef.current?.offsetWidth\r\n setRootWidth(width)\r\n // eslint-disable-next-line\r\n }, [rootRef])\r\n\r\n return (\r\n <div className={classes.root} ref={rootRef}>\r\n {props.content.type === WikiContentType.TEXT && (\r\n <ReactMarkdown linkTarget='_blank' className={classes.text}>\r\n {props.content.text}\r\n </ReactMarkdown>\r\n )}\r\n {props.content.type === WikiContentType.IMAGE &&\r\n props.content.key !== undefined &&\r\n rootWidth > 10 && (\r\n <>\r\n <img\r\n src={wikiService.getImageUrl(props.content.key, rootWidth)}\r\n alt={intl.formatMessage({ id: 'wiki.content.image' })}\r\n className={classes.image}\r\n onClick={() => setFullSizeKey(props.content.key)}\r\n />\r\n <ReactMarkdown linkTarget='_blank' className={classes.subtitle}>{props.content.text}</ReactMarkdown>\r\n </>\r\n )}\r\n {props.content.type === WikiContentType.VIDEO && props.content.url !== undefined && (\r\n <>\r\n <VideoEmbed url={props.content.url} />\r\n <ReactMarkdown linkTarget='_blank' className={classes.subtitle}>{props.content.text}</ReactMarkdown>\r\n </>\r\n )}\r\n <FullSizeDialog\r\n open={fullSizeKey !== undefined}\r\n imageKey={fullSizeKey ?? ''}\r\n handleClose={() => setFullSizeKey(undefined)}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default WikiContentComponent\r\n","import { WikiContent, WikiContentType } from 'src/components/wiki/wikidocument/wikicontent/WikiContent'\r\nimport { WikiDocument } from 'src/components/wiki/wikidocument/WikiDocument'\r\nimport { WikiSection } from 'src/components/wiki/wikidocument/wikisection/WikiSection'\r\nimport { WebServiceClient } from '../WebServiceClient'\r\n\r\n/**\r\n * Defining the possible context tags\r\n */\r\nexport enum ContextTag {\r\n BLUE_SPOT_EXTREME_RAIN = 'blue_spot_extreme_rain',\r\n BOREHOLE = 'borehole',\r\n BURIED_VALLEYS = 'buried_valleys',\r\n ONSHORE_WINDMILLS = 'onshore_windmills',\r\n GERDA = 'gerda',\r\n GROUND_POLLUTION_1 = 'ground_pollution_1',\r\n GROUND_POLLUTION_2 = 'ground_pollution_2',\r\n HYDROMODEL = 'hydromodel',\r\n ICE_AGE = 'ice_age',\r\n MODEL_AREAS = 'model_area',\r\n MORPHOLOGY = 'morphology',\r\n ORTO = 'orto',\r\n TOPO_LOW = 'topo_low_background',\r\n TOPO_HIGH = 'topo_high_background',\r\n PRUSSIAN = 'prussian_background',\r\n OSM = 'osm',\r\n PESTICIDE_WATER_SUPPLY_WELLS = 'pesticide_water_supply_wells',\r\n PESTICIDE_WATERWORKS = 'pesticide_waterworks',\r\n POSTGLACIAL_SEDIMENT_THICKNESS = 'postglacial_sediment_thickness',\r\n PREQUATERNARY_LITHOLOGY = 'prequaternary_lithology',\r\n PREQUATERNARY_ELEVATION = 'prequaternary_elevation',\r\n ELEVATION_DEPTH = 'elevation_depth',\r\n PROTECTED_NATURE_TYPES = 'protected_nature_types',\r\n RAW_MATERIALS = 'raw_materials',\r\n SEABED_SEDIMENTS = 'seabed_sediments',\r\n SEA_LEVEL_ON_LAND = 'sea_level_on_land',\r\n SHALLOW_GROUNDWATER = 'shallow_groundwater',\r\n SLICE_DHM = 'slice_dhm',\r\n SLICE_KOTE = 'slice_kote',\r\n SOIL_TYPES = 'soil_types',\r\n TERRAIN_SHADOWS = 'terrain_shadows',\r\n VARV = 'varv',\r\n WATER_EXTRACTION_PLANTS = 'water_extraction_plants',\r\n WINDMILLS_AT_SEA = 'windmills_at_sea',\r\n WIND_SPEED = 'wind_speed',\r\n BIRD_PROTECTION = 'natura',\r\n RAMSAR = 'natura',\r\n HABITAT_PROTECTION = 'natura',\r\n FOREST_PROTECTION = 'natura',\r\n WILDLIFE = 'natura',\r\n NATURA_STATE_OWNED = 'natura',\r\n NATURA = 'natura',\r\n SCREEN_CLASSIC = 'screen_classic',\r\n SCREEN_SUBDUED = 'screen_subdued',\r\n SCREEN_GREY = 'screen_grey',\r\n COSTAL_LOCATIONS = 'costal_locations'\r\n}\r\n\r\n/**\r\n * Simple location interface for use in the wiki.\r\n */\r\nexport interface WikiLocation {\r\n key: string\r\n lon: number\r\n lat: number\r\n layer?: string\r\n}\r\n\r\n\r\n/**\r\n * Interface for representing the metadata of a WikiDocument as returned by the Django backend.\r\n */\r\nexport interface WikiDocumentMeta {\r\n key: string\r\n title: string\r\n tags: ContextTag[]\r\n categories: string[]\r\n location?: WikiLocation\r\n}\r\n\r\n/**\r\n * Web service clinet for fetching the wiki documents and data related to these.\r\n */\r\nexport class WikiService extends WebServiceClient {\r\n static get URL (): string {\r\n // For development it can be handy to have the Wiki host running elsewhere,\r\n // we therefore check to see if a separate host is mentioned in the environment.\r\n if (process.env.REACT_APP_WIKI_HOST !== undefined) {\r\n return `${process.env.REACT_APP_WIKI_HOST}/wiki`\r\n } else {\r\n // This is the standard deployment - the wiki is served by the same webserver\r\n // as the React site.\r\n return `${process.env.PUBLIC_URL}/wiki`\r\n }\r\n }\r\n\r\n /**\r\n * Constructor.\r\n */\r\n constructor () {\r\n super(WikiService.URL, {})\r\n }\r\n\r\n /**\r\n * Returns an URL for fetching a image based on the given parameters.\r\n * The image is scaled if either width or height is given.\r\n * Aspect ratio is maintained if just one of the dimentions is given.\r\n * @param imageId The id of the image to be fetched.\r\n * @param width The desired width of the image.\r\n * @param height The desired height of the image.\r\n * @returns An URL for fetching the image.\r\n */\r\n getImageUrl (imageId: string, width?: number, height?: number): string {\r\n this.setPath(`/image/${imageId}`)\r\n this.setParams({})\r\n if (width !== undefined) {\r\n if (width < 10 || width > 2048) {\r\n throw new Error(`Width must be a number in the range 10 - 2048. Got a width of \"${width}\".`)\r\n }\r\n this.addParam('width', `${width}`)\r\n }\r\n if (height !== undefined) {\r\n if (height < 10 || height > 2048) {\r\n throw new Error(`Height must be a number in the range 10 - 2048. Got a height of \"${height}\".`)\r\n }\r\n this.addParam('height', `${height}`)\r\n }\r\n\r\n return this.url()\r\n }\r\n\r\n /**\r\n * Fetches meta data for all the wiki documents on the backend.\r\n * @returns A promise bearing a list of wiki document meta objects.\r\n */\r\n async fetchDocumentsMeta (): Promise<WikiDocumentMeta[]> {\r\n this.setPath('/titles')\r\n this.setParams({})\r\n\r\n const response: Response = await fetch(this.url())\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n return await response.json()\r\n }\r\n\r\n /**\r\n * Fethes the wiki document matching a given id.\r\n * @param documentId The id for which to fetch the matching wiki document.\r\n * @returns A promise bearing the wiki document.\r\n */\r\n async fetchDocument (documentId: string): Promise<WikiDocument> {\r\n this.setPath(`/doc/${documentId}`)\r\n this.setParams({})\r\n\r\n const response: Response = await fetch(this.url())\r\n if (!response.ok) {\r\n console.error(`No wiki document found at: ${this.url()}`)\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n return await response.json()\r\n .then(json => {\r\n return this.validateWikiDocument(json)\r\n })\r\n }\r\n\r\n /**\r\n * Validates (type checks) a wiki document.\r\n * @param json The JSON object retrieved from the wiki server.\r\n * @returns A WikiDocument structure based on the given JSON.\r\n */\r\n validateWikiDocument (json: any): WikiDocument {\r\n if (json.title === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. The title is missing.`)\r\n }\r\n if (typeof json.title !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. The title is of the wrong type. The expected type is string.`)\r\n }\r\n if (json.sections === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. It has no sections key.`)\r\n }\r\n if (!Array.isArray(json.sections)) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. Its sections key is not an array.`)\r\n }\r\n if (json.logo !== undefined && typeof json.logo !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. The logo is of the wrong type. The expected type is string.`)\r\n }\r\n if (json.resume !== undefined && typeof json.resume !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. The resume is of the wrong type. The expected type is string.`)\r\n }\r\n if (json.footer !== undefined && typeof json.footer !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. The footer is of the wrong type. The expected type is string.`)\r\n }\r\n if (json.categories === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. It has no categories key.`)\r\n }\r\n if (!Array.isArray(json.categories)) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. Its categories key is not an array.`)\r\n }\r\n\r\n // Sanitize sections.\r\n const sections: WikiSection[] = json.sections.map((s: any) => this.validateWikiSection(s))\r\n // Sanitize categories.\r\n const categories: string[] = json.categories.map((s: any) => {\r\n if (typeof s !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A category is of wrong type. The expected type is string.`)\r\n }\r\n return s\r\n })\r\n\r\n return {\r\n ...json,\r\n sections: sections,\r\n categories: categories\r\n }\r\n }\r\n\r\n /**\r\n * Validates (type checks) a wiki section.\r\n * @param section The JSON object retrieved from the wiki server.\r\n * @returns A WikiSection structure based on the given JSON.\r\n */\r\n validateWikiSection (section: any): WikiSection {\r\n if (section.id === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A section is missing its id.`)\r\n }\r\n if (typeof section.id !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A section id is of wrong type. The expected type is string.`)\r\n }\r\n if (section.title === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A section is missing its title.`)\r\n }\r\n if (typeof section.title !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A section title is of wrong type. The expected type is string.`)\r\n }\r\n if (section.content === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A section is missing its content.`)\r\n }\r\n\r\n return {\r\n ...section,\r\n content: section.content.map((c: any) => this.validateWikiContent(c))\r\n }\r\n }\r\n\r\n /**\r\n * Validates (type checks) a wiki content object.\r\n * @param content The JSON object retrieved from the wiki server.\r\n * @returns A WikiContent structure based on the given JSON.\r\n */\r\n validateWikiContent (content: any): WikiContent {\r\n if (content.type === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A piece of content is missing its type.`)\r\n }\r\n if (!Object.keys(WikiContentType).includes(content.type)) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A piece of content has invalid type. The expected type is WikiContentType enum.`)\r\n }\r\n if (content.text === undefined) {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A piece of content is missing its text.`)\r\n }\r\n if (typeof content.text !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A piece of content has a text field of invalid type. The expected type is string.`)\r\n }\r\n\r\n if (content.key !== undefined && typeof content.key !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A piece of content has a key field of invalid type. The expected type is string.`)\r\n }\r\n if (content.url !== undefined && typeof content.url !== 'string') {\r\n throw new Error(`Invalid wiki document found at: ${this.url()}. A piece of content has a url field of invalid type. The expected type is string.`)\r\n }\r\n\r\n return content\r\n }\r\n}\r\n","export interface TestComponent {\r\n component: {}\r\n componentWithProviders: JSX.Element\r\n}\r\n\r\nexport enum CallResult {\r\n 'Initial',\r\n 'Running',\r\n 'Failed',\r\n 'Succeeded'\r\n}\r\n\r\nexport interface BaseAction {\r\n type: string\r\n}\r\n\r\nexport interface EmptyAction extends BaseAction {}\r\n\r\nexport interface MessageAction extends BaseAction{\r\n message: string\r\n}\r\n\r\nexport interface DataAction<T> extends BaseAction {\r\n data: T\r\n}\r\n","import {\r\n ADD_CATEGORIES,\r\n ADD_CONTEXT_TAGS,\r\n ADD_OPEN_SECTION_ID,\r\n CLEAR_DOCUMENT,\r\n CLEAR_DOCUMENTS_META,\r\n CLEAR_VIEW_STACK,\r\n FETCHING_DOCUMENTS_META_FAILURE,\r\n FETCHING_DOCUMENTS_META_STARTED,\r\n FETCHING_DOCUMENTS_META_SUCCESS,\r\n FETCHING_DOCUMENT_FAILURE,\r\n FETCHING_DOCUMENT_STARTED,\r\n FETCHING_DOCUMENT_SUCCESS,\r\n POP_VIEW,\r\n PUSH_VIEW,\r\n REMOVE_CONTEXT_TAGS,\r\n REMOVE_OPEN_SECTION_ID,\r\n REMOVE_VIEW,\r\n SET_CATEGORY,\r\n SET_POINTS_OF_INTEREST,\r\n SHOW_WIKI_SIDE_BAR\r\n} from 'src/actions/WikiActions'\r\nimport { WikiDocument } from 'src/components/wiki/wikidocument/WikiDocument'\r\nimport { BaseAction, CallResult, DataAction, MessageAction } from 'src/CustomTypes'\r\nimport { ContextTag, WikiDocumentMeta, WikiLocation } from 'src/dataSources/wiki/Wiki'\r\n\r\nexport enum WikiView {\r\n WikiBrowser,\r\n WikiDocument,\r\n WikiCategory\r\n}\r\n\r\nexport interface WikiState {\r\n fetchDocumentsMetaStatus: CallResult\r\n fetchDocumentsMetaError: string\r\n fetchDocumentStatus: CallResult\r\n fetchDocumentError: string\r\n document?: WikiDocument\r\n openSectionIds: string[]\r\n documentsMeta: WikiDocumentMeta[]\r\n contextTags: ContextTag[]\r\n categories: string[]\r\n poi: WikiLocation[]\r\n category: string\r\n showWikiSideBar: boolean\r\n currentWikiViews: WikiView[]\r\n}\r\n\r\nexport const wikiStateInitial: WikiState = {\r\n fetchDocumentsMetaStatus: CallResult.Initial,\r\n fetchDocumentsMetaError: '',\r\n fetchDocumentStatus: CallResult.Initial,\r\n fetchDocumentError: '',\r\n document: undefined,\r\n openSectionIds: [],\r\n documentsMeta: [],\r\n contextTags: [ContextTag.OSM, ContextTag.MODEL_AREAS],\r\n categories: [],\r\n poi: [],\r\n category: '',\r\n showWikiSideBar: false,\r\n currentWikiViews: []\r\n}\r\n\r\nexport function wikiReducer (\r\n state: WikiState = wikiStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): WikiState {\r\n switch (action.type) {\r\n case FETCHING_DOCUMENTS_META_STARTED: {\r\n return {\r\n ...state,\r\n fetchDocumentsMetaStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_DOCUMENTS_META_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchDocumentsMetaStatus: CallResult.Failed,\r\n fetchDocumentsMetaError: a.message\r\n }\r\n }\r\n case FETCHING_DOCUMENTS_META_SUCCESS: {\r\n const a = action as DataAction<WikiDocumentMeta[]>\r\n return {\r\n ...state,\r\n fetchDocumentsMetaStatus: CallResult.Succeeded,\r\n documentsMeta: a.data\r\n }\r\n }\r\n case FETCHING_DOCUMENT_STARTED: {\r\n return {\r\n ...state,\r\n fetchDocumentStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_DOCUMENT_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchDocumentStatus: CallResult.Failed,\r\n fetchDocumentError: a.message\r\n }\r\n }\r\n case FETCHING_DOCUMENT_SUCCESS: {\r\n const a = action as DataAction<WikiDocument>\r\n return {\r\n ...state,\r\n fetchDocumentStatus: CallResult.Succeeded,\r\n document: a.data\r\n }\r\n }\r\n case ADD_OPEN_SECTION_ID: {\r\n const a = action as DataAction<string>\r\n const newOpenSectionsIds: string[] = Object.assign([], state.openSectionIds)\r\n return {\r\n ...state,\r\n openSectionIds: [a.data, ...newOpenSectionsIds.filter(id => id !== a.data)]\r\n }\r\n }\r\n case REMOVE_OPEN_SECTION_ID: {\r\n const a = action as DataAction<string>\r\n const newOpenSectionsIds: string[] = Object.assign([], state.openSectionIds)\r\n return {\r\n ...state,\r\n openSectionIds: newOpenSectionsIds.filter(id => id !== a.data)\r\n }\r\n }\r\n case ADD_CONTEXT_TAGS: {\r\n const a = action as DataAction<ContextTag[]>\r\n return {\r\n ...state,\r\n contextTags: [...state.contextTags, ...a.data.filter(tag => !state.contextTags.includes(tag))]\r\n }\r\n }\r\n case REMOVE_CONTEXT_TAGS: {\r\n const a = action as DataAction<ContextTag[]>\r\n const newContextTags: ContextTag[] = Object.assign([], state.contextTags)\r\n a.data.forEach(tagToBeRemoved => {\r\n const index = newContextTags.findIndex(tag => tag === tagToBeRemoved)\r\n if (index !== -1) {\r\n newContextTags.splice(index, 1)\r\n }\r\n })\r\n return {\r\n ...state,\r\n contextTags: newContextTags\r\n }\r\n }\r\n case ADD_CATEGORIES: {\r\n const a = action as DataAction<string[]>\r\n return {\r\n ...state,\r\n categories: a.data\r\n }\r\n }\r\n case SET_POINTS_OF_INTEREST: {\r\n const a = action as DataAction<WikiLocation[]>\r\n return {\r\n ...state,\r\n poi: a.data\r\n }\r\n }\r\n case SET_CATEGORY: {\r\n const a = action as DataAction<string>\r\n return {\r\n ...state,\r\n category: a.data\r\n }\r\n }\r\n case PUSH_VIEW: {\r\n const a = action as DataAction<WikiView>\r\n return {\r\n ...state,\r\n currentWikiViews: [...state.currentWikiViews, a.data]\r\n }\r\n }\r\n case POP_VIEW: {\r\n return {\r\n ...state,\r\n currentWikiViews: state.currentWikiViews.slice(0, -1)\r\n }\r\n }\r\n case REMOVE_VIEW: {\r\n const a = action as DataAction<WikiView>\r\n return {\r\n ...state,\r\n currentWikiViews: state.currentWikiViews.filter(view => view !== a.data)\r\n }\r\n }\r\n case CLEAR_VIEW_STACK: {\r\n return {\r\n ...state,\r\n currentWikiViews: []\r\n }\r\n }\r\n case SHOW_WIKI_SIDE_BAR: {\r\n const a = action as DataAction<boolean>\r\n return {\r\n ...state,\r\n showWikiSideBar: a.data\r\n }\r\n }\r\n case CLEAR_DOCUMENTS_META: {\r\n return {\r\n ...state,\r\n documentsMeta: []\r\n }\r\n }\r\n case CLEAR_DOCUMENT: {\r\n return {\r\n ...state,\r\n document: undefined,\r\n openSectionIds: [],\r\n fetchDocumentStatus: CallResult.Initial\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { AnyAction } from 'redux'\r\nimport { WikiDocument } from 'src/components/wiki/wikidocument/WikiDocument'\r\nimport { DataAction, EmptyAction, MessageAction } from 'src/CustomTypes'\r\nimport { ContextTag, WikiDocumentMeta, WikiLocation, WikiService } from 'src/dataSources/wiki/Wiki'\r\nimport { RootState } from 'src/Store'\r\nimport { WikiView } from 'src/reducers/WikiReducer'\r\n\r\nexport const FETCHING_DOCUMENTS_META_STARTED = 'WIKI_ACTIONS_FETCHING_DOCUMENTS_STARTED'\r\nexport const FETCHING_DOCUMENTS_META_FAILURE = 'WIKI_ACTIONS_FETCHING_DOCUMENTS_FAILURE'\r\nexport const FETCHING_DOCUMENTS_META_SUCCESS = 'WIKI_ACTIONS_FETCHING_DOCUMENTS_SUCCESS'\r\nexport const FETCHING_DOCUMENT_STARTED = 'WIKI_ACTIONS_FETCHING_DOCUMENT_STARTED'\r\nexport const FETCHING_DOCUMENT_FAILURE = 'WIKI_ACTIONS_FETCHING_DOCUMENT_FAILURE'\r\nexport const FETCHING_DOCUMENT_SUCCESS = 'WIKI_ACTIONS_FETCHING_DOCUMENT_SUCCESS'\r\nexport const ADD_OPEN_SECTION_ID = 'WIKI_ACTIONS_ADD_OPEN_SECTION_ID'\r\nexport const REMOVE_OPEN_SECTION_ID = 'WIKI_ACTIONS_REMOVE_OPEN_SECTION_ID'\r\nexport const ADD_CONTEXT_TAGS = 'WIKI_ACTIONS_ADD_CONTEXT_TAGS'\r\nexport const REMOVE_CONTEXT_TAGS = 'WIKI_ACTIONS_REMOVE_CONTEXT_TAGS'\r\nexport const ADD_CATEGORIES = 'WIKI_ACTIONS_ADD_CATEGORIES'\r\nexport const SET_POINTS_OF_INTEREST = 'WIKI_ACTIONS_SET_POINTS_OF_INTEREST'\r\nexport const SET_CATEGORY = 'WIKI_ACTIONS_SET_CATEGORY'\r\nexport const PUSH_VIEW = 'WIKI_ACTIONS_PUSH_VIEW'\r\nexport const POP_VIEW = 'WIKI_ACTIONS_POP_VIEW'\r\nexport const REMOVE_VIEW = 'WIKI_ACTIONS_REMOVE_VIEW'\r\nexport const CLEAR_VIEW_STACK = 'WIKI_ACTIONS_CLEAR_VIEW_STACK'\r\nexport const SHOW_WIKI_SIDE_BAR = 'WIKI_ACTIONS_SHOW_WIKI_SIDE_BAR'\r\nexport const CLEAR_DOCUMENTS_META = 'WIKI_ACTIONS_CLEAR_DOCUMENTS_META'\r\nexport const CLEAR_DOCUMENT = 'WIKI_ACTIONS_CLEAR_DOCUMENT'\r\n\r\ninterface WikiActions {\r\n fetchingDocumentsMetaStarted: () => EmptyAction\r\n fetchingDocumentsMetaFailure: (message: string) => MessageAction\r\n fetchingDocumentsMetaSuccess: (documentsMeta: WikiDocumentMeta[]) => DataAction<WikiDocumentMeta[]>\r\n fetchingDocumentStarted: () => EmptyAction\r\n fetchingDocumentFailure: (message: string) => MessageAction\r\n fetchingDocumentSuccess: (document: WikiDocument) => DataAction<WikiDocument>\r\n addOpenSectionId: (id: string) => DataAction<string>\r\n removeOpenSectionId: (id: string) => DataAction<string>\r\n addContextTags: (contextTags: ContextTag[]) => DataAction<ContextTag[]>\r\n removeContextTags: (contextTags: ContextTag[]) => DataAction<ContextTag[]>\r\n addCategories: (categories: string[]) => DataAction<string[]>\r\n setPointsOfInterest: (poi: WikiLocation[]) => DataAction<WikiLocation[]>\r\n setCategory: (category: string) => DataAction<string>\r\n pushView: (wikiView: WikiView) => DataAction<WikiView>\r\n popView: () => EmptyAction\r\n removeView: (wikiView: WikiView) => DataAction<WikiView>\r\n clearViewStack: () => EmptyAction\r\n showWikiSideBar: (show: boolean) => DataAction<boolean>\r\n clearDocumentsMeta: () => EmptyAction\r\n clearDocument: () => EmptyAction\r\n\r\n // Thunk actions\r\n clearViews: () => ThunkAction<void, RootState, {}, AnyAction>\r\n fetchDocumentsMeta: () => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n fetchDocument: (documentId: string) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n openCategory: (category: string) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const wikiActions: WikiActions = {\r\n fetchingDocumentsMetaStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_DOCUMENTS_META_STARTED\r\n }\r\n },\r\n fetchingDocumentsMetaFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_DOCUMENTS_META_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingDocumentsMetaSuccess: (documentsMeta: WikiDocumentMeta[]): DataAction<WikiDocumentMeta[]> => {\r\n return {\r\n type: FETCHING_DOCUMENTS_META_SUCCESS,\r\n data: documentsMeta\r\n }\r\n },\r\n fetchingDocumentStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_DOCUMENT_STARTED\r\n }\r\n },\r\n fetchingDocumentFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_DOCUMENT_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingDocumentSuccess: (document: WikiDocument): DataAction<WikiDocument> => {\r\n return {\r\n type: FETCHING_DOCUMENT_SUCCESS,\r\n data: document\r\n }\r\n },\r\n addOpenSectionId: (id: string): DataAction<string> => {\r\n return {\r\n type: ADD_OPEN_SECTION_ID,\r\n data: id\r\n }\r\n },\r\n removeOpenSectionId: (id: string): DataAction<string> => {\r\n return {\r\n type: REMOVE_OPEN_SECTION_ID,\r\n data: id\r\n }\r\n },\r\n addContextTags: (contextTags: ContextTag[]): DataAction<ContextTag[]> => {\r\n return {\r\n type: ADD_CONTEXT_TAGS,\r\n data: contextTags\r\n }\r\n },\r\n removeContextTags: (contextTags: ContextTag[]): DataAction<ContextTag[]> => {\r\n return {\r\n type: REMOVE_CONTEXT_TAGS,\r\n data: contextTags\r\n }\r\n },\r\n addCategories: (categories: string[]): DataAction<string[]> => {\r\n return {\r\n type: ADD_CATEGORIES,\r\n data: categories\r\n }\r\n },\r\n setPointsOfInterest: (poi: WikiLocation[]): DataAction<WikiLocation[]> => {\r\n return {\r\n type: SET_POINTS_OF_INTEREST,\r\n data: poi\r\n }\r\n },\r\n setCategory: (category: string): DataAction<string> => {\r\n return {\r\n type: SET_CATEGORY,\r\n data: category\r\n }\r\n },\r\n pushView: (wikiView: WikiView): DataAction<WikiView> => {\r\n return {\r\n type: PUSH_VIEW,\r\n data: wikiView\r\n }\r\n },\r\n popView: (): EmptyAction => {\r\n return {\r\n type: POP_VIEW\r\n }\r\n },\r\n removeView: (wikiView: WikiView): DataAction<WikiView> => {\r\n return {\r\n type: REMOVE_VIEW,\r\n data: wikiView\r\n }\r\n },\r\n clearViewStack: (): EmptyAction => {\r\n return {\r\n type: CLEAR_VIEW_STACK\r\n }\r\n },\r\n showWikiSideBar: (show: boolean): DataAction<boolean> => {\r\n return {\r\n type: SHOW_WIKI_SIDE_BAR,\r\n data: show\r\n }\r\n },\r\n clearDocumentsMeta: (): EmptyAction => {\r\n return {\r\n type: CLEAR_DOCUMENTS_META\r\n }\r\n },\r\n clearDocument: (): EmptyAction => {\r\n return {\r\n type: CLEAR_DOCUMENT\r\n }\r\n },\r\n clearViews: (): ThunkAction<void, RootState, {}, AnyAction> => {\r\n return (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): void => {\r\n dispatch(wikiActions.clearViewStack())\r\n dispatch(wikiActions.clearDocument())\r\n dispatch(wikiActions.showWikiSideBar(false))\r\n }\r\n },\r\n fetchDocumentsMeta: (): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n dispatch(wikiActions.clearDocumentsMeta())\r\n dispatch(wikiActions.fetchingDocumentsMetaStarted())\r\n const wikiService = new WikiService()\r\n let documentsMeta: WikiDocumentMeta[]\r\n try {\r\n documentsMeta = await wikiService.fetchDocumentsMeta()\r\n\r\n const categories: string[] = []\r\n const poi: WikiLocation[] = []\r\n documentsMeta.forEach(meta => {\r\n meta.categories?.forEach(category => {\r\n if (!categories.includes(category)) {\r\n categories.push(category)\r\n }\r\n })\r\n if ('location' in meta) {\r\n let location = meta.location!\r\n location.key = meta.key\r\n poi.push(location)\r\n }\r\n })\r\n dispatch(wikiActions.addCategories(categories))\r\n dispatch(wikiActions.setPointsOfInterest(poi))\r\n\r\n dispatch(wikiActions.fetchingDocumentsMetaSuccess(documentsMeta))\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(wikiActions.fetchingDocumentsMetaFailure(errorMessage))\r\n }\r\n }\r\n },\r\n fetchDocument: (documentId: string): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n dispatch(wikiActions.clearDocument())\r\n dispatch(wikiActions.removeView(WikiView.WikiDocument))\r\n dispatch(wikiActions.pushView(WikiView.WikiDocument))\r\n dispatch(wikiActions.showWikiSideBar(true))\r\n dispatch(wikiActions.fetchingDocumentStarted())\r\n const wikiService = new WikiService()\r\n try {\r\n const document = await wikiService.fetchDocument(documentId)\r\n dispatch(wikiActions.fetchingDocumentSuccess(document))\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(wikiActions.fetchingDocumentFailure(errorMessage))\r\n }\r\n }\r\n },\r\n openCategory: (category: string): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n dispatch(wikiActions.setCategory(category))\r\n dispatch(wikiActions.pushView(WikiView.WikiCategory))\r\n dispatch(wikiActions.showWikiSideBar(true))\r\n }\r\n }\r\n}\r\n","export enum DataTheme {\r\n NONE = 'NONE',\r\n ICE_AGE = 'ICE_AGE',\r\n CLIMATE = 'CLIMATE',\r\n ENERGY = 'ENERGY',\r\n ENVIRONMENT = 'ENVIRONMENT'\r\n}\r\n\r\nexport enum LayerViewType {\r\n NONE = 'NONE',\r\n INFO = 'INFO',\r\n OPACITY = 'OPACITY',\r\n SETTINGS = 'SETTINGS'\r\n}\r\n\r\nexport enum ToolType {\r\n NONE = 'NONE',\r\n INFO = 'INFO',\r\n PROFILE = 'PROFILE',\r\n VIRTUAL_BOREHOLE = 'VIRTUAL_BOREHOLE',\r\n _3D_VIEW = '3D_VIEW'\r\n}\r\n","import { ThemeOptions } from '@material-ui/core'\r\nimport { DataTheme } from './Enums'\r\n\r\ndeclare module '@material-ui/core/styles/createPalette' {\r\n interface Palette {\r\n geoColors: {\r\n topBar: PaletteColor\r\n contextBar: PaletteColor\r\n toolBar: PaletteColor\r\n text: PaletteColor\r\n headerText: PaletteColor\r\n error: PaletteColor\r\n }\r\n dataThemeIceAge: PaletteColor\r\n dataThemeClimate: PaletteColor\r\n dataThemeEnergy: PaletteColor\r\n dataThemeEnvironment: PaletteColor\r\n }\r\n interface PaletteOptions {\r\n geoColors?: {\r\n topBar: PaletteColorOptions\r\n contextBar: PaletteColorOptions\r\n toolBar: PaletteColorOptions\r\n text: PaletteColorOptions\r\n headerText: PaletteColorOptions\r\n error: PaletteColorOptions\r\n }\r\n dataThemeIceAge?: PaletteColorOptions\r\n dataThemeClimate?: PaletteColorOptions\r\n dataThemeEnergy?: PaletteColorOptions\r\n dataThemeEnvironment?: PaletteColorOptions\r\n }\r\n}\r\n\r\nconst dataThemeIceAgeMain = '#01579b'\r\nconst dataThemeClimateMain = '#33691e'\r\nconst dataThemeEnergyMain = '#00838f'\r\nconst dataThemeEnvironmentMain = '#ab5600'\r\n\r\nconst common = {\r\n common: {\r\n black: '#000000',\r\n white: '#ffffff'\r\n },\r\n error: {\r\n main: '#fe2020'\r\n },\r\n geoColors: {\r\n topBar: {\r\n main: '#403f44'\r\n },\r\n contextBar: {\r\n main: '#ebebeb',\r\n dark: '#cccccc'\r\n },\r\n toolBar: {\r\n main: '#666666',\r\n light: '#cccccc',\r\n dark: '#333333'\r\n },\r\n text: {\r\n main: '#000000',\r\n light: '#555555'\r\n },\r\n headerText: {\r\n main: '#ffffff'\r\n },\r\n error: {\r\n main: '#e29fa2'\r\n }\r\n },\r\n dataThemeIceAge: {\r\n main: dataThemeIceAgeMain\r\n },\r\n dataThemeClimate: {\r\n main: dataThemeClimateMain\r\n },\r\n dataThemeEnergy: {\r\n main: dataThemeEnergyMain\r\n },\r\n dataThemeEnvironment: {\r\n main: dataThemeEnvironmentMain\r\n }\r\n}\r\n\r\nexport const defaultTheme: ThemeOptions = {\r\n palette: {\r\n ...common,\r\n primary: {\r\n main: '#70533f',\r\n light: '#AB8C76'\r\n },\r\n secondary: {\r\n main: '#fff9e7'\r\n }\r\n }\r\n}\r\n\r\nexport const iceAgeTheme: ThemeOptions = {\r\n palette: {\r\n ...common,\r\n primary: {\r\n main: dataThemeIceAgeMain,\r\n light: '#79B4E3'\r\n },\r\n secondary: {\r\n main: '#cfd8dc'\r\n }\r\n }\r\n}\r\n\r\nexport const climateTheme: ThemeOptions = {\r\n palette: {\r\n ...common,\r\n primary: {\r\n main: dataThemeClimateMain,\r\n light: '#7AB463'\r\n },\r\n secondary: {\r\n main: '#c8e6c9'\r\n }\r\n }\r\n}\r\n\r\nexport const energyTheme: ThemeOptions = {\r\n palette: {\r\n ...common,\r\n primary: {\r\n main: dataThemeEnergyMain,\r\n light: '#6AC0C8'\r\n },\r\n secondary: {\r\n main: '#e0f7fa'\r\n }\r\n }\r\n}\r\n\r\nexport const environmentTheme: ThemeOptions = {\r\n palette: {\r\n ...common,\r\n primary: {\r\n main: dataThemeEnvironmentMain,\r\n light: '#a98274'\r\n },\r\n secondary: {\r\n main: '#ffe0b2'\r\n }\r\n }\r\n}\r\n\r\nexport const getThemeOptionsByDataTheme = (dataTheme: DataTheme): ThemeOptions => {\r\n switch (dataTheme) {\r\n case DataTheme.ICE_AGE:\r\n return iceAgeTheme\r\n case DataTheme.CLIMATE:\r\n return climateTheme\r\n case DataTheme.ENERGY:\r\n return energyTheme\r\n case DataTheme.ENVIRONMENT:\r\n return environmentTheme\r\n case DataTheme.NONE:\r\n return defaultTheme\r\n }\r\n}\r\n","// Delays\r\nexport const tooltipDelay: number = 500\r\n\r\n// Dimensions for various components\r\n\r\nexport const sidebarWidth: number = 350\r\nexport const maxSidebarWidth: number = 550\r\n\r\nexport const bottomBarHeight: number = 420\r\nexport const bottomBarHeightMargin: number = 5\r\nexport const leftSidebarToolsWidth: number = 55\r\nexport const leftSidebarWidth: number = sidebarWidth\r\nexport const leftSidebarSettingsWidth: number = 318\r\nexport const rightSidebarWidth: number = sidebarWidth\r\nexport const profileLegendWidth: number = 275\r\nexport const toolbarHeight: number = 55\r\nexport const topbarHeight: number = 50\r\nexport const headerHeight: number = topbarHeight + toolbarHeight\r\n\r\n// Style constants for side bar components\r\nexport const wikiSideBarBaseZIndex = 800\r\nexport const sidebarAnimationDuration = 300\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { headerHeight, toolbarHeight, topbarHeight } from './Constants'\r\n\r\nexport const appStyle = makeStyles((theme) => ({\r\n '@global': {\r\n body: {\r\n overflow: 'hidden'\r\n },\r\n '*::-webkit-scrollbar': {\r\n width: '0.6em'\r\n },\r\n '*::-webkit-scrollbar-track': {\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: '#ccc'\r\n },\r\n '*::-webkit-scrollbar-thumb': {\r\n width: '0.3em',\r\n backgroundColor: '#cccccc',\r\n backgroundClip: 'padding-box',\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: '#999'\r\n }\r\n },\r\n errorMessage: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(2),\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n textAlign: 'center'\r\n },\r\n errorIcon: {\r\n marginBottom: theme.spacing(1)\r\n },\r\n mainContainer: {\r\n flex: 1,\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden',\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none'\r\n }\r\n },\r\n mobileContainer: {\r\n display: 'none',\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'block'\r\n }\r\n },\r\n mobileWarning: {\r\n padding: theme.spacing(2)\r\n },\r\n mainArea: {\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'row',\r\n background: theme.palette.common.white\r\n },\r\n mainContentArea: {\r\n flex: 1\r\n },\r\n toolbar: {\r\n flex: `0 0 ${toolbarHeight}px`,\r\n height: toolbarHeight\r\n },\r\n bottomBar: {\r\n position: 'absolute',\r\n bottom: 0,\r\n left: 50,\r\n right: 0,\r\n zIndex: 700\r\n },\r\n leftSideBar: {\r\n position: 'absolute',\r\n left: 0,\r\n top: headerHeight,\r\n zIndex: 1000\r\n },\r\n progressIcon: {\r\n color: theme.palette.primary.main,\r\n marginBottom: theme.spacing(1)\r\n },\r\n rightSideBar: {\r\n position: 'absolute',\r\n right: 0,\r\n top: headerHeight,\r\n zIndex: 999\r\n },\r\n topBar: {\r\n flex: `0 0 ${topbarHeight}px`,\r\n height: topbarHeight\r\n },\r\n wikiSideBar: {\r\n position: 'absolute',\r\n right: 0,\r\n top: headerHeight,\r\n zIndex: 1000\r\n }\r\n}))\r\n","/**\r\nService for fetching a profile for a given geo model layer and a series of coordinates.\r\n*/\r\n\r\nimport { Borehole } from './Borehole'\r\nimport { GeoModel } from './GeoModel'\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * Object type describing the returned profile.\r\n */\r\nexport interface ProfileObject {\r\n Bathymetrics: any\r\n Borehole: Borehole\r\n BoreholeMaxDistance: number\r\n BoreholeNearestPoint: any\r\n HydroModels: any\r\n Model: GeoModel\r\n Path: []\r\n PathLength: number\r\n Svg: string\r\n SvgLayout: {}\r\n Tag: string\r\n ZMax: number\r\n ZMin: number\r\n}\r\n\r\n/**\r\n * Web service for fetching a profile for a given geo model layer and a series of coordinates.\r\n * The following parameters are required: 'ModelId' ( @see setModelId ) and 'Path' ( @see setPath ).\r\n */\r\nexport class CrossSection extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/crosssection' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n const defaultParams = {\r\n srid: '25832'\r\n }\r\n super(CrossSection.URL, token, defaultParams)\r\n }\r\n\r\n /**\r\n * Setter for hydro model ids.\r\n * @param hydroModelIds Comma separated list of hydro model ids.\r\n */\r\n setHydroModelIds (hydroModelIds: string): void {\r\n this.addParam('hydromodelid', hydroModelIds)\r\n }\r\n\r\n /**\r\n * Setter for max borehole distance.\r\n * @param maxBoreholeDistance The max borehole distance.\r\n */\r\n setMaxBoreholeDistance (maxBoreholeDistance: number): void {\r\n this.addParam('maxBoringDistance', maxBoreholeDistance.toString())\r\n }\r\n\r\n /**\r\n * Setter for max depth.\r\n * @param maxDepth The max depth.\r\n */\r\n setMaxDepth (maxDepth: number): void {\r\n this.addParam('maxDepth', maxDepth.toString())\r\n }\r\n\r\n /**\r\n * [Required*] Setter for the model id.\r\n * @param modelId The model id.\r\n */\r\n setModelId (modelId: string): void {\r\n this.addParam('geoModelId', modelId)\r\n }\r\n\r\n /**\r\n * [Required*] Setter for the path coordinates.\r\n * @param path The path coordinates.\r\n */\r\n setPathCoordinates (path: ol.Coordinate[]): void {\r\n let coordinates = ''\r\n path.forEach((coordinate: ol.Coordinate) => {\r\n coordinates = `${coordinates !== '' ? coordinates + ',' : ''}[${coordinate[0]},${coordinate[1]}]`\r\n })\r\n this.addParam('path', '[' + coordinates + ']')\r\n }\r\n\r\n /**\r\n * Setter for width in pixels.\r\n * @param width The width of the figure in pixels.\r\n */\r\n setWidth (width: number): void {\r\n this.addParam('width', width.toString())\r\n }\r\n\r\n /**\r\n * Setter for height in pixels.\r\n * @param height The height of the figure in pixels.\r\n */\r\n setHeight (height: number): void {\r\n this.addParam('height', height.toString())\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n */\r\n private validateParams (): void {\r\n if (!(this.hasParam('geoModelId')) || !(this.hasParam('path'))) {\r\n throw new Error('Parameter mismatch: The modelId and path params must be set.')\r\n }\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the profile object.\r\n */\r\n async fetchProfile (): Promise<ProfileObject> {\r\n this.validateParams()\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n return await response.json()\r\n }\r\n}\r\n","import { Extent } from 'openlayers'\r\nimport { LayerActiveView } from 'src/components/layerpicker/LayerPicker'\r\nimport { DataAction, EmptyAction } from 'src/CustomTypes'\r\nimport { LayerCapabilities, LayerGroup, LayerParams, LayerType } from 'src/dataSources/layers/LayerRegistry'\r\nimport { LayerViewType } from 'src/Enums'\r\n\r\nexport const SET_MAP_CENTER = 'MAP_ACTIONS_SET_MAP_CENTER'\r\nexport const SET_MAP_CURRENT_ZOOM = 'MAP_ACTIONS_SET_MAP_CURRENT_ZOOM'\r\nexport const SET_MAP_EXTENT = 'MAP_ACTIONS_SET_MAP_EXTENT'\r\nexport const SET_COLORS_IN_FOCUS = 'MAP_ACTIONS_SET_COLORS_IN_FOCUS'\r\nexport const ADD_LAYER = 'MAP_ACTIONS_ADD_LAYER'\r\nexport const ADD_LAYER_GROUP = 'MAP_ACTIONS_ADD_LAYER_GROUP'\r\nexport const REMOVE_LAYER = 'MAP_ACTIONS_REMOVE_LAYER'\r\nexport const REMOVE_LAYER_GROUP = 'MAP_ACTIONS_REMOVE_LAYER_GROUP'\r\nexport const CLEAR_LAYERS = 'MAP_ACTIONS_CLEAR_LAYERS'\r\nexport const SET_LAYER_PARAMS = 'MAP_ACTIONS_SET_LAYER_PARAMS'\r\nexport const SET_LAYER_ACTIVE_VIEW = 'MAP_ACTIONS_SET_ACTIVE_VIEW'\r\nexport const SET_LAYER_CAPABILITIES = 'MAP_ACTIONS_SET_LAYER_CAPABILITIES'\r\n\r\nexport interface ColorInFocus {\r\n layerType: LayerType\r\n color: string\r\n}\r\n\r\ninterface MapActions {\r\n setMapCenter: (center: ol.Coordinate) => DataAction<ol.Coordinate>\r\n setMapCurrentZoom: (currentZoom: number) => DataAction<number>\r\n setMapExtent: (extent: Extent) => DataAction<Extent>\r\n setColorsInFocus: (colorsInFocus: ColorInFocus[]) => DataAction<ColorInFocus[]>\r\n addLayer: (layer: LayerType) => DataAction<LayerType>\r\n addLayerGroup: (layerGroup: LayerGroup) => DataAction<LayerGroup>\r\n clearLayers: () => EmptyAction\r\n removeLayer: (layer: LayerType) => DataAction<LayerType>\r\n removeLayerGroup: (layerGroup: LayerGroup) => DataAction<LayerGroup>\r\n setLayerActiveView: (layer: LayerType, view: LayerViewType) => DataAction<LayerActiveView>\r\n setLayerParams: (config: LayerParams) => DataAction<LayerParams>\r\n setLayerCapabilities: (capabilities: LayerCapabilities) => DataAction<LayerCapabilities>\r\n}\r\n\r\nexport const mapActions: MapActions = {\r\n setMapCenter: (center: ol.Coordinate): DataAction<ol.Coordinate> => {\r\n return {\r\n type: SET_MAP_CENTER,\r\n data: center\r\n }\r\n },\r\n setMapCurrentZoom: (currentZoom: number): DataAction<number> => {\r\n return {\r\n type: SET_MAP_CURRENT_ZOOM,\r\n data: currentZoom\r\n }\r\n },\r\n setMapExtent: (mapExtent: Extent): DataAction<Extent> => {\r\n return {\r\n type: SET_MAP_EXTENT,\r\n data: mapExtent\r\n }\r\n },\r\n setColorsInFocus: (colorsInFocus: ColorInFocus[]): DataAction<ColorInFocus[]> => {\r\n return {\r\n type: SET_COLORS_IN_FOCUS,\r\n data: colorsInFocus\r\n }\r\n },\r\n addLayer: (layer: LayerType): DataAction<LayerType> => {\r\n return {\r\n type: ADD_LAYER,\r\n data: layer\r\n }\r\n },\r\n addLayerGroup: (layerGroup: LayerGroup): DataAction<LayerGroup> => {\r\n return {\r\n type: ADD_LAYER_GROUP,\r\n data: layerGroup\r\n }\r\n },\r\n clearLayers: (): EmptyAction => {\r\n return {\r\n type: CLEAR_LAYERS\r\n }\r\n },\r\n removeLayer: (layer: LayerType): DataAction<LayerType> => {\r\n return {\r\n type: REMOVE_LAYER,\r\n data: layer\r\n }\r\n },\r\n removeLayerGroup: (layerGroup: LayerGroup): DataAction<LayerGroup> => {\r\n return {\r\n type: REMOVE_LAYER_GROUP,\r\n data: layerGroup\r\n }\r\n },\r\n setLayerActiveView: (layer: LayerType, view: LayerViewType): DataAction<LayerActiveView> => {\r\n return {\r\n type: SET_LAYER_ACTIVE_VIEW,\r\n data: {\r\n type: layer,\r\n view: view\r\n }\r\n }\r\n },\r\n setLayerParams: (params: LayerParams): DataAction<LayerParams> => {\r\n return {\r\n type: SET_LAYER_PARAMS,\r\n data: params\r\n }\r\n },\r\n setLayerCapabilities: (capabilities: LayerCapabilities): DataAction<LayerCapabilities> => {\r\n return {\r\n type: SET_LAYER_CAPABILITIES,\r\n data: capabilities\r\n }\r\n }\r\n}\r\n","import * as ol from 'openlayers'\r\nimport { LayerDescription, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Interface for the base AbstractLayer class.\r\n */\r\nexport interface GeoLayer {\r\n olLayer: ol.layer.Layer\r\n enabled: boolean\r\n visible: boolean\r\n type: LayerType\r\n zIndex: number\r\n getSubLayerName: (params: LayerParamsObject, value: number) => string\r\n onZoomChange: (zoomLevel: number) => void\r\n getMinimumZoom: () => number\r\n describe: () => LayerDescription\r\n}\r\n\r\n/**\r\n * Interface for the options object given to the base AbstractLayer\r\n * class' constructor.\r\n */\r\nexport interface AbstractLayerOptions {\r\n layerType: LayerType\r\n minZoom?: number\r\n enabled?: boolean\r\n zIndex: number\r\n}\r\n\r\n/**\r\n * Interface for properties of a sub layer.\r\n */\r\nexport interface SubLayers {\r\n labelId: string\r\n key: string\r\n list: string[]\r\n subLayerDescriptors: SubLayerDescriptor[]\r\n inputEnabled?: boolean\r\n stepperEnabled?: boolean\r\n unit?: string\r\n minimum: number\r\n maximum: number\r\n step: number\r\n selected: SubLayerDescriptor\r\n}\r\n\r\nexport interface SubLayerDescriptor {\r\n value: number\r\n subLayer: string\r\n label?: string\r\n subLabel?: string\r\n wikiKey?: string\r\n}\r\n\r\n/**\r\n * Interface for properties of a radio button sub layer group.\r\n */\r\nexport interface RadioSubLayers {\r\n labelId: string\r\n selected: RadioSubLayer\r\n sublayers: RadioSubLayer[]\r\n}\r\n\r\n/**\r\n * Interface for properties of a radio button sub layer.\r\n */\r\nexport interface RadioSubLayer {\r\n labelId: string\r\n subLayer: string\r\n path?: string\r\n}\r\n\r\n/**\r\n * Interface for properties of a switch sub layer group.\r\n */\r\nexport interface SwitchSubLayers {\r\n labelId: string\r\n sublayers: SwitchSubLayer[]\r\n}\r\n\r\n/**\r\n * Interface for properties of a switch sub layer.\r\n */\r\nexport interface SwitchSubLayer {\r\n id?: string\r\n labelId?: string\r\n title?: string\r\n subLayer: string\r\n enabled: boolean\r\n}\r\n\r\n/**\r\n * Abstract super class for all OpenLayers layers.\r\n */\r\nexport class AbstractLayer implements GeoLayer {\r\n _minimumZoom: number\r\n _enabled: boolean\r\n _olLayer: ol.layer.Layer\r\n _type: LayerType\r\n _zIndex: number\r\n\r\n /**\r\n * Constructor.\r\n * @param {object} options The options to apply to the layer.\r\n * The options object has the following keys:\r\n * * minZoom: The minimum zoom level at which to show the layer.\r\n * * enabled: Whether the layer should be enabled. This does not\r\n * mean visible, rather whether the layer should react to other\r\n * changes from the outside, like e.g. when the zoom level is\r\n * changed.\r\n */\r\n constructor (options: AbstractLayerOptions) {\r\n this._type = options.layerType\r\n this._minimumZoom = options.minZoom !== undefined ? options.minZoom : -1\r\n this._enabled = options.enabled !== undefined ? options.enabled : false\r\n this._olLayer = new ol.layer.Layer({})\r\n this._zIndex = options.zIndex\r\n }\r\n\r\n /**\r\n * Getter for the layer type\r\n */\r\n get type (): LayerType {\r\n return this._type\r\n }\r\n\r\n /**\r\n * Getter for the underlying OpenLayers layer.\r\n */\r\n get olLayer (): ol.layer.Layer {\r\n return this._olLayer\r\n }\r\n\r\n /**\r\n * Setter for the underlying OpenLayers layer.\r\n * All subclasses must use this setter within their constructor\r\n * to set the layer.\r\n */\r\n set olLayer (value) {\r\n this._olLayer = value\r\n this._olLayer.setZIndex(this._zIndex)\r\n this._olLayer.setProperties({ layerType: this._type })\r\n this._olLayer.set('geo_type', this._type, true)\r\n }\r\n\r\n /**\r\n * Getter for the layer zIndex.\r\n */\r\n get zIndex (): number {\r\n return this._zIndex\r\n }\r\n\r\n /**\r\n * Setter for the layer zIndex.\r\n */\r\n set zIndex (zIndex: number) {\r\n this._zIndex = zIndex\r\n }\r\n\r\n /**\r\n * Getter for the enabled property.\r\n */\r\n get enabled (): boolean {\r\n return this._enabled\r\n }\r\n\r\n /**\r\n * Setter for the enabled property.\r\n */\r\n set enabled (value) {\r\n this._enabled = value\r\n }\r\n\r\n /**\r\n * Getter for the visible property.\r\n * This calls down to the underlying OpenLayers layer, so calling\r\n * it before initializing that will result in an error.\r\n */\r\n get visible (): boolean {\r\n if (this._olLayer === undefined) {\r\n throw new Error('OpenLayers layer has not been initialized.')\r\n }\r\n return this._olLayer.getVisible()\r\n }\r\n\r\n /**\r\n * Setter for the visible property.\r\n * This calls down to the underlying OpenLayers layer, so calling\r\n * it before initializing that will result in an error.\r\n */\r\n set visible (value) {\r\n if (this._olLayer === undefined) {\r\n throw new Error('OpenLayers layer has not been initialized.')\r\n }\r\n this._olLayer.setVisible(value)\r\n }\r\n\r\n /**\r\n * Get sub layer name of a given value.\r\n * @param params Params to get sub layer name from.\r\n * @param value Sub layer value.\r\n * @returns Name of sub layer.\r\n */\r\n getSubLayerName (params: LayerParamsObject, value: number): string {\r\n return ''\r\n }\r\n\r\n /**\r\n * Getter for minimum zoom level.\r\n * @returns The minimum zoom level to enable the layer on.\r\n */\r\n getMinimumZoom (): number {\r\n return this._minimumZoom\r\n }\r\n\r\n /**\r\n * Method that can be called when the Map component changes\r\n * zoom level. The layer will toggle its visible property if\r\n * needed.\r\n * @param {number} zoomLevel The current zoom level.\r\n */\r\n onZoomChange (zoomLevel: number): void {\r\n if (this.enabled) {\r\n if (this._minimumZoom !== -1) {\r\n if (zoomLevel < this._minimumZoom && this.visible) {\r\n this.visible = false\r\n } else if (zoomLevel >= this._minimumZoom && !this.visible) {\r\n this.visible = true\r\n }\r\n }\r\n }\r\n }\r\n\r\n describe (): LayerDescription {\r\n throw new Error('Mandatory method describe is missing in subclass.')\r\n }\r\n}\r\n","export default __webpack_public_path__ + \"static/media/legend_borehole.6ca9965a.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_borehole.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the main borehole WMS source from Geo.\r\n */\r\nclass BoreHoleLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1.0\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.BORE_HOLES,\r\n enabled: true,\r\n minZoom: 12,\r\n zIndex: 5\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? BoreHoleLayer.defaultParams.opacity : opacity\r\n\r\n let layer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/ows',\r\n params: {\r\n layers: 'GEO-Services:borehole',\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n })\r\n })\r\n })\r\n\r\n // Method copied from GAL codebase to speed up borehole WMS. TypeScript compiler might complain about setImageLoadFunction, but it does exist, ignore error.\r\n layer.getSource().setImageLoadFunction(function (image: any, src: any) {\r\n var bboxStr = getArgFromUrl(src, \"BBOX\", null);\r\n let srsStr = getArgFromUrl(src, \"CRS\", null);\r\n\r\n if (bboxStr && srsStr) {\r\n let bbox = parseBBOX(bboxStr, \"%2C\");\r\n\r\n let newExtentStr =\r\n bbox[0] + \" \" + bbox[1] + \",\" +\r\n bbox[0] + \" \" + bbox[3] + \",\" +\r\n bbox[2] + \" \" + bbox[3] + \",\" +\r\n bbox[2] + \" \" + bbox[1] + \",\" +\r\n bbox[0] + \" \" + bbox[1];\r\n\r\n src += \"&cql_filter=WITHIN(geom,SRID=25832;POLYGON((\" + newExtentStr + \")))\";\r\n }\r\n\r\n (<HTMLImageElement>image.getImage()).src = src;\r\n \r\n });\r\n\r\n this.olLayer = layer\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.BORE_HOLES,\r\n name: 'map.layer.boreholes',\r\n group: LayerGroup.SUBSURFACE,\r\n ordering: 2,\r\n contextTags: [\r\n ContextTag.BOREHOLE\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 220\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nfunction getArgFromUrl(url: string, argName: string, defaultValue: string | null = null) : string | null {\r\n let index = url.search(new RegExp(argName, \"gi\"));\r\n if (index > -1) {\r\n if (url.indexOf(\"&\", index) > -1) {\r\n return url.substring(url.indexOf(\"=\", index) + 1, url.indexOf(\"&\", index));\r\n } else {\r\n return url.substring(url.indexOf(\"=\", index) + 1);\r\n }\r\n }\r\n else {\r\n return defaultValue;\r\n }\r\n}\r\n\r\nfunction parseBBOX(bbox: string, seperator: string = \",\"): number[] {\r\n if (!bbox) return [];\r\n\r\n let parts = bbox.split(seperator);\r\n let res = [];\r\n for (let i = 0; i < parts.length; i++) {\r\n res.push(parseFloat(parts[i]));\r\n }\r\n\r\n return res;\r\n}\r\n\r\nexport default BoreHoleLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_buried_valleys.b4a18c8c.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_buried_valleys.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the buried valleys WMS source from Geo.\r\n */\r\nclass BuriedValleysLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.BURIED_VALLEYS,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 4\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? BuriedValleysLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/wms',\r\n params: {\r\n layers: 'begravede-dale',\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n })\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.BURIED_VALLEYS,\r\n name: 'map.layer.buriedvalleys',\r\n group: LayerGroup.SUBSURFACE,\r\n contextTags: [\r\n ContextTag.BURIED_VALLEYS\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 220\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default BuriedValleysLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_postglacial_sediment_thickness.a8539bbd.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_postglacial_sediment_thickness.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the post glacial sediment thickness WMS source from Geo.\r\n */\r\nclass PostGlacialSedimentThicknessLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.POSTGLACIAL_SEDIMENT_THICKNESS,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? PostGlacialSedimentThicknessLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/wms',\r\n params: {\r\n layers: 'geo_tykkelse_af_postglaciale_aflejringer',\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.POSTGLACIAL_SEDIMENT_THICKNESS,\r\n name: 'map.layer.postglacialsedimentthickness',\r\n group: LayerGroup.SUBSURFACE,\r\n contextTags: [\r\n ContextTag.POSTGLACIAL_SEDIMENT_THICKNESS\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 300,\r\n legendTextId: 'layerpicker.legend.text.postglacialsedimentthickness'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default PostGlacialSedimentThicknessLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_ground_pollution_1.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the ground pollution V1 WMS source from Miljøportal.\r\n */\r\nclass GroundPollution1Layer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.GROUND_POLLUTION_1,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? GroundPollution1Layer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://b0501-prod-arldgeo-app.azurewebsites.net/geoserver/DKJord/wms',\r\n params: {\r\n LAYERS: 'View_V1Flader'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.GROUND_POLLUTION_1,\r\n name: 'map.layer.groundpollution1',\r\n group: LayerGroup.POLLUTION,\r\n contextTags: [\r\n ContextTag.GROUND_POLLUTION_1\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n legendTextId: 'layerpicker.legend.text.groundpollution1'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Miljoportal\r\n }\r\n }\r\n}\r\n\r\nexport default GroundPollution1Layer\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAABlCAIAAACjobQ5AAAEtGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjE2NSIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjEwMSIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICB0aWZmOkltYWdlV2lkdGg9IjE2NSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAxIgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI3Mi4wIgogICB0aWZmOllSZXNvbHV0aW9uPSI3Mi4wIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIx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\"","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_ground_pollution_2.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the ground pollution V2 WMS source from Miljøportal.\r\n */\r\nclass GroundPollution2Layer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.GROUND_POLLUTION_2,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? GroundPollution2Layer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://b0501-prod-arldgeo-app.azurewebsites.net/geoserver/DKJord/wms',\r\n params: {\r\n LAYERS: 'View_V2Flader'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.GROUND_POLLUTION_2,\r\n name: 'map.layer.groundpollution2',\r\n group: LayerGroup.POLLUTION,\r\n contextTags: [\r\n ContextTag.GROUND_POLLUTION_2\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n legendTextId: 'layerpicker.legend.text.groundpollution2'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Miljoportal\r\n }\r\n }\r\n}\r\n\r\nexport default GroundPollution2Layer\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK8AAABjCAIAAABi2sftAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjE3NSIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249Ijk5IgogICBleGlmOkNvbG9yU3BhY2U9IjEiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTc1IgogICB0aWZmOkltYWdlTGVuZ3RoPSI5OSIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIuMCIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIuMCIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0x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\"","export default __webpack_public_path__ + \"static/media/legend_raw_materials.be6e8425.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_raw_materials.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the raw material areas WMS source from Miljøportal.\r\n */\r\nclass RawMaterialAreasLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions = {\r\n layerType: LayerType.RAW_MATERIALS,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? RawMaterialAreasLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://arealeditering-dist-geo.miljoeportal.dk/geoserver/wms?',\r\n params: {\r\n layers: 'raastofomr'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.RAW_MATERIALS,\r\n name: 'map.layer.rawmaterialareas',\r\n group: LayerGroup.NEAR_TERRAIN,\r\n contextTags: [\r\n ContextTag.RAW_MATERIALS\r\n ],\r\n themes: [DataTheme.ENVIRONMENT, DataTheme.ICE_AGE],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 220\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Miljoportal\r\n }\r\n }\r\n}\r\n\r\nexport default RawMaterialAreasLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_varv.db166025.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_varv.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the varv WMS source from Geus.\r\n */\r\nclass VarvLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.VARV,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? VarvLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geus.dk/arcgis/services/Denmark/Varv_Praekvartaer/MapServer/WMSServer',\r\n params: {\r\n LAYERS: 'Varv_stratigraphy,Varv_stratigraphy_outline,Varv_fault_line',\r\n TRANSPARENT: 'TRUE',\r\n STYLES: 'default,default,default'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.VARV,\r\n name: 'map.layer.varv',\r\n group: LayerGroup.SUBSURFACE,\r\n contextTags: [\r\n ContextTag.VARV\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 250\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Varv\r\n }\r\n }\r\n}\r\n\r\nexport default VarvLayer\r\n","export const DataforsyningenToken = 'f3ecb52320902f733a433aa9945d8dc8'\r\n","import ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { DataforsyningenToken } from '../dataforsyningen/Dataforsyningen'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions, SubLayerDescriptor } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the sea level on land WMS source from Geo.\r\n */\r\nclass SeaLevelOnLandLayer extends AbstractLayer implements GeoLayer {\r\n private static readonly token: string = DataforsyningenToken\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n subLayers: {\r\n labelId: 'map.layer.sealevel.sublayers',\r\n key: 'havvandpaaland',\r\n subLayerDescriptors: [],\r\n inputEnabled: true,\r\n maximum: 0,\r\n minimum: 0,\r\n step: 0,\r\n unit: 'm',\r\n list: [],\r\n selected: {\r\n value: 0,\r\n subLayer: ''\r\n }\r\n }\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SEA_LEVEL_ON_LAND,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 2\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n // Initialize sublayers.\r\n options.param = this.initSubLayers(options.params)\r\n\r\n let { subLayers, opacity } = options.params\r\n opacity = opacity === undefined ? SeaLevelOnLandLayer.defaultParams.opacity : opacity\r\n\r\n const fallbackLayer = subLayers !== undefined && subLayers.list.length > 0 ? subLayers.list[0] : ''\r\n const subLayer = subLayers !== undefined && subLayers.selected.subLayer === '' ? fallbackLayer : subLayers.selected\r\n\r\n const wmtsOptions = ol.source.WMTS.optionsFromCapabilities(options.capabilities, {\r\n layer: subLayer.subLayer\r\n })\r\n\r\n const wmts = new ol.source.WMTS(wmtsOptions)\r\n wmts.setUrls([`https://api.dataforsyningen.dk/dhm_havvandpaaland?token=${SeaLevelOnLandLayer.token}`])\r\n\r\n this.olLayer = new ol.layer.Tile({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: wmts\r\n })\r\n }\r\n\r\n getSubLayerName (params: LayerParamsObject, value: number): string {\r\n if (params.subLayers === undefined) {\r\n return ''\r\n }\r\n return `${params.subLayers.key}_${String(value).replace('.', '_')}`\r\n }\r\n\r\n initSubLayers (params: LayerParamsObject): LayerParamsObject {\r\n if (params.subLayers === undefined) {\r\n return params\r\n }\r\n let lastValue = 0\r\n params.subLayers.minimum = 0\r\n params.subLayers.maximum = 0\r\n params.subLayers.subLayerDescriptors = []\r\n for (const subLayer of params.subLayers.list) {\r\n // Convert string to float\r\n const value = parseFloat(subLayer.replace(`${params.subLayers.key}_`, '').replace('_', '.'))\r\n const descriptor: SubLayerDescriptor = {\r\n value: value,\r\n subLayer: subLayer\r\n }\r\n params.subLayers.subLayerDescriptors.push(descriptor)\r\n if (value < params.subLayers.minimum) {\r\n params.subLayers.minimum = value\r\n }\r\n if (value > params.subLayers.maximum) {\r\n params.subLayers.maximum = value\r\n }\r\n if (subLayer === params.subLayers.selected.subLayer) {\r\n params.subLayers.selected = descriptor\r\n }\r\n if (lastValue > 0) {\r\n params.subLayers.step = Math.round((value - lastValue) * 100) / 100 // round value to 1 decimal\r\n }\r\n lastValue = value\r\n }\r\n return params\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SEA_LEVEL_ON_LAND,\r\n name: 'map.layer.sealevel',\r\n group: LayerGroup.WATER,\r\n contextTags: [\r\n ContextTag.SEA_LEVEL_ON_LAND\r\n ],\r\n themes: [DataTheme.CLIMATE, DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: 'https://api.dataforsyningen.dk/service?request=GetCapabilities&version=1.1.1&servicename=dhm_havvandpaaland&service=WMTS',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geodatastyrelsen\r\n }\r\n }\r\n}\r\n\r\nexport default SeaLevelOnLandLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Slice Kote WMS source from Geo.\r\n */\r\nclass SliceKoteLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n level: 0\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SLICE_KOTE,\r\n enabled: true,\r\n minZoom: 10,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n const { params } = options\r\n const opacity = params.opacity === undefined ? SliceKoteLayer.defaultParams.opacity : params.opacity\r\n const level: number = params.level === undefined ? SliceKoteLayer.defaultParams.level : params.level\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/slice-tools',\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n\r\n params: {\r\n layers: 'slice_kote',\r\n viewparams: `model:${options.selectedGeoModel as string};level:${level}`,\r\n token: options.token\r\n },\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SLICE_KOTE,\r\n name: 'map.layer.slicekote',\r\n group: LayerGroup.SUBSURFACE,\r\n ordering: 4,\r\n contextTags: [\r\n ContextTag.SLICE_KOTE\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default SliceKoteLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Slice DHM WMS source from Geo.\r\n */\r\nclass SliceDHMLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n depth: 0\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SLICE_DHM,\r\n enabled: true,\r\n minZoom: 10,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n const { params } = options\r\n const opacity = params.opacity === undefined ? SliceDHMLayer.defaultParams.opacity : params.opacity\r\n const depth: number = params.depth === undefined ? SliceDHMLayer.defaultParams.depth : params.depth\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/slice-tools',\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n\r\n params: {\r\n layers: 'slice_dhm',\r\n viewparams: `model:${options.selectedGeoModel as string};depth:${depth}`,\r\n token: options.token\r\n }\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SLICE_DHM,\r\n name: 'map.layer.slicedhm',\r\n group: LayerGroup.SUBSURFACE,\r\n ordering: 3,\r\n contextTags: [\r\n ContextTag.SLICE_DHM\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default SliceDHMLayer\r\n","import ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { DataforsyningenToken } from '../dataforsyningen/Dataforsyningen'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions, SubLayerDescriptor } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the blue spot extreme rain WMTS source from Dataforsyningen.\r\n */\r\nclass BlueSpotExtremeRain extends AbstractLayer implements GeoLayer {\r\n private static readonly token: string = DataforsyningenToken\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n subLayers: {\r\n labelId: 'map.layer.bluespotextremerain.sublayers',\r\n key: 'bluespot_ekstremregn',\r\n subLayerDescriptors: [],\r\n inputEnabled: true,\r\n maximum: 0,\r\n minimum: 0,\r\n step: 0,\r\n unit: 'mm',\r\n list: [],\r\n selected: {\r\n value: 0,\r\n subLayer: ''\r\n }\r\n }\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.BLUE_SPOT_EXTREME_RAIN,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 2\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n // Initialize sublayers.\r\n options.param = this.initSubLayers(options.params)\r\n\r\n let { subLayers, opacity } = options.params\r\n opacity = opacity === undefined ? BlueSpotExtremeRain.defaultParams.opacity : opacity\r\n\r\n const fallbackLayer = subLayers !== undefined && subLayers.list.length > 0 ? subLayers.list[0] : ''\r\n const subLayer = subLayers !== undefined && subLayers.selected.subLayer === '' ? fallbackLayer : subLayers.selected\r\n\r\n const wmtsOptions = ol.source.WMTS.optionsFromCapabilities(options.capabilities, {\r\n layer: subLayer.subLayer\r\n })\r\n\r\n const wmts = new ol.source.WMTS(wmtsOptions)\r\n wmts.setUrls([`https://api.dataforsyningen.dk/dhm_bluespot_ekstremregn?token=${BlueSpotExtremeRain.token}`])\r\n\r\n this.olLayer = new ol.layer.Tile({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: wmts\r\n })\r\n }\r\n\r\n getSubLayerName (params: LayerParamsObject, value: number): string {\r\n if (params.subLayers === undefined) {\r\n return ''\r\n }\r\n\r\n // Append zero to layerName if needed\r\n let layerName = `${params.subLayers.key}_${String(value / 1000).replace('.', '_')}`\r\n if (layerName.split('_').length > 3) {\r\n if (layerName.split('_')[3].length < 3) {\r\n layerName += '0'\r\n }\r\n }\r\n\r\n return layerName\r\n }\r\n\r\n initSubLayers (params: LayerParamsObject): LayerParamsObject {\r\n if (params.subLayers === undefined) {\r\n return params\r\n }\r\n params.subLayers.list = params.subLayers.list.filter(subLayer => { return subLayer !== 'bluespot_ekstremregn_0_150plus' })\r\n\r\n let lastValue = 0\r\n params.subLayers.minimum = 0\r\n params.subLayers.maximum = 0\r\n params.subLayers.subLayerDescriptors = []\r\n params.subLayers.list.forEach(subLayer => {\r\n if (params.subLayers === undefined) {\r\n return params\r\n }\r\n const value = parseFloat(subLayer.replace(`${params.subLayers.key}_`, '').replace('_', '.')) * 1000\r\n const descriptor: SubLayerDescriptor = {\r\n value: value,\r\n subLayer: subLayer\r\n }\r\n params.subLayers.subLayerDescriptors.push(descriptor)\r\n if (value < params.subLayers.minimum) {\r\n params.subLayers.minimum = value\r\n }\r\n if (value > params.subLayers.maximum) {\r\n params.subLayers.maximum = value\r\n }\r\n if (subLayer === params.subLayers.selected.subLayer) {\r\n params.subLayers.selected = descriptor\r\n }\r\n if (lastValue > 0) {\r\n params.subLayers.step = Math.round((value - lastValue) * 1000) / 1000 // round value to 2 decimal\r\n }\r\n lastValue = value\r\n })\r\n\r\n return params\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.BLUE_SPOT_EXTREME_RAIN,\r\n name: 'map.layer.bluespotextremerain',\r\n group: LayerGroup.WATER,\r\n contextTags: [\r\n ContextTag.BLUE_SPOT_EXTREME_RAIN\r\n ],\r\n opacityEnabled: true,\r\n themes: [DataTheme.CLIMATE, DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: 'https://api.dataforsyningen.dk/service?request=GetCapabilities&version=1.1.1&servicename=dhm_bluespot_ekstremregn&service=WMTS',\r\n legendEnabled: false,\r\n layerCopyright: layerCopyrights.Geodatastyrelsen\r\n }\r\n }\r\n}\r\n\r\nexport default BlueSpotExtremeRain\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { DataforsyningenToken } from '../dataforsyningen/Dataforsyningen'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the TerrainShadows WMS source from Dataforsyningen.\r\n */\r\nclass TerrainShadows extends AbstractLayer implements GeoLayer {\r\n private static readonly token: string = DataforsyningenToken\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.8\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.TERRAIN_SHADOWS,\r\n enabled: true,\r\n minZoom: 12,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? TerrainShadows.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://api.dataforsyningen.dk/wms/dhm_temp',\r\n params: {\r\n layers: 'quickDHM_skyggekort_terraen_overdrevet',\r\n token: TerrainShadows.token,\r\n transparent: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.TERRAIN_SHADOWS,\r\n name: 'map.layer.terrainshadows',\r\n group: LayerGroup.NEAR_TERRAIN,\r\n contextTags: [\r\n ContextTag.TERRAIN_SHADOWS\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geodatastyrelsen\r\n }\r\n }\r\n}\r\n\r\nexport default TerrainShadows\r\n","export default __webpack_public_path__ + \"static/media/legend_gerda.2f42693e.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_gerda.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the GERDA WMS source from GEUS.\r\n */\r\nclass GerdaLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.GERDA,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? GerdaLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'http://data.geus.dk/geusmap/ows/25832.jsp?mapname=gerda&whoami=data@geo.dk',\r\n params: {\r\n layers: ['gerda_data', 'gerda_lines']\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.GERDA,\r\n name: 'map.layer.gerda',\r\n group: LayerGroup.GEOPHYSICS,\r\n contextTags: [\r\n ContextTag.GERDA\r\n ],\r\n themes: [DataTheme.ENERGY],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageHeight: 200\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geus\r\n }\r\n }\r\n}\r\n\r\nexport default GerdaLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the Onshore windmills WMS source from SDFI.\r\n */\r\nclass OnshoreWindmillsLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.ONSHORE_WINDMILLS,\r\n enabled: true,\r\n zIndex: 5\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? OnshoreWindmillsLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/ows',\r\n params: {\r\n layers: 'GEO-Services:eksisterende-moeller-2021',\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.ONSHORE_WINDMILLS,\r\n name: 'map.layer.onshorewindmills',\r\n group: LayerGroup.WINDPOWER,\r\n contextTags: [\r\n ContextTag.ONSHORE_WINDMILLS\r\n ],\r\n themes: [DataTheme.ENERGY],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.Energistyrelsen\r\n }\r\n }\r\n}\r\n\r\nexport default OnshoreWindmillsLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_water_extraction_plants.2b839ae7.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_water_extraction_plants.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the WaterExtractionPlants WMS source from GEUS.\r\n */\r\nclass WaterExtractionPlantsLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.WATER_EXTRACTION_PLANTS,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 4\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? WaterExtractionPlantsLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'http://data.geus.dk/geusmap/ows/25832.jsp?mapname=jupiter&whoami=data@geo.dk',\r\n params: {\r\n layers: 'jupiter_anlaeg_ws'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.WATER_EXTRACTION_PLANTS,\r\n name: 'map.layer.waterextractionplants',\r\n group: LayerGroup.WATER,\r\n contextTags: [\r\n ContextTag.WATER_EXTRACTION_PLANTS\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 160\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geus\r\n }\r\n }\r\n}\r\n\r\nexport default WaterExtractionPlantsLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_protected_nature_types.7602c8d6.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_protected_nature_types.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the ProtectedNatureTypes WMS source from Miljoeportalen.\r\n */\r\nclass ProtectedNatureTypesLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.PROTECTED_NATURE_TYPES,\r\n enabled: true,\r\n minZoom: 12,\r\n zIndex: 4\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? ProtectedNatureTypesLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://arealeditering-dist-geo.miljoeportal.dk/geoserver/wms',\r\n params: {\r\n layers: 'bes_naturtyper'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.PROTECTED_NATURE_TYPES,\r\n name: 'map.layer.protectednaturetypes',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.PROTECTED_NATURE_TYPES\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 100\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Miljoportal\r\n }\r\n }\r\n}\r\n\r\nexport default ProtectedNatureTypesLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_shallow_groundwater.050e4ef7.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_shallow_groundwater.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the ShallowGroundwater WMS source from Geo.\r\n */\r\nclass ShallowGroundwaterLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SHALLOW_GROUNDWATER,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? ShallowGroundwaterLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/wms',\r\n params: {\r\n layers: 'TNGVSmap',\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SHALLOW_GROUNDWATER,\r\n name: 'map.layer.shallowgroundwater',\r\n group: LayerGroup.WATER,\r\n contextTags: [\r\n ContextTag.SHALLOW_GROUNDWATER\r\n ],\r\n themes: [DataTheme.CLIMATE, DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 300,\r\n legendTextId: 'layerpicker.legend.text.shallowgroundwater'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default ShallowGroundwaterLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport legendImage from '../../img/legend_ice_age.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { AbstractLayer, AbstractLayerOptions, GeoLayer, SubLayerDescriptor } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the ice age WMS sources from Geo.\r\n */\r\nclass IceAgeLayer extends AbstractLayer implements GeoLayer {\r\n private static readonly descriptors: SubLayerDescriptor[] = [\r\n {\r\n value: 0,\r\n label: 'I dag',\r\n subLayer: '',\r\n subLabel: 'map.layer.iceage.now'\r\n },\r\n {\r\n value: -12600,\r\n label: '12.600 - 11.700 f.v.t.',\r\n subLayer: 'istid-11-5-yd',\r\n subLabel: 'map.layer.iceage.yngredryas',\r\n wikiKey: 'yngredryas'\r\n },\r\n {\r\n value: -13900,\r\n label: '13.900 - 12.600 f.v.t.',\r\n subLayer: 'istid-13-alleroed',\r\n subLabel: 'map.layer.iceage.alleroed',\r\n wikiKey: 'alleroed'\r\n },\r\n {\r\n value: -14000,\r\n label: '14.050 - 13.900 f.v.t.',\r\n subLayer: 'istid-15-bholm',\r\n subLabel: 'map.layer.iceage.aeldredryas',\r\n wikiKey: 'aeldredryas'\r\n },\r\n {\r\n value: -14700,\r\n label: '14.700 - 14.050 f.v.t.',\r\n subLayer: 'istid-14-5-boelling',\r\n subLabel: 'map.layer.iceage.boelling',\r\n wikiKey: 'boelling'\r\n },\r\n {\r\n value: -17000,\r\n label: '17.000 - 14.700 f.v.t.',\r\n subLayer: 'istid-17-16-oeresund',\r\n subLabel: 'map.layer.iceage.aeldstedryas',\r\n wikiKey: 'aeldstedryas'\r\n },\r\n {\r\n value: -18000,\r\n label: '18.000 - 17.000 f.v.t.',\r\n subLayer: 'istid-18-baelthav',\r\n subLabel: 'map.layer.iceage.baelthavisstroem',\r\n wikiKey: 'baelthavisstroem'\r\n },\r\n {\r\n value: -19000,\r\n label: '19.000 - 18.000 f.v.t.',\r\n subLayer: 'istid-19-oestjysk',\r\n subLabel: 'map.layer.iceage.oestjyskisstroem',\r\n wikiKey: 'oestjyskisstroem'\r\n },\r\n {\r\n value: -20000,\r\n label: '20.000 - 19.000 f.v.t.',\r\n subLayer: 'istid-20-storebaelt',\r\n subLabel: 'map.layer.iceage.hovedfremstoedet',\r\n wikiKey: 'hovedfremstoedet'\r\n },\r\n {\r\n value: -23000,\r\n label: '23.000 - 20.000 f.v.t.',\r\n subLayer: 'istid-22-lgm',\r\n subLabel: 'map.layer.iceage.hovedopholdslinjen',\r\n wikiKey: 'hovedopholdslinjen'\r\n },\r\n {\r\n value: -26000,\r\n label: '26.000 - 23.000f.v.t.',\r\n subLayer: 'istid-25-glumsloev-moen',\r\n subLabel: 'map.layer.iceage.kattegatissoeninterfasen',\r\n wikiKey: 'kattegatissoeninterfasen'\r\n },\r\n {\r\n value: -28000,\r\n label: '28.000 - 26.000 f.v.t.',\r\n subLayer: 'istid-27-kattegatisstroem',\r\n subLabel: 'map.layer.iceage.kattegatisstroemmen',\r\n wikiKey: 'kattegatisstroemmen'\r\n },\r\n {\r\n value: -30000,\r\n label: '30.000 - 28.000 f.v.t.',\r\n subLayer: 'istid-28-kattegatissoe',\r\n subLabel: 'map.layer.iceage.kattegatissoeen',\r\n wikiKey: 'kattegatissoeen'\r\n },\r\n {\r\n value: -32000,\r\n label: '32.000 - 30.000 f.v.t.',\r\n subLayer: 'istid-30-sandnes',\r\n subLabel: 'map.layer.iceage.sandnesmildningen',\r\n wikiKey: 'moenkattegatinterstadial'\r\n },\r\n {\r\n value: -35000,\r\n label: '35.000 - 32.000 f.v.t.',\r\n subLayer: 'istid-35-klintholm',\r\n subLabel: 'map.layer.iceage.klinthomsfremstoedet',\r\n wikiKey: 'klinthomsfremstoedet'\r\n },\r\n {\r\n value: -45000,\r\n label: '45.000 - 35.000 f.v.t.',\r\n subLayer: 'istid-40-sejroe',\r\n subLabel: 'map.layer.iceage.sandnesmildningen',\r\n wikiKey: 'moenkattegatinterstadial'\r\n },\r\n {\r\n value: -50000,\r\n label: '50.000 - 45.000 f.v.t.',\r\n subLayer: 'istid-46-postristinge',\r\n subLabel: 'map.layer.iceage.vennebjergmildningen',\r\n wikiKey: 'sejeroeinterstadial'\r\n },\r\n {\r\n value: -55000,\r\n label: '55.000 - 50.000 f.v.t.',\r\n subLayer: 'istid-50-ristinge',\r\n subLabel: 'map.layer.iceage.ristingefremstoedet',\r\n wikiKey: 'ristingefremstoedet'\r\n },\r\n {\r\n value: -60000,\r\n label: '60.000 - 55.000 f.v.t.',\r\n subLayer: 'istid-60-hirtshals',\r\n subLabel: 'map.layer.iceage.hirtshalsmildningen',\r\n wikiKey: 'hirtshalsmildningen'\r\n },\r\n {\r\n value: -105000,\r\n label: '105.000 - 95.000 f.v.t.',\r\n subLayer: 'istid-100-broerup',\r\n subLabel: 'map.layer.iceage.boerupmildningen',\r\n wikiKey: 'boerupmildningen'\r\n },\r\n {\r\n value: -130000,\r\n label: '130.000 - 105.000 f.v.t.',\r\n subLayer: 'istid-125-eem',\r\n subLabel: 'map.layer.iceage.eemmellemistid',\r\n wikiKey: 'eemmellemistid'\r\n },\r\n {\r\n value: -135000,\r\n label: '135.000 - 130.000 f.v.t.',\r\n subLayer: 'istid-130-sen-saale',\r\n subLabel: 'map.layer.iceage.sensaaleistid',\r\n wikiKey: 'sensaaleistid'\r\n },\r\n {\r\n value: -145000,\r\n label: '145.000 - 140.000 f.v.t.',\r\n subLayer: 'istid-140-warthe',\r\n subLabel: 'map.layer.iceage.warthefremstoedet',\r\n wikiKey: 'warthefremstoedet'\r\n },\r\n {\r\n value: -180000,\r\n label: '180.000 - 160.000 f.v.t.',\r\n subLayer: 'istid-170-drenthe',\r\n subLabel: 'map.layer.iceage.drenthefremstoedet',\r\n wikiKey: 'drenthefremstoedet'\r\n }\r\n ]\r\n\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n subLayers: {\r\n labelId: 'map.layer.iceage.sublayers',\r\n key: 'istider',\r\n subLayerDescriptors: IceAgeLayer.descriptors,\r\n inputEnabled: true,\r\n stepperEnabled: true,\r\n maximum: 0,\r\n minimum: -170000,\r\n step: 0,\r\n unit: 'm',\r\n list: [],\r\n selected: IceAgeLayer.descriptors[0]\r\n }\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.ICE_AGE,\r\n enabled: true,\r\n minZoom: 6,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { subLayers, opacity } = options.params\r\n opacity = opacity === undefined ? IceAgeLayer.defaultParams.opacity : opacity\r\n\r\n const layer = subLayers !== undefined ? subLayers.selected.subLayer : ''\r\n\r\n this.olLayer = new ol.layer.Tile({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.TileWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/wms',\r\n params: {\r\n layers: layer,\r\n token: options.token\r\n }\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.ICE_AGE,\r\n name: 'map.layer.iceage',\r\n group: LayerGroup.ICE_AGE,\r\n contextTags: [\r\n ContextTag.ICE_AGE\r\n ],\r\n themes: [DataTheme.ICE_AGE],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageHeight: 110,\r\n legendTextId: 'layerpicker.legend.text.iceage'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default IceAgeLayer\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIUAAACRCAYAAADtnXuxAAAEtGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEzMyIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjE0NSIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICB0aWZmOkltYWdlV2lkdGg9IjEzMyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTQ1IgogICB0aWZmOlJlc29sdXRpb25Vbml0PSIyIgogICB0aWZmOlhSZXNvbHV0aW9uPSI3Mi4wIgogICB0aWZmOllSZXNvbHV0aW9uPSI3Mi4wIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIx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\"","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport legendImage from '../../img/legend_windmillsatsea.png'\r\n\r\n/**\r\n * Map layer class for the WindmillsAtSea WMS source from Dataforsyningen.\r\n */\r\nclass WindmillsAtSeaLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.WINDMILLS_AT_SEA,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 4\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? WindmillsAtSeaLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://ows.emodnet-humanactivities.eu/wms?',\r\n params: {\r\n layers: \"windfarmspoly\",\r\n transparent: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.WINDMILLS_AT_SEA,\r\n name: 'map.layer.windmillsatsea',\r\n group: LayerGroup.WINDPOWER,\r\n contextTags: [\r\n ContextTag.WINDMILLS_AT_SEA\r\n ],\r\n themes: [DataTheme.ENERGY],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 150\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Miljoportal\r\n }\r\n }\r\n}\r\n\r\nexport default WindmillsAtSeaLayer\r\n","export default \"data:image/png;base64,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\"","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Natura 2000 Bird Protection Areas WMS source from MiljøGIS.\r\n */\r\nclass BirdProtectionLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.BIRD_PROTECTION,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? BirdProtectionLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://tilecache7-miljoegis.mim.dk/gwc/service/wms',\r\n params: {\r\n LAYERS: 'theme-np3b_2020-fuglbeskyttelsesomrader',\r\n transparent: 'TRUE',\r\n srs: 'EPSG:25832'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.BIRD_PROTECTION,\r\n name: 'map.layer.birdprotection',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.BIRD_PROTECTION\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.MST\r\n }\r\n }\r\n}\r\n\r\nexport default BirdProtectionLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Natura 2000 Ramsar Areas WMS source from MiljøGIS.\r\n */\r\nclass RamsarLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.RAMSAR,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? RamsarLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://tilecache7-miljoegis.mim.dk/gwc/service/wms',\r\n params: {\r\n LAYERS: 'theme-np3b_2020-ramsar',\r\n transparent: 'TRUE',\r\n srs: 'EPSG:25832'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.RAMSAR,\r\n name: 'map.layer.ramsar',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.RAMSAR\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.MST\r\n }\r\n }\r\n}\r\n\r\nexport default RamsarLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Natura 2000 Habitat Areas WMS source from MiljøGIS.\r\n */\r\nclass HabitatProtectionLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.HABITAT_PROTECTION,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? HabitatProtectionLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://tilecache7-miljoegis.mim.dk/gwc/service/wms',\r\n params: {\r\n LAYERS: 'theme-np3b_2020-habitatomraader',\r\n transparent: 'TRUE',\r\n srs: 'EPSG:25832'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.HABITAT_PROTECTION,\r\n name: 'map.layer.habitatprotection',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.HABITAT_PROTECTION\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.MST\r\n }\r\n }\r\n}\r\n\r\nexport default HabitatProtectionLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Natura 2000 Protected Forest Areas WMS source from MiljøGIS.\r\n */\r\nclass ForestProtectionLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.FOREST_PROTECTION,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? ForestProtectionLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://tilecache7-miljoegis.mim.dk/gwc/service/wms',\r\n params: {\r\n LAYERS: 'theme-np3b_2020-fredskov',\r\n transparent: 'TRUE',\r\n srs: 'EPSG:25832'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.FOREST_PROTECTION,\r\n name: 'map.layer.forestprotection',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.FOREST_PROTECTION\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.MST\r\n }\r\n }\r\n}\r\n\r\nexport default ForestProtectionLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Natura 2000 Protected Wildlife Areas WMS source from MiljøGIS.\r\n */\r\nclass WildlifeLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.WILDLIFE,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? WildlifeLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://tilecache7-miljoegis.mim.dk/gwc/service/wms',\r\n params: {\r\n LAYERS: 'theme-np3b_2020-naturvildtreservat',\r\n transparent: 'TRUE',\r\n srs: 'EPSG:25832'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.WILDLIFE,\r\n name: 'map.layer.wildlife',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.WILDLIFE\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.MST\r\n }\r\n }\r\n}\r\n\r\nexport default WildlifeLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Natura 2000 Sate Owned Areas WMS source from MiljøGIS.\r\n */\r\nclass NaturaStateOwnedLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.NATURA_STATE_OWNED,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? NaturaStateOwnedLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://tilecache7-miljoegis.mim.dk/gwc/service/wms',\r\n params: {\r\n LAYERS: 'theme-np3b_2020-natura2000statsejet',\r\n transparent: 'TRUE',\r\n srs: 'EPSG:25832'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.NATURA_STATE_OWNED,\r\n name: 'map.layer.naturastateowned',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.NATURA_STATE_OWNED\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.MST\r\n }\r\n }\r\n}\r\n\r\nexport default NaturaStateOwnedLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Natura 2000 Areas WMS source from MiljøGIS.\r\n */\r\nclass NaturaLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.NATURA,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? NaturaLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://tilecache7-miljoegis.mim.dk/gwc/service/wms',\r\n params: {\r\n LAYERS: 'theme-np3b_2020-natura2000omraader',\r\n transparent: 'TRUE',\r\n srs: 'EPSG:25832'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.NATURA,\r\n name: 'map.layer.natura',\r\n group: LayerGroup.NATURE,\r\n contextTags: [\r\n ContextTag.NATURA\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.MST\r\n }\r\n }\r\n}\r\n\r\nexport default NaturaLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_prequaternary_lithology.eed06894.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_prequaternary_lithology.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the Pre-Quaternary Lithology WMS source from Geo.\r\n */\r\nclass PreQuaternaryLithologyLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.PREQUATERNARY_LITHOLOGY,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? PreQuaternaryLithologyLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/wms',\r\n params: {\r\n layers: 'GEO-Services:praekvartaer-lithologi',\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.PREQUATERNARY_LITHOLOGY,\r\n name: 'map.layer.prequaternarylithology',\r\n group: LayerGroup.SUBSURFACE,\r\n contextTags: [\r\n ContextTag.PREQUATERNARY_LITHOLOGY\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 260\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default PreQuaternaryLithologyLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_prequaternary_elevation.9dbc3ba8.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_prequaternary_elevation.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the Pre-Quaternary Elevation Maps WMS source from GEUS.\r\n */\r\nclass PreQuaternaryElevationLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.PREQUATERNARY_ELEVATION,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? PreQuaternaryElevationLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geus.dk/arcgis/services/Denmark/Praekvartert_hojdeforhold/MapServer/WMSServer',\r\n params: {\r\n layers: ['Hojdeforhold']\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.PREQUATERNARY_ELEVATION,\r\n name: 'map.layer.prequaternaryelevation',\r\n group: LayerGroup.SUBSURFACE,\r\n contextTags: [\r\n ContextTag.PREQUATERNARY_ELEVATION\r\n ],\r\n themes: [DataTheme.ENERGY, DataTheme.ICE_AGE],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 150\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geus\r\n }\r\n }\r\n}\r\n\r\nexport default PreQuaternaryElevationLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_elevation_depth.55b2b233.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_elevation_depth.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the Elevation and Depth Maps WMS source from GEUS.\r\n */\r\nclass ElevationAndDepthLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.ELEVATION_DEPTH,\r\n enabled: true,\r\n minZoom: 8,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? ElevationAndDepthLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geus.dk/arcgis/services/Denmark/Hoejde_dybde/MapServer/WMSServer',\r\n params: {\r\n layers: ['Hoejde,Dybde']\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.ELEVATION_DEPTH,\r\n name: 'map.layer.elevationdepth',\r\n group: LayerGroup.SUBSURFACE,\r\n contextTags: [\r\n ContextTag.ELEVATION_DEPTH\r\n ],\r\n themes: [DataTheme.ENERGY, DataTheme.ICE_AGE],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 360\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geus\r\n }\r\n }\r\n}\r\n\r\nexport default ElevationAndDepthLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_soil_types.980e0c70.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions, RadioSubLayer } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_soil_types.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\nconst defaultSubLayer: RadioSubLayer = {\r\n labelId: 'map.layer.soiltypes.sublayer.soiltypes200',\r\n subLayer: 'Jordart_200000',\r\n path: 'Jordartskort_200000'\r\n}\r\n\r\n/**\r\n * Map layer class for the Soil Type Maps WMS source from GEUS.\r\n */\r\nclass SoilTypesLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n radioSubLayers: {\r\n labelId: 'layerpicker.radiosublayer.soiltypes',\r\n selected: defaultSubLayer,\r\n sublayers: [\r\n {\r\n labelId: 'map.layer.soiltypes.sublayer.soiltypes25',\r\n subLayer: 'Jordart_25000_uden_hav',\r\n path: 'Jordartskort_25000'\r\n },\r\n defaultSubLayer\r\n ]\r\n }\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SOIL_TYPES,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { radioSubLayers, opacity } = options.params\r\n opacity = opacity === undefined ? SoilTypesLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: `https://data.geus.dk/arcgis/services/Denmark/${radioSubLayers.selected.path as string}/MapServer/WmsServer`,\r\n params: {\r\n layers: radioSubLayers.selected.subLayer\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SOIL_TYPES,\r\n name: 'map.layer.soiltypes',\r\n group: LayerGroup.NEAR_TERRAIN,\r\n contextTags: [\r\n ContextTag.SOIL_TYPES\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 210\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geus\r\n }\r\n }\r\n}\r\n\r\nexport default SoilTypesLayer","export default __webpack_public_path__ + \"static/media/legend_morphology.b09a2525.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_morphology.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the Morphology WMS source from GEUS.\r\n */\r\nclass MorphologyLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.MORPHOLOGY,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? MorphologyLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'http://data.geus.dk/arcgis/services/Denmark/DK_Morfologi_kort/MapServer/WMSServer?',\r\n params: {\r\n layers: 'Geomorfologi'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.MORPHOLOGY,\r\n name: 'map.layer.morphology',\r\n group: LayerGroup.NEAR_TERRAIN,\r\n contextTags: [\r\n ContextTag.MORPHOLOGY\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 220\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geus\r\n }\r\n }\r\n}\r\n\r\nexport default MorphologyLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_seabed_sediments.731c6833.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_seabed_sediments.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the Seabed Sediments WMS source from GEUS.\r\n */\r\nclass SeabedSedimentsLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SEABED_SEDIMENTS,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? SeabedSedimentsLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'http://data.geus.dk/arcgis/services/Denmark/Havbundssediment/MapServer/WMSServer?',\r\n params: {\r\n layers: 'Seabed_sediment'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SEABED_SEDIMENTS,\r\n name: 'map.layer.seabedsediments',\r\n group: LayerGroup.NEAR_TERRAIN,\r\n contextTags: [\r\n ContextTag.SEABED_SEDIMENTS\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 180,\r\n legendTextId: 'layerpicker.legend.text.seabedsediments'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geus\r\n }\r\n }\r\n}\r\n\r\nexport default SeabedSedimentsLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions, RadioSubLayer } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_pesticide_waterworks.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\nconst defaultSubLayer: RadioSubLayer = {\r\n labelId: 'map.layer.pesticidewaterworks.sublayer.waterworksdesphenylchloridazon',\r\n subLayer: 'waterworks-desphenyl-chloridazon'\r\n}\r\n\r\n/**\r\n * Map layer class for the Pesticide Waterworks Maps WMS source from GEO.\r\n */\r\nclass PesticideWaterworksLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1,\r\n radioSubLayers: {\r\n labelId: 'layerpicker.radiosublayer.pesticidewaterworks',\r\n selected: defaultSubLayer,\r\n sublayers: [\r\n defaultSubLayer,\r\n {\r\n labelId: 'map.layer.pesticidewaterworks.sublayer.waterworksmethyldesphenylchloridazon',\r\n subLayer: 'waterworks-methyl-desphenyl-chloridazon'\r\n },\r\n {\r\n labelId: 'map.layer.pesticidewaterworks.sublayer.waterworksnndimethylsulfamiddms',\r\n subLayer: 'waterworks-n-n-dimethylsulfamid-dms'\r\n },\r\n {\r\n labelId: 'map.layer.pesticidewaterworks.sublayer.waterworksmetalaxylsyrecga62826',\r\n subLayer: 'waterworks-metalaxylsyre-cga-62826'\r\n },\r\n {\r\n labelId: 'map.layer.pesticidewaterworks.sublayer.waterworks124triazol',\r\n subLayer: 'waterworks-1-2-4-triazol'\r\n }\r\n ]\r\n }\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.PESTICIDE_WATERWORKS,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 4\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { radioSubLayers, opacity } = options.params\r\n opacity = opacity === undefined ? PesticideWaterworksLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/wms',\r\n params: {\r\n layers: radioSubLayers.selected.subLayer,\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.PESTICIDE_WATERWORKS,\r\n name: 'map.layer.pesticidewaterworks',\r\n group: LayerGroup.POLLUTION,\r\n contextTags: [\r\n ContextTag.PESTICIDE_WATERWORKS\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageHeight: 55,\r\n legendTextId: 'layerpicker.legend.text.pesticidewaterworks'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default PesticideWaterworksLayer\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGMAAABDCAYAAACIl7ujAAAEsGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249Ijk5IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNjciCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSI5OSIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNjciCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMTAt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\"","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions, RadioSubLayer } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/legend_pesticide_water_supply_wells.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\nconst defaultSubLayer: RadioSubLayer = {\r\n labelId: 'map.layer.pesticidewatersupplywells.sublayer.waterworksboreholedesphenylchloridazon',\r\n subLayer: 'waterworks-borehole-desphenyl-chloridazon'\r\n}\r\n\r\n/**\r\n * Map layer class for the Pesticide Water Supply Wells Maps WMS source from GEO.\r\n */\r\nclass PesticideWaterSupplyWellsLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1,\r\n radioSubLayers: {\r\n labelId: 'layerpicker.radiosublayer.pesticidewatersupplywells',\r\n selected: defaultSubLayer,\r\n sublayers: [\r\n defaultSubLayer,\r\n {\r\n labelId: 'map.layer.pesticidewatersupplywells.sublayer.waterworksboreholemethyldesphenylchloridazon',\r\n subLayer: 'waterworks-borehole-methyl-desphenyl-chloridazon'\r\n },\r\n {\r\n labelId: 'map.layer.pesticidewatersupplywells.sublayer.waterworksboreholenndimethylsulfamiddms',\r\n subLayer: 'waterworks-borehole-n-n-dimethylsulfamid-dms'\r\n },\r\n {\r\n labelId: 'map.layer.pesticidewatersupplywells.sublayer.waterworksboreholemetalaxylsyrecga62826',\r\n subLayer: 'waterworks-borehole-metalaxylsyre-cga-62826'\r\n },\r\n {\r\n labelId: 'map.layer.pesticidewatersupplywells.sublayer.waterworksborehole124triazol',\r\n subLayer: 'waterworks-borehole-1-2-4-triazol'\r\n }\r\n ]\r\n }\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.PESTICIDE_WATER_SUPPLY_WELLS,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 4\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { radioSubLayers, opacity } = options.params\r\n opacity = opacity === undefined ? PesticideWaterSupplyWellsLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/wms',\r\n params: {\r\n layers: radioSubLayers.selected.subLayer,\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.PESTICIDE_WATER_SUPPLY_WELLS,\r\n name: 'map.layer.pesticidewatersupplywells',\r\n group: LayerGroup.POLLUTION,\r\n contextTags: [\r\n ContextTag.PESTICIDE_WATER_SUPPLY_WELLS\r\n ],\r\n themes: [DataTheme.ENVIRONMENT],\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageHeight: 55,\r\n legendTextId: 'layerpicker.legend.text.pesticidewatersupplywells'\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default PesticideWaterSupplyWellsLayer\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGYAAABGCAYAAAA+c+FUAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwMiIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjcwIgogICBleGlmOkNvbG9yU3BhY2U9IjEiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAyIgogICB0aWZmOkltYWdlTGVuZ3RoPSI3MCIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIuMCIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIuMCIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0xMC0wN1QxMDo1Mzo0OSswMjowMCIKICAgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0xMC0wN1QxMDo1Mzo0OSswMjowMCI+CiAgIDx4bXBNTTpIaXN0b3J5PgogICAgPHJkZjpTZXE+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InByb2R1Y2VkIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZmZpbml0eSBQaG90byAxLjEwLjEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMTAtMDdUMTA6NTM6NDkrMDI6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/PqDAufcAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWR3yuDURjHP9uImKa4cOFiCVebZiJulC2hltZM+XXz7t27TW3z9r6T5Fa5VZS48euCv4Bb5VopIiV3yjVxw3o9r60m2XN6zvM533Oep3OeA854Vs2ZNQHI5QtGbCzknZmd89Y900AtTQTpV1RTH4lGI1S1jzscdrzx27Wqn/vXGpOaqYKjXnhY1Y2C8LhwZKWg27wt3KpmlKTwqbDPkAsK39p6osQvNqdL/GWzEY+Fwdks7E3/4sQvVjNGTlheTmcuu6yW72O/xK3lp6ckdoi3YxJjjBBeJhglzAC9DMk8gF/60yMrquQHfvInWZJcVWadVQwWSZOhgE/UZamuSUyJrsnIsmr3/29fzVRfsFTdHYLaJ8t664K6LShuWtbnoWUVj8D1CBf5Sv7SAQy+i75Z0Tr3wbMOZ5cVLbED5xvQ9qArhvIjucSdqRS8nkDTLLRcQ8N8qWflfY7vIb4mX3UFu3vQLec9C9+VhGf7iIZN5wAAAAlwSFlzAAALEwAACxMBAJqcGAAADwpJREFUeJztnXmQHPV1xz+vZ3Z2pb10IFYSFlok7SGEQKA4JDGycYwNJggTU0oBxbEqFSEHOZzDcaXigIxTTnA5VjlyiIlTu3Ic2yAgJLEUrtgGi4DLlgRICivtol3JOlntStrZe2b65Y/XvdPTM3vPyippvlVb3fPrX7/+db/fO37v93u/FSYKRVZQXeoOOsWDxfQelIMDE6ZRwJiQ8VSqTdReLmi9Qi0wFygHYkCvQA9wVFX3R4pS774rbWemsb0XDUZlTF2i7nIldRPIDUCd9zcbcALVEsAxoBnYh8gPEpHEq23S1jNdjb4YkJsxilOTrPmEwDrg48CicdJzgZ3AS4hsORA90JKfZl58yGLM1Xp1rC/Zd5eD/B5wfWZloURKKKKICBGSJBnQARIkwmQGga2ifH1/rOXN6Wv+hYtMxihSm6y9F/QRYKlfHCXKPJnHLJlFmZRlMSZOnE7t4oyeRtE0NXhRhc+2RFv2nLM3ukCQwZiaRM1HBf4RqPfLKqWSxbKYKqmiUiqJEs0iMsAAndrFcT3GYT3MkA4FLz/lqn6mNdZ6fLpe4kJExD+p76+fhaObgV/2y+bKXK50rmSJs4RSKcXJsPlpRIlSIeXMkTlEJMJZzpIkOUxaRE53Pta1Yzpf5ELD8Jd2I+6ngRv93+VSzlXOVSySRSMyJIwSSqiTOmqllkia51HgoZpkTW3+mn3hwwGo1uoSRB/GkyBBqJVaFsiCCROMEGGZsyx872JR7slHgy8WOADRVHQlcLVfOEfmsNhZPGmiMWLUO/Vhe7Ruha6ITZroRYYogIPcQsDeXO4sJsbUvuFcmctsmU2HdvhFtclUsgbYNyXCo+MDwK3e+fexgW8Qd2KRiyPA9jw9U4AHvfMfA+/mg6h1adVrgw7aZFRYGIJQJVVBxkRddVcyvYxZAjzqne8jmzEPAVcBPyK/jPGf+VnyyhjkA35BhAjllOWDNpVSmfFbAs+ZJhQDfq/KJfKXeNfn5Pm5/jNn5oug525phV8QIYKML7Y5JopC30bQyhGqFhCCb52HA44pUiiaF+YExjI+zsfA5nXAZUAbZns+CswHujCVdzJUvxq4AYuwH/Lq5IIA1wLXADOA94EdwIlAnauAKzCVG/eefRbYHgVQ5KjAajDG9NJLWR7UWTfdGb9d9OiUieYfdwI3A/+Nfcy1pBmzHfhroNeruxT4S+DDQAXQDiwbge5NwMPAKtKM+SHwd1gHALgFuAv4CaYGbwbOAD+KAojyDsLtPsWTepIymTpjTroZnc0VR8/HmNkVWKcs9f7+DyjBwlKLgf/CpEKAPwQavPve8I5/noPmfIyhNwAHgd3ALwG/g0nEX3n1FnnPvhSYB3RjDOo2GyP6IqSjj+3uoVxqaEI4rafp0s5g0XvFTuLAlIhOL+qAf8E8rC8CQ1hPX+NdXwjch9nll716G7F5qDA+CXwIY8JjXr2vY0OSDRjjgliEdYCNwONAXxQgFdXdkaQ0A8sBOvUUR/TnVMsVk3rDJEma3ebwdMDze+Rw/6QIjh8aOM9lJCVHPR9x4GvAaeBnwJeBKtIfcRU2SYhX7xXvvBRTW0Hc7j3rHeBfgRRwAJO4+Zj0fD90z5cwySoBzyt7T97rBXnCb7CLS7O7nw49laP9o8PF5aAe5GimOTnhin57wsQmjsHAeVGO6/4gOmsCCejAmAKQxGwMmAsOptZ8vDnCuQ8/Ol8JfB6TrodJd4zlofpDgK/mByDtleG67vccR+4BfgXgjJ5hr7uXeqdu3APOBAnatZ1mtzmoCl2gsTXSei7sS1/gfEaO6yXeMZfkdoV++7T8jxn0/YPeZTwHrVLvuBT47UB5r/cXHmP1QqbtGGZMa3FrR12i5osKmzGXkJN6gqSbIO7EmS9VlFOR041OkqRLuzimxzikh+jXjPd+AeQbSE71kW8EF4KEB7MxLBwDackIIsysVOh30MWcQ9rtvSQHLZ9xe4DGQLmDddRwJ80aRmREGcuiFS90J7sfFxO/BQCd2kmP28Mp6aASm8GMEcPBIUmSQQaJa5xO7eSUnsLFDZJ8XZUvtMQOHMrR+OnASewDVgB3AC8A72Fq7TZgllevPce9Y3Wc/YHzmwBfNd+ao65vrx3MxvRj9upBbMwSfn6WBGcwZqfsTNVr/RY36QroQ3gR50Ed5LD+HIejlEppFmP6tT84pQzW27YpbG6JtfxkjBfOJ3qA1zAmrAEewT5oCTZmcDB9/uNJ0N6Hub5LgN/3aEWw+JuS6Wz8B/ApYKVX9y3g14E/82i8QiayXOCseeJmae6r1uonY4nYCUTv8gjOBTPscc2lUjNJAC+JatOBWOvusSpPAzZjxncZcC/20hHswyWB7wC7JkH3DPAPwN9gdrgKY85ZzHG4NFD3Bcylvhn4C6xzXOm1Ywcw5jR7JFfhmY1n3M4vdDZfonP2AUdA4livqCAHMzHDudtrUCOuNB0objk45qtODw4DnZh66McM63Fs4PgM9nGDI9867N3eAl4KlK/C1OIbpAeTLV7dIowp+4FN3rVOjBkt3jPbvDox7LsdwSTpqxgjwZyDGLAX+M/gS4wZEFutqyM9qbP16ko9krESs9hrQFzhqAP7UWfv/tj+cKj9FwEHk5ilmMs6BJzCOk9Y5OuwUfdZMo3yNdh7nsQ+to8KTGIqsI+/C4uJzQRayYyFLcbiYaWYxO3y2uFjCTZw7SMkxROLVCqynOVlmhgqV6E45UpPMpaMt0t7Yf1yAQUUUEABBRRQQAEFFFBAAQUUUEABBRRQwMWEcUeXdcOGS3Hdpa5qJVAmEFFbmBbHddv41reOydjTswWME6MyRhsaosD1aqsF67H5g1lAGTbnEff+2oBmhbecWOx1efLJwjTAFDEiY7ShYbna3PnHsQVqs0eq6yGOzQK+IrBNmpp25q+ZFx+yGKMgNDR8SG2B2iexmbqJoB94RVW/6fT1bZOtW8PLgAoYB7IYk7r//lvFcT4DfCzjejSKFBVBJAKOn1ajkEyiiQQksxZ67AL+XqqrvyOPPlqwPRNExsIKXb/+g6r6CIFcfxwHmTkTiouhqAii0TRjXBdSKSSRgIEBtL8fUsMCch3webe9/X1skUIBE8CwRGhDw1y1VYNrh69Go0h5OcycaQwZDakU9Pej8TgMZeyMsUNU75UtW87Vor8LAsM7K6jttPQbw1ciEaSyEioqxmaKV5+yMmTWLJOsNG5QkQd1ogs/LnI4AHrfffMwY+/lywhSUQFlk0hemjHD7nUydtNooKFh6Ui3TCMczJuczQhr6M5XmCg4zhpgxXBpcTGUl0+eamkpMjCA9voZclympiK/OnmiE8JsLJ9xJWk3vwNbV/ZDcq/2P69gOZgivxkslPJykCloHhFTgWnGANyhsOkcRAeqsAShtVhn80V3EEskWgH8E7nTJ84b+I1eM1wSiUBJSe7aE0EsFrZN13H33aUjVc8THOB3gT/CpKUDeBVbRN4LfBBbS3wf57nNi+o998xQS6f2SqJh+zB5FBcHxzdlxGJVTG9K+TVYAmoptjr/CWzNsuNd+wMs9+dPsSzltmlsy5QQJRKZTXA8E8mjjQzTcpwqLF9lurAOU2UJLMn02zCcsPOqd/wKFvNbC3wD+C1Men6GMdHHYuAj3vlzWIeKemUrscXgfop4cCjwa9i66VYsu+AjWKLUU0xAfUbzJh3nB27xjq3AVsjIokoCW4DPYYvIb8EYswHLGv4u6TRvsDjhn2CLwJ/zytZhqvJqjDEnsZTxx0gz53av3mvec27EGPjsRF7EQaSLYOJMKo+hrWxa7+ePeBaipJNO3yG359WJMQ3MCRj0fi8BPk06N1KwjRmWAEcxaVmGMW4NJvXbsISoBkx9+pjn3fcJzDM8jqVzTMjZcKSpacB7uCGRsFBLPjAYTCKmF9UTI1XNA8pJJ7+OtgOHnyZyKcYAvyfXkM42XohF1AlcvxNLPjqOZSE/iiVJRYD1ZCYu+TS2ePX+lhxZY6PB12Pp1DfXhYE8TKcMDYUDm7toauodqXoeUBw4z5Uu7sNvlG9X38AYGcWi6WA9vRyzDT/wyvxcy3ewrLBjwNNY+ncVlugURALbnuTfMLU6ITgAAs8HCzUet8jxZKEK3d3hsueneQzTR5r+vFHq+de6vfpnSAdZb8OkyN++5XXSaXk13nEhaYl5OEC3LvScHiy7DbIzoMeEH4J5jeAGb4ODEJ/C+KuvzyLNaRwV25JjOtFLOoVvObnHKTHS+0kHvcNnvOO12Af+sPc7aLB9NbkAy1r2/w5i3lxYSn3GTwq2yU9jY4fb0LAZ2+/EQRXt7kYiEYssTyQK0NeHnj0btlNNbNnSOtIteUIK26XiDsywr8Zc4CBuxHo8mDry8b+YalqIGfIqLPUvmF18Fgvv7Ab+2SsTjGH9ZO/sN6Xx2rCvLKYHtw1fSaXsA8fjuSbBspFKQU+P3ZPI6Dyvi8g3z9FCje9hDKrAPKhfxQabFRhTPocltvYD/x647zRpJtztHd8k04nY6x3LsO2ytmJMWoFJUQeZmJKhHh5YSlNTp65f/5iqzsdCF5BImOQkEjaKj8UyZzC9iTISCRgcRPv6wi7yAYWNTmNj+1QaOQG8DPwP5qrehvXmPVgHXE2mivpp6N5ngPtJe1fPkdmZnsUcgGux8c0+7/cGTC0+HaI3pXFHRjBLGht/mnrggY0i8sf4OwqlUmhPDwwM2NRyNGqqTWSYMZrtgYF9kC871dXhzQamE13YYM8fod/s/fkYwkIxj5Pdo31DvwBTQy+Grm/Hdkxai+1R1ob9P50BjCl5HaNlxV82vv12q6xadRAT2UX4bqjr2scfGjLnYHDQzrPHPf3AiwqbHHhWNm3K06Bo3DiMbQnShXlcXViO/W5MfT0BvJ3jvn7MRe7Ahg9Pha73YoPRIczlFsyuPI39PwTfW7oM8xB3YtI7KYy8fOmBB65UuA0Rf/nSrJHqeujBli+9LCLbpbExbHjPNSoxD8vfMfZ9bMOE0cZS/g6zcdKubhjzMK+vFIsk7CEzyrAQcxL6MY9tUhh9wd+6dUWUll6vxhh/wV8lZkzFe4FuTKz3K+x2YIcXTShgChj/EtmGhvnAUhcqBCoREXVdWyKr2saSJUcKy5Tyh/8HD3ilbXqsOuIAAAAASUVORK5CYII=\"","export default __webpack_public_path__ + \"static/media/geo_model.8c90b0a5.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { LayerConstructionOptions, layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport legendImage from '../../img/geo_model.png'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class that draws the model areas for Geo's underground models.\r\n */\r\nclass ModelAreaLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1.0\r\n }\r\n\r\n constructor (options: LayerConstructionOptions) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.MODEL_AREAS,\r\n enabled: true,\r\n minZoom: 4,\r\n zIndex: Number.MAX_SAFE_INTEGER - 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n const opacity = options.params?.opacity === undefined ? ModelAreaLayer.defaultParams.opacity : options.params?.opacity\r\n\r\n const models = options.geoModels\r\n const selectedGeoModel = options.selectedGeoModel\r\n\r\n const features: ol.Feature[] = []\r\n if (models !== undefined) {\r\n models.forEach(model => {\r\n const feature = new ol.Feature({\r\n geometry: new ol.geom.LineString(model.Geometry.coordinates[0]),\r\n type: 'model_area',\r\n name: model.Name,\r\n id: model.ID\r\n })\r\n\r\n const defaultColor = model.Type === 1 ? 'rgba(255, 0, 0, 1)' : 'rgba(0, 0, 255, 1)'\r\n\r\n const selected = selectedGeoModel !== undefined && model.ID === selectedGeoModel\r\n feature.setStyle(new ol.style.Style({\r\n stroke: new ol.style.Stroke({\r\n color: selected ? 'rgba(255, 192, 1, 1)' : defaultColor,\r\n width: selected ? 4 : 1.5\r\n })\r\n }))\r\n\r\n features.push(feature)\r\n })\r\n }\r\n\r\n this.olLayer = new ol.layer.Vector({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.Vector({\r\n features: features\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.MODEL_AREAS,\r\n name: 'map.layer.modelarea',\r\n group: LayerGroup.SUBSURFACE,\r\n ordering: 1,\r\n contextTags: [\r\n ContextTag.MODEL_AREAS\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 300\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default ModelAreaLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { LayerConstructionOptions, layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class that draws the costal location points of interest.\r\n */\r\nclass CostalLocations extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1.0\r\n }\r\n\r\n constructor (options: LayerConstructionOptions) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.COSTAL_LOCATIONS,\r\n enabled: true,\r\n minZoom: 4,\r\n zIndex: Number.MAX_SAFE_INTEGER - 1\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n const opacity = options.params?.opacity === undefined ? CostalLocations.defaultParams.opacity : options.params?.opacity\r\n\r\n const poi = options.poi\r\n\r\n const features: ol.Feature[] = []\r\n if (poi !== undefined) {\r\n poi.forEach(point => {\r\n if (point.layer === LayerType.COSTAL_LOCATIONS) {\r\n let coord: ol.Coordinate = [point.lon, point.lat]\r\n coord = ol.proj.transform(coord, 'EPSG:4326', 'EPSG:25832')\r\n const feature = new ol.Feature({\r\n geometry: new ol.geom.Point(coord),\r\n type: 'wiki_link',\r\n key: point.key\r\n })\r\n\r\n feature.setStyle(new ol.style.Style({\r\n image: new ol.style.Icon({\r\n anchor: [0.5, 0.5],\r\n anchorXUnits: 'fraction',\r\n anchorYUnits: 'fraction',\r\n src: 'marker.png'\r\n })\r\n }))\r\n\r\n features.push(feature)\r\n }\r\n })\r\n }\r\n\r\n this.olLayer = new ol.layer.Vector({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.Vector({\r\n features: features\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.COSTAL_LOCATIONS,\r\n name: 'map.layer.costallocations',\r\n group: LayerGroup.POINTS_OF_INTEREST,\r\n ordering: 1,\r\n contextTags: [\r\n ContextTag.COSTAL_LOCATIONS\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default CostalLocations\r\n","export const DatafordelerUsername = 'MRELCFWBOX'\r\nexport const DatafordelerPassword = '!6ydEFIH-2VT.7!Ukvc!'\r\n","import ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { DatafordelerPassword, DatafordelerUsername } from '../datafordeler/Datafordeler'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Skærmkort background layer.\r\n */\r\nclass ScreenClassicLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SCREEN_CLASSIC,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Image({\r\n source: new ol.source.ImageWMS({\r\n url: `https://services.datafordeler.dk/Dkskaermkort/topo_skaermkort/1.0.0/wms?username=${DatafordelerUsername}&password=${DatafordelerPassword}`,\r\n params: {\r\n layers: ['dtk_skaermkort'],\r\n TRANSPARENT: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SCREEN_CLASSIC,\r\n name: 'map.layer.screenclassic',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.SCREEN_CLASSIC\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.SDFI\r\n }\r\n }\r\n}\r\n\r\nexport default ScreenClassicLayer\r\n","import ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { DatafordelerPassword, DatafordelerUsername } from '../datafordeler/Datafordeler'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Skærmkort dæmpet background layer.\r\n */\r\nclass ScreenSubduedLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SCREEN_SUBDUED,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Image({\r\n source: new ol.source.ImageWMS({\r\n url: `https://services.datafordeler.dk/Dkskaermkort/topo_skaermkort/1.0.0/wms?username=${DatafordelerUsername}&password=${DatafordelerPassword}`,\r\n params: {\r\n layers: ['dtk_skaermkort_daempet'],\r\n TRANSPARENT: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SCREEN_SUBDUED,\r\n name: 'map.layer.screensubdued',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.SCREEN_SUBDUED\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.SDFI\r\n }\r\n }\r\n}\r\n\r\nexport default ScreenSubduedLayer\r\n","import ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { DatafordelerPassword, DatafordelerUsername } from '../datafordeler/Datafordeler'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Skærmkort grå background layer.\r\n */\r\nclass ScreenGreyLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.SCREEN_GREY,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Image({\r\n source: new ol.source.ImageWMS({\r\n url: `https://services.datafordeler.dk/Dkskaermkort/topo_skaermkort/1.0.0/wms?username=${DatafordelerUsername}&password=${DatafordelerPassword}`,\r\n params: {\r\n layers: ['dtk_skaermkort_graa'],\r\n TRANSPARENT: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.SCREEN_GREY,\r\n name: 'map.layer.screengrey',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.SCREEN_GREY\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.SDFI\r\n }\r\n }\r\n}\r\n\r\nexport default ScreenGreyLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { DataforsyningenToken } from '../dataforsyningen/Dataforsyningen'\r\nimport { ContextTag } from '../wiki/Wiki'\r\n\r\n/**\r\n * Map layer class for the Orto background layer.\r\n */\r\nclass OrtoBackgroundLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.ORTO_BACKGROUND,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Image({\r\n source: new ol.source.ImageWMS({\r\n url: 'https://api.dataforsyningen.dk/orto_foraar_DAF',\r\n params: {\r\n token: DataforsyningenToken,\r\n layers: ['orto_foraar'],\r\n transparent: 'FALSE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.ORTO_BACKGROUND,\r\n name: 'map.layer.orto',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.ORTO\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.Geodatastyrelsen\r\n }\r\n }\r\n}\r\n\r\nexport default OrtoBackgroundLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { DatafordelerPassword, DatafordelerUsername } from '../datafordeler/Datafordeler'\r\n\r\n/**\r\n * Map layer class for the Topo low background layer.\r\n */\r\nclass TopoLowBackgroundLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.TOPO_LOW_BACKGROUND,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Image({\r\n source: new ol.source.ImageWMS({\r\n url: `https://services.datafordeler.dk/LaveMaalebordsblade/topo20_lave_maalebordsblade/1.0.0/wms?username=${DatafordelerUsername}&password=${DatafordelerPassword}`,\r\n params: {\r\n layers: ['dtk_lave_maalebordsblade'],\r\n TRANSPARENT: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.TOPO_LOW_BACKGROUND,\r\n name: 'map.layer.topolow',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.TOPO_LOW\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.SDFI\r\n }\r\n }\r\n}\r\n\r\nexport default TopoLowBackgroundLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { DatafordelerPassword, DatafordelerUsername } from '../datafordeler/Datafordeler'\r\n\r\n/**\r\n * Map layer class for the Høje målebordsblade background layer.\r\n */\r\nclass TopoHighBackgroundLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.TOPO_HIGH_BACKGROUND,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Image({\r\n source: new ol.source.ImageWMS({\r\n url: `https://services.datafordeler.dk/HoejeMaalebordsblade/topo20_hoeje_maalebordsblade/1.0.0/wms?username=${DatafordelerUsername}&password=${DatafordelerPassword}`,\r\n params: {\r\n layers: ['dtk_hoeje_maalebordsblade'],\r\n TRANSPARENT: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.TOPO_HIGH_BACKGROUND,\r\n name: 'map.layer.topohigh',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.TOPO_HIGH\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.SDFI\r\n }\r\n }\r\n}\r\n\r\nexport default TopoHighBackgroundLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { DatafordelerPassword, DatafordelerUsername } from '../datafordeler/Datafordeler'\r\n\r\n/**\r\n * Map layer class for the Prussian background layer.\r\n */\r\nclass PrussianBackgroundLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.PRUSSIAN_BACKGROUND,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Image({\r\n source: new ol.source.ImageWMS({\r\n url: `https://services.datafordeler.dk/PreussiskeMaalebordsblade/topo25_preussen_maalebordsblade/1.0.0/wms?username=${DatafordelerUsername}&password=${DatafordelerPassword}`,\r\n params: {\r\n layers: ['dtk_preussen_maalebordsblade'],\r\n TRANSPARENT: 'TRUE'\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.PRUSSIAN_BACKGROUND,\r\n name: 'map.layer.prussian',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.PRUSSIAN\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: false,\r\n layerCopyright: layerCopyrights.SDFI\r\n }\r\n }\r\n}\r\n\r\nexport default PrussianBackgroundLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the Open Street Map background layer.\r\n */\r\nclass OSMBackgroundLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.OSM_BACKGROUND,\r\n enabled: true,\r\n zIndex: 0\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n this.olLayer = new ol.layer.Tile({\r\n source: new ol.source.OSM()\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.OSM_BACKGROUND,\r\n name: 'map.layer.osm',\r\n group: LayerGroup.BACKGROUND_MAPS,\r\n contextTags: [\r\n ContextTag.OSM\r\n ],\r\n opacityEnabled: false,\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n layerCopyright: layerCopyrights.OpenStreetMap\r\n }\r\n }\r\n}\r\n\r\nexport default OSMBackgroundLayer\r\n","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions, SwitchSubLayers } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\n\r\n/**\r\n * Map layer class for the HydroModel layers.\r\n */\r\nclass HydroModelLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5,\r\n switchSubLayers: {\r\n labelId: 'layerpicker.switchsublayer',\r\n sublayers: []\r\n }\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.HYDRO_MODEL,\r\n enabled: true,\r\n minZoom: 7,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { switchSubLayers, opacity } = options.params\r\n opacity = opacity === undefined ? HydroModelLayer.defaultParams.opacity : opacity\r\n const subLayers = (switchSubLayers as SwitchSubLayers)?.sublayers\r\n .filter(subLayer => subLayer.enabled)\r\n .map(subLayer => subLayer.subLayer)\r\n .reverse()\r\n\r\n if (subLayers.length > 0) {\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-hydromodels/wms',\r\n params: {\r\n layers: subLayers,\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n } else {\r\n // No sublayers are active.\r\n // We need a layer here, so we simply create an empty Vector layer.\r\n // There's no overhead in that.\r\n this.olLayer = new ol.layer.Vector()\r\n }\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.HYDRO_MODEL,\r\n name: 'map.layer.hydromodels',\r\n group: LayerGroup.WATER,\r\n contextTags: [\r\n ContextTag.HYDROMODEL\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geo\r\n }\r\n }\r\n}\r\n\r\nexport default HydroModelLayer\r\n","export default __webpack_public_path__ + \"static/media/legend_windspeed.feb9e17b.png\";","import * as ol from 'openlayers'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { GeoLayer, AbstractLayer, AbstractLayerOptions } from './Layer'\r\nimport { layerCopyrights, LayerDescription, LayerGroup, LayerParamsObject, LayerType } from './LayerRegistry'\r\nimport { ContextTag } from '../wiki/Wiki'\r\nimport legendImage from '../../img/legend_windspeed.png'\r\n\r\n/**\r\n * Map layer class for the Wind speed WMS source\r\n */\r\nclass WindSpeedLayer extends AbstractLayer implements GeoLayer {\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 0.5\r\n }\r\n\r\n constructor (options: any) {\r\n const defaultOptions: AbstractLayerOptions = {\r\n layerType: LayerType.WIND_SPEED,\r\n enabled: true,\r\n minZoom: 0,\r\n zIndex: 3\r\n }\r\n super({ ...defaultOptions, ...options })\r\n\r\n let { opacity } = options.params\r\n opacity = opacity === undefined ? WindSpeedLayer.defaultParams.opacity : opacity\r\n\r\n this.olLayer = new ol.layer.Image({\r\n visible: this.enabled,\r\n opacity: opacity,\r\n source: new ol.source.ImageWMS({\r\n url: 'https://data.geo.dk/mapv2/geo-services/ows',\r\n params: {\r\n layers: 'GEO-Services:vindhastighed',\r\n token: options.token\r\n },\r\n projection: new ol.proj.Projection({\r\n code: 'EPSG:25832'\r\n }),\r\n })\r\n })\r\n }\r\n\r\n static describe (): LayerDescription {\r\n return {\r\n type: LayerType.WIND_SPEED,\r\n name: 'map.layer.windspeed',\r\n group: LayerGroup.WINDPOWER,\r\n contextTags: [\r\n ContextTag.WIND_SPEED\r\n ],\r\n themes: Object.values(DataTheme),\r\n capabilitiesUrl: '',\r\n legendEnabled: true,\r\n imageLegend: {\r\n legendImage: legendImage,\r\n imageWidth: 250\r\n },\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Energistyrelsen\r\n }\r\n }\r\n}\r\n\r\nexport default WindSpeedLayer\r\n","import { GeoLayer, RadioSubLayers, SubLayers, SwitchSubLayers } from './Layer'\r\nimport BoreHoleLayer from './BoreHoles'\r\nimport BuriedValleysLayer from './BuriedValleys'\r\nimport PostGlacialSedimentThicknessLayer from './PostGlacialSedimentThickness'\r\nimport GroundPollution1Layer from './GroundPollution1'\r\nimport GroundPollution2Layer from './GroundPollution2'\r\nimport RawMaterialAreasLayer from './RawMaterialAreas'\r\nimport VarvLayer from './Varv'\r\nimport SeaLevelOnLandLayer from './SeaLevelOnLand'\r\nimport SliceKoteLayer from './SliceKote'\r\nimport SliceDHMLayer from './SliceDHM'\r\nimport BlueSpotExtremeRain from './BlueSpotExtremeRain'\r\nimport { DataTheme } from 'src/Enums'\r\nimport TerrainShadows from './TerrainShadows'\r\nimport GerdaLayer from './Gerda'\r\nimport OnshoreWindmillsLayer from './OnshoreWindmills'\r\nimport WaterExtractionPlantsLayer from './WaterExtractionPlants'\r\nimport ProtectedNatureTypesLayer from './ProtectedNatureTypes'\r\nimport ShallowGroundwaterLayer from './ShallowGroundwater'\r\nimport IceAgeLayer from './IceAge'\r\nimport WindmillsAtSeaLayer from './WindmillsAtSea'\r\nimport BirdProtectionLayer from './BirdProtection'\r\nimport RamsarLayer from './Ramsar'\r\nimport HabitatProtectionLayer from './HabitatProtection'\r\nimport ForestProtectionLayer from './ForestProtection'\r\nimport WildlifeLayer from './Wildlife'\r\nimport NaturaStateOwnedLayer from './NaturaStateOwned'\r\nimport NaturaLayer from './Natura'\r\nimport PreQuaternaryLithologyLayer from './PreQuaternaryLithology'\r\nimport PreQuaternaryElevationLayer from './PreQuaternaryElevation'\r\nimport ElevationAndDepthLayer from './ElevationAndDepth'\r\nimport SoilTypesLayer from './SoilTypes'\r\nimport MorphologyLayer from './Morphology'\r\nimport SeabedSedimentsLayer from './SeabedSediments'\r\nimport PesticideWaterworksLayer from './PesticideWaterworks'\r\nimport PesticideWaterSupplyWellsLayer from './PesticideWaterSupplyWells'\r\nimport ModelAreaLayer from './ModelAreaLayer'\r\nimport CostalLocations from './CostalLocations'\r\nimport { GeoModel } from '../geo/GeoModel'\r\nimport ScreenClassicLayer from './ScreenClassic'\r\nimport ScreenSubduedLayer from './ScreenSubdued'\r\nimport ScreenGreyLayer from './ScreenGrey'\r\nimport OrtoBackgroundLayer from './OrtoBackground'\r\nimport TopoLowBackgroundLayer from './TopoLowBackground'\r\nimport TopoHighBackgroundLayer from './TopoHighBackground'\r\nimport PrussianBackgroundLayer from './PrussianBackground'\r\nimport OSMBackgroundLayer from './OSMBackground'\r\nimport HydroModelLayer from './HydroModel'\r\nimport WindSpeedLayer from './WindSpeed'\r\nimport { ContextTag, WikiLocation } from '../wiki/Wiki'\r\n\r\nexport interface LayerCopyright {\r\n name: string\r\n url: string\r\n priority: number\r\n}\r\ninterface LayerCopyrightType {\r\n [name: string]: LayerCopyright\r\n}\r\n\r\nconst createLayerCopyrigts = <T extends LayerCopyrightType>(copyrights: T): T => copyrights\r\nexport const layerCopyrights = createLayerCopyrigts({\r\n OpenStreetMap: {\r\n name: 'OpenStreetMap',\r\n url: 'https://www.openstreetmap.org/',\r\n priority: 0\r\n },\r\n Geodatastyrelsen: {\r\n name: 'Geodatastyrelsen',\r\n url: 'https://gst.dk/',\r\n priority: 0\r\n },\r\n Geo: {\r\n name: 'Geo',\r\n url: 'https://www.geo.dk/forside/',\r\n priority: 1\r\n },\r\n Geus: {\r\n name: 'GEUS',\r\n url: 'https://www.geus.dk/',\r\n priority: 2\r\n },\r\n Miljoportal: {\r\n name: 'Miljøportal',\r\n url: 'https://arealeditering-dist-geo.miljoeportal.dk/',\r\n priority: 2\r\n },\r\n Varv: {\r\n name: 'Varv 1992',\r\n url: 'https://www.geus.dk/',\r\n priority: 2\r\n },\r\n MST: {\r\n name: 'Miljøstyrelsen',\r\n url: 'https://mst.dk/',\r\n priority: 2\r\n },\r\n SDFI: {\r\n name: 'Styrelsen for Dataforsyning og Infrastruktur',\r\n url: 'https://sdfi.dk/',\r\n priority: 2\r\n },\r\n Energistyrelsen: {\r\n name: 'Energistyrelsen',\r\n url: 'https://ens.dk/',\r\n priority: 2\r\n }\r\n})\r\n\r\n/**\r\n * Defining the layer groups\r\n */\r\nexport enum LayerGroup {\r\n GENERAL = 'GENERAL',\r\n NATURE = 'NATURE',\r\n SUBSURFACE = 'SUBSURFACE',\r\n WATER = 'WATER',\r\n WINDPOWER = 'WIND_POWER',\r\n POLLUTION = 'POLLUTION',\r\n GEOPHYSICS = 'GEOPHYSICS',\r\n ICE_AGE = 'ICE_AGE',\r\n NEAR_TERRAIN = 'NEAR_TERRAIN',\r\n BACKGROUND_MAPS = 'BACKGROUND_MAPS',\r\n POINTS_OF_INTEREST = 'POINTS_OF_INTEREST'\r\n}\r\n\r\nconst defaultGroupOrdering: LayerGroup[] = [\r\n LayerGroup.GENERAL,\r\n LayerGroup.NATURE,\r\n LayerGroup.SUBSURFACE,\r\n LayerGroup.NEAR_TERRAIN,\r\n LayerGroup.GEOPHYSICS,\r\n LayerGroup.POLLUTION,\r\n LayerGroup.WATER,\r\n LayerGroup.WINDPOWER,\r\n LayerGroup.ICE_AGE,\r\n LayerGroup.BACKGROUND_MAPS\r\n]\r\n\r\nconst themeGroupOrdering: Record<DataTheme, LayerGroup[]> = {\r\n [DataTheme.NONE]: defaultGroupOrdering,\r\n [DataTheme.ICE_AGE]: defaultGroupOrdering,\r\n [DataTheme.CLIMATE]: defaultGroupOrdering,\r\n [DataTheme.ENERGY]: defaultGroupOrdering,\r\n [DataTheme.ENVIRONMENT]: defaultGroupOrdering\r\n}\r\n\r\n/**\r\n * Defining the possible layers\r\n */\r\nexport enum LayerType {\r\n TERRAIN_SHADOWS = 'TERRAIN_SHADOWS',\r\n BORE_HOLES = 'BORE_HOLES',\r\n SEA_LEVEL_ON_LAND = 'SEA_LEVEL_ON_LAND',\r\n BLUE_SPOT_EXTREME_RAIN = 'BLUE_SPOT_EXTREME_RAIN',\r\n BURIED_VALLEYS = 'BURIED_VALLEYS',\r\n SLICE_KOTE = 'SLICE_KOTE',\r\n SLICE_DHM = 'SLICE_DHM',\r\n POSTGLACIAL_SEDIMENT_THICKNESS = 'POSTGLACIAL_SEDIMENT_THICKNESS',\r\n GROUND_POLLUTION_1 = 'GROUND_POLLUTION_1',\r\n GROUND_POLLUTION_2 = 'GROUND_POLLUTION_2',\r\n ICE_AGE = 'ICE_AGE',\r\n RAW_MATERIALS = 'RAW_MATERIALS',\r\n VARV = 'VARV',\r\n GERDA = 'GERDA',\r\n WATER_EXTRACTION_PLANTS = 'WATER_EXTRACTION_PLANTS',\r\n PROTECTED_NATURE_TYPES = 'PROTECTED_NATURE_TYPES',\r\n SHALLOW_GROUNDWATER = 'SHALLOW_GROUNDWATER',\r\n WINDMILLS_AT_SEA = 'WINDMILLS_AT_SEA',\r\n ONSHORE_WINDMILLS = 'ONSHORE_WINDMILLS',\r\n BIRD_PROTECTION = 'BIRD_PROTECTION',\r\n RAMSAR = 'RAMSAR',\r\n HABITAT_PROTECTION = 'HABITAT_PROTECTION',\r\n FOREST_PROTECTION = 'FOREST_PROTECTION',\r\n WILDLIFE = 'WILDLIFE',\r\n NATURA_STATE_OWNED = 'NATURA_STATE_OWNED',\r\n NATURA = 'NATURA',\r\n PREQUATERNARY_LITHOLOGY = 'PREQUATERNARY_LITHOLOGY',\r\n PREQUATERNARY_ELEVATION = 'PREQUATERNARY_ELEVATION',\r\n ELEVATION_DEPTH = 'ELEVATION_DEPTH',\r\n SOIL_TYPES = 'SOIL_TYPES',\r\n MORPHOLOGY = 'MORPHOLOGY',\r\n SEABED_SEDIMENTS = 'SEABED_SEDIMENTS',\r\n PESTICIDE_WATERWORKS = 'PESTICIDE_WATERWORKS',\r\n PESTICIDE_WATER_SUPPLY_WELLS = 'PESTICIDE_WATER_SUPPLY_WELLS',\r\n MODEL_AREAS = 'MODEL_AREAS',\r\n HYDRO_MODEL = 'HYDRO_MODEL',\r\n SCREEN_CLASSIC = 'SCREEN_CLASSIC',\r\n SCREEN_SUBDUED = 'SCREEN_SUBDUED',\r\n SCREEN_GREY = 'SCREEN_GREY',\r\n ORTO_BACKGROUND = 'ORTO_BACKGROUND',\r\n TOPO_LOW_BACKGROUND = 'TOPO_LOW_BACKGROUND',\r\n TOPO_HIGH_BACKGROUND = 'TOPO_HIGH_BACKGROUND',\r\n PRUSSIAN_BACKGROUND = 'PRUSSIAN_BACKGROUND',\r\n OSM_BACKGROUND = 'OSM_BACKGROUND',\r\n WIND_SPEED = 'WIND_SPEED',\r\n COSTAL_LOCATIONS = 'COSTAL_LOCATIONS'\r\n}\r\n\r\nconst enabledLayers = new Map<LayerType, GeoLayer>()\r\nconst allLayerDescriptions = new Map<LayerType, LayerDescription>([\r\n [LayerType.TERRAIN_SHADOWS, TerrainShadows.describe()],\r\n [LayerType.BORE_HOLES, BoreHoleLayer.describe()],\r\n [LayerType.SEA_LEVEL_ON_LAND, SeaLevelOnLandLayer.describe()],\r\n [LayerType.BLUE_SPOT_EXTREME_RAIN, BlueSpotExtremeRain.describe()],\r\n [LayerType.BURIED_VALLEYS, BuriedValleysLayer.describe()],\r\n [LayerType.SLICE_KOTE, SliceKoteLayer.describe()],\r\n [LayerType.SLICE_DHM, SliceDHMLayer.describe()],\r\n [LayerType.POSTGLACIAL_SEDIMENT_THICKNESS, PostGlacialSedimentThicknessLayer.describe()],\r\n [LayerType.GROUND_POLLUTION_1, GroundPollution1Layer.describe()],\r\n [LayerType.GROUND_POLLUTION_2, GroundPollution2Layer.describe()],\r\n [LayerType.ICE_AGE, IceAgeLayer.describe()],\r\n [LayerType.RAW_MATERIALS, RawMaterialAreasLayer.describe()],\r\n [LayerType.VARV, VarvLayer.describe()],\r\n [LayerType.GERDA, GerdaLayer.describe()],\r\n [LayerType.WATER_EXTRACTION_PLANTS, WaterExtractionPlantsLayer.describe()],\r\n [LayerType.PROTECTED_NATURE_TYPES, ProtectedNatureTypesLayer.describe()],\r\n [LayerType.SHALLOW_GROUNDWATER, ShallowGroundwaterLayer.describe()],\r\n [LayerType.WINDMILLS_AT_SEA, WindmillsAtSeaLayer.describe()],\r\n [LayerType.ONSHORE_WINDMILLS, OnshoreWindmillsLayer.describe()],\r\n [LayerType.NATURA, NaturaLayer.describe()],\r\n [LayerType.BIRD_PROTECTION, BirdProtectionLayer.describe()],\r\n [LayerType.RAMSAR, RamsarLayer.describe()],\r\n [LayerType.HABITAT_PROTECTION, HabitatProtectionLayer.describe()],\r\n [LayerType.FOREST_PROTECTION, ForestProtectionLayer.describe()],\r\n [LayerType.WILDLIFE, WildlifeLayer.describe()],\r\n [LayerType.NATURA_STATE_OWNED, NaturaStateOwnedLayer.describe()],\r\n [LayerType.PREQUATERNARY_LITHOLOGY, PreQuaternaryLithologyLayer.describe()],\r\n [LayerType.PREQUATERNARY_ELEVATION, PreQuaternaryElevationLayer.describe()],\r\n [LayerType.ELEVATION_DEPTH, ElevationAndDepthLayer.describe()],\r\n [LayerType.SOIL_TYPES, SoilTypesLayer.describe()],\r\n [LayerType.MORPHOLOGY, MorphologyLayer.describe()],\r\n [LayerType.SEABED_SEDIMENTS, SeabedSedimentsLayer.describe()],\r\n [LayerType.PESTICIDE_WATERWORKS, PesticideWaterworksLayer.describe()],\r\n [LayerType.PESTICIDE_WATER_SUPPLY_WELLS, PesticideWaterSupplyWellsLayer.describe()],\r\n [LayerType.HYDRO_MODEL, HydroModelLayer.describe()],\r\n [LayerType.SCREEN_CLASSIC, ScreenClassicLayer.describe()],\r\n [LayerType.SCREEN_SUBDUED, ScreenSubduedLayer.describe()],\r\n [LayerType.SCREEN_GREY, ScreenGreyLayer.describe()],\r\n [LayerType.ORTO_BACKGROUND, OrtoBackgroundLayer.describe()],\r\n [LayerType.TOPO_LOW_BACKGROUND, TopoLowBackgroundLayer.describe()],\r\n [LayerType.TOPO_HIGH_BACKGROUND, TopoHighBackgroundLayer.describe()],\r\n [LayerType.PRUSSIAN_BACKGROUND, PrussianBackgroundLayer.describe()],\r\n [LayerType.OSM_BACKGROUND, OSMBackgroundLayer.describe()],\r\n [LayerType.MODEL_AREAS, ModelAreaLayer.describe()],\r\n [LayerType.WIND_SPEED, WindSpeedLayer.describe()],\r\n [LayerType.COSTAL_LOCATIONS, CostalLocations.describe()]\r\n])\r\n\r\nexport interface LayerParams {\r\n layerType: LayerType\r\n params: LayerParamsObject\r\n}\r\n\r\nexport interface LayerCapabilities {\r\n type: LayerType\r\n capabilities: ol.GlobalObject\r\n}\r\n\r\nexport interface LayerParamsObject {\r\n opacity?: number\r\n depth?: number\r\n level?: number\r\n subLayers?: SubLayers\r\n radioSubLayers?: RadioSubLayers\r\n switchSubLayers?: SwitchSubLayers\r\n}\r\n\r\nexport interface ImageLegend {\r\n legendImage: string\r\n imageWidth?: number\r\n imageHeight?: number\r\n legendTextId?: string\r\n}\r\n\r\nexport interface LayerDescription {\r\n type: LayerType\r\n name: string\r\n group: LayerGroup\r\n ordering?: number\r\n contextTags: ContextTag[]\r\n themes: DataTheme[]\r\n capabilitiesUrl: string\r\n legendEnabled: boolean\r\n imageLegend?: ImageLegend\r\n opacityEnabled: boolean\r\n layerCopyright: LayerCopyright\r\n}\r\n\r\nexport interface LayerConstructionOptions {\r\n token: string | undefined\r\n selectedGeoModel: string | undefined\r\n geoModels: GeoModel[] | undefined\r\n capabilities: ol.GlobalObject | undefined\r\n params: LayerParamsObject | undefined\r\n poi: WikiLocation[] | undefined\r\n}\r\n\r\n/**\r\n * A list of initial LayerParams for all layers\r\n */\r\nexport const initialLayerParams: LayerParams[] = [\r\n { layerType: LayerType.TERRAIN_SHADOWS, params: TerrainShadows.defaultParams },\r\n { layerType: LayerType.BURIED_VALLEYS, params: BuriedValleysLayer.defaultParams },\r\n { layerType: LayerType.BORE_HOLES, params: BoreHoleLayer.defaultParams },\r\n { layerType: LayerType.SEA_LEVEL_ON_LAND, params: SeaLevelOnLandLayer.defaultParams },\r\n { layerType: LayerType.BLUE_SPOT_EXTREME_RAIN, params: BlueSpotExtremeRain.defaultParams },\r\n { layerType: LayerType.SLICE_DHM, params: SliceDHMLayer.defaultParams },\r\n { layerType: LayerType.SLICE_KOTE, params: SliceKoteLayer.defaultParams },\r\n { layerType: LayerType.POSTGLACIAL_SEDIMENT_THICKNESS, params: PostGlacialSedimentThicknessLayer.defaultParams },\r\n { layerType: LayerType.GROUND_POLLUTION_1, params: GroundPollution1Layer.defaultParams },\r\n { layerType: LayerType.GROUND_POLLUTION_2, params: GroundPollution2Layer.defaultParams },\r\n { layerType: LayerType.ICE_AGE, params: IceAgeLayer.defaultParams },\r\n { layerType: LayerType.RAW_MATERIALS, params: RawMaterialAreasLayer.defaultParams },\r\n { layerType: LayerType.VARV, params: VarvLayer.defaultParams },\r\n { layerType: LayerType.GERDA, params: GerdaLayer.defaultParams },\r\n { layerType: LayerType.WATER_EXTRACTION_PLANTS, params: WaterExtractionPlantsLayer.defaultParams },\r\n { layerType: LayerType.PROTECTED_NATURE_TYPES, params: ProtectedNatureTypesLayer.defaultParams },\r\n { layerType: LayerType.SHALLOW_GROUNDWATER, params: ShallowGroundwaterLayer.defaultParams },\r\n { layerType: LayerType.WINDMILLS_AT_SEA, params: WindmillsAtSeaLayer.defaultParams },\r\n { layerType: LayerType.ONSHORE_WINDMILLS, params: OnshoreWindmillsLayer.defaultParams },\r\n { layerType: LayerType.BIRD_PROTECTION, params: BirdProtectionLayer.defaultParams },\r\n { layerType: LayerType.RAMSAR, params: RamsarLayer.defaultParams },\r\n { layerType: LayerType.HABITAT_PROTECTION, params: HabitatProtectionLayer.defaultParams },\r\n { layerType: LayerType.FOREST_PROTECTION, params: ForestProtectionLayer.defaultParams },\r\n { layerType: LayerType.WILDLIFE, params: WildlifeLayer.defaultParams },\r\n { layerType: LayerType.NATURA_STATE_OWNED, params: NaturaStateOwnedLayer.defaultParams },\r\n { layerType: LayerType.NATURA, params: NaturaLayer.defaultParams },\r\n { layerType: LayerType.PREQUATERNARY_LITHOLOGY, params: PreQuaternaryLithologyLayer.defaultParams },\r\n { layerType: LayerType.PREQUATERNARY_ELEVATION, params: PreQuaternaryElevationLayer.defaultParams },\r\n { layerType: LayerType.ELEVATION_DEPTH, params: ElevationAndDepthLayer.defaultParams },\r\n { layerType: LayerType.SOIL_TYPES, params: SoilTypesLayer.defaultParams },\r\n { layerType: LayerType.MORPHOLOGY, params: MorphologyLayer.defaultParams },\r\n { layerType: LayerType.SEABED_SEDIMENTS, params: SeabedSedimentsLayer.defaultParams },\r\n { layerType: LayerType.PESTICIDE_WATERWORKS, params: PesticideWaterworksLayer.defaultParams },\r\n { layerType: LayerType.PESTICIDE_WATER_SUPPLY_WELLS, params: PesticideWaterSupplyWellsLayer.defaultParams },\r\n { layerType: LayerType.HYDRO_MODEL, params: HydroModelLayer.defaultParams },\r\n { layerType: LayerType.SCREEN_CLASSIC, params: ScreenClassicLayer.defaultParams },\r\n { layerType: LayerType.SCREEN_SUBDUED, params: ScreenSubduedLayer.defaultParams },\r\n { layerType: LayerType.SCREEN_GREY, params: ScreenGreyLayer.defaultParams },\r\n { layerType: LayerType.ORTO_BACKGROUND, params: OrtoBackgroundLayer.defaultParams },\r\n { layerType: LayerType.TOPO_LOW_BACKGROUND, params: TopoLowBackgroundLayer.defaultParams },\r\n { layerType: LayerType.TOPO_HIGH_BACKGROUND, params: TopoHighBackgroundLayer.defaultParams },\r\n { layerType: LayerType.PRUSSIAN_BACKGROUND, params: PrussianBackgroundLayer.defaultParams },\r\n { layerType: LayerType.MODEL_AREAS, params: ModelAreaLayer.defaultParams },\r\n { layerType: LayerType.WIND_SPEED, params: WindSpeedLayer.defaultParams },\r\n { layerType: LayerType.COSTAL_LOCATIONS, params: CostalLocations.defaultParams }\r\n]\r\n\r\n/**\r\n * Ask the registry to create a new layer of the given type (name).\r\n * @param layerType The name of the layer to add.\r\n * @param options The options used when constructing the new layer.\r\n * @returns A Layer subclass.\r\n */\r\nexport const addLayerByType = (layerType: LayerType, options: any): GeoLayer => {\r\n if (!enabledLayers.has(layerType)) {\r\n switch (layerType) {\r\n case LayerType.TERRAIN_SHADOWS:\r\n enabledLayers.set(layerType, new TerrainShadows(options))\r\n break\r\n case LayerType.BORE_HOLES:\r\n enabledLayers.set(layerType, new BoreHoleLayer(options))\r\n break\r\n case LayerType.SEA_LEVEL_ON_LAND:\r\n enabledLayers.set(layerType, new SeaLevelOnLandLayer(options))\r\n break\r\n case LayerType.BLUE_SPOT_EXTREME_RAIN:\r\n enabledLayers.set(layerType, new BlueSpotExtremeRain(options))\r\n break\r\n case LayerType.BURIED_VALLEYS:\r\n enabledLayers.set(layerType, new BuriedValleysLayer(options))\r\n break\r\n case LayerType.GROUND_POLLUTION_1:\r\n enabledLayers.set(layerType, new GroundPollution1Layer(options))\r\n break\r\n case LayerType.GROUND_POLLUTION_2:\r\n enabledLayers.set(layerType, new GroundPollution2Layer(options))\r\n break\r\n case LayerType.RAW_MATERIALS:\r\n enabledLayers.set(layerType, new RawMaterialAreasLayer(options))\r\n break\r\n case LayerType.VARV:\r\n enabledLayers.set(layerType, new VarvLayer(options))\r\n break\r\n case LayerType.GERDA:\r\n enabledLayers.set(layerType, new GerdaLayer(options))\r\n break\r\n case LayerType.POSTGLACIAL_SEDIMENT_THICKNESS:\r\n enabledLayers.set(layerType, new PostGlacialSedimentThicknessLayer(options))\r\n break\r\n case LayerType.SLICE_KOTE:\r\n enabledLayers.set(layerType, new SliceKoteLayer(options))\r\n break\r\n case LayerType.SLICE_DHM:\r\n enabledLayers.set(layerType, new SliceDHMLayer(options))\r\n break\r\n case LayerType.WATER_EXTRACTION_PLANTS:\r\n enabledLayers.set(layerType, new WaterExtractionPlantsLayer(options))\r\n break\r\n case LayerType.PROTECTED_NATURE_TYPES:\r\n enabledLayers.set(layerType, new ProtectedNatureTypesLayer(options))\r\n break\r\n case LayerType.SHALLOW_GROUNDWATER:\r\n enabledLayers.set(layerType, new ShallowGroundwaterLayer(options))\r\n break\r\n case LayerType.ICE_AGE:\r\n enabledLayers.set(layerType, new IceAgeLayer(options))\r\n break\r\n case LayerType.WINDMILLS_AT_SEA:\r\n enabledLayers.set(layerType, new WindmillsAtSeaLayer(options))\r\n break\r\n case LayerType.ONSHORE_WINDMILLS:\r\n enabledLayers.set(layerType, new OnshoreWindmillsLayer(options))\r\n break\r\n case LayerType.BIRD_PROTECTION:\r\n enabledLayers.set(layerType, new BirdProtectionLayer(options))\r\n break\r\n case LayerType.RAMSAR:\r\n enabledLayers.set(layerType, new RamsarLayer(options))\r\n break\r\n case LayerType.HABITAT_PROTECTION:\r\n enabledLayers.set(layerType, new HabitatProtectionLayer(options))\r\n break\r\n case LayerType.FOREST_PROTECTION:\r\n enabledLayers.set(layerType, new ForestProtectionLayer(options))\r\n break\r\n case LayerType.WILDLIFE:\r\n enabledLayers.set(layerType, new WildlifeLayer(options))\r\n break\r\n case LayerType.NATURA_STATE_OWNED:\r\n enabledLayers.set(layerType, new NaturaStateOwnedLayer(options))\r\n break\r\n case LayerType.NATURA:\r\n enabledLayers.set(layerType, new NaturaLayer(options))\r\n break\r\n case LayerType.PREQUATERNARY_LITHOLOGY:\r\n enabledLayers.set(layerType, new PreQuaternaryLithologyLayer(options))\r\n break\r\n case LayerType.PREQUATERNARY_ELEVATION:\r\n enabledLayers.set(layerType, new PreQuaternaryElevationLayer(options))\r\n break\r\n case LayerType.ELEVATION_DEPTH:\r\n enabledLayers.set(layerType, new ElevationAndDepthLayer(options))\r\n break\r\n case LayerType.SOIL_TYPES:\r\n enabledLayers.set(layerType, new SoilTypesLayer(options))\r\n break\r\n case LayerType.MORPHOLOGY:\r\n enabledLayers.set(layerType, new MorphologyLayer(options))\r\n break\r\n case LayerType.SEABED_SEDIMENTS:\r\n enabledLayers.set(layerType, new SeabedSedimentsLayer(options))\r\n break\r\n case LayerType.PESTICIDE_WATERWORKS:\r\n enabledLayers.set(layerType, new PesticideWaterworksLayer(options))\r\n break\r\n case LayerType.PESTICIDE_WATER_SUPPLY_WELLS:\r\n enabledLayers.set(layerType, new PesticideWaterSupplyWellsLayer(options))\r\n break\r\n case LayerType.SCREEN_CLASSIC:\r\n enabledLayers.set(layerType, new ScreenClassicLayer(options))\r\n break\r\n case LayerType.SCREEN_SUBDUED:\r\n enabledLayers.set(layerType, new ScreenSubduedLayer(options))\r\n break\r\n case LayerType.SCREEN_GREY:\r\n enabledLayers.set(layerType, new ScreenGreyLayer(options))\r\n break\r\n case LayerType.ORTO_BACKGROUND:\r\n enabledLayers.set(layerType, new OrtoBackgroundLayer(options))\r\n break\r\n case LayerType.PRUSSIAN_BACKGROUND:\r\n enabledLayers.set(layerType, new PrussianBackgroundLayer(options))\r\n break\r\n case LayerType.TOPO_HIGH_BACKGROUND:\r\n enabledLayers.set(layerType, new TopoHighBackgroundLayer(options))\r\n break\r\n case LayerType.TOPO_LOW_BACKGROUND:\r\n enabledLayers.set(layerType, new TopoLowBackgroundLayer(options))\r\n break\r\n case LayerType.OSM_BACKGROUND:\r\n enabledLayers.set(layerType, new OSMBackgroundLayer(options))\r\n break\r\n case LayerType.HYDRO_MODEL:\r\n enabledLayers.set(layerType, new HydroModelLayer(options))\r\n break\r\n case LayerType.MODEL_AREAS:\r\n enabledLayers.set(layerType, new ModelAreaLayer(options))\r\n break\r\n case LayerType.WIND_SPEED:\r\n enabledLayers.set(layerType, new WindSpeedLayer(options))\r\n break\r\n case LayerType.COSTAL_LOCATIONS:\r\n enabledLayers.set(layerType, new CostalLocations(options))\r\n break\r\n }\r\n }\r\n\r\n const layer = enabledLayers.get(layerType)\r\n if (layer === undefined || layer === null) {\r\n throw new Error(`Layer name ${layerType as string} given.`)\r\n }\r\n\r\n return layer\r\n}\r\n\r\n/**\r\n * Remove an active GeoLayer from the registry.\r\n * @param layerType The type of the layer to remove from the list of active GeoLayers.\r\n */\r\nexport const removeLayerByType = (layerType: LayerType): boolean => {\r\n if (enabledLayers.has(layerType)) {\r\n enabledLayers.delete(layerType)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Get the named layer from the registry.\r\n * @param layerType Name of the layer to fetch.\r\n * @returns A GeoLater instance.\r\n */\r\nexport const getGeoLayerByType = (layerType: LayerType): GeoLayer => {\r\n const layer = enabledLayers.get(layerType)\r\n if (layer === undefined || layer === null) {\r\n throw new Error(`Asked for non-existing layer with type ${layerType as string},`)\r\n }\r\n return layer\r\n}\r\n\r\n/**\r\n * Gets the available LayerType's for a given DataTheme\r\n * @param dataTheme The DataTheme for which to get the available LayerType's\r\n * @returns A list of available LayerType's\r\n */\r\nexport const getLayersByDataTheme = (dataTheme: DataTheme): LayerType[] => {\r\n return Object.values(LayerType)\r\n .map(layerType => getLayerDescriptionForType(layerType))\r\n .filter(layerDescription => {\r\n return (dataTheme === DataTheme.NONE || layerDescription.themes.includes(dataTheme))\r\n })\r\n .sort((a, b) => {\r\n const aOrder = a.ordering !== undefined ? a.ordering : Number.MAX_SAFE_INTEGER\r\n const bOrder = b.ordering !== undefined ? b.ordering : Number.MAX_SAFE_INTEGER\r\n return aOrder - bOrder\r\n })\r\n .map(layerDescription => layerDescription.type)\r\n}\r\n\r\n/**\r\n * Get sub layer name of a given value.\r\n * @param params Params to get sub layer name from.\r\n * @param value Sub layer value.\r\n * @param type Name of the laye from which to get the sub layer name\r\n * @returns Name of sub layer.\r\n */\r\nexport const getSublayerName = (params: LayerParamsObject, value: number, type: LayerType): string => {\r\n return getGeoLayerByType(type).getSubLayerName(params, value)\r\n}\r\n\r\n/**\r\n * Gets the LayerGroup's for a given DataTheme\r\n * @param dataTheme The DataTheme for which to get the LayerGroup's\r\n * @returns A list of LayerGroup's\r\n */\r\nexport const getLayerGroups = (dataTheme: DataTheme): LayerGroup[] => {\r\n const layers = getLayersByDataTheme(dataTheme)\r\n const themeGroupOrder = themeGroupOrdering[dataTheme]\r\n return layers\r\n .map(layer => getLayerDescriptionForType(layer).group)\r\n .filter((value, index, self) => self.indexOf(value) === index) // remove duplicates\r\n .sort((a: LayerGroup, b: LayerGroup) => {\r\n return themeGroupOrder.indexOf(a) - themeGroupOrder.indexOf(b)\r\n })\r\n}\r\n\r\n/**\r\n * Gets the description of a LayerType\r\n * @param layerType the LayerType to be descriped\r\n * @returns A LayerDescription\r\n */\r\nexport const getLayerDescriptionForType = (layerType: LayerType): LayerDescription => {\r\n const description = allLayerDescriptions.get(layerType)\r\n if (description === undefined) {\r\n throw new Error(`Unknown layer type ${layerType as string} requested`)\r\n }\r\n return description\r\n}\r\n\r\n/**\r\n * Delete all layers from the registry.\r\n */\r\nexport const clearLayers = (): void => {\r\n enabledLayers.clear()\r\n}\r\n","import { Extent } from 'openlayers'\r\nimport { LayerActiveView } from 'src/components/layerpicker/LayerPicker'\r\nimport { BaseAction, DataAction } from 'src/CustomTypes'\r\nimport {\r\n initialLayerParams,\r\n LayerCapabilities,\r\n LayerGroup,\r\n LayerParams,\r\n LayerParamsObject,\r\n LayerType\r\n} from 'src/dataSources/layers/LayerRegistry'\r\nimport { LayerViewType } from 'src/Enums'\r\nimport {\r\n ADD_LAYER,\r\n REMOVE_LAYER,\r\n CLEAR_LAYERS,\r\n SET_LAYER_CAPABILITIES,\r\n SET_LAYER_PARAMS,\r\n ADD_LAYER_GROUP,\r\n REMOVE_LAYER_GROUP,\r\n SET_LAYER_ACTIVE_VIEW,\r\n SET_MAP_CENTER,\r\n SET_MAP_CURRENT_ZOOM,\r\n SET_COLORS_IN_FOCUS,\r\n ColorInFocus,\r\n SET_MAP_EXTENT\r\n} from '../actions/MapActions'\r\n\r\nexport interface MapState {\r\n showOrtoImages: boolean\r\n mapCenter: ol.Coordinate\r\n mapCurrentZoom: number\r\n mapExtent: Extent\r\n colorsInFocus: ColorInFocus[]\r\n enabledLayerGroups: LayerGroup[]\r\n enabledLayers: LayerType[]\r\n layerParams: LayerParams[]\r\n modifiedLayer?: LayerType\r\n layerCapabilities: LayerCapabilities[]\r\n layerActiveViews: LayerActiveView[]\r\n}\r\n\r\nexport const mapStateInitial: MapState = {\r\n showOrtoImages: false,\r\n mapCenter: [550232.2914831298, 6178702.8859613435],\r\n mapCurrentZoom: 8.1,\r\n mapExtent: [0, 0, 0, 0],\r\n colorsInFocus: [],\r\n enabledLayerGroups: [LayerGroup.SUBSURFACE],\r\n enabledLayers: [LayerType.OSM_BACKGROUND, LayerType.MODEL_AREAS],\r\n layerParams: initialLayerParams,\r\n layerCapabilities: [],\r\n layerActiveViews: []\r\n}\r\n\r\nexport function mapReducer (\r\n state: MapState = mapStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): MapState {\r\n switch (action.type) {\r\n case SET_MAP_CENTER: {\r\n const a = action as DataAction<ol.Coordinate>\r\n return {\r\n ...state,\r\n mapCenter: a.data\r\n }\r\n }\r\n case SET_MAP_CURRENT_ZOOM: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n mapCurrentZoom: a.data\r\n }\r\n }\r\n case SET_MAP_EXTENT: {\r\n const a = action as DataAction<Extent>\r\n return {\r\n ...state,\r\n mapExtent: a.data\r\n }\r\n }\r\n case SET_COLORS_IN_FOCUS: {\r\n const a = action as DataAction<ColorInFocus[]>\r\n return {\r\n ...state,\r\n colorsInFocus: a.data\r\n }\r\n }\r\n case ADD_LAYER: {\r\n const a = action as DataAction<LayerType>\r\n let layerTypes = [...state.enabledLayers]\r\n const layerAlreadyEnabled = state.enabledLayers.some(layerType => layerType === a.data)\r\n if (!layerAlreadyEnabled) {\r\n layerTypes = [...state.enabledLayers, a.data]\r\n }\r\n return {\r\n ...state,\r\n enabledLayers: layerTypes,\r\n layerActiveViews: [...state.layerActiveViews, { type: a.data, view: LayerViewType.SETTINGS }]\r\n }\r\n }\r\n case REMOVE_LAYER: {\r\n const a = action as DataAction<LayerType>\r\n return {\r\n ...state,\r\n enabledLayers: state.enabledLayers.filter(layerType => layerType !== a.data),\r\n layerActiveViews: state.layerActiveViews.filter(layerView => layerView.type !== a.data)\r\n }\r\n }\r\n case ADD_LAYER_GROUP: {\r\n const a = action as DataAction<LayerGroup>\r\n let layerGroups = [...state.enabledLayerGroups]\r\n const layerGroupAlreadyEnabled = state.enabledLayerGroups.some(layerGroup => layerGroup === a.data)\r\n if (!layerGroupAlreadyEnabled) {\r\n layerGroups = [...state.enabledLayerGroups, a.data]\r\n }\r\n return {\r\n ...state,\r\n enabledLayerGroups: layerGroups\r\n }\r\n }\r\n case REMOVE_LAYER_GROUP: {\r\n const a = action as DataAction<LayerGroup>\r\n return {\r\n ...state,\r\n enabledLayerGroups: state.enabledLayerGroups.filter(layerGroup => layerGroup !== a.data)\r\n }\r\n }\r\n case CLEAR_LAYERS:\r\n return {\r\n ...state,\r\n enabledLayers: mapStateInitial.enabledLayers,\r\n enabledLayerGroups: mapStateInitial.enabledLayerGroups,\r\n layerActiveViews: []\r\n }\r\n case SET_LAYER_ACTIVE_VIEW: {\r\n const a = action as DataAction<LayerActiveView>\r\n const layerActiveViews = state.layerActiveViews.filter(layerView => layerView.type !== a.data.type)\r\n return {\r\n ...state,\r\n layerActiveViews: [...layerActiveViews, a.data]\r\n }\r\n }\r\n case SET_LAYER_PARAMS: {\r\n const a = action as DataAction<LayerParams>\r\n let params = state.layerParams.map(param => {\r\n if (param.layerType === a.data.layerType) {\r\n return a.data\r\n } else {\r\n return param\r\n }\r\n })\r\n if (!params.some(param => param.layerType === a.data.layerType)) {\r\n params = [...params, a.data]\r\n }\r\n return {\r\n ...state,\r\n layerParams: params,\r\n modifiedLayer: a.data.layerType\r\n }\r\n }\r\n case SET_LAYER_CAPABILITIES: {\r\n const a = action as DataAction<LayerCapabilities>\r\n let capabilities = state.layerCapabilities.map(capability => {\r\n if (capability.type === a.data.type) {\r\n return a.data\r\n } else {\r\n return capability\r\n }\r\n })\r\n if (!capabilities.some(capability => capability.type === a.data.type)) {\r\n capabilities = [...capabilities, a.data]\r\n }\r\n return {\r\n ...state,\r\n layerCapabilities: capabilities\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n\r\nexport const getLayerParamsFromType = (type: LayerType, params: LayerParams[]): LayerParamsObject | undefined => {\r\n return params.find(param => param.layerType === type)?.params\r\n}\r\n\r\nexport const getLayerCapabilitiesFromType = (type: LayerType, capabilities: LayerCapabilities[]): ol.GlobalObject | undefined => {\r\n return capabilities.find(capability => capability.type === type)?.capabilities\r\n}\r\n","import ol, { Extent } from 'openlayers'\r\nimport { Dispatch } from 'react'\r\nimport { mapActions } from 'src/actions/MapActions'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { HydroModelObject } from 'src/dataSources/geo/HydroModel'\r\nimport { getLayerDescriptionForType, LayerCapabilities, LayerType } from 'src/dataSources/layers/LayerRegistry'\r\nimport { getLayerCapabilitiesFromType, getLayerParamsFromType, MapState, mapStateInitial } from 'src/reducers/MapReducer'\r\n\r\n/**\r\n * Gets the capabilities for a layer from the capabilitiesUrl.\r\n * @param layer the layer for witch the capabilities are needed\r\n * @param layerCapabilities a map of the current capabilities from state\r\n * @returns the capabilities object for the layer\r\n */\r\nexport const getLayerCapabilities = async (\r\n layer: LayerType,\r\n capabilitiesUrl: string,\r\n layerCapabilities: LayerCapabilities[]\r\n): Promise<ol.GlobalObject|undefined> => {\r\n let capabilities = getLayerCapabilitiesFromType(layer, layerCapabilities)\r\n try {\r\n const response = await fetch(capabilitiesUrl)\r\n const fetchedCapabilities = await response.text()\r\n\r\n const parser = new ol.format.WMTSCapabilities()\r\n capabilities = parser.read(fetchedCapabilities)\r\n } catch (error) {\r\n console.error(error)\r\n }\r\n\r\n return capabilities\r\n}\r\n\r\n/**\r\n * Resets the selected layers to the default selection\r\n * @param enabledLayers The currently enabled layers\r\n * @param dispatch Dispatch object to dispatch Redux state change actions\r\n */\r\nexport const resetSelectedLayers = (enabledLayers: LayerType[], dispatch: Dispatch<any>): void => {\r\n const defaultLayers = mapStateInitial.enabledLayers\r\n enabledLayers.forEach(layerType => {\r\n if (!defaultLayers.includes(layerType)) {\r\n const contextTags = getLayerDescriptionForType(layerType).contextTags\r\n dispatch(wikiActions.removeContextTags(contextTags))\r\n }\r\n })\r\n const tagsToAdd = defaultLayers.map(layer => getLayerDescriptionForType(layer).contextTags).flat()\r\n dispatch(wikiActions.addContextTags(tagsToAdd))\r\n dispatch(mapActions.clearLayers())\r\n}\r\n\r\n/**\r\n * Get comma separated string of selected hydro model ids.\r\n * @param mapState Map state to search through.\r\n * @returns Comma separated string with ids.\r\n */\r\nexport const getSelectedHydroModelLayers = (mapState: MapState): string => {\r\n const params = getLayerParamsFromType(LayerType.HYDRO_MODEL, mapState.layerParams)\r\n let hydroModelIds = ''\r\n if (params?.switchSubLayers !== undefined) {\r\n for (const layer of params.switchSubLayers?.sublayers) {\r\n if (!layer.enabled) {\r\n continue\r\n }\r\n if (layer.id === undefined) {\r\n continue\r\n }\r\n hydroModelIds = [hydroModelIds, layer.id].filter(Boolean).join(',')\r\n }\r\n }\r\n return hydroModelIds\r\n}\r\n\r\n/**\r\n * Gets sub layers from capabilities.\r\n * Retrieves the available sub layers from capabilities\r\n * @param capabilities the capabilities from witch to retrieve the available sub layers\r\n * @returns the a list of sub layers\r\n */\r\nexport const getSubLayersFromCapabilities = (\r\n capabilities: ol.GlobalObject\r\n): string[] => {\r\n let layers = []\r\n if (capabilities.Contents !== undefined) {\r\n layers = capabilities.Contents.Layer.map((layer: { Identifier: any }) => {\r\n return layer.Identifier\r\n })\r\n }\r\n\r\n return layers\r\n}\r\n\r\n/**\r\n * Determine if a given point intersects a given map extent.\r\n * @param mapExtent Extent object.\r\n * @param x x-value of point\r\n * @param y y-value of point\r\n * @returns true inf intersecting, false otherwise.\r\n */\r\nexport const isPointIntersectingMapExtent = (mapExtent: Extent, x: number, y: number): boolean => {\r\n return x > mapExtent[0] && x < mapExtent[2] && y > mapExtent[1] && y < mapExtent[3]\r\n}\r\n\r\n/**\r\n * Determine if one of the corners of b2 is within the bounds of b1.\r\n * @param b1 Extent object.\r\n * @param b2 Extent object.\r\n * @returns true if intersecting, false otherwise.\r\n */\r\nconst areBoxesIntersecting = (b1: Extent, b2: Extent): boolean => {\r\n // Top left (b1)\r\n if (isPointIntersectingMapExtent(b1, b2[0], b2[3])) {\r\n return true\r\n }\r\n\r\n // Top right (b1)\r\n if (isPointIntersectingMapExtent(b1, b2[2], b2[3])) {\r\n return true\r\n }\r\n\r\n // Bottom left (b1)\r\n if (isPointIntersectingMapExtent(b1, b2[0], b2[1])) {\r\n return true\r\n }\r\n\r\n // Bottom right (b1)\r\n if (isPointIntersectingMapExtent(b1, b2[2], b2[1])) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Determine if a given hydro model intersects a given map extent.\r\n * @param mapExtent Extent object.\r\n * @param hydroModel HydroModel object.\r\n * @returns true if intersecting, false otherwise.\r\n */\r\nexport const isHydroModelIntersectingMapExtent = (mapExtent: Extent, hydroModel: HydroModelObject): boolean => {\r\n const hydroExtend: Extent = [\r\n hydroModel.areaInfo.ModelBbox.MinX,\r\n hydroModel.areaInfo.ModelBbox.MinY,\r\n hydroModel.areaInfo.ModelBbox.MaxX,\r\n hydroModel.areaInfo.ModelBbox.MaxY\r\n ]\r\n return areBoxesIntersecting(mapExtent, hydroExtend) || areBoxesIntersecting(hydroExtend, mapExtent)\r\n}\r\n","import ol from 'openlayers'\r\nimport { AnyAction } from 'redux'\r\nimport { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { bottomBarHeightMargin, profileLegendWidth } from 'src/Constants'\r\nimport { DataAction, EmptyAction, MessageAction } from 'src/CustomTypes'\r\nimport { CrossSection, ProfileObject } from 'src/dataSources/geo/CrossSection'\r\nimport { RootState } from 'src/Store'\r\nimport { getSelectedHydroModelLayers } from 'src/utils/MapLayerUtils'\r\nimport { ProfileSetting, ProfileView } from '../reducers/ProfileReducer'\r\n\r\nexport const CLEAR_PROFILE_STATE = 'PROFILE_ACTIONS_CLEAR_PROFILE_STATE'\r\nexport const CURRENT_PROFILE_VIEW = 'PROFILE_ACTIONS_CURRENT_PROFILE_VIEW'\r\nexport const DISABLE_SETTING = 'PROFILE_ACTIONS_DISABLE_SETTING'\r\nexport const ENABLE_SETTING = 'PROFILE_ACTIONS_ENABLE_SETTING'\r\nexport const FETCHING_PROFILE_STARTED =\r\n 'PROFILE_ACTIONS_FETCHING_PROFILE_STARTED'\r\nexport const FETCHING_PROFILE_SUCCESS =\r\n 'PROFILE_ACTIONS_FETCHING_PROFILE_SUCCESS'\r\nexport const FETCHING_PROFILE_FAILURE =\r\n 'PROFILE_ACTIONS_FETCHING_PROFILE_FAILURE'\r\nexport const SET_COORDINATES = 'PROFILE_ACTIONS_SET_COORDINATES'\r\nexport const SET_MAX_DEPTH = 'PROFILE_ACTIONS_SET_MAX_DEPTH'\r\nexport const SET_MAX_BOREHOLE_DISTANCE =\r\n 'PROFILE_ACTIONS_SET_MAX_BOREHOLE_DISTANCE'\r\nexport const SET_CROSSHAIR_DISTANCE = 'PROFILE_ACTIONS_SET_CROSSHAIR_DISTANCE'\r\n\r\ninterface ProfileActions {\r\n clearState: () => EmptyAction\r\n currentView: (viewType: ProfileView) => DataAction<ProfileView>\r\n disableSetting: (setting: ProfileSetting) => DataAction<ProfileSetting>\r\n enableSetting: (setting: ProfileSetting) => DataAction<ProfileSetting>\r\n fetchingProfileStarted: () => EmptyAction\r\n fetchingProfileFailure: (message: string) => MessageAction\r\n fetchingProfileSuccess: (profile: ProfileObject) => DataAction<ProfileObject>\r\n setCoordinates: (coordinates: ol.Coordinate[]) => DataAction<ol.Coordinate[]>\r\n setMaxBoreholeDistance: (distance: number) => DataAction<number>\r\n setMaxDepth: (depth: number) => DataAction<number>\r\n setCrosshairDistance: (distance: number | undefined) => DataAction<number | undefined>\r\n\r\n // Thunk actions\r\n fetchProfile: () => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const profileActions: ProfileActions = {\r\n clearState: () => {\r\n return {\r\n type: CLEAR_PROFILE_STATE\r\n }\r\n },\r\n currentView: (viewType: ProfileView): DataAction<ProfileView> => {\r\n return {\r\n type: CURRENT_PROFILE_VIEW,\r\n data: viewType\r\n }\r\n },\r\n disableSetting: (setting: ProfileSetting): DataAction<ProfileSetting> => {\r\n return {\r\n type: DISABLE_SETTING,\r\n data: setting\r\n }\r\n },\r\n enableSetting: (setting: ProfileSetting): DataAction<ProfileSetting> => {\r\n return {\r\n type: ENABLE_SETTING,\r\n data: setting\r\n }\r\n },\r\n fetchingProfileStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_PROFILE_STARTED\r\n }\r\n },\r\n fetchingProfileFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_PROFILE_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingProfileSuccess: (borehole: ProfileObject): DataAction<ProfileObject> => {\r\n return {\r\n type: FETCHING_PROFILE_SUCCESS,\r\n data: borehole\r\n }\r\n },\r\n setMaxBoreholeDistance: (distance: number) => {\r\n return {\r\n type: SET_MAX_BOREHOLE_DISTANCE,\r\n data: distance\r\n }\r\n },\r\n setCoordinates: (coordinates: ol.Coordinate[]): DataAction<ol.Coordinate[]> => {\r\n return {\r\n type: SET_COORDINATES,\r\n data: coordinates\r\n }\r\n },\r\n setMaxDepth: (depth: number) => {\r\n return {\r\n type: SET_MAX_DEPTH,\r\n data: depth\r\n }\r\n },\r\n setCrosshairDistance: (distance: number | undefined): DataAction<number | undefined> => {\r\n return {\r\n type: SET_CROSSHAIR_DISTANCE,\r\n data: distance\r\n }\r\n },\r\n fetchProfile: (): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Fetch profile\r\n const token = getState().authState.token\r\n dispatch(profileActions.fetchingProfileStarted())\r\n\r\n const model = getState().generalState.selectedGeoModel\r\n const coordinates = getState().profileState.coordinates\r\n if (coordinates === undefined) {\r\n return\r\n }\r\n\r\n const bottomBarWidth = getState().generalState.bottomBarWidth\r\n const bottomBarHeight = getState().generalState.bottomBarHeight\r\n const maxDepth = getState().profileState.maxDepth\r\n const maxBoreholeDistance = getState().profileState.maxBoreholeDistance\r\n\r\n const wsCrossSection = new CrossSection(token)\r\n if (model !== undefined) {\r\n wsCrossSection.setModelId(model.ID)\r\n } else {\r\n wsCrossSection.setModelId('-1')\r\n }\r\n wsCrossSection.setPathCoordinates(coordinates)\r\n wsCrossSection.setHydroModelIds(getSelectedHydroModelLayers(getState().mapState))\r\n wsCrossSection.setMaxDepth(maxDepth)\r\n wsCrossSection.setMaxBoreholeDistance(maxBoreholeDistance)\r\n wsCrossSection.setWidth(bottomBarWidth - profileLegendWidth)\r\n wsCrossSection.setHeight(bottomBarHeight - bottomBarHeightMargin)\r\n try {\r\n const profile = await wsCrossSection.fetchProfile()\r\n dispatch(profileActions.fetchingProfileSuccess(profile))\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(profileActions.fetchingProfileFailure(errorMessage))\r\n }\r\n }\r\n }\r\n}\r\n","import { BaseAction, CallResult, DataAction, MessageAction } from 'src/CustomTypes'\r\nimport { ProfileObject } from 'src/dataSources/geo/CrossSection'\r\nimport { CURRENT_PROFILE_VIEW, SET_COORDINATES, SET_MAX_DEPTH, SET_MAX_BOREHOLE_DISTANCE, FETCHING_PROFILE_STARTED, FETCHING_PROFILE_SUCCESS, FETCHING_PROFILE_FAILURE, CLEAR_PROFILE_STATE, SET_CROSSHAIR_DISTANCE, DISABLE_SETTING, ENABLE_SETTING } from '../actions/ProfileActions'\r\n\r\nexport enum ProfileView {\r\n Empty,\r\n Info\r\n}\r\n\r\nexport enum ProfileSetting {\r\n SHOW_BOREHOLE_LABEL = 'showBoreholeLabel',\r\n SHOW_GEOLOGY_LABEL = 'showGeologyLabel',\r\n SHOW_FILTER_LEVEL = 'showFilterLevel',\r\n SHOW_WATER_LEVEL_SYMBOL = 'showWaterLevelSymbol',\r\n SHOW_WATER_LEVEL = 'showWaterLevel',\r\n SHOW_GEO_LOGO = 'showGeoLogo',\r\n SHOW_PROFILE_BUFFER = 'showProfileBuffer'\r\n}\r\n\r\nexport interface ProfileState {\r\n fetchProfileStatus: CallResult\r\n fetchProfileError: string\r\n selectedProfile?: ProfileObject\r\n\r\n currentView: ProfileView\r\n coordinates: ol.Coordinate[]\r\n maxBoreholeDistance: number\r\n maxDepth: number\r\n crosshairDistance?: number\r\n enabledSettings: ProfileSetting[]\r\n}\r\n\r\nexport const profileStateInitial: ProfileState = {\r\n fetchProfileStatus: CallResult.Initial,\r\n fetchProfileError: '',\r\n selectedProfile: undefined,\r\n\r\n currentView: ProfileView.Empty,\r\n coordinates: [],\r\n maxBoreholeDistance: 0,\r\n maxDepth: -40,\r\n crosshairDistance: undefined,\r\n enabledSettings: [\r\n ProfileSetting.SHOW_BOREHOLE_LABEL,\r\n ProfileSetting.SHOW_FILTER_LEVEL,\r\n ProfileSetting.SHOW_GEOLOGY_LABEL,\r\n ProfileSetting.SHOW_GEO_LOGO,\r\n ProfileSetting.SHOW_PROFILE_BUFFER,\r\n ProfileSetting.SHOW_WATER_LEVEL,\r\n ProfileSetting.SHOW_WATER_LEVEL_SYMBOL\r\n ]\r\n}\r\n\r\nexport function profileReducer (\r\n state: ProfileState = profileStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction\r\n): ProfileState {\r\n switch (action.type) {\r\n case CLEAR_PROFILE_STATE:\r\n return {\r\n ...state,\r\n currentView: ProfileView.Empty,\r\n coordinates: [],\r\n selectedProfile: undefined\r\n }\r\n case CURRENT_PROFILE_VIEW: {\r\n const a = action as DataAction<ProfileView>\r\n return {\r\n ...state,\r\n currentView: a.data\r\n }\r\n }\r\n case DISABLE_SETTING: {\r\n const a = action as DataAction<ProfileSetting>\r\n return {\r\n ...state,\r\n enabledSettings: state.enabledSettings.filter(\r\n (setting) => setting !== a.data\r\n )\r\n }\r\n }\r\n case ENABLE_SETTING: {\r\n const a = action as DataAction<ProfileSetting>\r\n let enabledSettings = [...state.enabledSettings]\r\n const settingAlreadyEnabled = state.enabledSettings.some(\r\n (setting) => setting === a.data\r\n )\r\n if (!settingAlreadyEnabled) {\r\n enabledSettings = [...state.enabledSettings, a.data]\r\n }\r\n return {\r\n ...state,\r\n enabledSettings: enabledSettings\r\n }\r\n }\r\n case FETCHING_PROFILE_STARTED: {\r\n return {\r\n ...state,\r\n fetchProfileStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_PROFILE_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchProfileStatus: CallResult.Failed,\r\n fetchProfileError: a.message\r\n }\r\n }\r\n case FETCHING_PROFILE_SUCCESS: {\r\n const a = action as DataAction<ProfileObject | undefined>\r\n return {\r\n ...state,\r\n fetchProfileStatus: CallResult.Succeeded,\r\n selectedProfile: a.data !== undefined ? a.data : undefined\r\n }\r\n }\r\n case SET_COORDINATES: {\r\n const a = action as DataAction<ol.Coordinate[]>\r\n return {\r\n ...state,\r\n coordinates: a.data\r\n }\r\n }\r\n case SET_MAX_BOREHOLE_DISTANCE: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n maxBoreholeDistance: a.data\r\n }\r\n }\r\n case SET_MAX_DEPTH: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n maxDepth: a.data\r\n }\r\n }\r\n case SET_CROSSHAIR_DISTANCE: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n crosshairDistance: a.data\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const co2LevelsOrgStyle = makeStyles((theme) => ({\r\n root: {\r\n width: '99%',\r\n marginTop: '2.5rem',\r\n display: 'flex',\r\n height: '330px'\r\n },\r\n container: {\r\n flex: 1\r\n }\r\n}))\r\n","import { FC, useEffect, useRef } from 'react'\r\nimport { co2LevelsOrgStyle } from './CO2LevelsOrg.style'\r\n\r\n/**\r\n * CO2LevelsOrgProps contains properties for the component.\r\n */\r\nexport interface CO2LevelsOrgProps {} // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\n/**\r\n * CO2LevelsOrg figure and legend for the current profile.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const CO2LevelsOrg: FC<CO2LevelsOrgProps> = (props: CO2LevelsOrgProps) => {\r\n const divRef = useRef<HTMLDivElement>(null)\r\n const classes = co2LevelsOrgStyle()\r\n\r\n useEffect(() => {\r\n const script = document.createElement('script')\r\n script.async = true\r\n script.src = 'https://www.climatelevels.org/graphs/js/co2.php?theme=default&pid=2degreesinstitute'\r\n const current = divRef.current\r\n if (current !== undefined) {\r\n current?.appendChild(script)\r\n }\r\n }, [])\r\n return (\r\n <div\r\n ref={divRef}\r\n className={classes.root}\r\n >\r\n <div id='co2-widget-container' className={classes.container} />\r\n </div>\r\n )\r\n}\r\n","import { DataTheme } from 'src/Enums'\r\nimport { createIntl, createIntlCache, IntlShape } from 'react-intl'\r\nimport messages_da from '../translations/da.json'\r\nimport { LayerGroup } from 'src/dataSources/layers/LayerRegistry'\r\n\r\nexport interface BarStyle {\r\n transition: string\r\n}\r\n\r\nexport interface BarTransitionStyleState {\r\n width?: string\r\n height?: string\r\n}\r\n\r\nexport interface BarTransitionStyle {\r\n entering: BarTransitionStyleState\r\n entered: BarTransitionStyleState\r\n exiting: BarTransitionStyleState\r\n exited: BarTransitionStyleState\r\n unmounted: BarTransitionStyleState\r\n}\r\n\r\n/**\r\n * Get IntlShape object that can be used for getting localized texts.\r\n * @returns IntlShape object.\r\n */\r\nexport const getIntl = (): IntlShape => {\r\n const cache = createIntlCache()\r\n return createIntl({\r\n locale: 'da',\r\n messages: messages_da\r\n }, cache)\r\n}\r\n\r\n/**\r\n * Get localized data theme name.\r\n * @param type DateTheme type.\r\n * @returns Localized data theme name.\r\n */\r\nexport const getDataThemeName = (type: DataTheme): string => {\r\n const intl = getIntl()\r\n switch (type) {\r\n case DataTheme.NONE:\r\n return intl.formatMessage({ id: 'theme.live' })\r\n case DataTheme.ICE_AGE:\r\n return intl.formatMessage({ id: 'theme.iceage' })\r\n case DataTheme.CLIMATE:\r\n return intl.formatMessage({ id: 'theme.climate' })\r\n case DataTheme.ENERGY:\r\n return intl.formatMessage({ id: 'theme.energy' })\r\n case DataTheme.ENVIRONMENT:\r\n return intl.formatMessage({ id: 'theme.environment' })\r\n }\r\n}\r\n\r\n/**\r\n * Get localized layer group name.\r\n * @param group Group to get name for.\r\n * @returns Localized layer group name.\r\n */\r\nexport const getLayerGroupName = (group: LayerGroup): string => {\r\n const intl = getIntl()\r\n switch (group) {\r\n case LayerGroup.GENERAL:\r\n return intl.formatMessage({ id: 'map.layergroup.general' })\r\n case LayerGroup.NATURE:\r\n return intl.formatMessage({ id: 'map.layergroup.nature' })\r\n case LayerGroup.SUBSURFACE:\r\n return intl.formatMessage({ id: 'map.layergroup.subsurface' })\r\n case LayerGroup.WATER:\r\n return intl.formatMessage({ id: 'map.layergroup.water' })\r\n case LayerGroup.WINDPOWER:\r\n return intl.formatMessage({ id: 'map.layergroup.windpower' })\r\n case LayerGroup.POLLUTION:\r\n return intl.formatMessage({ id: 'map.layergroup.pollution' })\r\n case LayerGroup.GEOPHYSICS:\r\n return intl.formatMessage({ id: 'map.layergroup.geophysics' })\r\n case LayerGroup.ICE_AGE:\r\n return intl.formatMessage({ id: 'map.layergroup.iceage' })\r\n case LayerGroup.NEAR_TERRAIN:\r\n return intl.formatMessage({ id: 'map.layergroup.nearterrain' })\r\n case LayerGroup.BACKGROUND_MAPS:\r\n return intl.formatMessage({ id: 'map.layergroup.backgroundmaps' })\r\n case LayerGroup.POINTS_OF_INTEREST:\r\n return intl.formatMessage({ id: 'map.layergroup.pointsofinterest' })\r\n }\r\n}\r\n\r\n/**\r\n * Get style for bar.\r\n * @param speed Speed to transition with.\r\n * @returns Bar style object.\r\n */\r\nexport const getBarStyle = (speed: number): BarStyle => {\r\n return {\r\n transition: `width ${speed}ms`\r\n }\r\n}\r\n\r\n/**\r\n * Get bar transition style.\r\n * @param width Width of sidebar in pixels.\r\n * @returns Bar transition style object.\r\n */\r\nexport const getBarTransitionStyle = (width: number): BarTransitionStyle => {\r\n return {\r\n entering: { width: '0px' },\r\n entered: { width: `${width}px` },\r\n exiting: { width: `${width}px` },\r\n exited: { width: '0px' },\r\n unmounted: { width: '0px' }\r\n }\r\n}\r\n\r\n/**\r\n * Converts a number into a hex string\r\n * @param c Number to be converted\r\n * @returns the number converted into a hex string\r\n */\r\nexport const numberToHex = (c: number): string => {\r\n const hex = c.toString(16).toUpperCase()\r\n return hex.length === 1 ? `0${hex}` : hex\r\n}\r\n\r\n/**\r\n * Converts a rgb color into a hex color\r\n * @param r the red channel\r\n * @param g the green channel\r\n * @param b the blue channel\r\n * @returns returns the color converted into a hex string\r\n */\r\nexport const rgbToHex = (r: number, g: number, b: number): string => {\r\n return `#${numberToHex(r)}${numberToHex(g)}${numberToHex(b)}`\r\n}\r\n\r\n/**\r\n * Rounds a given number to the desired number of decimal places and retuns it as a string\r\n * @param num The number to turn into a string\r\n * @param decimalPlaces the amount of decimal places to round the number to\r\n * @returns the rounded number as a string\r\n */\r\nexport const numberToDecimalString = (num: number, decimalPlaces: number = 2): string => {\r\n return (Math.round(num * 100) / 100).toFixed(decimalPlaces)\r\n}\r\n\r\n/**\r\n * Replaces special characters like æ, ø and å\r\n * @param str string for which to raplace chars\r\n * @returns string with replaced chars\r\n */\r\nexport const replaceSpecialChars = (str: string): string => {\r\n return str\r\n .replaceAll('æ', 'ae')\r\n .replaceAll('ø', 'oe')\r\n .replaceAll('å', 'aa')\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { leftSidebarSettingsWidth } from 'src/Constants'\r\n\r\nexport const layerLegendStyle = makeStyles((theme) => ({\r\n root: {\r\n width: leftSidebarSettingsWidth,\r\n height: '100%',\r\n backgroundColor: theme.palette.secondary.main,\r\n padding: theme.spacing(2),\r\n borderTop: 1,\r\n borderTopStyle: 'solid',\r\n borderTopColor: theme.palette.primary.main,\r\n borderBottom: 1,\r\n borderBottomStyle: 'solid',\r\n borderBottomColor: theme.palette.primary.main\r\n },\r\n layer: {\r\n display: 'flex',\r\n flexDirection: 'row'\r\n },\r\n layerWithWikiDocument: {\r\n cursor: 'pointer'\r\n },\r\n color: {\r\n marginLeft: theme.spacing(1),\r\n minWidth: '20px',\r\n minHeight: '20px',\r\n marginRight: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.common.black\r\n },\r\n selectedColor: {\r\n marginLeft: theme.spacing(1),\r\n minWidth: '20px',\r\n minHeight: '20px',\r\n marginRight: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n borderWidth: 1.5,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.common.black\r\n },\r\n description: {\r\n fontSize: '0.6rem'\r\n },\r\n selectedDescription: {\r\n fontSize: '0.7rem',\r\n fontWeight: 'bold'\r\n },\r\n legendText: {\r\n marginBottom: theme.spacing(2)\r\n }\r\n}))\r\n","import { Grid } from '@material-ui/core'\r\nimport { FC, useEffect, useState } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { ColorInFocus } from 'src/actions/MapActions'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport { MapLegendObject } from 'src/dataSources/geo/MapLegend'\r\nimport { ImageLegend, LayerType } from 'src/dataSources/layers/LayerRegistry'\r\nimport { WikiDocumentMeta } from 'src/dataSources/wiki/Wiki'\r\nimport { RootState } from 'src/Store'\r\nimport { replaceSpecialChars } from 'src/utils/Utils'\r\nimport { layerLegendStyle } from './LayerLegend.style'\r\n\r\nexport interface LayerLegendProps {\r\n layerType?: LayerType\r\n layerPickerStyle?: boolean\r\n numberOfColumns?: number\r\n imageLegend?: ImageLegend\r\n}\r\n\r\nconst defaultProps: LayerLegendProps = {\r\n layerType: undefined,\r\n layerPickerStyle: true,\r\n numberOfColumns: 2,\r\n imageLegend: undefined\r\n}\r\n\r\nexport const LayerLegend: FC<LayerLegendProps> = (props: LayerLegendProps) => {\r\n const classes = layerLegendStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n\r\n const tokenSelector = useSelector((state: RootState) => state.authState.token)\r\n const allColorsInFocus = useSelector((state: RootState): ColorInFocus[] => state.mapState.colorsInFocus)\r\n const mapLegend = useSelector((state: RootState): MapLegendObject[] | undefined => state.generalState.mapLegend)\r\n const selectedGeoModel = useSelector((state: RootState): GeoModel | undefined => state.generalState.selectedGeoModel)\r\n const wikiDocumentsMeta = useSelector((state: RootState): WikiDocumentMeta[] => state.wikiState.documentsMeta)\r\n\r\n const [colorsInFocus, setColorsInFocus] = useState<string[]>([])\r\n\r\n const legendNameToWikiDocumentKey = (legendName: string): string => {\r\n return legendName.toLowerCase().replaceAll(' ', '_')\r\n }\r\n\r\n const hasDocument = (legendName: string): boolean => {\r\n const legendKey = legendNameToWikiDocumentKey(legendName)\r\n return wikiDocumentsMeta.some(meta => meta.key === legendKey)\r\n }\r\n\r\n const getImageStyle = (): React.CSSProperties|undefined => {\r\n if (props.imageLegend?.imageWidth !== undefined && props.imageLegend?.imageHeight !== undefined) {\r\n return {\r\n width: props.imageLegend?.imageWidth,\r\n height: props.imageLegend.imageHeight\r\n }\r\n }\r\n if (props.imageLegend?.imageWidth !== undefined) {\r\n return {\r\n width: props.imageLegend?.imageWidth\r\n }\r\n }\r\n if (props.imageLegend?.imageHeight !== undefined) {\r\n return {\r\n height: props.imageLegend?.imageHeight\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n useEffect(() => {\r\n if (tokenSelector === '') {\r\n return\r\n }\r\n if (selectedGeoModel === undefined) {\r\n return\r\n }\r\n dispatch(generalActions.fetchMapLegend(selectedGeoModel.ID))\r\n // eslint-disable-next-line\r\n }, [tokenSelector, selectedGeoModel])\r\n\r\n useEffect(() => {\r\n const colors: string[] = allColorsInFocus\r\n .filter(inFocus => inFocus.layerType === props.layerType)\r\n .map(inFocus => inFocus.color)\r\n setColorsInFocus(colors)\r\n // eslint-disable-next-line\r\n }, [allColorsInFocus])\r\n\r\n return (\r\n <div className={props.layerPickerStyle === true ? classes.root : ''}>\r\n {props.imageLegend === undefined && (\r\n <Grid container>\r\n {mapLegend?.map((legend, index) => {\r\n return (\r\n <Grid item xs={props.numberOfColumns === 2 ? 6 : 12} key={index}>\r\n <div\r\n className={`${classes.layer} ${hasDocument(legend.Name) ? classes.layerWithWikiDocument : ''}`}\r\n title={legend.LongName}\r\n onClick={() => {\r\n const legendName = replaceSpecialChars(legend.Name)\r\n if (hasDocument(legendName)) {\r\n dispatch(wikiActions.fetchDocument(legendNameToWikiDocumentKey(legendName)))\r\n }\r\n }}\r\n >\r\n <div className={colorsInFocus.includes(legend.Color) ? classes.selectedColor : classes.color} style={{ backgroundColor: legend.Color }} />\r\n <div className={colorsInFocus.includes(legend.Color) ? classes.selectedDescription : classes.description}>\r\n {legend.Name}\r\n </div>\r\n </div>\r\n </Grid>\r\n )\r\n })}\r\n </Grid>\r\n )}\r\n {props.imageLegend !== undefined && (\r\n <div>\r\n {props.imageLegend.legendTextId !== undefined && (\r\n <div className={classes.legendText}>{intl.formatMessage({ id: props.imageLegend.legendTextId })}</div>\r\n )}\r\n <img\r\n src={props.imageLegend.legendImage}\r\n style={getImageStyle()}\r\n alt={intl.formatMessage({ id: 'layerpicker.legend' })}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nLayerLegend.defaultProps = defaultProps\r\n\r\nexport default LayerLegend\r\n","import { makeStyles, Theme } from '@material-ui/core/styles'\r\n\r\nexport interface ProfileInfoStyleProps {\r\n bottomBarHeight: number\r\n}\r\nexport const profileInfoStyle = makeStyles<Theme, ProfileInfoStyleProps>(theme => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n marginLeft: theme.spacing(2)\r\n },\r\n figure: {\r\n marginTop: theme.spacing(0.2),\r\n paddingLeft: theme.spacing(3),\r\n paddingRight: theme.spacing(3),\r\n width: '100%',\r\n overflowX: 'hidden',\r\n overflowY: 'hidden',\r\n '& .boring-container': {\r\n cursor: 'pointer',\r\n '& rect:hover': {\r\n strokeWidth: 2\r\n }\r\n }\r\n },\r\n progress: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(8),\r\n fontSize: '0.8rem',\r\n color: theme.palette.geoColors.text.light\r\n },\r\n legend: {\r\n width: 250,\r\n height: props => props.bottomBarHeight - 45,\r\n overflowY: 'scroll',\r\n overflowX: 'hidden',\r\n marginTop: theme.spacing(0.2),\r\n paddingTop: theme.spacing(5),\r\n paddingLeft: theme.spacing(2),\r\n borderLeftColor: theme.palette.geoColors.text.light,\r\n borderLeftWidth: 1,\r\n borderLeftStyle: 'solid'\r\n },\r\n crosshairContainer: {\r\n position: 'absolute',\r\n top: 0,\r\n pointerEvents: 'none'\r\n },\r\n crosshairHorizontal: {\r\n height: 1,\r\n width: '100%',\r\n position: 'absolute',\r\n background: theme.palette.common.black\r\n },\r\n crosshairVertical: {\r\n height: '100%',\r\n width: 1,\r\n position: 'absolute',\r\n background: theme.palette.common.black\r\n },\r\n crosshairValueXCard: {\r\n position: 'absolute',\r\n width: 50,\r\n bottom: -28\r\n },\r\n crosshairValueYCard: {\r\n position: 'absolute',\r\n width: 35,\r\n left: -54\r\n },\r\n crosshairValueX: {\r\n paddingTop: theme.spacing(0.5),\r\n paddingBottom: theme.spacing(0.5),\r\n width: '100%',\r\n background: theme.palette.geoColors.contextBar.dark,\r\n borderRadius: 3\r\n },\r\n crosshairValueY: {\r\n padding: theme.spacing(0.5),\r\n width: 35,\r\n background: theme.palette.geoColors.contextBar.dark,\r\n borderRadius: 3\r\n },\r\n crosshairValue: {\r\n margin: 0,\r\n fontSize: 10,\r\n textAlign: 'center'\r\n },\r\n profileWrapper: {\r\n width: '100%'\r\n },\r\n triangleTop: {\r\n content: '',\r\n position: 'absolute',\r\n top: -5,\r\n left: 15,\r\n borderTop: 'none',\r\n borderRight: '10px solid transparent',\r\n borderLeft: '10px solid transparent',\r\n borderBottom: '10px solid',\r\n borderBottomColor: theme.palette.geoColors.contextBar.dark\r\n },\r\n triangleRight: {\r\n content: '',\r\n position: 'absolute',\r\n top: 0,\r\n right: -17,\r\n borderTop: '10px solid transparent',\r\n borderRight: 'none',\r\n borderLeft: '10px solid',\r\n borderLeftColor: theme.palette.geoColors.contextBar.dark,\r\n borderBottom: '10px solid transparent'\r\n }\r\n}))\r\n","/**\r\nService for fetching the boreholes nearest to the given coordinate.\r\n\r\nExample output:\r\n[\r\n {\r\n \"BoreholeId\": 779581,\r\n \"BoreholeNumber\": \"GI_14018836_2\",\r\n \"X\": 574598.5929637103,\r\n \"Y\": 6228472.113549921,\r\n \"Epsg\": 0,\r\n \"DistanceToBorehole\": 46.64895697526009,\r\n \"DatasourceId\": 1\r\n }\r\n]\r\n*/\r\n\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * The object type returned by the nearest borehole webservice.\r\n */\r\nexport interface NearestBoreholeObject {\r\n BoreholeId: number\r\n BoreholeNumber: string\r\n X: number\r\n Y: number\r\n Espg: number\r\n DistanceToBorehole: number\r\n DatasourceId: number\r\n}\r\n\r\n/**\r\n * Web service for fetching the boreholes near to a given map coordinate.\r\n * The following parameters are required: 'X' & 'Y' ( @see setCoordinate ),\r\n * 'MaxDistance' ( @see setDistance ), and 'MaxBoreholeNumber' ( @see setLimit ).\r\n */\r\nexport class NearestBoreholes extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/borehole/GetNearestBorehole' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n const defaultParams = {\r\n MaxBoreholeNumber: '1',\r\n MaxDistance: '50',\r\n HideWhiteBorehole: '1'\r\n }\r\n super(NearestBoreholes.URL, token, defaultParams)\r\n }\r\n\r\n /**\r\n * [Required] Setter for the coordinate.\r\n * @param coordinate The map coordinate to use in the lookup operation.\r\n */\r\n setCoordinate (coordinate: number[]): void {\r\n if (coordinate.length !== 2) {\r\n throw new Error('Argument error: coordinate must have exactly two entries.')\r\n }\r\n this.addParam('X', coordinate[0].toString())\r\n this.addParam('Y', coordinate[1].toString())\r\n }\r\n\r\n /**\r\n * Setter for the maximum search distance. Default value is 50m.\r\n * @param distance The max distance in meters. The service searches this far\r\n * away from the given point when looking for boreholes.\r\n */\r\n setDistance (distance: number): void {\r\n this.addParam('MaxDistance', distance.toString())\r\n }\r\n\r\n /**\r\n * Setter for the search limit. Default is 1.\r\n * @param limit The maximum number of boreholes to return.\r\n */\r\n setLimit (limit: number): void {\r\n this.addParam('MaxBoreholeNumber', limit.toString())\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n */\r\n private validateParams (): void {\r\n if (!this.hasParam('X') || !this.hasParam('Y')) {\r\n throw new Error('Parameter mismatch: The search coordinate has not been set.')\r\n }\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the nearest borehole information objects fetched.\r\n */\r\n async fetchBoreHoles (): Promise<NearestBoreholeObject[]> {\r\n this.validateParams()\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n const responseData = await response.json()\r\n return responseData\r\n }\r\n}\r\n","/**\r\nService for fetching an image of a borehole.\r\n\r\nReturn an image of the borehole in SVG format.\r\n*/\r\n\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * Web service for fetching an image for a given borehole.\r\n * The following parameter is required: 'BoreholeNo' ( @see setBoreholeNo ).\r\n */\r\nexport class Borehole extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/borehole' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n const defaultParams = {\r\n format: 'image/svg+xml'\r\n }\r\n super(Borehole.URL, token, defaultParams)\r\n }\r\n\r\n /**\r\n * [Required*] Setter for the borehole id.\r\n * *: This parameter or BoreholeNo must be set.\r\n * @param boreholeId The borehole id.\r\n */\r\n setBoreholeId (boreholeId: number): void {\r\n this.addParam('BoreholeId', boreholeId.toString())\r\n }\r\n\r\n /**\r\n * [Required*] Setter for the borehole number.\r\n * *: This paremeter or BoreholeId must be set.\r\n * @param boreholeNo The borehole number.\r\n */\r\n setBoreholeNo (boreholeNo: string): void {\r\n this.addParam('BoreholeNo', boreholeNo)\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n */\r\n private validateParams (): void {\r\n if (!(this.hasParam('BoreholeNo') || this.hasParam('BoreholeId'))) {\r\n throw new Error('Parameter mismatch: The boreholeNo or boreholeId param must be set.')\r\n }\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the borehole image.\r\n */\r\n async fetchBorehole (): Promise<string> {\r\n this.validateParams()\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n return await response.text()\r\n }\r\n}\r\n","/**\r\nService for fetching a legend for a give borehole.\r\n\r\nReturn a list of layers i JSON format with description, symbol, color and view order.\r\n*/\r\n\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * Object type returned by the borehole legend webservice.\r\n */\r\nexport interface BoreholeLegendObject {\r\n HasSounding: boolean\r\n HasScreens: boolean\r\n Layers: BoreholeLegendLayerObject[]\r\n}\r\n\r\n/**\r\n * Object type describing the properties of the available layers.\r\n */\r\nexport interface BoreholeLegendLayerObject {\r\n Description: string\r\n Symbol: string\r\n Color: string\r\n ViewOrder: number\r\n}\r\n\r\n/**\r\n * Web service for fetching a legend for a given borehole.\r\n * The following parameter is required: 'BoreholeNo' ( @see setBoreholeNo ).\r\n */\r\nexport class BoreholeLegend extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/borehole/GetLegend' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n super(BoreholeLegend.URL, token, {})\r\n }\r\n\r\n /**\r\n * [Required*] Setter for the borehole id.\r\n * *: This parameter or BoreholeNo must be set.\r\n * @param boreholeId The borehole id.\r\n */\r\n setBoreholeId (boreholeId: number): void {\r\n this.addParam('BoreholeId', boreholeId.toString())\r\n }\r\n\r\n /**\r\n * [Required*] Setter for the borehole number.\r\n * *: This paremeter or BoreholeId must be set.\r\n * @param boreholeNo The borehole number.\r\n */\r\n setBoreholeNo (boreholeNo: string): void {\r\n this.addParam('BoreholeNo', boreholeNo)\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n */\r\n private validateParams (): void {\r\n if (!(this.hasParam('BoreholeNo') || this.hasParam('BoreholeId'))) {\r\n throw new Error('Parameter mismatch: The boreholeNo or boreholeId param must be set.')\r\n }\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the borehole legend.\r\n */\r\n async fetchBoreholeLegend (): Promise<BoreholeLegendObject> {\r\n this.validateParams()\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n return await response.json()\r\n }\r\n}\r\n","/**\r\n * Web service for converting a longitude, latitude pair to the nearest\r\n * postal address.\r\n *\r\n * Example output:\r\n *\r\n * curl https://api.dataforsyningen.dk/adgangsadresser/reverse\\?x\\=574380.9209504016\\&y\\=6228272.66888137\\&srid\\=25832\\&struktur\\=mini\r\n *\r\n * {\r\n \"id\": \"0a3f5096-a6ae-32b8-e044-0003ba298018\",\r\n \"status\": 1,\r\n \"darstatus\": 3,\r\n \"vejkode\": \"6033\",\r\n \"vejnavn\": \"Næringen\",\r\n \"adresseringsvejnavn\": \"Næringen\",\r\n \"husnr\": \"34\",\r\n \"supplerendebynavn\": null,\r\n \"postnr\": \"8240\",\r\n \"postnrnavn\": \"Risskov\",\r\n \"stormodtagerpostnr\": null,\r\n \"stormodtagerpostnrnavn\": null,\r\n \"kommunekode\": \"0751\",\r\n \"x\": 574364.25,\r\n \"y\": 6228262,\r\n \"href\": \"https://api.dataforsyningen.dk/adgangsadresser/0a3f5096-a6ae-32b8-e044-0003ba298018\",\r\n \"betegnelse\": \"Næringen 34, 8240 Risskov\"\r\n }\r\n */\r\nimport { WebServiceClient } from '../WebServiceClient'\r\n\r\nexport interface AddressReverseResult {\r\n id: string\r\n vejnavn?: string\r\n husnr?: string\r\n postnr?: string\r\n postnrnavn?: string\r\n betegnelse?: string\r\n}\r\n\r\nexport class AddressReverse extends WebServiceClient {\r\n static get URL (): string { return 'https://api.dataforsyningen.dk/adgangsadresser/reverse' }\r\n\r\n constructor () {\r\n const defaultParams = {\r\n srid: '25832',\r\n noFormat: '',\r\n struktur: 'mini'\r\n }\r\n super(AddressReverse.URL, defaultParams)\r\n }\r\n\r\n setCoords (coords: number[]): void {\r\n if (coords.length !== 2) {\r\n throw new Error('Parameter coords must have exactly two items.')\r\n }\r\n this.addParam('x', coords[0].toString())\r\n this.addParam('y', coords[1].toString())\r\n }\r\n\r\n async fetchReverseAddress (): Promise<AddressReverseResult> {\r\n const response: Response = await fetch(this.url())\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n return await response.json()\r\n }\r\n}\r\n","import { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { AnyAction } from 'redux'\r\nimport { NearestBoreholeObject, NearestBoreholes } from 'src/dataSources/geo/NearestBoreHoles'\r\nimport { Borehole } from 'src/dataSources/geo/Borehole'\r\nimport { BoreholeLegend, BoreholeLegendObject } from 'src/dataSources/geo/BoreholeLegend'\r\nimport { RootState } from 'src/Store'\r\nimport { AddressReverse, AddressReverseResult } from 'src/dataSources/dataforsyningen/AddressReverse'\r\nimport { EmptyAction, DataAction, MessageAction } from 'src/CustomTypes'\r\n\r\nexport const FETCHING_BOREHOLE_STARTED = 'BOREHOLE_INFO_ACTIONS_FETCHING_BOREHOLE_STARTED'\r\nexport const FETCHING_BOREHOLE_SUCCESS = 'BOREHOLE_INFO_ACTIONS_FETCHING_BOREHOLE_SUCCESS'\r\nexport const FETCHING_BOREHOLE_FAILURE = 'BOREHOLE_INFO_ACTIONS_FETCHING_BOREHOLE_FAILURE'\r\nexport const FETCHING_ADDRESS_STARTED = 'BOREHOLE_INFO_ACTIONS_FETCHING_ADDRESS_STARTED'\r\nexport const FETCHING_ADDRESS_SUCCESS = 'BOREHOLE_INFO_ACTIONS_FETCHING_ADDRESS_SUCCESS'\r\nexport const FETCHING_ADDRESS_FAILURE = 'BOREHOLE_INFO_ACTIONS_FETCHING_ADDRESS_FAILURE'\r\nexport const FETCHING_IMAGE_STARTED = 'BOREHOLE_INFO_ACTIONS_FETCHING_IMAGE_STARTED'\r\nexport const FETCHING_IMAGE_SUCCESS = 'BOREHOLE_INFO_ACTIONS_FETCHING_IMAGE_SUCCESS'\r\nexport const FETCHING_IMAGE_FAILURE = 'BOREHOLE_INFO_ACTIONS_FETCHING_IMAGE_FAILURE'\r\nexport const FETCHING_LEGEND_STARTED = 'BOREHOLE_INFO_ACTIONS_FETCHING_LEGEND_STARTED'\r\nexport const FETCHING_LEGEND_SUCCESS = 'BOREHOLE_INFO_ACTIONS_FETCHING_LEGEND_SUCCESS'\r\nexport const FETCHING_LEGEND_FAILURE = 'BOREHOLE_INFO_ACTIONS_FETCHING_LEGEND_FAILURE'\r\nexport const CLEAR_STATE = 'BOREHOLE_INFO_ACTIONS_CLEAR_STATE'\r\n\r\ninterface BoreholeInfoActions {\r\n fetchingBoreholeStarted: () => EmptyAction\r\n fetchingBoreholeFailure: (message: string) => MessageAction\r\n fetchingBoreholeSuccess: (borehole: NearestBoreholeObject | null) => DataAction<NearestBoreholeObject | null>\r\n fetchingAddressStarted: () => EmptyAction\r\n fetchingAddressFailure: (message: string) => MessageAction\r\n fetchingAddressSuccess: (address: AddressReverseResult) => DataAction<AddressReverseResult>\r\n fetchingImageStarted: () => EmptyAction\r\n fetchingImageFailure: (message: string) => MessageAction\r\n fetchingImageSuccess: (data: string) => DataAction<string>\r\n fetchingLegendStarted: () => EmptyAction\r\n fetchingLegendFailure: (message: string) => MessageAction\r\n fetchingLegendSuccess: (data: BoreholeLegendObject) => DataAction<BoreholeLegendObject>\r\n clearState: () => EmptyAction\r\n\r\n // Thunk actions.\r\n setCoordinate: (coords: number[]) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n setBoreholeId: (id: number) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const boreholeInfoActions: BoreholeInfoActions = {\r\n fetchingBoreholeStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_BOREHOLE_STARTED\r\n }\r\n },\r\n fetchingBoreholeFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_BOREHOLE_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingBoreholeSuccess: (borehole: NearestBoreholeObject | null): DataAction<NearestBoreholeObject | null> => {\r\n return {\r\n type: FETCHING_BOREHOLE_SUCCESS,\r\n data: borehole\r\n }\r\n },\r\n fetchingAddressStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_ADDRESS_STARTED\r\n }\r\n },\r\n fetchingAddressFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_ADDRESS_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingAddressSuccess: (address: AddressReverseResult): DataAction<AddressReverseResult> => {\r\n return {\r\n type: FETCHING_ADDRESS_SUCCESS,\r\n data: address\r\n }\r\n },\r\n fetchingImageStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_IMAGE_STARTED\r\n }\r\n },\r\n fetchingImageFailure: (message: string) => {\r\n return {\r\n type: FETCHING_IMAGE_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingImageSuccess: (data: string) => {\r\n return {\r\n type: FETCHING_IMAGE_SUCCESS,\r\n data: data\r\n }\r\n },\r\n fetchingLegendStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_LEGEND_STARTED\r\n }\r\n },\r\n fetchingLegendFailure: (message: string) => {\r\n return {\r\n type: FETCHING_LEGEND_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingLegendSuccess: (data: BoreholeLegendObject) => {\r\n return {\r\n type: FETCHING_LEGEND_SUCCESS,\r\n data: data\r\n }\r\n },\r\n clearState: () => {\r\n return {\r\n type: CLEAR_STATE\r\n }\r\n },\r\n setCoordinate: (coords: number[]): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Clear current state.\r\n dispatch(boreholeInfoActions.clearState())\r\n\r\n // Fetch the nearest borehole.\r\n const token = getState().authState.token\r\n dispatch(boreholeInfoActions.fetchingBoreholeStarted())\r\n const wsNearestBoreholes = new NearestBoreholes(token)\r\n wsNearestBoreholes.setCoordinate(coords)\r\n let boreholes: NearestBoreholeObject[] = []\r\n try {\r\n boreholes = await wsNearestBoreholes.fetchBoreHoles()\r\n dispatch(boreholeInfoActions.fetchingBoreholeSuccess(boreholes.length > 0 ? boreholes[0] : null))\r\n if (boreholes.length === 0) {\r\n return // Stop execution here - we cannot fetch anymore without a borehole.\r\n }\r\n } catch (err) {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(boreholeInfoActions.fetchingBoreholeFailure(errorMessage))\r\n return // Stop execution here - we cannot fetch anymore without the borehole.\r\n }\r\n\r\n // Get ready to fetch address info, borehole image, and legend.\r\n // --- Postal address ---\r\n const wsAddressReverse = new AddressReverse()\r\n wsAddressReverse.setCoords(coords)\r\n dispatch(boreholeInfoActions.fetchingAddressStarted())\r\n wsAddressReverse.fetchReverseAddress()\r\n .then((addressInfo: AddressReverseResult) => {\r\n dispatch(boreholeInfoActions.fetchingAddressSuccess(addressInfo))\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(boreholeInfoActions.fetchingAddressFailure(errorMessage))\r\n })\r\n\r\n // --- Borehole image ---\r\n const borehole: NearestBoreholeObject = boreholes[0]\r\n const wsBorehole = new Borehole(token)\r\n wsBorehole.setBoreholeNo(borehole.BoreholeNumber)\r\n dispatch(boreholeInfoActions.fetchingImageStarted())\r\n wsBorehole.fetchBorehole()\r\n .then(image => {\r\n dispatch(boreholeInfoActions.fetchingImageSuccess(image))\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(boreholeInfoActions.fetchingImageFailure(errorMessage))\r\n })\r\n\r\n // --- Borehole legend ---\r\n const wsBoreholeLegend = new BoreholeLegend(token)\r\n wsBoreholeLegend.setBoreholeNo(borehole.BoreholeNumber)\r\n dispatch(boreholeInfoActions.fetchingLegendStarted())\r\n wsBoreholeLegend.fetchBoreholeLegend()\r\n .then(legend => {\r\n dispatch(boreholeInfoActions.fetchingLegendSuccess(legend))\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(boreholeInfoActions.fetchingLegendFailure(errorMessage))\r\n })\r\n }\r\n },\r\n setBoreholeId: (id: number): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Clear current state.\r\n dispatch(boreholeInfoActions.clearState())\r\n\r\n dispatch(boreholeInfoActions.fetchingBoreholeStarted())\r\n dispatch(boreholeInfoActions.fetchingBoreholeSuccess({\r\n BoreholeId: id,\r\n BoreholeNumber: '-',\r\n X: 0,\r\n Y: 0,\r\n Espg: 0,\r\n DistanceToBorehole: 0,\r\n DatasourceId: 0\r\n }))\r\n\r\n // Fetch the nearest borehole.\r\n const token = getState().authState.token\r\n\r\n // --- Borehole image ---\r\n const wsBorehole = new Borehole(token)\r\n wsBorehole.setBoreholeId(id)\r\n dispatch(boreholeInfoActions.fetchingImageStarted())\r\n wsBorehole.fetchBorehole()\r\n .then(image => {\r\n dispatch(boreholeInfoActions.fetchingImageSuccess(image))\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(boreholeInfoActions.fetchingImageFailure(errorMessage))\r\n })\r\n\r\n // --- Borehole legend ---\r\n const wsBoreholeLegend = new BoreholeLegend(token)\r\n wsBoreholeLegend.setBoreholeId(id)\r\n dispatch(boreholeInfoActions.fetchingLegendStarted())\r\n wsBoreholeLegend.fetchBoreholeLegend()\r\n .then(legend => {\r\n dispatch(boreholeInfoActions.fetchingLegendSuccess(legend))\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(boreholeInfoActions.fetchingLegendFailure(errorMessage))\r\n })\r\n }\r\n }\r\n}\r\n","import { BaseAction, DataAction } from 'src/CustomTypes'\r\nimport { CURRENT_VIEW } from '../actions/InfoMenuActions'\r\n\r\nexport enum InfoView {\r\n Empty,\r\n BoreholeInfo,\r\n VirtualBoreholeInfo\r\n}\r\n\r\nexport interface InfoMenuState {\r\n currentView: InfoView\r\n}\r\n\r\nexport const infoMenuStateInitial: InfoMenuState = {\r\n currentView: InfoView.Empty\r\n}\r\n\r\nexport function infoMenuReducer (\r\n state: InfoMenuState = infoMenuStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): InfoMenuState {\r\n switch (action.type) {\r\n case CURRENT_VIEW: {\r\n const a = action as DataAction<InfoView>\r\n return {\r\n ...state,\r\n currentView: a.data\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","/**\r\nService for fetching an image of a virtual borehole.\r\n\r\nReturn an image of the virtual borehole in PNG format.\r\n*/\r\n\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * Web service for fetching an image for a virtual borehole.\r\n * The following parameters are required: 'X' & 'Y' ( @see setCoordinate ),\r\n * and 'maxDepth' ( @see setMaxDepth ).\r\n */\r\nexport class VirtualBorehole extends GeoWebServiceClient {\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/virtualboring' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n const defaultParams = {\r\n geoAreaId: '1',\r\n format: 'png',\r\n modelId: '1098',\r\n width: '334',\r\n showCopyright: 'true',\r\n showHeader: 'false'\r\n }\r\n super(VirtualBorehole.URL, token, defaultParams)\r\n }\r\n\r\n /**\r\n * [Required] Setter for the coordinate.\r\n * @param coordinate The map coordinate to use in the lookup operation.\r\n */\r\n setCoordinate (coordinate: number[]): void {\r\n if (coordinate.length !== 2) {\r\n throw new Error('Argument error: coordinate must have exactly two entries.')\r\n }\r\n this.addParam('X', coordinate[0].toString())\r\n this.addParam('Y', coordinate[1].toString())\r\n }\r\n\r\n /**\r\n * Setter for hydro model ids.\r\n * @param hydroModelIds Comma separated list of hydro model ids.\r\n */\r\n setHydroModelIds (hydroModelIds: string): void {\r\n this.addParam('hydromodelid', hydroModelIds)\r\n }\r\n\r\n /**\r\n * [Required] Setter for the maximum depth.\r\n * @param maxDepth The maximum depth of the virtual borehole.\r\n */\r\n setMaxDepth (maxDepth: number): void {\r\n this.addParam('maxDepth', maxDepth.toString())\r\n }\r\n\r\n /**\r\n * [Required] Setter for the model id.\r\n * @param modelId The model id.\r\n */\r\n setModelId (modelId: string): void {\r\n this.addParam('modelId', modelId.toString())\r\n }\r\n\r\n /**\r\n * Validates that required params are given.\r\n */\r\n private validateParams (): void {\r\n if (!(this.hasParam('X') && this.hasParam('Y') && this.hasParam('maxDepth'))) {\r\n throw new Error('Parameter mismatch: The search coordinate and maxDepth params must be set.')\r\n }\r\n }\r\n\r\n /**\r\n * Transforms an ArrayBuffer into a Base64 string.\r\n * @param buffer the bytearray to transform into a Base64 string\r\n * @returns a Base64 string\r\n */\r\n private arrayBufferToBase64 (buffer: ArrayBuffer): string {\r\n let binary = ''\r\n let bytes = [].slice.call(new Uint8Array(buffer))\r\n\r\n bytes.forEach((b) => {\r\n binary += String.fromCharCode(b)\r\n })\r\n\r\n return window.btoa(binary)\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the virtual borehole image.\r\n */\r\n async fetchVirtualBorehole (): Promise<string> {\r\n this.validateParams()\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n const buffer = await response.arrayBuffer()\r\n const base64Flag = 'data:image/jpeg;base64,'\r\n const imageStr = this.arrayBufferToBase64(buffer)\r\n\r\n return base64Flag + imageStr\r\n }\r\n}\r\n","import { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { AnyAction } from 'redux'\r\nimport { RootState } from 'src/Store'\r\nimport { AddressReverse, AddressReverseResult } from 'src/dataSources/dataforsyningen/AddressReverse'\r\nimport { EmptyAction, DataAction, MessageAction } from 'src/CustomTypes'\r\nimport { VirtualBorehole } from 'src/dataSources/geo/VirtualBorehole'\r\nimport { getSelectedHydroModelLayers } from 'src/utils/MapLayerUtils'\r\n\r\nexport const FETCHING_ADDRESS_STARTED = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_FETCHING_ADDRESS_STARTED'\r\nexport const FETCHING_ADDRESS_SUCCESS = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_FETCHING_ADDRESS_SUCCESS'\r\nexport const FETCHING_ADDRESS_FAILURE = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_FETCHING_ADDRESS_FAILURE'\r\nexport const FETCHING_IMAGE_STARTED = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_FETCHING_IMAGE_STARTED'\r\nexport const FETCHING_IMAGE_SUCCESS = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_FETCHING_IMAGE_SUCCESS'\r\nexport const FETCHING_IMAGE_FAILURE = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_FETCHING_IMAGE_FAILURE'\r\nexport const SET_MAX_DEPTH = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_SET_MAX_DEPTH'\r\nexport const SET_COORDINATES = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_SET_COORDINATES'\r\nexport const CLEAR_ADDRESS_STATE = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_CLEAR_ADDRESS_STATE'\r\nexport const CLEAR_IMAGE_STATE = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_CLEAR_IMAGE_STATE'\r\nexport const CLEAR_STATE = 'VIRTUAL_BOREHOLE_INFO_ACTIONS_CLEAR_STATE'\r\n\r\ninterface VirtualBoreholeInfoActions {\r\n fetchingAddressStarted: () => EmptyAction\r\n fetchingAddressFailure: (message: string) => MessageAction\r\n fetchingAddressSuccess: (address: AddressReverseResult) => DataAction<AddressReverseResult>\r\n fetchingImageStarted: () => EmptyAction\r\n fetchingImageFailure: (message: string) => MessageAction\r\n fetchingImageSuccess: (image: string) => DataAction<string>\r\n setMaxDepth: (maxDepth: number) => DataAction<number>\r\n clearAddressState: () => EmptyAction\r\n clearImageState: () => EmptyAction\r\n clearState: () => EmptyAction\r\n\r\n // Thunk actions.\r\n setCoordinates: (coords: number[]) => DataAction<number[]>\r\n updateVirtualBorehole: (coords: number[]) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const virtualBoreholeInfoActions: VirtualBoreholeInfoActions = {\r\n fetchingAddressStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_ADDRESS_STARTED\r\n }\r\n },\r\n fetchingAddressFailure: (message: string): MessageAction => {\r\n return {\r\n type: FETCHING_ADDRESS_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingAddressSuccess: (address: AddressReverseResult): DataAction<AddressReverseResult> => {\r\n return {\r\n type: FETCHING_ADDRESS_SUCCESS,\r\n data: address\r\n }\r\n },\r\n fetchingImageStarted: (): EmptyAction => {\r\n return {\r\n type: FETCHING_IMAGE_STARTED\r\n }\r\n },\r\n fetchingImageFailure: (message: string) => {\r\n return {\r\n type: FETCHING_IMAGE_FAILURE,\r\n message: message\r\n }\r\n },\r\n fetchingImageSuccess: (image: string) => {\r\n return {\r\n type: FETCHING_IMAGE_SUCCESS,\r\n data: image\r\n }\r\n },\r\n setMaxDepth: (maxDepth: number) => {\r\n return {\r\n type: SET_MAX_DEPTH,\r\n data: maxDepth\r\n }\r\n },\r\n setCoordinates: (coords: number[]) => {\r\n return {\r\n type: SET_COORDINATES,\r\n data: coords\r\n }\r\n },\r\n clearAddressState: () => {\r\n return {\r\n type: CLEAR_ADDRESS_STATE\r\n }\r\n },\r\n clearImageState: () => {\r\n return {\r\n type: CLEAR_IMAGE_STATE\r\n }\r\n },\r\n clearState: () => {\r\n return {\r\n type: CLEAR_STATE\r\n }\r\n },\r\n updateVirtualBorehole: (coords: number[]): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>, getState: () => RootState): Promise<void> => {\r\n // Get current coordinates\r\n const currentCoords = getState().virtualBoreholeInfoState.coordinates\r\n\r\n // Clear current image state.\r\n dispatch(virtualBoreholeInfoActions.clearImageState())\r\n\r\n // Set new coordinates\r\n dispatch(virtualBoreholeInfoActions.setCoordinates(coords))\r\n\r\n // --- Postal address ---\r\n if (currentCoords !== coords) {\r\n dispatch(virtualBoreholeInfoActions.clearAddressState())\r\n const wsAddressReverse = new AddressReverse()\r\n wsAddressReverse.setCoords(coords)\r\n dispatch(virtualBoreholeInfoActions.fetchingAddressStarted())\r\n wsAddressReverse.fetchReverseAddress()\r\n .then((addressInfo: AddressReverseResult) => {\r\n dispatch(virtualBoreholeInfoActions.fetchingAddressSuccess(addressInfo))\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(virtualBoreholeInfoActions.fetchingAddressFailure(errorMessage))\r\n })\r\n }\r\n\r\n // --- Virtual Borehole image ---\r\n const token = getState().authState.token\r\n const maxDepth = getState().virtualBoreholeInfoState.maxDepth\r\n const modelId = getState().generalState.selectedGeoModel?.ID\r\n const wsVirtualBorehole = new VirtualBorehole(token)\r\n wsVirtualBorehole.setCoordinate(coords)\r\n wsVirtualBorehole.setMaxDepth(maxDepth)\r\n wsVirtualBorehole.setModelId(modelId !== undefined ? modelId : '')\r\n wsVirtualBorehole.setHydroModelIds(getSelectedHydroModelLayers(getState().mapState))\r\n dispatch(virtualBoreholeInfoActions.fetchingImageStarted())\r\n wsVirtualBorehole.fetchVirtualBorehole()\r\n .then(image => {\r\n dispatch(virtualBoreholeInfoActions.fetchingImageSuccess(image))\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n const errorMessage: string = (err as Error).message\r\n dispatch(virtualBoreholeInfoActions.fetchingImageFailure(errorMessage))\r\n })\r\n }\r\n }\r\n}\r\n","import { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { AnyAction } from 'redux'\r\nimport { InfoView } from '../reducers/InfoMenuReducer'\r\nimport { boreholeInfoActions } from '../actions/BoreholeInfoActions'\r\nimport { RootState } from 'src/Store'\r\nimport { virtualBoreholeInfoActions } from './VirtualBoreholeInfoActions'\r\nimport { DataAction } from 'src/CustomTypes'\r\n\r\nexport const CURRENT_VIEW = 'INFO_MENU_ACTIONS_CURRENT_VIEW'\r\n\r\ninterface InfoMenuActions {\r\n currentView: (viewType: InfoView) => DataAction<InfoView>\r\n boreholeInfo: (coords: number[]) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n virtualBoreholeInfo: (coords: number[]) => ThunkAction<Promise<void>, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const infoMenuActions: InfoMenuActions = {\r\n currentView: (viewType: InfoView): DataAction<InfoView> => {\r\n return {\r\n type: CURRENT_VIEW,\r\n data: viewType\r\n }\r\n },\r\n // Thunk actions\r\n boreholeInfo: (coords: number[]): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>): Promise<void> => {\r\n dispatch(infoMenuActions.currentView(InfoView.BoreholeInfo))\r\n await dispatch(boreholeInfoActions.setCoordinate(coords))\r\n }\r\n },\r\n // Thunk actions\r\n virtualBoreholeInfo: (coords: number[]): ThunkAction<Promise<void>, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<RootState, {}, AnyAction>): Promise<void> => {\r\n dispatch(infoMenuActions.currentView(InfoView.VirtualBoreholeInfo))\r\n await dispatch(virtualBoreholeInfoActions.updateVirtualBorehole(coords))\r\n }\r\n }\r\n}\r\n","import { FC, useEffect, useRef, useState } from 'react'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport { CircularProgress } from '@material-ui/core'\r\nimport { Error } from '@material-ui/icons'\r\n\r\nimport { ProfileObject } from 'src/dataSources/geo/CrossSection'\r\nimport { RootState } from 'src/Store'\r\nimport { profileActions } from 'src/actions/ProfileActions'\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport { CallResult } from 'src/CustomTypes'\r\n\r\nimport LayerLegend from '../layerpicker/layerlegend/LayerLegend'\r\n\r\nimport { profileInfoStyle, ProfileInfoStyleProps } from './ProfileInfo.style'\r\nimport { appStyle } from 'src/App.style'\r\nimport { rgbToHex } from 'src/utils/Utils'\r\nimport { boreholeInfoActions } from 'src/actions/BoreholeInfoActions'\r\nimport { infoMenuActions } from 'src/actions/InfoMenuActions'\r\nimport { InfoView } from 'src/reducers/InfoMenuReducer'\r\nimport { ProfileSetting } from 'src/reducers/ProfileReducer'\r\nimport { numberToDecimalString } from '../../utils/Utils'\r\nimport { LayerParams } from 'src/dataSources/layers/LayerRegistry'\r\n\r\n/**\r\n * ProfileInfoProps contains properties for the component.\r\n */\r\nexport interface ProfileInfoProps {\r\n selectedProfile: ProfileObject | undefined\r\n}\r\n\r\n/**\r\n * ProfileInfo figure and legend for the current profile.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const ProfileInfo: FC<ProfileInfoProps> = (props: ProfileInfoProps) => {\r\n const appClasses = appStyle()\r\n const dispatch = useDispatch()\r\n\r\n const [minX, setMinX] = useState(0)\r\n const [maxX, setMaxX] = useState(0)\r\n const [minY, setMinY] = useState(0)\r\n const [maxY, setMaxY] = useState(0)\r\n\r\n const [crossX, setCrossX] = useState(0)\r\n const [crossY, setCrossY] = useState(0)\r\n const [showCrosshair, setShowCrosshair] = useState(false)\r\n const [pixelScaleX, setPixelScaleX] = useState(0)\r\n const [pixelScaleY, setPixelScaleY] = useState(0)\r\n\r\n const [valueX, setValueX] = useState(0)\r\n const [valueY, setValueY] = useState(0)\r\n\r\n const crosshairContainerRef = useRef<HTMLDivElement>(null)\r\n const crosshairValueXCardRef = useRef<HTMLDivElement>(null)\r\n const crosshairValueYCardRef = useRef<HTMLDivElement>(null)\r\n\r\n const bottomBarWidth = useSelector((state: RootState): number => state.generalState.bottomBarWidth)\r\n const bottomBarHeight = useSelector((state: RootState): number => state.generalState.bottomBarHeight)\r\n const layerParams = useSelector((state: RootState): LayerParams[] => state.mapState.layerParams)\r\n const maxDepth = useSelector((state: RootState): number => state.profileState.maxDepth)\r\n const enabledProfileSettings = useSelector((state: RootState): ProfileSetting[] => state.profileState.enabledSettings)\r\n const selectedModel = useSelector((state: RootState): GeoModel | undefined => state.generalState.selectedGeoModel)\r\n const fetchProfileStatus = useSelector((state: RootState): CallResult => state.profileState.fetchProfileStatus)\r\n const fetched = fetchProfileStatus === CallResult.Succeeded\r\n const error = fetchProfileStatus === CallResult.Failed\r\n const running = fetchProfileStatus === CallResult.Running\r\n\r\n const piProps: ProfileInfoStyleProps = {\r\n bottomBarHeight: bottomBarHeight\r\n }\r\n const classes = profileInfoStyle(piProps)\r\n\r\n /**\r\n * Is a given profile setting enabled?\r\n * @param setting Layer to check.\r\n * @returns true if layer is selected, false otherwise.\r\n */\r\n const isProfileSettingEnabled = (setting: ProfileSetting): boolean => {\r\n return enabledProfileSettings.some(enabledSetting => enabledSetting === setting)\r\n }\r\n\r\n const onMouseOver = (e: React.MouseEvent<HTMLElement>): void => {\r\n const rect = e.currentTarget.getBoundingClientRect()\r\n const x = e.clientX - rect.left - minX\r\n const y = e.clientY - rect.top\r\n\r\n if (crosshairContainerRef.current?.clientHeight !== undefined) {\r\n const graphHeight = crosshairContainerRef.current?.clientHeight\r\n\r\n if (\r\n x >= minX &&\r\n x <= maxX &&\r\n y >= minY &&\r\n y <= maxY) {\r\n setShowCrosshair(true)\r\n\r\n const graphX = x - minX\r\n const graphY = y - minY\r\n setCrossX(graphX)\r\n setCrossY(graphY)\r\n\r\n setValueX((graphX + 2) * pixelScaleX)\r\n setValueY(maxDepth + ((graphHeight - y + minY) * pixelScaleY))\r\n } else {\r\n setShowCrosshair(false)\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n dispatch(profileActions.setCrosshairDistance(showCrosshair ? valueX : undefined))\r\n // eslint-disable-next-line\r\n }, [valueX, showCrosshair])\r\n\r\n useEffect(() => {\r\n applyProfileViewSettings()\r\n // eslint-disable-next-line\r\n }, [enabledProfileSettings])\r\n\r\n useEffect(() => {\r\n extractGraphBoundsFromSVG()\r\n extractPixelScalesFromSVG()\r\n\r\n const boringer = document.getElementsByClassName('boring-container')\r\n for (let i = 0; i < boringer.length; i++) {\r\n const boring = boringer[i]\r\n boringer[i].addEventListener('click', () => {\r\n const id = boring.getAttribute('data-id')\r\n if (id !== null) {\r\n dispatch(infoMenuActions.currentView(InfoView.BoreholeInfo))\r\n dispatch(boreholeInfoActions.setBoreholeId(+id))\r\n }\r\n })\r\n }\r\n\r\n // Tests extracting the color of a soil layer in the svg\r\n const test = document.getElementsByClassName('geounit-1078')\r\n if (test.length > 0) {\r\n const rgbComponents = getComputedStyle(test[0]).fill.replace('rgb(', '').replace(')', '').split(',')\r\n console.log(rgbToHex(+rgbComponents[0], +rgbComponents[1], +rgbComponents[2]))\r\n }\r\n\r\n // Apply view settings\r\n applyProfileViewSettings()\r\n\r\n // eslint-disable-next-line\r\n }, [fetchProfileStatus])\r\n\r\n /**\r\n * Apply the view settings for the profile tool.\r\n */\r\n const applyProfileViewSettings = (): void => {\r\n // Hide boring labels\r\n const labels = Array.from(document.querySelectorAll<HTMLElement>('[class*=geodatasource]'))\r\n for (const label of labels) {\r\n label.style.display = isProfileSettingEnabled(ProfileSetting.SHOW_BOREHOLE_LABEL) ? 'block' : 'none'\r\n }\r\n\r\n // Hide geology labels\r\n const geologyLabels = Array.from(document.getElementsByClassName('sample-text') as HTMLCollectionOf<HTMLElement>)\r\n for (const label of geologyLabels) {\r\n label.style.display = isProfileSettingEnabled(ProfileSetting.SHOW_GEOLOGY_LABEL) ? 'block' : 'none'\r\n }\r\n\r\n // Hide filter levels\r\n const filterLevels = Array.from(document.getElementsByClassName('screen') as HTMLCollectionOf<HTMLElement>)\r\n for (const level of filterLevels) {\r\n level.style.display = isProfileSettingEnabled(ProfileSetting.SHOW_FILTER_LEVEL) ? 'block' : 'none'\r\n }\r\n\r\n // Hide water levels\r\n const waterLevels = Array.from(document.getElementsByClassName('screen-text') as HTMLCollectionOf<HTMLElement>)\r\n for (const level of waterLevels) {\r\n level.style.display = isProfileSettingEnabled(ProfileSetting.SHOW_WATER_LEVEL) ? 'block' : 'none'\r\n }\r\n\r\n // Hide water level symbols\r\n const waterLevelSymbols = Array.from(document.getElementsByClassName('screen-mark') as HTMLCollectionOf<HTMLElement>)\r\n for (const symbol of waterLevelSymbols) {\r\n symbol.style.display = isProfileSettingEnabled(ProfileSetting.SHOW_WATER_LEVEL_SYMBOL) ? 'block' : 'none'\r\n }\r\n\r\n // Hide Geo logo\r\n const logo = document.getElementById('logo')\r\n if (logo !== null) {\r\n logo.style.display = isProfileSettingEnabled(ProfileSetting.SHOW_GEO_LOGO) ? 'block' : 'none'\r\n }\r\n }\r\n\r\n /**\r\n * Finds the bounding box for the part of the svg containg the actual graph and saves it to local state.\r\n * Excluding everything outside the axis lines (eg. tics)\r\n */\r\n const extractGraphBoundsFromSVG = (): void => {\r\n const svg = document.getElementById('svg1')\r\n if (svg !== null) {\r\n const axis = svg.querySelectorAll(':scope > .axis')\r\n const fistVirticalAxis = axis.item(0)\r\n if (fistVirticalAxis !== null) {\r\n const x1 = fistVirticalAxis.getAttribute('x1')\r\n const y1 = fistVirticalAxis.getAttribute('y1')\r\n const y2 = fistVirticalAxis.getAttribute('y2')\r\n setMinX(x1 !== null ? parseInt(x1) : 0)\r\n setMinY(y2 !== null ? parseInt(y2) : 0)\r\n setMaxY(y1 !== null ? parseInt(y1) : 0)\r\n }\r\n const lastVirticalAxis = axis.item(1)\r\n if (lastVirticalAxis !== null) {\r\n const x2 = lastVirticalAxis.getAttribute('x2')\r\n setMaxX(x2 !== null ? parseInt(x2) : 0)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Finds for each axis the scale factor between a pixel and 1 unit on the axis.\r\n * Saves the scale factor to local state.\r\n */\r\n const extractPixelScalesFromSVG = (): void => {\r\n const gridValuesX: Map<number, number> = new Map()\r\n const gridValuesY: Map<number, number> = new Map()\r\n const axisGrid = document.getElementById('id-axis-grid')\r\n const axisTexts = axisGrid?.getElementsByClassName('axis-text')\r\n if (axisTexts !== undefined) {\r\n for (let i = 0; i < axisTexts.length; i++) {\r\n const anchor = axisTexts[i].getAttribute('text-anchor')\r\n const gridValue: number = +axisTexts[i].innerHTML\r\n const anchorPosition = anchor === 'middle' ? axisTexts[i].getAttribute('x') : axisTexts[i].getAttribute('y')\r\n if (anchorPosition !== null) {\r\n anchor === 'middle' ? gridValuesX.set(gridValue, +anchorPosition) : gridValuesY.set(gridValue, +anchorPosition)\r\n }\r\n }\r\n if (gridValuesX.size > 1) {\r\n setPixelScaleX(calculatePixelScale(gridValuesX))\r\n }\r\n if (gridValuesY.size > 1) {\r\n setPixelScaleY(calculatePixelScale(gridValuesY))\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Calculates and returns the pixel scale describing the number of pixels between two values on the axis.\r\n * @param map containing pairs of axis value (key) and the values pixel position in the svg (value)\r\n * @returns the pixel scale describing the number of pixels between two values on the axis.\r\n */\r\n const calculatePixelScale = (map: Map<number, number>): number => {\r\n const keys: number[] = []\r\n const values: number[] = []\r\n map.forEach((v, k) => {\r\n keys.push(k)\r\n values.push(v)\r\n })\r\n const sortedKeys: number[] = keys.sort((k1, k2) => k2 - k1)\r\n const sortedValues: number[] = values.sort((v1, v2) => v2 - v1)\r\n const absGridValueDiff = Math.abs(sortedKeys[0] - sortedKeys[1])\r\n const absGridPixelDiff = Math.abs(sortedValues[0] - sortedValues[1])\r\n\r\n return absGridValueDiff / absGridPixelDiff\r\n }\r\n\r\n const [updatingProfile, setUpdatingProfile] = useState<number | undefined>(undefined)\r\n const startUpdateProfileInterval = (): void => {\r\n if (updatingProfile !== undefined) {\r\n clearTimeout(updatingProfile)\r\n setUpdatingProfile(undefined)\r\n }\r\n const timeout = window.setTimeout(() => {\r\n dispatch(profileActions.fetchProfile())\r\n setUpdatingProfile(undefined)\r\n }, 500)\r\n setUpdatingProfile(timeout)\r\n }\r\n useEffect(() => {\r\n dispatch(profileActions.fetchingProfileStarted())\r\n startUpdateProfileInterval()\r\n // eslint-disable-next-line\r\n }, [bottomBarWidth, bottomBarHeight, selectedModel, layerParams])\r\n\r\n // Remove svg background color as it will apply to all svg elements on page\r\n let svg = ''\r\n if (props.selectedProfile?.Svg !== undefined) {\r\n svg = props.selectedProfile.Svg.replace('background-color: white;', '')\r\n }\r\n return (\r\n <div>\r\n {running && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {error && (\r\n <div className={appClasses.errorMessage}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='common.loading.error' />\r\n </div>\r\n )}\r\n {fetched && (\r\n <div className={classes.root}>\r\n {props.selectedProfile?.Svg !== undefined && (\r\n <div>\r\n <div\r\n onMouseMove={onMouseOver}\r\n className={classes.profileWrapper}\r\n >\r\n <div className={classes.figure} dangerouslySetInnerHTML={{ __html: svg }} />\r\n <div\r\n className={classes.crosshairContainer}\r\n ref={crosshairContainerRef}\r\n style={{ width: maxX - minX, height: maxY - minY, marginTop: minY, marginLeft: minX * 2 }}\r\n >\r\n <div\r\n className={classes.crosshairHorizontal}\r\n style={{ opacity: showCrosshair ? 1 : 0, top: crossY }}\r\n />\r\n <div\r\n className={classes.crosshairVertical}\r\n style={{ opacity: showCrosshair ? 1 : 0, left: crossX, top: 2 }}\r\n />\r\n <div\r\n ref={crosshairValueXCardRef}\r\n className={classes.crosshairValueXCard}\r\n style={{\r\n opacity: showCrosshair ? 1 : 0,\r\n left: `${crossX - (crosshairValueXCardRef.current?.clientWidth === undefined ? 0 : crosshairValueXCardRef.current?.clientWidth / 2)}px`\r\n }}\r\n >\r\n <div className={classes.triangleTop} />\r\n <div className={classes.crosshairValueX}>\r\n <p className={classes.crosshairValue}>{numberToDecimalString(valueX, 0)}</p>\r\n </div>\r\n </div>\r\n <div\r\n ref={crosshairValueYCardRef}\r\n className={classes.crosshairValueYCard}\r\n style={{\r\n opacity: showCrosshair ? 1 : 0,\r\n top: `${crossY - (crosshairValueYCardRef.current?.clientHeight === undefined ? 0 : crosshairValueYCardRef.current?.clientHeight / 2)}px`\r\n }}\r\n >\r\n <div className={classes.crosshairValueY}>\r\n <p className={classes.crosshairValue}>{numberToDecimalString(valueY, 1)}</p>\r\n </div>\r\n <div className={classes.triangleRight} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n <div className={classes.legend}>\r\n <LayerLegend numberOfColumns={1} layerPickerStyle={false} />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const bottomBarStyle = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '170px',\r\n background: theme.palette.common.white,\r\n borderTop: 2,\r\n borderTopColor: theme.palette.primary.main,\r\n borderTopStyle: 'solid'\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n color: theme.palette.geoColors.headerText.main,\r\n right: 0,\r\n top: 0,\r\n zIndex: 1000\r\n },\r\n closeButtonIcon: {\r\n color: theme.palette.geoColors.topBar.dark\r\n }\r\n}))\r\n","import { DataTheme } from 'src/Enums'\r\n\r\nexport enum Graph {\r\n CO2Levels = 'CO2Levels'\r\n}\r\n\r\nexport enum GraphGroup {\r\n CO2Levels = 'CO2Levels'\r\n}\r\n\r\nexport interface GraphDescription {\r\n name: string\r\n description: string\r\n type: Graph\r\n}\r\n\r\nexport interface GraphGroupDescription {\r\n name: string\r\n description: string\r\n type: GraphGroup\r\n graphs: Graph[]\r\n themes: DataTheme[]\r\n}\r\n\r\n/**\r\n * Gets the available GraphGroups for a given DataTheme\r\n * @param dataTheme The DataTheme for which to get the available GraphGroups\r\n * @returns A list of available GraphGroups\r\n */\r\nexport const getGraphsGroupsByDataTheme = (dataTheme: DataTheme): GraphGroup[] => {\r\n if (dataTheme === DataTheme.NONE) {\r\n return Object.values(GraphGroup)\r\n }\r\n return Object.values(GraphGroup).filter(graphGroup => getGraphGroupDescriptionForType(graphGroup).themes.includes(dataTheme))\r\n}\r\n\r\n/**\r\n * Gets the GraphGroup's for a given DataTheme\r\n * @param dataTheme The DataTheme for which to get the GraphGroup's\r\n * @returns A list of GraphGroup's\r\n */\r\nexport const getGraphGroups = (dataTheme: DataTheme): GraphGroup[] => {\r\n const groups = getGraphsGroupsByDataTheme(dataTheme)\r\n return groups\r\n .map(group => getGraphGroupDescriptionForType(group).type)\r\n .filter((value, index, self) => self.indexOf(value) === index) // remove duplicates\r\n}\r\n\r\n/**\r\n * Gets the description of a GraphGroup\r\n * @param type the GraphGroup to be descriped\r\n * @returns A GraphGroupDescription\r\n */\r\nexport const getGraphGroupDescriptionForType = (graphGroup: GraphGroup): GraphGroupDescription => {\r\n switch (graphGroup) {\r\n case GraphGroup.CO2Levels:\r\n return {\r\n name: 'layerpicker.co2levelsorg.title',\r\n description: 'layerpicker.co2levelsorg.description',\r\n type: GraphGroup.CO2Levels,\r\n graphs: [Graph.CO2Levels],\r\n themes: Object.values(DataTheme)\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Gets the description of a Graph\r\n * @param type the Graph to be descriped\r\n * @returns A GraphDescription\r\n */\r\nexport const getGraphDescriptionForType = (graph: Graph): GraphDescription => {\r\n switch (graph) {\r\n case Graph.CO2Levels:\r\n return {\r\n name: 'layerpicker.graphs.button',\r\n description: '',\r\n type: Graph.CO2Levels\r\n }\r\n }\r\n}\r\n","import { FC, RefObject, useEffect, useRef, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { Transition, TransitionStatus } from 'react-transition-group'\r\n\r\nimport Close from '@material-ui/icons/Close'\r\nimport { IconButton } from '@material-ui/core'\r\n\r\nimport { RootState } from 'src/Store'\r\nimport { profileActions } from 'src/actions/ProfileActions'\r\nimport { ProfileView } from 'src/reducers/ProfileReducer'\r\nimport { ProfileObject } from 'src/dataSources/geo/CrossSection'\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\n\r\nimport { CO2LevelsOrg } from '../co2levelsorg/CO2LevelsOrg'\r\nimport { ProfileInfo } from '../profileinfo/ProfileInfo'\r\n\r\nimport { bottomBarStyle } from './BottomBar.style'\r\nimport { Graph } from 'src/dataSources/graphs/GraphRegistry'\r\nimport { Rnd } from 'react-rnd'\r\nimport { sidebarAnimationDuration } from 'src/Constants'\r\n\r\nexport interface BottomBarProps {\r\n open: boolean\r\n}\r\n\r\nconst defaultProps: BottomBarProps = {\r\n open: false\r\n}\r\n\r\n/**\r\n * Hook to get div dimensions when resized.\r\n * @param ref Reference to div element.\r\n * @returns Div dimensions.\r\n */\r\nconst useContainerDimensions = (ref: RefObject<HTMLDivElement>): {} => {\r\n const dispatch = useDispatch()\r\n\r\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\r\n\r\n const getDimensions = (): { width: number, height: number } | undefined => {\r\n if (ref === undefined || ref.current === undefined) {\r\n return undefined\r\n }\r\n const width = ref.current?.offsetWidth\r\n const height = ref.current?.offsetHeight\r\n return {\r\n width: width !== undefined ? width : 0,\r\n height: height !== undefined ? height : 0\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n const handleResize = (): void => {\r\n const dimensions = getDimensions()\r\n if (dimensions !== undefined && dimensions.width !== 0 && dimensions.height !== 0) {\r\n setDimensions(dimensions)\r\n dispatch(generalActions.setBottomBarWidth(dimensions.width))\r\n dispatch(generalActions.setBottomBarHeight(dimensions.height))\r\n }\r\n }\r\n\r\n if (ref.current != null) {\r\n handleResize()\r\n }\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n // eslint-disable-next-line\r\n }, [ref])\r\n return dimensions\r\n}\r\n\r\n/**\r\n * BottomBar React component.\r\n * @param {object} props React properties object.\r\n * The following properties are implemented:\r\n * open {boolean}: If true the component will be open initially.\r\n * @returns React view component.\r\n */\r\nexport const BottomBar: FC<BottomBarProps> = (props: BottomBarProps) => {\r\n const dispatch = useDispatch()\r\n const classes = bottomBarStyle()\r\n const currentView = useSelector((state: RootState): ProfileView => state.profileState.currentView)\r\n const selectedGraph = useSelector((state: RootState): Graph | undefined => state.generalState.selectedGraph)\r\n const selectedProfile = useSelector((state: RootState): ProfileObject | undefined => state.profileState.selectedProfile)\r\n const bottomBarHeight = useSelector((state: RootState): number => state.generalState.bottomBarHeight)\r\n const dragging = useSelector((state: RootState): Boolean => state.generalState.bottomBarDragging)\r\n\r\n // Styles for sidebar in different transitions\r\n const bottomBarTransitionStyle = {\r\n transition: `height ${dragging === true ? 0 : sidebarAnimationDuration} ms`\r\n }\r\n const bottomBarTransitionStyles = {\r\n entering: { height: 0 },\r\n entered: { height: `${bottomBarHeight}px` },\r\n exiting: { height: `${bottomBarHeight}px` },\r\n exited: { height: 0 },\r\n unmounted: { height: 0 }\r\n }\r\n\r\n // Handle reload on resize\r\n const ref = useRef<HTMLDivElement>(null)\r\n useContainerDimensions(ref)\r\n\r\n /**\r\n * Set to empty view when close button is clicked.\r\n */\r\n const closeBarClicked = (): void => {\r\n dispatch(profileActions.clearState())\r\n dispatch(generalActions.setSelectedGraph(undefined))\r\n }\r\n return (\r\n <>\r\n <Transition in={currentView !== ProfileView.Empty || selectedGraph !== undefined} timeout={0}>\r\n {(state: TransitionStatus) => (\r\n <>\r\n {(currentView !== ProfileView.Empty || selectedGraph !== undefined) && (\r\n <div\r\n style={{ ...bottomBarTransitionStyle, ...bottomBarTransitionStyles[state] }}\r\n className={classes.root} ref={ref}\r\n >\r\n <div className={classes.closeButton}>\r\n <IconButton size='medium' className={classes.closeButtonIcon} onClick={closeBarClicked}>\r\n <Close />\r\n </IconButton>\r\n </div>\r\n <Rnd\r\n disableDragging\r\n enableResizing={{ top: true }}\r\n position={{ x: 0, y: 0 }}\r\n size={{ width: '100%', height: bottomBarHeight }}\r\n minHeight={200}\r\n maxHeight={700}\r\n onResizeStart={() => {\r\n dispatch(generalActions.setBottomBarDragging(true))\r\n }}\r\n onResize={(e, direction, ref, delta, position) => {\r\n dispatch(generalActions.setBottomBarHeight(parseInt(ref.style.height)))\r\n }}\r\n onResizeStop={(e, direction, ref, delta, position) => {\r\n dispatch(generalActions.setBottomBarHeight(parseInt(ref.style.height)))\r\n dispatch(generalActions.setBottomBarDragging(false))\r\n }}\r\n >\r\n <div>\r\n {dragging === false && (\r\n <>\r\n {currentView !== ProfileView.Empty && (\r\n <ProfileInfo selectedProfile={selectedProfile} />\r\n )}\r\n {selectedGraph === Graph.CO2Levels && (\r\n <CO2LevelsOrg />\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </Rnd>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </Transition>\r\n </>\r\n )\r\n}\r\n\r\nBottomBar.defaultProps = defaultProps\r\n\r\nexport default BottomBar\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { headerHeight, leftSidebarWidth, leftSidebarToolsWidth } from '../../Constants'\r\n\r\nexport const leftSideBarStyle = makeStyles((theme) => ({\r\n root: {\r\n width: leftSidebarWidth,\r\n height: `calc(100vh - ${headerHeight}px)`,\r\n background: theme.palette.common.white\r\n },\r\n tools: {\r\n position: 'absolute',\r\n height: `calc(100vh - ${headerHeight}px)`,\r\n zIndex: 100,\r\n right: -leftSidebarToolsWidth,\r\n top: 0,\r\n width: leftSidebarToolsWidth,\r\n background: theme.palette.geoColors.toolBar.dark\r\n },\r\n tool: {\r\n width: leftSidebarToolsWidth,\r\n color: theme.palette.common.white,\r\n fontSize: '1.3rem'\r\n },\r\n toolDisabled: {\r\n width: leftSidebarToolsWidth,\r\n fontSize: '1.3rem',\r\n color: theme.palette.geoColors.contextBar.dark\r\n },\r\n toolSelected: {\r\n width: leftSidebarToolsWidth,\r\n fontSize: '1.3rem',\r\n color: theme.palette.primary.main,\r\n stroke: theme.palette.geoColors.toolBar.light,\r\n strokeWidth: 25\r\n },\r\n toolSelectedMaterial: {\r\n width: leftSidebarToolsWidth,\r\n fontSize: '1.3rem',\r\n color: theme.palette.primary.main,\r\n stroke: theme.palette.geoColors.toolBar.light,\r\n strokeWidth: 0.7\r\n },\r\n virtualBoreholeIcon: {\r\n fontSize: '2rem'\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { leftSidebarSettingsWidth } from 'src/Constants'\r\n\r\nconst sliderSubLabelText = {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n fontSize: '0.8rem'\r\n}\r\n\r\nexport const layerParametersStyle = makeStyles((theme) => ({\r\n root: {\r\n width: leftSidebarSettingsWidth,\r\n height: '100%',\r\n backgroundColor: theme.palette.secondary.main,\r\n padding: theme.spacing(2),\r\n borderTop: 1,\r\n borderTopStyle: 'solid',\r\n borderTopColor: theme.palette.primary.main,\r\n borderBottom: 1,\r\n borderBottomStyle: 'solid',\r\n borderBottomColor: theme.palette.primary.main\r\n },\r\n discreteSlider: {\r\n display: 'flex',\r\n fontSize: '0.8rem'\r\n },\r\n slider: {\r\n color: theme.palette.primary.main\r\n },\r\n marksSlider: {\r\n color: theme.palette.primary.main,\r\n '& .MuiSlider-mark': {\r\n display: 'none'\r\n }\r\n },\r\n stepValueText: {\r\n display: 'flex',\r\n justifyContent: 'center'\r\n },\r\n sliderValueText: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n fontSize: '1.0rem'\r\n },\r\n sliderSubLabelText: {\r\n ...sliderSubLabelText,\r\n userSelect: 'none'\r\n },\r\n sliderSubLabelTextWithWikiDocument: {\r\n ...sliderSubLabelText,\r\n cursor: 'pointer'\r\n },\r\n valueStepDownButton: {\r\n display: 'flex',\r\n justifyContent: 'flex-end'\r\n },\r\n discreteRadio: {\r\n display: 'flex',\r\n marginBottom: 10,\r\n fontSize: '0.8rem'\r\n },\r\n radioGroup: {\r\n width: '100%'\r\n },\r\n radioLabel: {\r\n width: '100%',\r\n height: 35,\r\n marginLeft: 0,\r\n '& .MuiTypography-root': {\r\n fontSize: '0.9rem'\r\n }\r\n },\r\n discreteSwitch: {\r\n display: 'flex',\r\n marginBottom: 10,\r\n fontSize: '0.8rem'\r\n },\r\n switchLabel: {\r\n width: '100%',\r\n height: 35,\r\n marginLeft: 0,\r\n '& .MuiTypography-root': {\r\n fontSize: '0.8rem'\r\n }\r\n },\r\n input: {\r\n width: 50,\r\n height: 30,\r\n textAlign: 'center',\r\n borderRadius: theme.spacing(1),\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.geoColors.toolBar.light,\r\n '& input::-webkit-clear-button, & input::-webkit-outer-spin-button, & input::-webkit-inner-spin-button': {\r\n display: 'none'\r\n }\r\n },\r\n inputWrapper: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'center'\r\n },\r\n valueWrapper: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'center'\r\n },\r\n error: {\r\n backgroundColor: theme.palette.geoColors.error.main\r\n },\r\n normal: {\r\n backgroundColor: theme.palette.common.white\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n color: theme.palette.geoColors.headerText.main,\r\n right: 4,\r\n top: -5,\r\n zIndex: 1000\r\n },\r\n closeButtonIcon: {\r\n color: theme.palette.primary.main,\r\n fontSize: '1.2rem'\r\n },\r\n arrowButtonIcon: {\r\n color: theme.palette.primary.main,\r\n fontSize: '1.2rem'\r\n },\r\n message: {\r\n fontSize: '0.7rem',\r\n fontStyle: 'italic',\r\n paddingLeft: theme.spacing(1)\r\n }\r\n}))\r\n","import { FC, useEffect, useState } from 'react'\r\nimport { FormattedMessage, useIntl } from 'react-intl'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState } from 'src/Store'\r\nimport { mapActions } from 'src/actions/MapActions'\r\nimport { layerParametersStyle } from './LayerParameters.style'\r\nimport { RadioSubLayers, SubLayerDescriptor, SubLayers, SwitchSubLayer, SwitchSubLayers } from 'src/dataSources/layers/Layer'\r\nimport { Close, ArrowBackIos, ArrowForwardIos } from '@material-ui/icons'\r\nimport { Slider, Typography, Grid, Input, IconButton, RadioGroup, FormControlLabel, Radio, Switch, Mark, List, ListItemText } from '@material-ui/core'\r\nimport { LayerParams, LayerParamsObject, LayerType } from 'src/dataSources/layers/LayerRegistry'\r\nimport { getLayerParamsFromType } from 'src/reducers/MapReducer'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { HydroModelObject } from 'src/dataSources/geo/HydroModel'\r\nimport { Extent } from 'openlayers'\r\nimport { isHydroModelIntersectingMapExtent } from 'src/utils/MapLayerUtils'\r\nimport { WikiDocumentMeta } from 'src/dataSources/wiki/Wiki'\r\n\r\nexport interface LayerParametersProps {\r\n layerType?: LayerType\r\n opacitySliderMode: boolean\r\n closeHandler: () => void\r\n}\r\n\r\nconst defaultProps: LayerParametersProps = {\r\n layerType: undefined,\r\n opacitySliderMode: false,\r\n closeHandler: (): void => { }\r\n}\r\n\r\n/**\r\n * LayerParameters React component.\r\n * The following properties are implemented:\r\n * layerType {LayerType}: Layer to show parameters for.\r\n * @param props React properties object.\r\n * @returns React view component.\r\n */\r\nexport const LayerParameters: FC<LayerParametersProps> = (props: LayerParametersProps) => {\r\n const classes = layerParametersStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n const layerParams = useSelector((state: RootState): LayerParams[] => state.mapState.layerParams)\r\n const mapExtent = useSelector((state: RootState): Extent => state.mapState.mapExtent)\r\n\r\n // Local state to store values from params\r\n const [opacityEnabled, setOpacityEnabled] = useState<boolean>(false)\r\n const [opacity, setOpacity] = useState<number>(0.5)\r\n const [depthEnabled, setDepthEnabled] = useState<boolean>(false)\r\n const [depth, setDepth] = useState<number>(0)\r\n const [levelEnabled, setLevelEnabled] = useState<boolean>(false)\r\n const [level, setLevel] = useState<number>(0)\r\n const [radioSublayersEnabled, setRadioSublayersEnabled] = useState<boolean>(false)\r\n const [radioSublayers, setRadioSublayers] = useState<RadioSubLayers>({ labelId: '', selected: { labelId: '', subLayer: '' }, sublayers: [] })\r\n const [switchSublayersEnabled, setSwitchSublayersEnabled] = useState<boolean>(false)\r\n const [switchSublayers, setSwitchSublayers] = useState<SwitchSubLayers>({ labelId: '', sublayers: [] })\r\n const [subLayersEnabled, setSubLayersEnabled] = useState<boolean>(false)\r\n const [subLayers, setSubLayers] = useState<SubLayers>({ labelId: '', key: '', list: [], subLayerDescriptors: [], minimum: 0, maximum: 0, step: 0, selected: { value: 0, subLayer: '' } })\r\n const wikiDocumentsMeta = useSelector((state: RootState): WikiDocumentMeta[] => state.wikiState.documentsMeta)\r\n\r\n const [subLayerDescriptors, setSubLayerDescriptors] = useState<SubLayerDescriptor[]>([] as SubLayerDescriptor[])\r\n\r\n const hydroModels: HydroModelObject[] = useSelector((state: RootState): HydroModelObject[] => state.hydroModelState.hydroModels)\r\n\r\n // Determine which params are available\r\n useEffect(() => {\r\n if (props.layerType === undefined) {\r\n return\r\n }\r\n const params: LayerParamsObject | undefined = getParameters()\r\n if (params === undefined) {\r\n return\r\n }\r\n if (props.opacitySliderMode) {\r\n if (params.opacity !== undefined) {\r\n setOpacityEnabled(true)\r\n setOpacity(params.opacity)\r\n }\r\n return\r\n }\r\n if (params.depth !== undefined) {\r\n setDepthEnabled(true)\r\n setDepth(params.depth)\r\n }\r\n if (params.level !== undefined) {\r\n setLevelEnabled(true)\r\n setLevel(params.level)\r\n }\r\n if (params.radioSubLayers !== undefined) {\r\n setRadioSublayersEnabled(true)\r\n setRadioSublayers(params.radioSubLayers)\r\n }\r\n if (params.switchSubLayers !== undefined) {\r\n setSwitchSublayersEnabled(true)\r\n setSwitchSublayers(params.switchSubLayers)\r\n }\r\n if (params.subLayers !== undefined) {\r\n setSubLayersEnabled(true)\r\n setSubLayers(params.subLayers)\r\n setSubLayerDescriptors(params.subLayers.subLayerDescriptors)\r\n }\r\n // eslint-disable-next-line\r\n }, [layerParams, props.layerType])\r\n\r\n /**\r\n * Get hydro model sub layer object.\r\n * @param hydroModel Hydro model to get sub layer format.\r\n * @param enabled Is true the hydro model enabled in the layer picker.\r\n */\r\n const getHydroModelSubLayer = (hydroModel: HydroModelObject, enabled: boolean): SwitchSubLayer | undefined => {\r\n if (hydroModel.WMSLayerName1 === undefined || hydroModel.WMSLayerName1 === '') {\r\n return undefined\r\n }\r\n return {\r\n id: `${hydroModel.Id}`,\r\n title: hydroModel.Name + (hydroModel.MessuringPeriode !== null && hydroModel.MessuringPeriode !== '' ? ' (' + hydroModel.MessuringPeriode + ')' : ''),\r\n subLayer: hydroModel.WMSLayerName1,\r\n enabled: enabled\r\n }\r\n }\r\n\r\n /**\r\n * Get parameters object from layer params string.\r\n * @returns LayerParamsObject\r\n */\r\n const getParameters = (): LayerParamsObject | undefined => {\r\n if (props.layerType !== undefined) {\r\n return getLayerParamsFromType(props.layerType, layerParams)\r\n }\r\n }\r\n\r\n /**\r\n * Gets a SubLayerDescriptor from a value\r\n * @param value The value for which to get the SubLayerDescriptor\r\n * @returns A SubLayerDescriptor if such exists for a given subLayerType and value\r\n */\r\n const getSubLayerDescriptor = (value: number): SubLayerDescriptor | undefined => {\r\n return subLayerDescriptors.find(descriptor => descriptor.value === value)\r\n }\r\n\r\n const isInputValid = (value: number, min: number, max: number, step?: number): boolean => {\r\n if (value < min || value > max) {\r\n return false\r\n }\r\n\r\n if (step === undefined) {\r\n return true\r\n }\r\n\r\n const remainder = ((((value - min) * 1000) % (step * 1000)) / 1000)\r\n return remainder === 0\r\n }\r\n\r\n /**\r\n * Update a given parameter with a new value in state.\r\n * @param param Parameter name.\r\n * @param value New parameter value.\r\n * @param commit If true commit to state.\r\n */\r\n const updateParameter = (param: string, value: number, commit: boolean): void => {\r\n const params = getParameters()\r\n if (params === undefined) {\r\n return\r\n }\r\n if (props.layerType === undefined) {\r\n return\r\n }\r\n switch (param) {\r\n case 'opacity':\r\n params.opacity = value / 100\r\n setOpacity(params.opacity)\r\n break\r\n case 'level':\r\n params.level = value\r\n setLevel(params.level)\r\n break\r\n case 'depth':\r\n params.depth = value\r\n setDepth(params.depth)\r\n break\r\n case 'subLayer': {\r\n if (params.subLayers === undefined) {\r\n return\r\n }\r\n const subLayerDescriptor = getSubLayerDescriptor(value)\r\n if (subLayerDescriptor !== undefined) {\r\n params.subLayers.selected = subLayerDescriptor\r\n setSubLayers({\r\n ...subLayers,\r\n selected: subLayerDescriptor\r\n })\r\n }\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n if (commit) {\r\n dispatch(mapActions.setLayerParams({\r\n layerType: props.layerType,\r\n params: params\r\n }))\r\n }\r\n }\r\n\r\n /**\r\n * Handles the update of a switch state by updating its parameter.\r\n * @param param Parameter name.\r\n * @param id Id to toggle.\r\n * @param checked Checked state of control.\r\n */\r\n const handleSwitchChange = (param: string, id: string, checked: boolean): void => {\r\n const params = getParameters()\r\n if (params === undefined) {\r\n return\r\n }\r\n if (props.layerType === undefined) {\r\n return\r\n }\r\n switch (param) {\r\n case 'switchSublayer': {\r\n if (params.switchSubLayers === undefined) {\r\n return\r\n }\r\n if (props.layerType === LayerType.HYDRO_MODEL) {\r\n params.switchSubLayers = switchSublayers\r\n }\r\n params.switchSubLayers.sublayers.forEach(subLayer => {\r\n if (id === subLayer.subLayer) {\r\n subLayer.enabled = checked\r\n }\r\n })\r\n setSwitchSublayers(params.switchSubLayers)\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n\r\n dispatch(mapActions.setLayerParams({\r\n layerType: props.layerType,\r\n params: params\r\n }))\r\n }\r\n\r\n /**\r\n * Handles the update of a radio button state by updating its parameter.\r\n * @param param Parameter name.\r\n * @param value New parameter value.\r\n */\r\n const handleRadioChange = (param: string, value: string): void => {\r\n const params = getParameters()\r\n if (params === undefined) {\r\n return\r\n }\r\n if (props.layerType === undefined) {\r\n return\r\n }\r\n switch (param) {\r\n case 'radioSublayer': {\r\n if (params.radioSubLayers === undefined) {\r\n return\r\n }\r\n const selectedSubLayer = params.radioSubLayers.sublayers.find(l => l.subLayer === value)\r\n if (selectedSubLayer === undefined) {\r\n return\r\n }\r\n params.radioSubLayers.selected = selectedSubLayer\r\n setRadioSublayers({\r\n ...radioSublayers,\r\n selected: selectedSubLayer\r\n })\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n\r\n dispatch(mapActions.setLayerParams({\r\n layerType: props.layerType,\r\n params: params\r\n }))\r\n }\r\n\r\n /**\r\n * Handle value changed in slider.\r\n * @param param Slide parameter name.\r\n * @param value Slide value.\r\n */\r\n const handleSliderChange = (param: string, value: number | number[], commit: boolean): void => {\r\n updateParameter(param, value as number, commit)\r\n }\r\n\r\n /**\r\n * Handle changing of input value.\r\n * @param event React event object.\r\n */\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>, min: number, max: number, step?: number): void => {\r\n const value = Number(event.target.value)\r\n const validInput = isInputValid(value, min, max, step)\r\n\r\n if (validInput) {\r\n updateParameter(event.target.name, value, true)\r\n }\r\n }\r\n\r\n /**\r\n * Handle when close button is clicked.\r\n */\r\n const handleCloseButtonClick = (): void => {\r\n props.closeHandler()\r\n }\r\n\r\n /**\r\n * Handle when a sub layer label is clicked.\r\n * @param subLayer Sub layer that was clicked.\r\n */\r\n const handleSubLayerLabelClicked = (subLayer: SubLayerDescriptor): void => {\r\n // If wiki key is defined open document\r\n const wikiKey = subLayer.wikiKey\r\n if (wikiKey !== undefined && hasDocument(wikiKey)) {\r\n dispatch(wikiActions.fetchDocument(wikiKey))\r\n }\r\n }\r\n\r\n /**\r\n * Checks if a wiki document with the specified key exists\r\n * @param wikiKey key identifying the wiki\r\n * @returns return true if a ducument exists\r\n */\r\n const hasDocument = (wikiKey: string|undefined): boolean => {\r\n return wikiKey === undefined ? false : wikiDocumentsMeta.some(meta => meta.key === wikiKey)\r\n }\r\n\r\n /**\r\n * Gets a list of Marks from a list of SubLayerDescriptor\r\n * @returns A list of Marks\r\n */\r\n const getMarks = (descriptors: SubLayerDescriptor[]): Mark[] => {\r\n return descriptors.map(descriptor => {\r\n return {\r\n value: descriptor.value\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Determines if a SubLayer with a lower value than the currently selected SubLayer exists\r\n * @returns Returns true if SubLayer exists or false otherwise\r\n */\r\n const hasPrevSubLayer = (): boolean => {\r\n return subLayers.selected.value > subLayers.minimum\r\n }\r\n\r\n /**\r\n * Determines if a SubLayer with a larger value than the currently selected SubLayer exists\r\n * @returns Returns true if SubLayer exists or false otherwise\r\n */\r\n const hasNextSubLayer = (): boolean => {\r\n return subLayers.selected.value < subLayers.maximum\r\n }\r\n\r\n /**\r\n * Updates the selected SubLayer to be the first SubLayer, in a sorted list, that has a lower value then the currently selected SubLayer, if such exists.\r\n */\r\n const selectPrevSubLayer = (): void => {\r\n const descriptors: SubLayerDescriptor[] = Object.assign([], subLayerDescriptors)\r\n const value = descriptors\r\n .sort((a, b) => {\r\n return b.value - a.value\r\n })\r\n .find(descriptor => descriptor.value < subLayers.selected.value)\r\n ?.value\r\n if (value !== undefined) {\r\n handleSliderChange('subLayer', value, true)\r\n }\r\n }\r\n\r\n /**\r\n * Updates the selected SubLayer to be the first SubLayer, in a sorted list, that has a larger value then the currently selected SubLayer, if such exists.\r\n */\r\n const selectNextSubLayer = (): void => {\r\n const descriptors: SubLayerDescriptor[] = Object.assign([], subLayerDescriptors)\r\n const value = descriptors\r\n .sort((a, b) => {\r\n return a.value - b.value\r\n })\r\n .find(descriptor => descriptor.value > subLayers.selected.value)\r\n ?.value\r\n if (value !== undefined) {\r\n handleSliderChange('subLayer', value, true)\r\n }\r\n }\r\n\r\n // Filter hydro models based on map extent\r\n useEffect(() => {\r\n if (props.layerType !== LayerType.HYDRO_MODEL) {\r\n return\r\n }\r\n if (hydroModels === undefined) {\r\n return\r\n }\r\n if (mapExtent === undefined) {\r\n return\r\n }\r\n\r\n const params = getParameters()\r\n const hydroModelSubLayers: SwitchSubLayers = { labelId: 'layerpicker.switchsublayer', sublayers: [] }\r\n for (const hydroModel of hydroModels) {\r\n const enabled = params?.switchSubLayers !== undefined ? params.switchSubLayers.sublayers.some(subLayer => subLayer.subLayer === hydroModel.WMSLayerName1 && subLayer.enabled) : false\r\n\r\n // Test if hydro model bounding box intersect with current map extent\r\n if (isHydroModelIntersectingMapExtent(mapExtent, hydroModel) || enabled) {\r\n const hydroModelSubLayer = getHydroModelSubLayer(hydroModel, enabled)\r\n if (hydroModelSubLayer === undefined) {\r\n continue\r\n }\r\n hydroModelSubLayers.sublayers.push(hydroModelSubLayer)\r\n }\r\n }\r\n\r\n // Update local state\r\n setSwitchSublayers(hydroModelSubLayers)\r\n\r\n // eslint-disable-next-line\r\n }, [hydroModels, mapExtent, layerParams, props.layerType]) \r\n\r\n return (\r\n <div className={classes.root}>\r\n <div className={classes.closeButton}>\r\n <IconButton size='medium' className={classes.closeButtonIcon} onClick={handleCloseButtonClick}>\r\n <Close className={classes.closeButtonIcon} />\r\n </IconButton>\r\n </div>\r\n\r\n {opacityEnabled && (\r\n <>\r\n <Typography id='discrete-slider-opacity' className={classes.discreteSlider} gutterBottom>\r\n <FormattedMessage id='layerpicker.opacity' />\r\n </Typography>\r\n <Grid container spacing={2} alignItems='center'>\r\n <Grid item xs={9}>\r\n <Slider\r\n name='opacity'\r\n defaultValue={50}\r\n aria-labelledby='discrete-slider-opacity'\r\n valueLabelDisplay='off'\r\n min={0}\r\n max={100}\r\n value={Math.round(opacity * 100)}\r\n onChange={(event: any, newValue: number | number[]): void => { handleSliderChange('opacity', newValue, false) }}\r\n onChangeCommitted={(event: any, newValue: number | number[]): void => { handleSliderChange('opacity', newValue, true) }}\r\n className={classes.slider}\r\n />\r\n </Grid>\r\n <Grid item xs={3} className={classes.inputWrapper}>\r\n <Input\r\n name='opacity'\r\n className={`${classes.input} ${(classes.normal)}`}\r\n value={Math.round(opacity * 100)}\r\n margin='dense'\r\n disableUnderline\r\n onChange={(event: React.ChangeEvent<HTMLInputElement>): void => { handleInputChange(event, 0, 100) }}\r\n inputProps={{\r\n style: { textAlign: 'center', padding: 0 },\r\n step: 10,\r\n min: 0,\r\n max: 100,\r\n type: 'number',\r\n 'aria-labelledby': 'input-slider'\r\n }}\r\n /> %\r\n </Grid>\r\n </Grid>\r\n </>\r\n )}\r\n {levelEnabled && (\r\n <>\r\n <Typography id='discrete-slider-level' className={classes.discreteSlider} gutterBottom>\r\n <FormattedMessage id='layerpicker.level' />\r\n </Typography>\r\n <Grid container spacing={2} alignItems='center'>\r\n <Grid item xs>\r\n <Slider\r\n name='level'\r\n defaultValue={-10}\r\n aria-labelledby='discrete-slider-level'\r\n valueLabelDisplay='off'\r\n min={-100}\r\n max={100}\r\n value={level}\r\n onChange={(event: any, newValue: number | number[]): void => { handleSliderChange('level', newValue, false) }}\r\n onChangeCommitted={(event: any, newValue: number | number[]): void => { handleSliderChange('level', newValue, true) }}\r\n className={classes.slider}\r\n />\r\n </Grid>\r\n <Grid item>\r\n <Input\r\n name='level'\r\n className={`${classes.input} ${(classes.normal)}`}\r\n value={level}\r\n margin='dense'\r\n disableUnderline\r\n onChange={(event: React.ChangeEvent<HTMLInputElement>): void => { handleInputChange(event, -100, 100) }}\r\n inputProps={{\r\n style: { textAlign: 'center', padding: 0 },\r\n step: 10,\r\n min: -100,\r\n max: 100,\r\n type: 'number',\r\n 'aria-labelledby': 'input-slider'\r\n }}\r\n /> m\r\n </Grid>\r\n </Grid>\r\n </>\r\n )}\r\n {depthEnabled && (\r\n <>\r\n <Typography id='discrete-slider-depth' className={classes.discreteSlider} gutterBottom>\r\n <FormattedMessage id='layerpicker.depth' />\r\n </Typography>\r\n <Grid container spacing={2} alignItems='center'>\r\n <Grid item xs>\r\n <Slider\r\n name='depth'\r\n defaultValue={10}\r\n aria-labelledby='discrete-slider-depth'\r\n valueLabelDisplay='off'\r\n min={-100}\r\n max={100}\r\n value={depth}\r\n onChange={(event: any, newValue: number | number[]): void => { handleSliderChange('depth', newValue, false) }}\r\n onChangeCommitted={(event: any, newValue: number | number[]): void => { handleSliderChange('depth', newValue, true) }}\r\n className={classes.slider}\r\n />\r\n </Grid>\r\n <Grid item>\r\n <Input\r\n name='depth'\r\n className={`${classes.input} ${(classes.normal)}`}\r\n value={depth}\r\n margin='dense'\r\n disableUnderline\r\n onChange={(event: React.ChangeEvent<HTMLInputElement>): void => { handleInputChange(event, -100, 100) }}\r\n inputProps={{\r\n style: { textAlign: 'center', padding: 0 },\r\n step: 10,\r\n min: -100,\r\n max: 100,\r\n type: 'number',\r\n 'aria-labelledby': 'input-slider'\r\n }}\r\n /> m\r\n </Grid>\r\n </Grid>\r\n </>\r\n )}\r\n {radioSublayersEnabled && (\r\n <>\r\n <Typography id='discrete-slider-level' className={classes.discreteRadio} gutterBottom>\r\n <FormattedMessage id={radioSublayers.labelId} />\r\n </Typography>\r\n <Grid container spacing={2} alignItems='center'>\r\n <RadioGroup\r\n aria-label='discrete-radio-sublayers'\r\n name={intl.formatMessage({ id: radioSublayers.labelId })}\r\n value={radioSublayers.selected.subLayer} onChange={(event) => { handleRadioChange('radioSublayer', event.target.value) }}\r\n className={classes.radioGroup}\r\n defaultValue={radioSublayers.selected.subLayer}\r\n >\r\n {\r\n radioSublayers.sublayers.map((subLayer, index) => {\r\n return (\r\n <FormControlLabel\r\n key={index}\r\n value={subLayer.subLayer}\r\n control={<Radio color='primary' />}\r\n label={intl.formatMessage({ id: subLayer.labelId })}\r\n className={classes.radioLabel}\r\n />\r\n )\r\n })\r\n }\r\n </RadioGroup>\r\n </Grid>\r\n </>\r\n )}\r\n {switchSublayersEnabled && (\r\n <>\r\n <Typography id='discrete-switch-sub-layers' className={classes.discreteSwitch} gutterBottom>\r\n <FormattedMessage id={switchSublayers.labelId} />\r\n </Typography>\r\n <Grid container spacing={2} alignItems='center'>\r\n {\r\n switchSublayers.sublayers.map((subLayer, index) => {\r\n return (\r\n <FormControlLabel\r\n key={index}\r\n control={\r\n <Switch\r\n checked={subLayer.enabled}\r\n onChange={event => handleSwitchChange('switchSublayer', event.target.name, event.target.checked)}\r\n name={subLayer.subLayer}\r\n color='primary'\r\n />\r\n }\r\n label={subLayer.labelId !== undefined ? intl.formatMessage({ id: subLayer.labelId }) : (subLayer.title !== undefined ? subLayer.title : '')}\r\n className={classes.switchLabel}\r\n />\r\n )\r\n })\r\n }\r\n {switchSublayers.sublayers.length === 0 && (\r\n <div className={classes.message}>\r\n <FormattedMessage id='layerpicker.nomaplayersavailable' />\r\n </div>\r\n )}\r\n </Grid>\r\n </>\r\n )}\r\n {subLayersEnabled && (\r\n <>\r\n <Typography id='discrete-slider-sub-layers' className={classes.discreteSlider} gutterBottom>\r\n {intl.formatMessage({ id: subLayers.labelId })}\r\n </Typography>\r\n <Grid container spacing={subLayers.stepperEnabled === true ? 0 : 2} alignItems='center'>\r\n <Grid item xs={subLayers.stepperEnabled === true ? 12 : 9}>\r\n <Slider\r\n name='subLayer'\r\n defaultValue={subLayers.minimum}\r\n aria-labelledby='discrete-slider-sub-layers'\r\n valueLabelDisplay='off'\r\n min={subLayers.minimum}\r\n max={subLayers.maximum}\r\n step={null}\r\n marks={getMarks(subLayerDescriptors)} // getMarks takes subLayerDescriptors as input to make the slider update on state changes\r\n value={subLayers.selected.value}\r\n onChange={(event: any, newValue: number | number[]): void => {\r\n handleSliderChange('subLayer', newValue, false)\r\n }}\r\n onChangeCommitted={(event: any, newValue: number | number[]): void => {\r\n handleSliderChange('subLayer', newValue, true)\r\n }}\r\n className={classes.marksSlider}\r\n />\r\n </Grid>\r\n {subLayers.stepperEnabled === true && (\r\n <Grid item xs={12}>\r\n <Grid container alignItems='center'>\r\n <Grid item xs={2} className={classes.valueStepDownButton}>\r\n <>\r\n {hasPrevSubLayer() &&\r\n <IconButton size='medium' className={classes.arrowButtonIcon} onClick={() => selectPrevSubLayer()}>\r\n <ArrowBackIos className={classes.arrowButtonIcon} />\r\n </IconButton>}\r\n </>\r\n </Grid>\r\n <Grid item xs={8}>\r\n <List disablePadding>\r\n <ListItemText>\r\n <div className={classes.sliderValueText}>\r\n {subLayers.selected.label}\r\n </div>\r\n </ListItemText>\r\n {subLayers.selected.subLabel !== undefined &&\r\n <ListItemText>\r\n <div\r\n className={hasDocument(subLayers.selected.wikiKey) ? classes.sliderSubLabelTextWithWikiDocument : classes.sliderSubLabelText}\r\n onClick={() => handleSubLayerLabelClicked(subLayers.selected)}\r\n >\r\n {intl.formatMessage({ id: subLayers.selected.subLabel })}\r\n </div>\r\n </ListItemText>}\r\n </List>\r\n </Grid>\r\n <Grid item xs={2}>\r\n <>\r\n {hasNextSubLayer() &&\r\n <IconButton size='medium' className={classes.arrowButtonIcon} onClick={() => selectNextSubLayer()}>\r\n <ArrowForwardIos className={classes.arrowButtonIcon} />\r\n </IconButton>}\r\n </>\r\n </Grid>\r\n </Grid>\r\n </Grid>)}\r\n {subLayers.stepperEnabled !== true && (\r\n <Grid item xs={3}>\r\n <Grid container className={classes.valueWrapper}>\r\n <Grid item xs alignItems='center'>\r\n <div className={classes.sliderValueText}>\r\n {subLayers.selected.value}\r\n </div>\r\n </Grid>\r\n <Grid item>\r\n {subLayers.unit}\r\n </Grid>\r\n </Grid>\r\n </Grid>\r\n )}\r\n </Grid>\r\n </>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nLayerParameters.defaultProps = defaultProps\r\n\r\nexport default LayerParameters\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const confirmStyle = makeStyles((theme) => ({\r\n confirmButton: {\r\n backgroundColor: theme.palette.primary.main\r\n }\r\n}))\r\n","import { FC } from 'react'\r\nimport { Button, Dialog, DialogTitle, DialogContent, DialogActions } from '@material-ui/core'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { confirmStyle } from './Confirm.style'\r\n\r\nexport interface ConfirmProps {\r\n open: boolean\r\n text: string\r\n handleConfirm: () => void\r\n handleCancel: () => void\r\n}\r\n\r\nconst defaultProps: ConfirmProps = {\r\n open: true,\r\n text: '',\r\n handleConfirm: () => {},\r\n handleCancel: () => {}\r\n}\r\n\r\n/**\r\n * Confirm React component.\r\n * The following properties are implemented:\r\n * visible {boolean}: If true the component is visible.\r\n * handleConfirm {function}: Handle \"OK\" click.\r\n * handleCancel {function}: Handle \"Cancel\" click.\r\n * @param props React properties object.\r\n * @returns React view component.\r\n */\r\nexport const Confirm: FC<ConfirmProps> = (props: ConfirmProps) => {\r\n const classes = confirmStyle()\r\n return (\r\n <Dialog\r\n open={props.open}\r\n onClose={() => props.handleCancel()}\r\n aria-labelledby='confirm-dialog'\r\n >\r\n <DialogTitle id='confirm-dialog'><FormattedMessage id='common.warning' /></DialogTitle>\r\n <DialogContent>\r\n {props.text}\r\n </DialogContent>\r\n <DialogActions>\r\n <Button\r\n variant='contained'\r\n onClick={() => props.handleCancel()}\r\n color='default'\r\n >\r\n <FormattedMessage id='common.cancel' />\r\n </Button>\r\n <Button\r\n variant='contained'\r\n onClick={() => {\r\n props.handleConfirm()\r\n }}\r\n color='primary'\r\n className={classes.confirmButton}\r\n >\r\n <FormattedMessage id='common.ok' />\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n )\r\n}\r\n\r\nConfirm.defaultProps = defaultProps\r\n\r\nexport default Confirm\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const layerPickerStyle = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: theme.palette.geoColors.contextBar.main,\r\n paddingBottom: 0,\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n },\r\n graphs: {\r\n maxHeight: 200\r\n },\r\n graphsDescription: {\r\n fontSize: '0.9rem',\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n paddingBottom: theme.spacing(2)\r\n },\r\n graphsButton: {\r\n backgroundColor: theme.palette.secondary.main,\r\n borderRadius: theme.spacing(1),\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n marginBottom: theme.spacing(2)\r\n },\r\n list: {\r\n paddingBottom: 0\r\n },\r\n groups: {\r\n width: '100%'\r\n },\r\n legendItems: {\r\n width: '100%',\r\n paddingTop: theme.spacing(2)\r\n },\r\n legendList: {\r\n paddingBottom: 0\r\n },\r\n button: {\r\n backgroundColor: theme.palette.primary.main\r\n },\r\n checkbox: {\r\n color: theme.palette.primary.main\r\n },\r\n listItemIcon: {\r\n minWidth: theme.spacing(4)\r\n },\r\n listTitle: {\r\n paddingRight: theme.spacing(2.5)\r\n },\r\n groupWithLayers: {\r\n borderTop: 1,\r\n borderTopStyle: 'solid',\r\n borderTopColor: theme.palette.geoColors.contextBar.dark\r\n },\r\n groupWithSelectedLayer: {\r\n color: theme.palette.primary.main\r\n },\r\n nested: {\r\n paddingLeft: theme.spacing(3)\r\n },\r\n nestedListSubheader: {\r\n paddingRight: theme.spacing(0.5),\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.geoColors.headerText.main,\r\n userSelect: 'none'\r\n },\r\n nestedListSubheaderIcon: {\r\n float: 'left',\r\n paddingTop: theme.spacing(1),\r\n marginRight: theme.spacing(1)\r\n },\r\n collapseButton: {\r\n float: 'right',\r\n color: theme.palette.secondary.main\r\n },\r\n legend: {\r\n width: '100%'\r\n },\r\n triangle: {\r\n float: 'right',\r\n width: 0,\r\n height: 0,\r\n borderLeft: 10,\r\n borderLeftStyle: 'solid',\r\n borderLeftColor: 'transparent',\r\n borderRight: 10,\r\n borderRightStyle: 'solid',\r\n borderRightColor: 'transparent',\r\n borderBottom: 10,\r\n borderBottomStyle: 'solid',\r\n borderBottomColor: theme.palette.primary.main\r\n },\r\n firstTriangle: {\r\n marginTop: -theme.spacing(0.7),\r\n marginRight: theme.spacing(2)\r\n },\r\n secondTriangle: {\r\n marginTop: -theme.spacing(0.7),\r\n marginRight: theme.spacing(5.7)\r\n },\r\n thirdTriangle: {\r\n marginTop: -theme.spacing(0.7),\r\n marginRight: theme.spacing(9.7)\r\n },\r\n selectedLayerParams: {\r\n fontSize: '1.2rem'\r\n },\r\n selectedLayerParamsActive: {\r\n fontSize: '1.2rem',\r\n color: theme.palette.primary.main\r\n }\r\n}))\r\n","import React, { FC } from 'react'\r\nimport { FormattedMessage, useIntl } from 'react-intl'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport { Checkbox, Collapse, IconButton, Tooltip, List, ListItem, ListItemIcon, ListItemSecondaryAction, ListItemText, ListSubheader, Button, Radio } from '@material-ui/core'\r\nimport { TuneOutlined, Layers, ExpandLess, ExpandMore, ShowChart, InfoOutlined, VerticalAlignCenterOutlined, Opacity } from '@material-ui/icons'\r\n\r\nimport { RootState } from 'src/Store'\r\nimport { getLayerGroupName } from 'src/utils/Utils'\r\nimport { mapActions } from '../../actions/MapActions'\r\nimport LayerLegend from './layerlegend/LayerLegend'\r\nimport LayerParameters from './layerparameters/LayerParameters'\r\nimport { getLayerDescriptionForType, getLayersByDataTheme, getLayerGroups, LayerGroup, LayerType, LayerParamsObject, LayerParams } from 'src/dataSources/layers/LayerRegistry'\r\nimport { DataTheme, LayerViewType, ToolType } from 'src/Enums'\r\nimport { tooltipDelay } from 'src/Constants'\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { profileActions } from 'src/actions/ProfileActions'\r\nimport { boreholeInfoActions } from 'src/actions/BoreholeInfoActions'\r\nimport { virtualBoreholeInfoActions } from 'src/actions/VirtualBoreholeInfoActions'\r\nimport { infoMenuActions } from 'src/actions/InfoMenuActions'\r\nimport { ProfileObject } from 'src/dataSources/geo/CrossSection'\r\nimport { NearestBoreholeObject } from 'src/dataSources/geo/NearestBoreHoles'\r\n\r\nimport Confirm from '../confirm/Confirm'\r\n\r\nimport { layerPickerStyle } from './LayerPicker.style'\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { InfoView } from 'src/reducers/InfoMenuReducer'\r\nimport { getGraphDescriptionForType, getGraphGroupDescriptionForType, getGraphGroups, Graph, GraphGroup } from 'src/dataSources/graphs/GraphRegistry'\r\nimport { getLayerParamsFromType } from 'src/reducers/MapReducer'\r\nimport { resetSelectedLayers } from 'src/utils/MapLayerUtils'\r\n\r\n/**\r\n * LayerActiveView represent the current view type being displayed in the layer picker.\r\n */\r\nexport interface LayerActiveView {\r\n type: LayerType\r\n view: LayerViewType\r\n}\r\n\r\nexport interface LayerPickerProps {\r\n visible: boolean\r\n}\r\n\r\nconst defaultProps: LayerPickerProps = {\r\n visible: true\r\n}\r\n\r\n/**\r\n * LayerPicker React component.\r\n * The following properties are implemented:\r\n * visible {boolean}: If true the component is visible.\r\n * @param props React properties object.\r\n * @returns React view component.\r\n */\r\nexport const LayerPicker: FC<LayerPickerProps> = (props: LayerPickerProps) => {\r\n const dispatch = useDispatch()\r\n const classes = layerPickerStyle()\r\n const intl = useIntl()\r\n\r\n const [currentGraph, setCurrentGraph] = React.useState<Graph>()\r\n const [showWarning, setShowWarning] = React.useState<boolean>(false)\r\n\r\n const enabledGraphGroups: GraphGroup[] = useSelector((state: RootState): GraphGroup[] => state.generalState.enabledGraphGroups)\r\n const enabledLayers: LayerType[] = useSelector((state: RootState): LayerType[] => state.mapState.enabledLayers)\r\n const enabledLayerGroups: LayerGroup[] = useSelector((state: RootState): LayerGroup[] => state.mapState.enabledLayerGroups)\r\n const layerActiveViews: LayerActiveView[] = useSelector((state: RootState): LayerActiveView[] => state.mapState.layerActiveViews)\r\n const layerParams = useSelector((state: RootState): LayerParams[] => state.mapState.layerParams)\r\n const currentDataTheme: DataTheme = useSelector((state: RootState): DataTheme => state.generalState.dataTheme)\r\n const selectedBoreholeInfo: NearestBoreholeObject | undefined = useSelector((state: RootState): NearestBoreholeObject | undefined => state.boreholeInfo.selectedBorehole)\r\n const selectedGeoModel: GeoModel | undefined = useSelector((state: RootState): GeoModel | undefined => state.generalState.selectedGeoModel)\r\n const selectedProfile: ProfileObject | undefined = useSelector((state: RootState): ProfileObject | undefined => state.profileState.selectedProfile)\r\n const selectedVirtualBorehole: string = useSelector((state: RootState): string => state.virtualBoreholeInfoState.virtualBoreholePng)\r\n\r\n const graphGroups: GraphGroup[] = getGraphGroups(currentDataTheme)\r\n const layerTypes: LayerType[] = getLayersByDataTheme(currentDataTheme)\r\n const layerGroups: LayerGroup[] = getLayerGroups(currentDataTheme)\r\n\r\n /**\r\n * Determine if a given layer type has settings.\r\n * @returns LayerParamsObject\r\n */\r\n const hasParameters = (layerType: LayerType): boolean => {\r\n if (layerType !== undefined) {\r\n const params: LayerParamsObject | undefined = getLayerParamsFromType(layerType, layerParams)\r\n return params !== undefined && (\r\n params.depth !== undefined ||\r\n params.level !== undefined ||\r\n params?.radioSubLayers !== undefined ||\r\n params?.switchSubLayers !== undefined ||\r\n params?.subLayers !== undefined\r\n )\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Does a given group have enabled layers?\r\n * @param group Group to check.\r\n * @returns true if layers are enabled, false otherwise.\r\n */\r\n const hasEnabledLayers = (group: LayerGroup): boolean => {\r\n return enabledLayers.some(layer => getLayerDescriptionForType(layer).group === group)\r\n }\r\n\r\n /**\r\n * Is a given layer a background layer?\r\n * @param layerType Layer to check.\r\n * @returns true if layer is background layer, false otherwise.\r\n */\r\n const isBackgroundLayer = (layerType: LayerType): boolean => {\r\n return getLayerDescriptionForType(layerType).group === LayerGroup.BACKGROUND_MAPS\r\n }\r\n\r\n /**\r\n * Is a given layer's legend enabled?\r\n * @param layerType Layer to check.\r\n * @returns true if legend is enabled, false otherwise.\r\n */\r\n const isLayerLegendEnabled = (layerType: LayerType): boolean => {\r\n if (selectedGeoModel === undefined && getLayerDescriptionForType(layerType).imageLegend === undefined) {\r\n return false\r\n }\r\n return getLayerDescriptionForType(layerType).legendEnabled\r\n }\r\n\r\n /**\r\n * Is a given layer's info visible?\r\n * @param layerType Layer to check.\r\n * @returns true if layer info are visible, false otherwise.\r\n */\r\n const isLayerInfoVisible = (layerType: LayerType): boolean => {\r\n if (!isLayerSelected(layerType)) {\r\n return false\r\n }\r\n return layerActiveViews.some(layerView => layerView.type === layerType && layerView.view === LayerViewType.INFO)\r\n }\r\n\r\n /**\r\n * Is a given layer's opacity visible?\r\n * @param layerType Layer to check.\r\n * @returns true if layer opacity are visible, false otherwise.\r\n */\r\n const isLayerOpacityVisible = (layerType: LayerType): boolean => {\r\n if (!isLayerSelected(layerType)) {\r\n return false\r\n }\r\n return layerActiveViews.some(layerView => layerView.type === layerType && layerView.view === LayerViewType.OPACITY)\r\n }\r\n\r\n /**\r\n * Is a given layer's settings visible?\r\n * @param layerType Layer to check.\r\n * @returns true if layer settings are visible, false otherwise.\r\n */\r\n const isLayerSettingsVisible = (layerType: LayerType): boolean => {\r\n if (!isLayerSelected(layerType)) {\r\n return false\r\n } if (!hasParameters(layerType)) {\r\n return false\r\n }\r\n return layerActiveViews.some(layerView => layerView.type === layerType && layerView.view === LayerViewType.SETTINGS)\r\n }\r\n\r\n /**\r\n * Is a given layer selected?\r\n * @param layerType Layer to check.\r\n * @returns true if layer is selected, false otherwise.\r\n */\r\n const isLayerSelected = (layerType: LayerType): boolean => {\r\n return enabledLayers.some(selectedLayerType => selectedLayerType === layerType)\r\n }\r\n\r\n /**\r\n * Is a given layer group selected?\r\n * @param graphGroup Layer group to check.\r\n * @returns true if layer group is selected, false otherwise.\r\n */\r\n const isGraphGroupSelected = (graphGroup: GraphGroup): boolean => {\r\n return enabledGraphGroups.some(selectedGraphGroup => selectedGraphGroup === graphGroup)\r\n }\r\n\r\n /**\r\n * Is a given layer group selected?\r\n * @param layerGroup Layer group to check.\r\n * @returns true if layer group is selected, false otherwise.\r\n */\r\n const isLayerGroupSelected = (layerGroup: LayerGroup): boolean => {\r\n return enabledLayerGroups.some(selectedLayerGroup => selectedLayerGroup === layerGroup)\r\n }\r\n\r\n /**\r\n * Is a given layer's opacity setting enabled?\r\n * @param layerType Layer to check.\r\n * @returns true if opacity is enabled, false otherwise.\r\n */\r\n const isOpacityEnabled = (layerType: LayerType): boolean => {\r\n return getLayerDescriptionForType(layerType).opacityEnabled\r\n }\r\n\r\n /**\r\n * Called when a layer is clicked.\r\n * @param layerType Layer that was clicked.\r\n */\r\n const layerClicked = (layerType: LayerType): void => {\r\n const layerDescription = getLayerDescriptionForType(layerType)\r\n\r\n if (layerDescription.group === LayerGroup.BACKGROUND_MAPS) {\r\n // Disable deselecting a background layer if is already selected\r\n if (isLayerSelected(layerType)) {\r\n return\r\n }\r\n\r\n // If background layer is selected deselect previously selected background layer and remove from context\r\n for (const enabledLayer of enabledLayers) {\r\n const enabledLayerDescription = getLayerDescriptionForType(enabledLayer)\r\n if (enabledLayerDescription.group === LayerGroup.BACKGROUND_MAPS) {\r\n dispatch(mapActions.removeLayer(enabledLayer))\r\n dispatch(wikiActions.removeContextTags(enabledLayerDescription.contextTags))\r\n }\r\n }\r\n }\r\n\r\n const layerAction = isLayerSelected(layerType) ? mapActions.removeLayer(layerType) : mapActions.addLayer(layerType)\r\n dispatch(layerAction)\r\n\r\n const contextTags = layerDescription.contextTags\r\n const tagAction = isLayerSelected(layerType) ? wikiActions.removeContextTags(contextTags) : wikiActions.addContextTags(contextTags)\r\n dispatch(tagAction)\r\n }\r\n\r\n /**\r\n * Called when a layer groups is clicked.\r\n * @param group Group that was clicked.\r\n */\r\n const selectGroup = (group: LayerGroup): void => {\r\n if (isLayerGroupSelected(group)) {\r\n dispatch(mapActions.removeLayerGroup(group))\r\n } else {\r\n dispatch(mapActions.addLayerGroup(group))\r\n }\r\n }\r\n\r\n /**\r\n * Called when a graph groups is clicked.\r\n * @param group Group that was clicked.\r\n */\r\n const selectGraphGroup = (group: GraphGroup): void => {\r\n if (isGraphGroupSelected(group)) {\r\n dispatch(generalActions.removeGraphGroup(group))\r\n } else {\r\n dispatch(generalActions.addGraphGroup(group))\r\n }\r\n }\r\n\r\n /**\r\n * Show graph click handler.\r\n */\r\n const showGraphClicked = (graph: Graph): void => {\r\n if (selectedProfile !== undefined || selectedBoreholeInfo !== undefined || selectedVirtualBorehole !== '') {\r\n setCurrentGraph(graph)\r\n setShowWarning(true)\r\n } else {\r\n setCurrentGraph(undefined)\r\n dispatch(infoMenuActions.currentView(InfoView.Empty))\r\n dispatch(wikiActions.clearViews())\r\n dispatch(boreholeInfoActions.clearState())\r\n dispatch(profileActions.clearState())\r\n dispatch(virtualBoreholeInfoActions.clearState())\r\n dispatch(generalActions.setSelectedTool(ToolType.INFO))\r\n dispatch(generalActions.setShowLeftSideBar(false))\r\n dispatch(generalActions.setSelectedGraph(graph))\r\n }\r\n }\r\n\r\n /**\r\n * Called when the layer info icon is clicked.\r\n * @param layerType Layer whose info icon was clicked.\r\n */\r\n const toggleLayerInfo = (layerType: LayerType): void => {\r\n if (isLayerInfoVisible(layerType)) {\r\n dispatch(mapActions.setLayerActiveView(layerType, LayerViewType.NONE))\r\n } else {\r\n dispatch(mapActions.setLayerActiveView(layerType, LayerViewType.INFO))\r\n }\r\n }\r\n\r\n /**\r\n * Called when the layer opacity icon is clicked.\r\n * @param layerType Layer whose opacity icon was clicked.\r\n */\r\n const toggleLayerOpacity = (layerType: LayerType): void => {\r\n if (isLayerOpacityVisible(layerType)) {\r\n dispatch(mapActions.setLayerActiveView(layerType, LayerViewType.NONE))\r\n } else {\r\n dispatch(mapActions.setLayerActiveView(layerType, LayerViewType.OPACITY))\r\n }\r\n }\r\n\r\n /**\r\n * Called when the layer params icon is clicked.\r\n * @param layerType Layer whose param icon was clicked.\r\n */\r\n const toggleLayerParams = (layerType: LayerType): void => {\r\n if (isLayerSettingsVisible(layerType)) {\r\n dispatch(mapActions.setLayerActiveView(layerType, LayerViewType.NONE))\r\n } else {\r\n dispatch(mapActions.setLayerActiveView(layerType, LayerViewType.SETTINGS))\r\n }\r\n }\r\n\r\n /**\r\n * Called when the collapse/reset icon is pressed.\r\n * Disables all selected layers, collapses all layer groups and updates WikiContext.\r\n */\r\n const handleReset = (): void => {\r\n resetSelectedLayers(enabledLayers, dispatch)\r\n }\r\n\r\n // Generate group layers\r\n const groups: JSX.Element[] = []\r\n layerGroups.forEach((layerGroup, index) => {\r\n const group = (\r\n <div key={index}>\r\n <ListItem\r\n button\r\n className={`${hasEnabledLayers(layerGroup) ? classes.groupWithSelectedLayer : ''} ${index > 0 ? classes.groupWithLayers : ''}`}\r\n onClick={() => { selectGroup(layerGroup) }}\r\n >\r\n <ListItemText primary={getLayerGroupName(layerGroup)} />\r\n {isLayerGroupSelected(layerGroup) ? <ExpandLess /> : <ExpandMore />}\r\n </ListItem>\r\n <Collapse in={isLayerGroupSelected(layerGroup)} timeout='auto' unmountOnExit>\r\n <List component='div' disablePadding dense>\r\n {layerTypes.filter(layerType => getLayerDescriptionForType(layerType).group === layerGroup).map((layerType, index) => {\r\n return (\r\n <div key={index}>\r\n <ListItem button className={classes.nested} onClick={() => { layerClicked(layerType) }}>\r\n <ListItemIcon className={classes.listItemIcon}>\r\n {!isBackgroundLayer(layerType) && (\r\n <Checkbox\r\n className={isLayerSelected(layerType) ? classes.checkbox : ''}\r\n edge='start'\r\n checked={isLayerSelected(layerType)}\r\n tabIndex={-1}\r\n disableRipple\r\n color='default' // color is set to 'default' to let className define the style\r\n />\r\n )}\r\n {isBackgroundLayer(layerType) && (\r\n <Radio\r\n className={isLayerSelected(layerType) ? classes.checkbox : ''}\r\n edge='start'\r\n checked={isLayerSelected(layerType)}\r\n tabIndex={-1}\r\n disableRipple\r\n color='default'\r\n />\r\n )}\r\n </ListItemIcon>\r\n <ListItemText primary={intl.formatMessage({ id: getLayerDescriptionForType(layerType).name })} className={classes.listTitle} />\r\n {isLayerSelected(layerType) && (\r\n <ListItemSecondaryAction>\r\n {isLayerLegendEnabled(layerType) && (\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'layerpicker.info' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton edge='end' aria-label='info' onClick={() => { toggleLayerInfo(layerType) }}>\r\n <InfoOutlined className={isLayerInfoVisible(layerType) ? classes.selectedLayerParamsActive : classes.selectedLayerParams} />\r\n </IconButton>\r\n </Tooltip>)}\r\n {hasParameters(layerType) && (\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'layerpicker.settings' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton edge='end' aria-label='settings' onClick={() => { toggleLayerParams(layerType) }}>\r\n <TuneOutlined className={isLayerSettingsVisible(layerType) ? classes.selectedLayerParamsActive : classes.selectedLayerParams} />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n {isOpacityEnabled(layerType) && (\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'layerpicker.opacity' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton edge='end' aria-label='opacity' onClick={() => { toggleLayerOpacity(layerType) }}>\r\n <Opacity className={isLayerOpacityVisible(layerType) ? classes.selectedLayerParamsActive : classes.selectedLayerParams} />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n </ListItemSecondaryAction>\r\n )}\r\n </ListItem>\r\n <Collapse in={isLayerLegendEnabled(layerType) && isLayerInfoVisible(layerType)} timeout='auto' unmountOnExit>\r\n <div className={`${classes.triangle} ${hasParameters(layerType) ? classes.thirdTriangle : classes.secondTriangle}`} />\r\n <List component='div' disablePadding dense>\r\n <ListItemText>\r\n <LayerLegend\r\n layerType={layerType}\r\n imageLegend={getLayerDescriptionForType(layerType).imageLegend}\r\n />\r\n </ListItemText>\r\n </List>\r\n </Collapse>\r\n <Collapse in={isLayerSettingsVisible(layerType)} timeout='auto' unmountOnExit>\r\n <div className={`${classes.triangle} ${classes.secondTriangle}`} />\r\n <List component='div' disablePadding dense>\r\n <ListItemText>\r\n <LayerParameters layerType={layerType} opacitySliderMode={false} closeHandler={() => { toggleLayerParams(layerType) }} />\r\n </ListItemText>\r\n </List>\r\n </Collapse>\r\n <Collapse in={isLayerOpacityVisible(layerType)} timeout='auto' unmountOnExit>\r\n <div className={`${classes.triangle} ${classes.firstTriangle}`} />\r\n <List component='div' disablePadding dense>\r\n <ListItemText>\r\n <LayerParameters layerType={layerType} opacitySliderMode closeHandler={() => { toggleLayerOpacity(layerType) }} />\r\n </ListItemText>\r\n </List>\r\n </Collapse>\r\n </div>\r\n )\r\n })}\r\n </List>\r\n </Collapse>\r\n </div>\r\n )\r\n groups.push(group)\r\n })\r\n const graphs: JSX.Element[] = []\r\n graphGroups.forEach((graphGroup, index) => {\r\n const graphGroupDescription = getGraphGroupDescriptionForType(graphGroup)\r\n const graph = (\r\n <div key={index}>\r\n <ListItem\r\n button\r\n className={index > 0 ? classes.groupWithLayers : ''}\r\n onClick={() => { selectGraphGroup(graphGroup) }}\r\n >\r\n <ListItemText primary={intl.formatMessage({ id: graphGroupDescription.name })} />\r\n {isGraphGroupSelected(graphGroup) ? <ExpandLess /> : <ExpandMore />}\r\n </ListItem>\r\n <Collapse in={isGraphGroupSelected(graphGroup)} timeout='auto' unmountOnExit>\r\n <div className={classes.graphsDescription}>\r\n <FormattedMessage id={graphGroupDescription.description} />\r\n </div>\r\n {graphGroupDescription.graphs.map((graph, index) => {\r\n const graphDescription = getGraphDescriptionForType(graph)\r\n return (\r\n <Button key={index} variant='contained' color='secondary' className={classes.graphsButton} onClick={() => { showGraphClicked(graphDescription.type) }}>\r\n <FormattedMessage id={graphDescription.name} />\r\n </Button>\r\n )\r\n })}\r\n </Collapse>\r\n </div>\r\n )\r\n graphs.push(graph)\r\n })\r\n return (\r\n <div className={classes.root}>\r\n <Confirm\r\n open={showWarning}\r\n text={intl.formatMessage({ id: 'layerpicker.graphs.warning' })}\r\n handleConfirm={() => {\r\n setShowWarning(false)\r\n if (currentGraph !== undefined) {\r\n showGraphClicked(currentGraph)\r\n }\r\n }}\r\n handleCancel={() => {\r\n setShowWarning(false)\r\n }}\r\n />\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={classes.nestedListSubheader} id='nested-list-subheader'>\r\n <div className={classes.nestedListSubheaderIcon}>\r\n <Layers />\r\n </div>\r\n <FormattedMessage id='layerpicker.title' />\r\n <Tooltip title={intl.formatMessage({ id: 'layerpicker.reset' })} enterDelay={tooltipDelay} placement='left'>\r\n <IconButton className={classes.collapseButton} onClick={handleReset}>\r\n <VerticalAlignCenterOutlined />\r\n </IconButton>\r\n </Tooltip>\r\n </ListSubheader>\r\n }\r\n className={classes.list}\r\n style={{ display: props.visible ? '' : 'none' }}\r\n >\r\n <div className={classes.groups}>\r\n {groups}\r\n </div>\r\n </List>\r\n {graphs.length > 0 && (\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={classes.nestedListSubheader} id='nested-list-subheader'>\r\n <FormattedMessage id='layerpicker.graphs' />\r\n <div className={classes.nestedListSubheaderIcon}>\r\n <ShowChart />\r\n </div>\r\n </ListSubheader>\r\n }\r\n className={classes.graphs}\r\n style={{ display: props.visible ? '' : 'none' }}\r\n >\r\n {graphs}\r\n </List>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nLayerPicker.defaultProps = defaultProps\r\n\r\nexport default LayerPicker\r\n","import { createMuiTheme } from '@material-ui/core'\r\nimport { FC } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { RootState } from 'src/Store'\r\nimport { getThemeOptionsByDataTheme } from 'src/Themes'\r\n\r\n/**\r\n * LeftSideBarIconProps contains properties for the component.\r\n */\r\nexport interface LeftSideBarIconProps {\r\n icon: LeftSideBarIconType\r\n selected: boolean\r\n disabled: boolean\r\n}\r\n\r\nexport enum LeftSideBarIconType {\r\n 'Profile',\r\n 'VirtualBorehole'\r\n}\r\n\r\n/**\r\n * LeftSideBarIcon display an SVG icon.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const LeftSideBarIcon: FC<LeftSideBarIconProps> = (props: LeftSideBarIconProps) => {\r\n const currentDataTheme: DataTheme = useSelector((state: RootState): DataTheme => state.generalState.dataTheme)\r\n const theme = createMuiTheme(getThemeOptionsByDataTheme(currentDataTheme))\r\n const color = props.selected ? theme.palette.primary.main : (props.disabled ? theme.palette.geoColors.contextBar.dark : theme.palette.common.white)\r\n const strokeWidth = props.selected ? 6 : 0\r\n return (\r\n <>\r\n {props.icon === LeftSideBarIconType.Profile && (\r\n <svg width='24' height='24' viewBox='0 0 256 256' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n <path fillRule='evenodd' clipRule='evenodd' d='M126.054 55.4734C123.532 55.7395 120.939 55.8782 118.294 55.8782C117.382 55.8782 116.476 55.8617 115.577 55.8292L57.5449 204.941C76.826 207.958 90.9953 218.039 90.9953 230.01C90.9953 244.364 70.6253 256 45.4976 256C20.37 256 0 244.364 0 230.01C0 215.656 20.37 204.02 45.4976 204.02C45.5969 204.02 45.6961 204.02 45.7953 204.021C45.8965 204.021 45.9976 204.022 46.0987 204.023L104.28 54.5277C86.0095 50.8991 72.7962 40.3667 72.7962 27.9391C72.7962 12.5088 93.1662 0 118.294 0C143.421 0 163.791 12.5088 163.791 27.9391C163.791 38.9245 153.467 48.429 138.452 52.9933L199.03 123.048C202.695 122.463 206.54 122.152 210.502 122.152C235.63 122.152 256 134.661 256 150.091C256 165.522 235.63 178.03 210.502 178.03C185.375 178.03 165.005 165.522 165.005 150.091C165.005 139.907 173.879 130.995 187.138 126.113L126.054 55.4734Z' fill={color} stroke='white' strokeWidth={strokeWidth} />\r\n </svg>\r\n )}\r\n {props.icon === LeftSideBarIconType.VirtualBorehole && (\r\n <svg width='24' height='24' viewBox='0 0 109 259' fill='none' xmlns='http://www.w3.org/2000/svg'>\r\n <path d='M68.399 100.31V120.827C68.399 120.827 156.869 151.597 68.399 161.444V178.411C68.3754 179.405 68.6497 180.383 69.1855 181.215C69.7214 182.047 70.4933 182.694 71.399 183.069C85.879 188.562 144.729 212.975 72.399 222.11C71.2609 222.29 70.2267 222.887 69.4902 223.787C68.7538 224.688 68.3658 225.831 68.399 227.002V231.926C68.4022 232.875 68.1498 233.808 67.669 234.621L56.909 252.768C56.7883 252.991 56.6124 253.178 56.3987 253.31C56.1851 253.442 55.9411 253.514 55.6912 253.521C55.4413 253.527 55.1942 253.466 54.9744 253.345C54.7547 253.224 54.5701 253.046 54.439 252.829L41.169 232.546C40.6177 231.691 40.3256 230.69 40.329 229.668V200.067C40.3622 198.896 39.9742 197.753 39.2377 196.852C38.5013 195.951 37.467 195.354 36.329 195.174C-45.431 184.85 40.329 155.025 40.329 155.025V134.457C-38.671 125.658 23.419 100.177 37.609 94.7863C38.4125 94.4465 39.0975 93.8694 39.5752 93.1296C40.053 92.3897 40.3016 91.5212 40.289 90.6361V28.8205C40.3297 27.6957 39.9324 26.6 39.1834 25.7715C38.4344 24.9429 37.3943 24.4485 36.289 24.3957H10.099C8.99364 24.3429 7.95349 23.8485 7.2045 23.0199C6.45551 22.1914 6.05822 21.0957 6.09896 19.9709V5.43501C6.05552 4.30848 6.4516 3.21014 7.20087 2.37939C7.95014 1.54864 8.99185 1.05282 10.099 1H95.359C96.4652 1.05543 97.5053 1.55203 98.2541 2.38219C99.0028 3.21235 99.3998 4.30918 99.359 5.43501V19.9709C99.3997 21.0957 99.0024 22.1914 98.2534 23.0199C97.5044 23.8485 96.4643 24.3429 95.359 24.3957H72.429C71.3236 24.4485 70.2835 24.9429 69.5345 25.7715C68.7855 26.6 68.3882 27.6957 68.429 28.8205V56.4478C68.4114 57.3445 68.6621 58.2254 69.1479 58.9738C69.6336 59.7222 70.3315 60.3028 71.149 60.6387C85.289 66.0299 147.399 91.5109 68.399 100.31Z' fill={color} strokeMiterlimit='10' stroke='white' strokeWidth={strokeWidth} />\r\n <path d='M28.1089 232.892L47.6689 252.097' stroke='#CDCCCC' strokeWidth='3' strokeMiterlimit='10' strokeLinecap='round' />\r\n <path d='M35.8691 252.717L41.6791 256.064' stroke='#CDCCCC' strokeWidth='3' strokeMiterlimit='10' strokeLinecap='round' />\r\n <path d='M19.7588 242.494L28.8388 248.353' stroke='#CDCCCC' strokeWidth='3' strokeMiterlimit='10' strokeLinecap='round' />\r\n <path d='M80.6191 233.838L61.0591 253.043' stroke='#CDCCCC' strokeWidth='3' strokeMiterlimit='10' strokeLinecap='round' />\r\n <path d='M72.8588 253.664L67.0488 257' stroke='#CDCCCC' strokeWidth='3' strokeMiterlimit='10' strokeLinecap='round' />\r\n <path d='M88.9691 243.441L79.8892 249.29' stroke='#CDCCCC' strokeWidth='3' strokeMiterlimit='10' strokeLinecap='round' />\r\n </svg>\r\n )}\r\n </>\r\n )\r\n}\r\n","import { FC, useEffect } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { Transition, TransitionStatus } from 'react-transition-group'\r\n\r\nimport { IconButton, Tooltip } from '@material-ui/core'\r\n\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faMousePointer, faChevronCircleLeft, faChevronCircleRight, faCubes } from '@fortawesome/free-solid-svg-icons'\r\n\r\nimport { sidebarAnimationDuration, leftSidebarWidth as sidebarWidth, tooltipDelay } from 'src/Constants'\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { profileActions } from 'src/actions/ProfileActions'\r\nimport { leftSideBarStyle } from './LeftSideBar.style'\r\nimport LayerPicker from '../layerpicker/LayerPicker'\r\nimport { RootState } from 'src/Store'\r\nimport { ToolType } from 'src/Enums'\r\nimport { infoMenuActions } from 'src/actions/InfoMenuActions'\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport { boreholeInfoActions } from 'src/actions/BoreholeInfoActions'\r\nimport { virtualBoreholeInfoActions } from 'src/actions/VirtualBoreholeInfoActions'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { InfoView } from 'src/reducers/InfoMenuReducer'\r\n\r\nimport { LeftSideBarIcon, LeftSideBarIconType } from './leftsidebaricon/LeftSideBarIcon'\r\nimport { getBarStyle, getBarTransitionStyle } from 'src/utils/Utils'\r\n\r\nexport interface LeftSideBarProps {\r\n open: boolean\r\n}\r\n\r\nconst defaultProps: LeftSideBarProps = {\r\n open: true\r\n}\r\n\r\n/**\r\n * LeftSideBar React component.\r\n * @param {object} props React properties object.\r\n * The following properties are implemented:\r\n * open {boolean}: If true the component will be open initially.\r\n * @returns React view component.\r\n */\r\nexport const LeftSideBar: FC<LeftSideBarProps> = (props: LeftSideBarProps) => {\r\n const classes = leftSideBarStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n\r\n const showLeftSideBar = useSelector((state: RootState): boolean => state.generalState.showLeftSideBar)\r\n const selectedTool = useSelector((state: RootState): ToolType => state.generalState.selectedTool)\r\n const selectedGeoModel = useSelector((state: RootState): GeoModel | undefined => state.generalState.selectedGeoModel)\r\n const username = useSelector((state: RootState): string => state.authState.username)\r\n\r\n // Styles for sidebar in different transitions\r\n const sidebarStyle = getBarStyle(sidebarAnimationDuration)\r\n const sidebarTransitionStyles = getBarTransitionStyle(sidebarWidth)\r\n\r\n /**\r\n * If not geo model is selected default to info tool.\r\n */\r\n useEffect(() => {\r\n if (selectedGeoModel === undefined) {\r\n dispatch(generalActions.setSelectedTool(ToolType.INFO))\r\n }\r\n // eslint-disable-next-line\r\n }, [selectedGeoModel])\r\n\r\n /**\r\n * When toggle button is clicked the sidebar is toggled.\r\n */\r\n const toggleSideBarClicked = (): void => {\r\n dispatch(generalActions.setShowLeftSideBar(!showLeftSideBar))\r\n }\r\n\r\n /**\r\n * Handle when the info tool button is clicked.\r\n */\r\n const infoToolClicked = (): void => {\r\n dispatch(boreholeInfoActions.clearState())\r\n dispatch(profileActions.clearState())\r\n dispatch(virtualBoreholeInfoActions.clearState())\r\n dispatch(infoMenuActions.currentView(InfoView.Empty))\r\n dispatch(generalActions.setSelectedTool(ToolType.INFO))\r\n dispatch(generalActions.setSelectedGraph(undefined))\r\n }\r\n\r\n /**\r\n * Handle when the profile tool button is clicked.\r\n */\r\n const profileToolClicked = (): void => {\r\n if (selectedTool === ToolType.PROFILE) {\r\n return\r\n }\r\n dispatch(boreholeInfoActions.clearState())\r\n dispatch(profileActions.clearState())\r\n dispatch(virtualBoreholeInfoActions.clearState())\r\n dispatch(generalActions.setSelectedGraph(undefined))\r\n dispatch(infoMenuActions.currentView(InfoView.Empty))\r\n dispatch(wikiActions.clearViews())\r\n dispatch(generalActions.setSelectedTool(ToolType.PROFILE))\r\n }\r\n\r\n /**\r\n * Handle when the virtual borehole tool button is clicked.\r\n */\r\n const virtualBoreholeToolClicked = (): void => {\r\n if (selectedGeoModel === undefined) {\r\n return\r\n }\r\n if (selectedTool === ToolType.VIRTUAL_BOREHOLE) {\r\n return\r\n }\r\n\r\n dispatch(boreholeInfoActions.clearState())\r\n dispatch(profileActions.clearState())\r\n dispatch(virtualBoreholeInfoActions.clearState())\r\n dispatch(generalActions.setSelectedGraph(undefined))\r\n dispatch(infoMenuActions.currentView(InfoView.Empty))\r\n dispatch(wikiActions.clearViews())\r\n dispatch(generalActions.setSelectedTool(ToolType.VIRTUAL_BOREHOLE))\r\n }\r\n\r\n /**\r\n * Handler for the 3D view tool button.\r\n */\r\n const _3dViewClicked = (): void => {\r\n // Updated the selected tool.\r\n const selectTool = selectedTool !== ToolType._3D_VIEW\r\n if (selectTool) {\r\n dispatch(generalActions.setSelectedTool(ToolType._3D_VIEW))\r\n\r\n // Close profile tool.\r\n dispatch(profileActions.clearState())\r\n // Close info view on right hand side.\r\n dispatch(infoMenuActions.currentView(InfoView.Empty))\r\n dispatch(wikiActions.clearViews())\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <Transition in={showLeftSideBar} timeout={0}>\r\n {(state: TransitionStatus) => (\r\n <div\r\n className={classes.root}\r\n style={{ ...sidebarStyle, ...sidebarTransitionStyles[state] }}\r\n >\r\n <LayerPicker visible={showLeftSideBar} />\r\n <div className={classes.tools}>\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'tools.' + (showLeftSideBar ? 'hide' : 'show') + '.sidebar' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton\r\n size='medium'\r\n className={classes.tool}\r\n onClick={toggleSideBarClicked}\r\n >\r\n {showLeftSideBar && <FontAwesomeIcon icon={faChevronCircleLeft} />}\r\n {!showLeftSideBar && <FontAwesomeIcon icon={faChevronCircleRight} />}\r\n </IconButton>\r\n </Tooltip>\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'tools.info' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton\r\n size='medium'\r\n onClick={infoToolClicked}\r\n className={selectedTool === ToolType.INFO ? classes.toolSelected : classes.tool}\r\n >\r\n <FontAwesomeIcon icon={faMousePointer} />\r\n </IconButton>\r\n </Tooltip>\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'tools.profile' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton\r\n size='medium'\r\n onClick={profileToolClicked}\r\n >\r\n <LeftSideBarIcon icon={LeftSideBarIconType.Profile} selected={selectedTool === ToolType.PROFILE} disabled={false} />\r\n </IconButton>\r\n </Tooltip>\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'tools.virtualborehole' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton\r\n size='medium'\r\n onClick={virtualBoreholeToolClicked}\r\n >\r\n <LeftSideBarIcon icon={LeftSideBarIconType.VirtualBorehole} selected={selectedTool === ToolType.VIRTUAL_BOREHOLE} disabled={selectedGeoModel === undefined} />\r\n </IconButton>\r\n </Tooltip>\r\n {username === 'geoatlas@alexandra.dk' && (\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'tools._3dview' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton\r\n size='medium'\r\n onClick={_3dViewClicked}\r\n className={selectedTool === ToolType._3D_VIEW ? classes.toolSelected : classes.tool}\r\n >\r\n <FontAwesomeIcon icon={faCubes} />\r\n </IconButton>\r\n </Tooltip>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </Transition>\r\n </>\r\n )\r\n}\r\n\r\nLeftSideBar.defaultProps = defaultProps\r\n\r\nexport default LeftSideBar\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const loginDialogStyle = makeStyles(theme => ({\r\n root: {\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none'\r\n }\r\n },\r\n username: {\r\n width: '100%',\r\n marginTop: theme.spacing(1)\r\n },\r\n password: {\r\n width: '100%',\r\n marginTop: theme.spacing(1)\r\n },\r\n errorContainer: {\r\n height: theme.spacing(2.25)\r\n },\r\n errorText: {\r\n fontSize: 12,\r\n color: '#DE4035'\r\n },\r\n title: {\r\n paddingBottom: 0\r\n },\r\n actionsContainer: {\r\n marginTop: 16\r\n }\r\n}))\r\n","import { useState, FC, KeyboardEvent } from 'react'\r\nimport { Dialog, DialogContent, DialogTitle, TextField, Button, DialogActions, Typography, Box } from '@material-ui/core'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { authActions } from '../../actions/AuthAction'\r\nimport { loginDialogStyle } from './LoginDialog.style'\r\nimport { RootState } from '../../Store'\r\nimport { FormattedMessage, useIntl } from 'react-intl'\r\nexport interface LoginDialogProps {\r\n open: boolean\r\n}\r\n\r\nexport const LoginDialog: FC<LoginDialogProps> = (props: LoginDialogProps) => {\r\n const classes = loginDialogStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n\r\n const isLoggedIn = useSelector((state: RootState): boolean => state.authState.isLoggedIn)\r\n const loginInProgress = useSelector((state: RootState): boolean => state.authState.loginInProgress)\r\n const isError = useSelector((state: RootState): boolean => state.authState.isLoginError)\r\n const [username, setUsername] = useState<string>('')\r\n const [password, setPassword] = useState<string>('')\r\n\r\n const submit = (): void => {\r\n dispatch(authActions.login({username: username, password: password}));\r\n }\r\n\r\n const handleKeyPress = (e: KeyboardEvent<HTMLDivElement>): void => {\r\n if (e.key === 'Enter') {\r\n submit()\r\n }\r\n }\r\n\r\n return (\r\n <Dialog open={!isLoggedIn}>\r\n <DialogTitle className={classes.title}><FormattedMessage id='login.title' /></DialogTitle>\r\n <DialogContent>\r\n <Box className={classes.errorContainer}>\r\n {isError && (\r\n <Typography className={classes.errorText}><FormattedMessage id='login.error' /></Typography>\r\n )}\r\n </Box>\r\n <TextField\r\n required\r\n variant='standard'\r\n placeholder={intl.formatMessage({ id: 'login.username' })}\r\n onChange={event => setUsername(event.target.value)}\r\n onKeyPress={handleKeyPress}\r\n autoFocus\r\n value={username}\r\n error={isError}\r\n className={classes.username}\r\n />\r\n <TextField\r\n required\r\n variant='standard'\r\n placeholder={intl.formatMessage({ id: 'login.password' })}\r\n type='password'\r\n onChange={event => setPassword(event.target.value)}\r\n onKeyPress={handleKeyPress}\r\n value={password}\r\n error={isError}\r\n className={classes.password}\r\n />\r\n </DialogContent>\r\n <DialogActions className={classes.actionsContainer}>\r\n <Button\r\n disabled={loginInProgress}\r\n variant='contained'\r\n color='primary'\r\n onClick={submit}\r\n >\r\n <FormattedMessage id='login.submit' />\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n )\r\n}\r\n\r\nexport default LoginDialog\r\n","import { makeStyles, Theme } from '@material-ui/core/styles'\r\nimport {\r\n leftSidebarWidth,\r\n leftSidebarToolsWidth,\r\n headerHeight\r\n} from '../../Constants'\r\n\r\nexport interface OpenLayersMapStyleProps {\r\n bottomBarOpen: boolean\r\n bottomBarHeight: number\r\n rightSideBarWidth: number\r\n}\r\n\r\nexport const openLayersMapStyle = makeStyles<Theme, OpenLayersMapStyleProps>(theme => ({\r\n root: {\r\n display: 'flex',\r\n height: `calc(100vh - ${headerHeight}px)`,\r\n background: theme.palette.common.white,\r\n '& .ol-rotate': {\r\n backgroundColor: '#00000000',\r\n top: theme.spacing(3),\r\n right: theme.spacing(3)\r\n },\r\n '& .ol-rotate-reset': {\r\n backgroundColor: '#00000000',\r\n color: '#00000000',\r\n '&:hover': {\r\n backgroundColor: '#00000000'\r\n },\r\n '&:focus': {\r\n backgroundColor: '#00000000'\r\n }\r\n },\r\n '& .ol-zoom': {\r\n backgroundColor: `${theme.palette.primary.main}6d`,\r\n top: 'auto',\r\n left: 'auto',\r\n right: theme.spacing(3),\r\n bottom: theme.spacing(4),\r\n '@media(-webkit-min-device-pixel-ratio: 2)': {\r\n bottom: theme.spacing(8)\r\n }\r\n },\r\n '& .ol-zoom button': {\r\n width: 30,\r\n height: 30\r\n },\r\n '& .ol-zoom-in': {\r\n cursor: 'pointer',\r\n backgroundColor: theme.palette.primary.main,\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main\r\n },\r\n '&:focus': {\r\n backgroundColor: theme.palette.primary.main\r\n },\r\n '&:active': {\r\n backgroundColor: theme.palette.primary.light\r\n }\r\n },\r\n '& .ol-zoom-out': {\r\n cursor: 'pointer',\r\n backgroundColor: theme.palette.primary.main,\r\n '&:hover': {\r\n backgroundColor: theme.palette.primary.main\r\n },\r\n '&:focus': {\r\n backgroundColor: theme.palette.primary.main\r\n },\r\n '&:active': {\r\n backgroundColor: theme.palette.primary.light\r\n }\r\n },\r\n '& .ol-scale-line': {\r\n left: leftSidebarToolsWidth + theme.spacing(3),\r\n bottom: theme.spacing(4),\r\n backgroundColor: theme.palette.primary.main,\r\n border: `solid ${theme.palette.primary.main}8d`,\r\n backgroundClip: 'padding-box',\r\n '@media(-webkit-min-device-pixel-ratio: 2)': {\r\n bottom: theme.spacing(8)\r\n }\r\n }\r\n },\r\n bottomBarOpen: {\r\n '& .ol-zoom': {\r\n bottom: props => props.bottomBarHeight + theme.spacing(4.5),\r\n '@media(-webkit-min-device-pixel-ratio: 2)': {\r\n bottom: props => props.bottomBarHeight + theme.spacing(9)\r\n }\r\n },\r\n '& .ol-scale-line': {\r\n bottom: props => props.bottomBarHeight + theme.spacing(4.5),\r\n '@media(-webkit-min-device-pixel-ratio: 2)': {\r\n bottom: props => props.bottomBarHeight + theme.spacing(9)\r\n }\r\n },\r\n '& #mousePositionWrapper': {\r\n bottom: props => props.bottomBarHeight + theme.spacing(0.8)\r\n },\r\n '& #copyrightWrapper': {\r\n bottom: props => props.bottomBarHeight + theme.spacing(0.8)\r\n }\r\n },\r\n bottomBarClosed: {\r\n '& #mousePositionWrapper': {\r\n bottom: 0\r\n },\r\n '& #copyrightWrapper': {\r\n bottom: 0\r\n }\r\n },\r\n leftSideBarOpen: {\r\n '& .ol-scale-line': {\r\n left: leftSidebarWidth + leftSidebarToolsWidth + theme.spacing(3)\r\n },\r\n '& #copyrightWrapper': {\r\n left: leftSidebarWidth + leftSidebarToolsWidth + theme.spacing(3)\r\n }\r\n },\r\n leftSideBarClosed: {\r\n '& #copyrightWrapper': {\r\n left: theme.spacing(10)\r\n }\r\n },\r\n rightSideBarOpen: {\r\n '& .ol-rotate': {\r\n right: props => props.rightSideBarWidth + theme.spacing(3)\r\n },\r\n '& .ol-zoom': {\r\n right: props => props.rightSideBarWidth + theme.spacing(3)\r\n },\r\n '& #mousePositionWrapper': {\r\n right: props => props.rightSideBarWidth + theme.spacing(3)\r\n }\r\n },\r\n rightSideBarClosed: {\r\n '& #mousePositionWrapper': {\r\n right: theme.spacing(3)\r\n }\r\n },\r\n northIcon: {\r\n height: theme.spacing(4),\r\n cursor: 'pointer'\r\n },\r\n copyrightWrapper: {\r\n position: 'absolute',\r\n paddingTop: theme.spacing(0.5),\r\n paddingRight: theme.spacing(1),\r\n paddingLeft: theme.spacing(1),\r\n paddingBottom: theme.spacing(0.5),\r\n backgroundColor: theme.palette.common.white,\r\n borderRadius: 2,\r\n zIndex: 500\r\n },\r\n copyrightItem: {\r\n marginRight: theme.spacing(1),\r\n textDecoration: 'none',\r\n color: theme.palette.common.black\r\n },\r\n copyright: {\r\n fontSize: 9,\r\n margin: 0,\r\n padding: 0,\r\n color: theme.palette.common.white\r\n },\r\n mousePositionWrapper: {\r\n position: 'absolute',\r\n minWidth: theme.spacing(28.125),\r\n paddingTop: theme.spacing(0.5),\r\n paddingRight: theme.spacing(1),\r\n paddingLeft: theme.spacing(1),\r\n paddingBottom: theme.spacing(0.5),\r\n backgroundColor: theme.palette.common.white,\r\n borderRadius: 2,\r\n zIndex: 500\r\n },\r\n mousePosition: {\r\n fontSize: 10,\r\n margin: 0,\r\n padding: 0\r\n },\r\n mousePositionCoordinateSystem: {\r\n position: 'absolute',\r\n top: theme.spacing(0.5),\r\n right: theme.spacing(1)\r\n }\r\n}))\r\n","import { useEffect, useRef, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport * as ol from 'openlayers'\r\nimport 'ol/ol.css'\r\nimport { DrawEvent } from 'ol/src/interaction/Draw'\r\nimport { SelectEvent } from 'ol/src/interaction/Select'\r\nimport proj4 from 'proj4'\r\n\r\nimport { featureCollection, lineString } from 'turf'\r\n\r\nimport { GeoLayer } from '../../dataSources/layers/Layer'\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport {\r\n addLayerByType,\r\n removeLayerByType,\r\n getGeoLayerByType,\r\n LayerParams,\r\n LayerCapabilities,\r\n LayerType,\r\n getLayerDescriptionForType,\r\n LayerCopyright,\r\n LayerConstructionOptions\r\n} from '../../dataSources/layers/LayerRegistry'\r\nimport { RootState } from '../../Store'\r\nimport { DataTheme, ToolType } from 'src/Enums'\r\nimport { getLayerCapabilities, getSubLayersFromCapabilities } from 'src/utils/MapLayerUtils'\r\nimport { numberToDecimalString, rgbToHex } from 'src/utils/Utils'\r\n\r\nimport { ColorInFocus, mapActions } from 'src/actions/MapActions'\r\nimport { profileActions } from 'src/actions/ProfileActions'\r\nimport { getLayerCapabilitiesFromType, getLayerParamsFromType } from 'src/reducers/MapReducer'\r\nimport { ProfileView, ProfileSetting } from 'src/reducers/ProfileReducer'\r\nimport { ProfileObject } from 'src/dataSources/geo/CrossSection'\r\n\r\nimport { openLayersMapStyle, OpenLayersMapStyleProps } from './OpenLayersMap.style'\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { getThemeOptionsByDataTheme } from 'src/Themes'\r\nimport { createMuiTheme } from '@material-ui/core'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { infoMenuActions } from 'src/actions/InfoMenuActions'\r\nimport { InfoView } from 'src/reducers/InfoMenuReducer'\r\nimport { toLonLat } from 'ol/proj'\r\nimport { getDistance } from 'ol/sphere'\r\nimport { Graph } from 'src/dataSources/graphs/GraphRegistry'\r\nimport { Extent } from 'openlayers'\r\nimport { WikiLocation } from 'src/dataSources/wiki/Wiki'\r\n\r\nlet olMap: any = null\r\nlet olMapMoveEndListener: any = null\r\nlet olPointerMoveListener: any = null\r\nlet olMapClickListener: any = null\r\nconst profileToolLineSource: ol.source.Vector = new ol.source.Vector()\r\nconst profileToolPointSource: ol.source.Vector = new ol.source.Vector()\r\nconst profileToolLineBufferSource: ol.source.Vector = new ol.source.Vector()\r\nconst profileToolLineLayer: ol.layer.Vector = new ol.layer.Vector()\r\nconst profileToolPointLayer: ol.layer.Vector = new ol.layer.Vector()\r\nconst profileToolLineBufferLayer: ol.layer.Vector = new ol.layer.Vector()\r\nlet lastZoomLevel = 15\r\nlet olDraw: ol.interaction.Draw\r\nlet olModify: ol.interaction.Modify\r\nlet olSnap: ol.interaction.Snap\r\nlet olSelect: ol.interaction.Select\r\n\r\ninterface Props {\r\n zoomLevel: number\r\n layerTypes: LayerType[]\r\n onLeftClick: (coord: number[]) => void\r\n}\r\n\r\nconst defaultProps = {\r\n zoomLevel: lastZoomLevel,\r\n layerTypes: [],\r\n onLeftClick: (coord: number[]): void => { }\r\n}\r\n\r\n/**\r\n * OpenLayersMap React component.\r\n * @param {object} props React properties object.\r\n * The following properties are implemented:\r\n * zoomLevel {number}: The initial zoom level if the map component.\r\n * layers {array}: The layers to add to the map. Must all be subclasses\r\n * of the @see Layer class.\r\n * @returns React view components.\r\n */\r\nfunction OpenLayersMap (props: Props): JSX.Element {\r\n const dispatch = useDispatch()\r\n\r\n const mapDiv: any = useRef()\r\n const [map, setMap] = useState<ol.Map | undefined>()\r\n const [currentMouseCoordinates, setCurrentMouseCoordinates] = useState<number[]>([0, 0])\r\n const [layerCopyrightMap, setLayerCopyrightMap] = useState<Map<string, LayerCopyright>>(new Map())\r\n\r\n const mapCenter = useSelector((state: RootState): ol.Coordinate => state.mapState.mapCenter)\r\n const mapCurrentZoom = useSelector((state: RootState): number => state.mapState.mapCurrentZoom)\r\n const profileCoordinates = useSelector((state: RootState): ol.Coordinate[] | undefined => state.profileState.coordinates)\r\n const crosshairDistance = useSelector((state: RootState): number | undefined => state.profileState.crosshairDistance)\r\n const currentDataTheme: DataTheme = useSelector((state: RootState): DataTheme => state.generalState.dataTheme)\r\n const layerParams = useSelector((state: RootState): LayerParams[] => state.mapState.layerParams)\r\n const modifiedLayer = useSelector((state: RootState): LayerType|undefined => state.mapState.modifiedLayer)\r\n const layerCapabilities = useSelector((state: RootState): LayerCapabilities[] => state.mapState.layerCapabilities)\r\n const maxBoreholeDistance = useSelector((state: RootState): number => state.profileState.maxBoreholeDistance)\r\n const enabledProfileSettings = useSelector((state: RootState): ProfileSetting[] => state.profileState.enabledSettings)\r\n const models = useSelector((state: RootState): GeoModel[] | undefined => state.generalState.geoModels)\r\n const poi = useSelector((state: RootState): WikiLocation[] | undefined => state.wikiState.poi)\r\n const selectedGeoModel = useSelector((state: RootState): GeoModel | undefined => state.generalState.selectedGeoModel)\r\n const selectedProfile = useSelector((state: RootState): ProfileObject | undefined => state.profileState.selectedProfile)\r\n const selectedTool = useSelector((state: RootState): ToolType => state.generalState.selectedTool)\r\n const tokenSelector = useSelector((state: RootState) => state.authState.token)\r\n const bottomBarHeight = useSelector((state: RootState) => state.generalState.bottomBarHeight)\r\n const showLeftSideBar = useSelector((state: RootState): boolean => state.generalState.showLeftSideBar)\r\n const showWikiSideBar = useSelector((state: RootState): boolean => state.wikiState.showWikiSideBar)\r\n const currentInfoView = useSelector((state: RootState): InfoView => state.infoMenuState.currentView)\r\n const rightSideBarOpen: boolean = showWikiSideBar || currentInfoView !== InfoView.Empty\r\n const rightSideBarWidth = useSelector((state: RootState): number => state.generalState.rightSideBarWidth)\r\n const currentBottomView = useSelector((state: RootState): ProfileView => state.profileState.currentView)\r\n const selectedGraph = useSelector((state: RootState): Graph | undefined => state.generalState.selectedGraph)\r\n const colorsInFocus = useSelector((state: RootState): ColorInFocus[] => state.mapState.colorsInFocus)\r\n\r\n const bottomBarOpen: boolean = selectedGraph !== undefined || currentBottomView !== ProfileView.Empty\r\n\r\n const olmsProps: OpenLayersMapStyleProps = {\r\n bottomBarOpen: bottomBarOpen,\r\n bottomBarHeight: bottomBarHeight,\r\n rightSideBarWidth: rightSideBarWidth\r\n }\r\n const classes = openLayersMapStyle(olmsProps)\r\n\r\n /**\r\n * Adds layers to the map.\r\n * If a layer needs capabilities, these are fetched from the supplied capabilitiesUrl.\r\n */\r\n const addLayers = async (layersToAdd: LayerType[]): Promise<void> => {\r\n const copyrightMap = new Map()\r\n const geoLayerPromises = layersToAdd.map(async layerType => {\r\n const layerDescription = getLayerDescriptionForType(layerType)\r\n\r\n copyrightMap.set(layerDescription.layerCopyright.name, layerDescription.layerCopyright)\r\n\r\n let params = getLayerParamsFromType(layerType, layerParams)\r\n params = params !== undefined ? params : {}\r\n const options: LayerConstructionOptions = {\r\n token: tokenSelector,\r\n selectedGeoModel: selectedGeoModel !== undefined ? selectedGeoModel.ID : '',\r\n geoModels: models,\r\n capabilities: getLayerCapabilitiesFromType(layerType, layerCapabilities),\r\n params: params,\r\n poi: poi\r\n }\r\n\r\n if (layerDescription.capabilitiesUrl !== '' && options.capabilities === undefined) {\r\n const capabilities = await getLayerCapabilities(layerType, layerDescription.capabilitiesUrl, layerCapabilities)\r\n if (capabilities !== undefined) {\r\n options.capabilities = capabilities\r\n\r\n const subLayers = getSubLayersFromCapabilities(capabilities)\r\n if (params.subLayers !== undefined) {\r\n params.subLayers.list = subLayers\r\n if (subLayers.length > 0) {\r\n params.subLayers.selected.subLayer = subLayers[0]\r\n }\r\n }\r\n\r\n dispatch(mapActions.setLayerCapabilities({\r\n type: layerType,\r\n capabilities: capabilities\r\n }))\r\n dispatch(mapActions.setLayerParams({\r\n layerType: layerType,\r\n params: params\r\n }))\r\n }\r\n }\r\n return addLayerByType(layerType, options)\r\n })\r\n\r\n const geoLayers = await Promise.all(geoLayerPromises)\r\n \r\n // Add layers\r\n const currentZoomLevel = olMap.getView().getZoom()\r\n for (const layer of geoLayers) {\r\n const olLayer = layer.olLayer\r\n if (currentZoomLevel < layer.getMinimumZoom()) {\r\n olLayer.setVisible(false)\r\n }\r\n olMap.addLayer(olLayer)\r\n }\r\n\r\n // Make sure we have the interaction we need for the feature layers.\r\n enableFeatureLayerInteraction()\r\n\r\n // Update copyright info.\r\n setLayerCopyrightMap(copyrightMap)\r\n }\r\n\r\n const removeLayers = (layersToRemove: LayerType[]): boolean => {\r\n // Remove layers from the actual map component.\r\n const layers = olMap\r\n .getLayers()\r\n .getArray()\r\n .filter((l: ol.layer.Layer) => layersToRemove.some(x => x === l.get('geo_type')))\r\n for (const l of layers) {\r\n olMap.removeLayer(l)\r\n }\r\n\r\n // Remove layers from the registry's list of active layers.\r\n // This is mostly just a resource consumption issue - keep unused layers out of memory.\r\n let didRemoveLayer = false\r\n for (const l of layersToRemove) {\r\n if (removeLayerByType(l)) {\r\n didRemoveLayer = true\r\n }\r\n }\r\n\r\n // Handle interaction for the model area layer if removed.\r\n if (layersToRemove.some(l => l === LayerType.MODEL_AREAS)) {\r\n clearFeatureLayerInteractions()\r\n }\r\n\r\n return didRemoveLayer\r\n }\r\n\r\n /**\r\n * Calculates a buffer for input features for a given radius. Units supported are miles, kilometers, and degrees.\r\n * Adopted from Turf.js.\r\n * @param feature Input to be buffered\r\n * @param radius Radius to draw the buffer\r\n * @param units 'miles', 'kilometers', 'radians', or 'degrees'\r\n * @returns Buffered features\r\n */\r\n const buffer = (feature: GeoJSON.FeatureCollection<any, GeoJSON.GeoJsonProperties>, radius: number, units: typeof TemplateUnits): GeoJSON.FeatureCollection<GeoJSON.Polygon> | undefined => {\r\n // eslint-disable-next-line\r\n const helpers = require('turf-helpers')\r\n // eslint-disable-next-line\r\n const normalize = require('geojson-normalize')\r\n\r\n const featureCollection = helpers.featureCollection\r\n const degrees = helpers.distanceToDegrees(radius, units)\r\n const fc = normalize(feature)\r\n const buffered = normalize(featureCollection(fc.features.map(function (f: any) {\r\n return bufferOp(f, degrees)\r\n })))\r\n\r\n if (buffered.features.length > 1) return buffered\r\n else if (buffered.features.length === 1) return buffered.features[0]\r\n return undefined\r\n }\r\n\r\n /**\r\n * Perform buffer operation with JSTS.\r\n * @param feature Feature to buffer.\r\n * @param radius Radius to draw around the feature.\r\n * @returns Buffered feature.\r\n */\r\n const bufferOp = (feature: any, radius: number): any => {\r\n // eslint-disable-next-line\r\n const jsts = require('jsts')\r\n\r\n const reader = new jsts.io.GeoJSONReader()\r\n const geom = reader.read(feature.geometry)\r\n const writer = new jsts.io.GeoJSONWriter()\r\n let buffered = geom.buffer(radius, jsts.operation.buffer.BufferParameters.DEFAULT_QUADRANT_SEGMENTS, jsts.operation.buffer.BufferParameters.CAP_FLAT)\r\n buffered = writer.write(buffered)\r\n\r\n return {\r\n type: 'Feature',\r\n geometry: buffered,\r\n properties: {}\r\n }\r\n }\r\n\r\n /**\r\n * Clear feature layer interactions.\r\n */\r\n const clearFeatureLayerInteractions = (): void => {\r\n olMap.getInteractions().forEach((interaction: ol.interaction.Interaction) => {\r\n if (interaction instanceof ol.interaction.Select) {\r\n interaction.setActive(false)\r\n olMap.removeInteraction(interaction)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Clear draw, modify and snap interactions on map.\r\n */\r\n const clearProfileToolInteractions = (): void => {\r\n olMap.getInteractions().forEach((interaction: ol.interaction.Interaction) => {\r\n if (interaction instanceof ol.interaction.Draw || interaction instanceof ol.interaction.Modify || interaction instanceof ol.interaction.Snap) {\r\n interaction.setActive(false)\r\n olMap.removeInteraction(interaction)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * Clear any features in the sources.\r\n */\r\n const clearSources = (): void => {\r\n profileToolLineSource.clear()\r\n profileToolPointSource.clear()\r\n profileToolLineBufferSource.clear()\r\n }\r\n\r\n /**\r\n * Disable drawing and modifying tools for profile tool.\r\n */\r\n const disableProfileTool = (): void => {\r\n clearSources()\r\n clearProfileToolInteractions()\r\n }\r\n\r\n /**\r\n * Get map extent of the current viewport.\r\n * @returns Extent object.\r\n */\r\n const getMapExtent = (): Extent => {\r\n return olMap.getView().calculateExtent(olMap.getSize()) as Extent\r\n }\r\n\r\n /**\r\n * Return a style for a given feature.\r\n * @param feature Feature object.\r\n * @param resolution Resolution.\r\n * @returns Style object.\r\n */\r\n const pointStyleFunction = (feature: ol.Feature | ol.render.Feature, resolution: number): (ol.style.Style | ol.style.Style[] | null) => {\r\n const theme = createMuiTheme(getThemeOptionsByDataTheme(currentDataTheme))\r\n return new ol.style.Style({\r\n fill: new ol.style.Fill({\r\n color: 'rgba(255, 255, 255, 1.0)'\r\n }),\r\n stroke: new ol.style.Stroke({\r\n color: theme.palette.primary.main,\r\n width: 4\r\n }),\r\n image: new ol.style.Circle({\r\n radius: 4,\r\n fill: new ol.style.Fill({\r\n color: theme.palette.primary.main\r\n })\r\n }),\r\n text: new ol.style.Text({\r\n font: '23px Calibri,sans-serif',\r\n offsetY: 18,\r\n offsetX: feature.get('name') === 'A\\'' ? 3 : 0,\r\n fill: new ol.style.Fill({ color: '#000' }),\r\n stroke: new ol.style.Stroke({\r\n color: '#fff', width: 4\r\n }),\r\n text: olMap.getView().getZoom() > 9 ? feature.get('name') : ''\r\n })\r\n })\r\n }\r\n\r\n const xStyleFunction = (feature: ol.Feature | ol.render.Feature, resolution: number): (ol.style.Style | ol.style.Style[] | null) => {\r\n return new ol.style.Style({\r\n text: new ol.style.Text({\r\n font: '18px Calibri,sans-serif',\r\n offsetY: 1,\r\n fill: new ol.style.Fill({ color: '#F00' }),\r\n stroke: new ol.style.Stroke({\r\n color: '#fff', width: 2\r\n }),\r\n text: olMap.getView().getZoom() > 9 ? feature.get('name') : ''\r\n })\r\n })\r\n }\r\n\r\n /**\r\n * Enable GeoModel selection by clicking the map\r\n * @param layer the layer with the model features\r\n */\r\n const enableFeatureLayerInteraction = (): void => {\r\n // Clear any existing interaction.\r\n clearFeatureLayerInteractions()\r\n\r\n // Find layers that need this interaction.\r\n const layerTypes = [LayerType.MODEL_AREAS, LayerType.COSTAL_LOCATIONS]\r\n const layers: ol.layer.Layer[] = olMap.getLayers().getArray().filter((l: ol.layer.Layer) => layerTypes.includes(l.get('geo_type')))\r\n\r\n if (layers.length > 0) {\r\n olSelect = new ol.interaction.Select({\r\n layers: layers,\r\n hitTolerance: 5\r\n })\r\n olSelect.on('select', (event) => {\r\n const feature = (event as SelectEvent).selected.find(f => f)\r\n if (feature !== undefined) {\r\n if (feature.get('type') === 'model_area') {\r\n const selectedGeoModel = models?.find(model => model.ID === feature.get('id'))\r\n if (selectedGeoModel !== undefined) {\r\n dispatch(generalActions.setSelectedGeoModel(selectedGeoModel))\r\n }\r\n }\r\n if (feature.get('type') === 'wiki_link') {\r\n dispatch(wikiActions.fetchDocument(feature.get('key')))\r\n }\r\n }\r\n })\r\n olMap.addInteraction(olSelect)\r\n }\r\n }\r\n\r\n /**\r\n * Enable drawing and modifying tools for profile tool.\r\n */\r\n const enableProfileTool = (): void => {\r\n clearSources()\r\n if (profileCoordinates !== undefined) {\r\n profileToolLineSource.addFeature(new ol.Feature({\r\n geometry: new ol.geom.LineString(profileCoordinates),\r\n name: 'Line'\r\n }))\r\n }\r\n\r\n const theme = createMuiTheme(getThemeOptionsByDataTheme(currentDataTheme))\r\n const lineStyle = new ol.style.Style({\r\n fill: new ol.style.Fill({\r\n color: 'rgba(255, 255, 255, 1.0)'\r\n }),\r\n stroke: new ol.style.Stroke({\r\n color: theme.palette.primary.main,\r\n width: 4\r\n }),\r\n image: new ol.style.Circle({\r\n radius: 7,\r\n fill: new ol.style.Fill({\r\n color: theme.palette.primary.main\r\n })\r\n })\r\n })\r\n profileToolLineLayer.setStyle(lineStyle)\r\n profileToolLineLayer.setZIndex(Number.MAX_SAFE_INTEGER)\r\n profileToolLineLayer.setSource(profileToolLineSource)\r\n\r\n if (profileCoordinates !== undefined) {\r\n const showProfileBuffer = enabledProfileSettings.some(enabledSetting => enabledSetting === ProfileSetting.SHOW_PROFILE_BUFFER)\r\n if (showProfileBuffer) {\r\n // Add buffer to profile line\r\n const line = lineString(profileCoordinates)\r\n const format = new ol.format.GeoJSON()\r\n\r\n // For some reason 100000 = 1000 meters\r\n const buffered = buffer(featureCollection([line]), 100000 * ((2 * maxBoreholeDistance) / 1000), 'kilometers')\r\n if (buffered !== undefined) {\r\n const bufferFeature = format.readFeature(buffered)\r\n profileToolLineBufferSource.addFeature(bufferFeature)\r\n const lineStyle = new ol.style.Style({\r\n fill: new ol.style.Fill({\r\n color: 'rgba(255, 255, 255, 0.4)'\r\n }),\r\n stroke: new ol.style.Stroke({\r\n color: theme.palette.primary.main,\r\n width: 0.5\r\n })\r\n })\r\n profileToolLineBufferLayer.setStyle(lineStyle)\r\n profileToolLineBufferLayer.setZIndex(Number.MAX_SAFE_INTEGER - 1)\r\n profileToolLineBufferLayer.setSource(profileToolLineBufferSource)\r\n }\r\n }\r\n\r\n // Draw points of profile\r\n const features = []\r\n let index = 0\r\n for (const coordinate of profileCoordinates) {\r\n features.push(new ol.Feature({\r\n geometry: new ol.geom.Point(coordinate),\r\n name: index === 0 ? 'A' : (index === profileCoordinates.length - 1 ? 'A\\'' : '')\r\n }))\r\n index++\r\n }\r\n\r\n profileToolPointSource.addFeatures(features)\r\n profileToolPointLayer.setStyle(pointStyleFunction)\r\n profileToolPointLayer.setSource(profileToolPointSource)\r\n profileToolPointLayer.setZIndex(Number.MAX_SAFE_INTEGER - 1)\r\n }\r\n\r\n // Clear existing interactions\r\n clearProfileToolInteractions()\r\n\r\n // Create new interactions\r\n olDraw = new ol.interaction.Draw({\r\n source: profileToolLineSource,\r\n type: 'LineString'\r\n })\r\n olDraw.on('drawstart', (event) => {\r\n clearSources()\r\n dispatch(profileActions.currentView(ProfileView.Empty))\r\n })\r\n olDraw.on('drawend', (event) => {\r\n const coordinates: ol.Coordinate[] = (event as DrawEvent).feature.getGeometry().getCoordinates()\r\n dispatch(wikiActions.clearViews())\r\n dispatch(infoMenuActions.currentView(InfoView.Empty))\r\n dispatch(generalActions.setShowLeftSideBar(false))\r\n dispatch(profileActions.setCoordinates(coordinates))\r\n dispatch(profileActions.fetchProfile())\r\n dispatch(profileActions.currentView(ProfileView.Info))\r\n })\r\n olMap.addInteraction(olDraw)\r\n\r\n olSnap = new ol.interaction.Snap({ source: profileToolLineSource })\r\n olMap.addInteraction(olSnap)\r\n\r\n olModify = new ol.interaction.Modify({ source: profileToolLineSource })\r\n olModify.on('modifyend', (event) => {\r\n const features = profileToolLineSource.getFeatures()\r\n features.forEach((feature) => {\r\n const point: ol.geom.Point = feature.getGeometry() as ol.geom.Point\r\n if (point !== undefined) {\r\n // TODO: For some reason the type does not match the actual object returned - this is the only solution I have found\r\n // This object is actually a list of points\r\n const coordinates: ol.Coordinate[] = (point.getCoordinates() as unknown) as ol.Coordinate[]\r\n dispatch(profileActions.setCoordinates(coordinates))\r\n dispatch(profileActions.fetchProfile())\r\n }\r\n })\r\n })\r\n olMap.addInteraction(olModify)\r\n }\r\n\r\n // Helper method for registering the left click handler on the map.\r\n const registerClickListener = (): void => {\r\n // Unregister any existing click listener so we don't end up\r\n // having multiple.\r\n if (olMapClickListener !== null) {\r\n olMap.un('click', olMapClickListener.listener)\r\n }\r\n // Register new click listener.\r\n olMapClickListener = olMap.on('click', (event: ol.MapBrowserEvent) => {\r\n const clickedCoordinate = event.map.getCoordinateFromPixel(event.pixel)\r\n props.onLeftClick(clickedCoordinate)\r\n })\r\n }\r\n\r\n // Helper method for registering the 'moveend' handler on the map.\r\n const registerMoveEndListener = (): void => {\r\n // Handler for map move events.\r\n // Make sure to unregister any existing 'moveend' listener.\r\n if (olMapMoveEndListener !== null) {\r\n olMap.un('moveend', olMapMoveEndListener.listener)\r\n }\r\n // Add new 'moveend' listener.\r\n olMapMoveEndListener = olMap.on('moveend', (event: ol.MapBrowserEvent) => {\r\n const currentZoomLevel = event.map.getView().getZoom()\r\n if (currentZoomLevel !== lastZoomLevel) {\r\n // We need to advise enabled layers that zoom level has changed.\r\n // We find the enabled layers by looking at what is in the map right now.\r\n const layers: LayerType[] = event.map.getLayers().getArray().map(l => l.get('geo_type') as LayerType).filter(x => x !== undefined)\r\n\r\n // Now update the zoom level.\r\n lastZoomLevel = currentZoomLevel\r\n const geoLayers = layers.map(layerType => getGeoLayerByType(layerType))\r\n geoLayers.forEach((layer: GeoLayer) => {\r\n layer.onZoomChange(currentZoomLevel)\r\n })\r\n }\r\n\r\n // Update state\r\n dispatch(mapActions.setMapExtent(getMapExtent()))\r\n dispatch(mapActions.setMapCurrentZoom(currentZoomLevel))\r\n dispatch(mapActions.setMapCenter(event.map.getView().getCenter()))\r\n })\r\n }\r\n\r\n // Helper method for registering the 'pointermove' handler on the map.\r\n const registerPointerMoveListener = (): void => {\r\n // Handler for mouse move events.\r\n // Make sure to unregister any existing 'pointermove' listener.\r\n if (olPointerMoveListener !== null) {\r\n olMap.un('pointermove', olPointerMoveListener.listener)\r\n }\r\n // Add new 'pointermove' listener.\r\n olPointerMoveListener = olMap.on('pointermove', (event: any) => {\r\n setCurrentMouseCoordinates(event.coordinate)\r\n const newColorsInFocus: ColorInFocus[] = []\r\n return;\r\n event.map.forEachLayerAtPixel(event.pixel, (layer: ol.layer.Layer, color: ol.Color) => {\r\n const layerType = layer.get('geo_type') as LayerType\r\n if (layerType !== undefined) {\r\n const layerDescriptor = getLayerDescriptionForType(layerType)\r\n if (layerDescriptor.legendEnabled && color !== null) {\r\n const hexColor = rgbToHex(color[0], color[1], color[2])\r\n newColorsInFocus.push({\r\n layerType: layerType,\r\n color: hexColor\r\n })\r\n }\r\n }\r\n })\r\n \r\n // Dispatch if anything has changed.\r\n if (newColorsInFocus.length !== colorsInFocus.length) {\r\n // New array length -> a change occurred.\r\n dispatch(mapActions.setColorsInFocus(newColorsInFocus))\r\n } else {\r\n // Same length -> compare values.\r\n let allFound = true;\r\n colorsInFocus.forEach((c1: ColorInFocus) => {\r\n const idx = newColorsInFocus.findIndex((c2: ColorInFocus) => c1.color === c2.color && c1.layerType === c2.layerType)\r\n if (idx === -1) {\r\n allFound = false;\r\n }\r\n })\r\n if (!allFound) {\r\n dispatch(mapActions.setColorsInFocus(newColorsInFocus))\r\n }\r\n }\r\n\r\n let foundFeature = false;\r\n event.map.forEachFeatureAtPixel(event.pixel, (feature: ol.Feature, layer: ol.layer.Layer) => {\r\n foundFeature = true;\r\n })\r\n event.map.getViewport().style.cursor = foundFeature ? 'pointer' : '';\r\n })\r\n }\r\n\r\n const getControlsStyling = (): string => {\r\n let style = ''\r\n style += showLeftSideBar ? ` ${classes.leftSideBarOpen}` : ` ${classes.leftSideBarClosed}`\r\n style += rightSideBarOpen ? ` ${classes.rightSideBarOpen}` : ` ${classes.rightSideBarClosed}`\r\n style += bottomBarOpen ? ` ${classes.bottomBarOpen}` : ` ${classes.bottomBarClosed}`\r\n return style\r\n }\r\n\r\n /**\r\n * Transforms coordinate from EPSG:25832 to EPSG:3857\r\n * @param coordinate coordinate to be transformed\r\n * @returns transformed coordinate\r\n */\r\n const toEPSG3857 = (coordinate: ol.Coordinate): ol.Coordinate => {\r\n return ol.proj.transform(coordinate, 'EPSG:25832', 'EPSG:3857')\r\n }\r\n\r\n /**\r\n * Calculates and returns the Point at which to place the crosshair marker.\r\n * @param coordinates The coordinates defining the line segments on which to place the marker.\r\n * @param crossDistance The distance from the first coordinates/Point to place the marker\r\n * @returns The Point at which to place the crosshair marker or undefined if the Point couldn't be calculated.\r\n */\r\n const calculateCrosshairPoint = (coordinates: ol.Coordinate[], crossDistance: number): ol.geom.Point | undefined => {\r\n let crosshairPoint: ol.geom.Point | undefined\r\n let startNode: ol.Coordinate | undefined\r\n let endNode: ol.Coordinate | undefined\r\n\r\n let accumulatedDistance = 0\r\n let crosshairOffset = 0\r\n let startEndNodeDistance = 0\r\n\r\n let index = 0\r\n while (accumulatedDistance < crossDistance && index < coordinates.length - 1) {\r\n const oldDistance = accumulatedDistance\r\n const distance = getDistance(toLonLat(toEPSG3857(coordinates[index])), toLonLat(toEPSG3857(coordinates[index + 1])))\r\n accumulatedDistance += distance\r\n if (accumulatedDistance >= crossDistance) {\r\n startNode = coordinates[index]\r\n endNode = coordinates[index + 1]\r\n crosshairOffset = crossDistance - oldDistance\r\n startEndNodeDistance = distance\r\n break\r\n }\r\n index++\r\n }\r\n\r\n if (startNode !== undefined && endNode !== undefined) {\r\n const scaleFactor = crosshairOffset / startEndNodeDistance\r\n const deltaX = (endNode[0] - startNode[0]) * scaleFactor\r\n const deltaY = (endNode[1] - startNode[1]) * scaleFactor\r\n crosshairPoint = new ol.geom.Point(startNode)\r\n crosshairPoint.translate(deltaX, deltaY)\r\n }\r\n\r\n return crosshairPoint\r\n }\r\n\r\n // On mount run this method that initializes the base map.\r\n useEffect(() => {\r\n const northArrowSpan = document.createElement('span')\r\n northArrowSpan.innerHTML = `<img src=\"north-icon.svg\" class=\"${classes.northIcon}\">`\r\n\r\n // Register projection to EPSG:25832\r\n const projectionName = 'EPSG:25832'\r\n proj4.defs(projectionName, '+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs')\r\n ol.proj.setProj4(proj4)\r\n\r\n if (map !== undefined) {\r\n olMap = map\r\n } else {\r\n const olLayers: ol.layer.Layer[] = []\r\n olMap = new ol.Map({\r\n target: mapDiv.current,\r\n layers: olLayers,\r\n view: new ol.View({\r\n center: mapCenter,\r\n zoom: mapCurrentZoom,\r\n minZoom: 7.9, // This value allows for the entire ice age layer to be visible.\r\n projection: projectionName\r\n }),\r\n controls: [\r\n new ol.control.Rotate({ autoHide: false, label: northArrowSpan }),\r\n new ol.control.Zoom(),\r\n new ol.control.ScaleLine()\r\n ]\r\n })\r\n setMap(olMap)\r\n\r\n // Add vector layers used by the profile tool.\r\n olMap.addLayer(profileToolLineLayer)\r\n olMap.addLayer(profileToolLineBufferLayer)\r\n olMap.addLayer(profileToolPointLayer)\r\n\r\n // Set current map extent\r\n dispatch(mapActions.setMapExtent(getMapExtent()))\r\n\r\n // Register event listeners.\r\n registerMoveEndListener()\r\n registerPointerMoveListener()\r\n registerClickListener()\r\n }\r\n // eslint-disable-next-line\r\n }, [])\r\n\r\n useEffect(() => {\r\n olMap.getView().setCenter(mapCenter)\r\n olMap.getView().setZoom(mapCurrentZoom)\r\n }, [mapCenter, mapCurrentZoom])\r\n\r\n useEffect(() => {\r\n enableProfileTool()\r\n // eslint-disable-next-line\r\n }, [maxBoreholeDistance, enabledProfileSettings])\r\n\r\n useEffect(() => {\r\n const vectorMarkerName = 'crosshairMark'\r\n olMap.getLayers().getArray()\r\n .filter((layer: any) => layer.get('name') === vectorMarkerName)\r\n .forEach((layer: any) => {\r\n olMap.removeLayer(layer)\r\n })\r\n\r\n if (profileCoordinates !== undefined && crosshairDistance !== undefined) {\r\n const crosshairPoint = calculateCrosshairPoint(profileCoordinates, crosshairDistance)\r\n if (crosshairPoint !== undefined) {\r\n setCurrentMouseCoordinates(crosshairPoint.getCoordinates())\r\n }\r\n\r\n const olSourceMarkerPoint = new ol.source.Vector({\r\n features: [new ol.Feature({\r\n geometry: crosshairPoint,\r\n name: 'X'\r\n })]\r\n })\r\n const olVectorMarkerPoint = new ol.layer.Vector({\r\n source: olSourceMarkerPoint,\r\n style: xStyleFunction\r\n })\r\n olVectorMarkerPoint.setZIndex(Number.MAX_SAFE_INTEGER)\r\n olVectorMarkerPoint.set('name', vectorMarkerName)\r\n olMap.addLayer(olVectorMarkerPoint)\r\n }\r\n // eslint-disable-next-line\r\n }, [crosshairDistance, profileCoordinates])\r\n\r\n // This useEffect call should only be invoked upon changes to the\r\n // list of available layers.\r\n useEffect(() => {\r\n // Layers that the registry says should be running.\r\n const layersToEnable = props.layerTypes\r\n\r\n // Layers that are actually running within the OpenLayer map.\r\n const currentlyEnabledLayers: LayerType[] =\r\n olMap\r\n .getLayers()\r\n .getArray()\r\n .map((l: ol.layer.Layer) => l.get('geo_type') as LayerType)\r\n .filter((t: LayerType) => t !== undefined)\r\n\r\n // Find layers that should be added or removed.\r\n const addTheseLayers: LayerType[] = []\r\n const removeTheseLayers: LayerType[] = []\r\n for (const l of layersToEnable) {\r\n if (!currentlyEnabledLayers.some(x => x === l)) {\r\n addTheseLayers.push(l)\r\n }\r\n }\r\n for (const l of currentlyEnabledLayers) {\r\n if (!layersToEnable.some(x => x === l)) {\r\n removeTheseLayers.push(l)\r\n }\r\n }\r\n\r\n // Modify the layers being shown within the map component.\r\n if (addTheseLayers.length > 0) {\r\n addLayers(addTheseLayers)\r\n .catch(e => console.error('Adding layers to map component', e))\r\n }\r\n if (removeTheseLayers.length > 0) {\r\n removeLayers(removeTheseLayers)\r\n }\r\n }, [props.layerTypes])\r\n\r\n // Handle changes in selected geo model.\r\n useEffect(() => {\r\n const layersTypesToUpdate = [LayerType.MODEL_AREAS, LayerType.SLICE_DHM, LayerType.SLICE_KOTE]\r\n layersTypesToUpdate.forEach(layerType => {\r\n const layer = olMap.getLayers().getArray().find((l: ol.layer.Layer) => l.get('geo_type') === layerType)\r\n if (layer !== undefined) {\r\n removeLayers([layerType])\r\n addLayers([layerType])\r\n .catch(e => console.error('Reloading layer because of Geo model change', e))\r\n }\r\n })\r\n }, [selectedGeoModel, models])\r\n\r\n useEffect(() => {\r\n const layer = olMap.getLayers().getArray().find((l: ol.layer.Layer) => l.get('geo_type') === LayerType.COSTAL_LOCATIONS)\r\n if (layer !== undefined) {\r\n removeLayers([LayerType.COSTAL_LOCATIONS])\r\n addLayers([LayerType.COSTAL_LOCATIONS])\r\n .catch(e => console.error('Reloading layer because of state change', e))\r\n }\r\n }, [poi])\r\n\r\n // Handle changes in selected tool.\r\n useEffect(() => {\r\n // Initialize profile tool\r\n if (selectedTool === ToolType.PROFILE) {\r\n enableProfileTool()\r\n } else {\r\n disableProfileTool()\r\n }\r\n }, [selectedTool, selectedProfile])\r\n\r\n // Handle changes in layer parameters. Only one layer may change parameters at the time\r\n // in the state. This layer will be named in modifiedLayer.\r\n useEffect(() => {\r\n if (modifiedLayer !== undefined) {\r\n // Find the modified layer and re-draw it.\r\n if (removeLayers([modifiedLayer])) {\r\n // If a layer was in fact removed, add it again.\r\n addLayers([modifiedLayer])\r\n .catch(e => console.error('Updating layer parameters', e))\r\n }\r\n }\r\n }, [layerParams])\r\n\r\n return (\r\n <div ref={mapDiv} onMouseLeave={() => dispatch(mapActions.setColorsInFocus([]))} className={`${classes.root}${getControlsStyling()}`}>\r\n <div id='copyrightWrapper' className={`${classes.copyrightWrapper} ${getControlsStyling()}`}>\r\n <p className={classes.copyright}>\r\n {Array.from(layerCopyrightMap.values())\r\n .sort((i1, i2) => i1.priority - i2.priority)\r\n .map((item, index) => {\r\n return (\r\n <a className={classes.copyrightItem} key={index} href={item.url} target='_blank' rel='noreferrer'>© {item.name}</a>\r\n )\r\n })}\r\n </p>\r\n </div>\r\n <div id='mousePositionWrapper' className={`${classes.mousePositionWrapper} ${getControlsStyling()}`}>\r\n <p className={classes.mousePosition}>\r\n E {numberToDecimalString(currentMouseCoordinates[0])} N {numberToDecimalString(currentMouseCoordinates[1])}\r\n </p>\r\n <p className={`${classes.mousePosition} ${classes.mousePositionCoordinateSystem}`}>(EPSG:25832)</p>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nOpenLayersMap.defaultProps = defaultProps\r\n\r\nexport default OpenLayersMap\r\n","import { bottomBarHeight, leftSidebarToolsWidth, rightSidebarWidth } from 'src/Constants'\r\nimport { BaseAction, CallResult, DataAction, MessageAction } from 'src/CustomTypes'\r\nimport { AddressResult } from 'src/dataSources/dataforsyningen/Address'\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport { MapLegendObject } from 'src/dataSources/geo/MapLegend'\r\nimport { Graph, GraphGroup } from 'src/dataSources/graphs/GraphRegistry'\r\nimport { DataTheme, ToolType } from 'src/Enums'\r\nimport {\r\n ADD_GRAPH_GROUP,\r\n REMOVE_GRAPH_GROUP,\r\n SET_DATA_THEME,\r\n SET_SELECTED_GEO_MODEL,\r\n SET_SELECTED_GRAPH,\r\n SET_SELECTED_TOOL,\r\n FETCHING_GEO_MODELS_STARTED,\r\n FETCHING_GEO_MODELS_FAILURE,\r\n FETCHING_GEO_MODELS_SUCCESS,\r\n FETCHING_MAP_LEGEND_STARTED,\r\n FETCHING_MAP_LEGEND_FAILURE,\r\n FETCHING_MAP_LEGEND_SUCCESS,\r\n SET_SHOW_LEFT_SIDE_BAR,\r\n SET_ADDRESSES,\r\n SET_ADDRESS_QUERY,\r\n FETCHING_ADDRESSES_STARTED,\r\n FETCHING_ADDRESSES_FAILURE,\r\n FETCHING_ADDRESSES_SUCCESS,\r\n SET_BOTTOM_BAR_HEIGHT,\r\n SET_BOTTOM_BAR_WIDTH,\r\n SET_RIGHT_SIDE_BAR_WIDTH,\r\n SET_RIGHT_SIDE_BAR_DRAGGING,\r\n SET_BOTTOM_BAR_DRAGGING\r\n} from '../actions/GeneralActions'\r\n\r\nexport interface GeneralState {\r\n addressQuery: string\r\n addresses: AddressResult[]\r\n bottomBarWidth: number\r\n bottomBarHeight: number\r\n bottomBarDragging: Boolean\r\n dataTheme: DataTheme\r\n enabledGraphGroups: GraphGroup[]\r\n fetchAddressesStatus: CallResult\r\n fetchAddressesError: string\r\n fetchGeoModelsStatus: CallResult\r\n fetchGeoModelsError: string\r\n fetchMapLegendStatus: CallResult\r\n fetchMapLegendError: string\r\n geoModels?: GeoModel[]\r\n mapLegend?: MapLegendObject[]\r\n rightSideBarDragging: Boolean\r\n rightSideBarWidth: number\r\n selectedGeoModel?: GeoModel\r\n selectedGraph?: Graph\r\n selectedTool: ToolType\r\n showLeftSideBar: boolean\r\n}\r\n\r\nexport const generalStateInitial: GeneralState = {\r\n addressQuery: '',\r\n addresses: [],\r\n bottomBarHeight: bottomBarHeight,\r\n bottomBarWidth: window.innerWidth - leftSidebarToolsWidth,\r\n bottomBarDragging: false,\r\n dataTheme: DataTheme.NONE,\r\n enabledGraphGroups: [],\r\n fetchAddressesStatus: CallResult.Initial,\r\n fetchAddressesError: '',\r\n fetchGeoModelsStatus: CallResult.Initial,\r\n fetchGeoModelsError: '',\r\n fetchMapLegendStatus: CallResult.Initial,\r\n fetchMapLegendError: '',\r\n geoModels: undefined,\r\n mapLegend: undefined,\r\n rightSideBarWidth: rightSidebarWidth,\r\n rightSideBarDragging: false,\r\n selectedGeoModel: undefined,\r\n selectedTool: ToolType.INFO,\r\n selectedGraph: undefined,\r\n showLeftSideBar: true\r\n}\r\n\r\nexport function generalReducer (\r\n state: GeneralState = generalStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): GeneralState {\r\n switch (action.type) {\r\n case ADD_GRAPH_GROUP: {\r\n const a = action as DataAction<GraphGroup>\r\n let graphGroups = [...state.enabledGraphGroups]\r\n const graphGroupAlreadyEnabled = state.enabledGraphGroups.some(graphGroup => graphGroup === a.data)\r\n if (!graphGroupAlreadyEnabled) {\r\n graphGroups = [...state.enabledGraphGroups, a.data]\r\n }\r\n return {\r\n ...state,\r\n enabledGraphGroups: graphGroups\r\n }\r\n }\r\n case REMOVE_GRAPH_GROUP: {\r\n const a = action as DataAction<GraphGroup>\r\n return {\r\n ...state,\r\n enabledGraphGroups: state.enabledGraphGroups.filter(graphGroup => graphGroup !== a.data)\r\n }\r\n }\r\n case FETCHING_ADDRESSES_STARTED: {\r\n return {\r\n ...state,\r\n fetchAddressesStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_ADDRESSES_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchAddressesStatus: CallResult.Failed,\r\n fetchAddressesError: a.message\r\n }\r\n }\r\n case FETCHING_ADDRESSES_SUCCESS: {\r\n const a = action as DataAction<AddressResult[]>\r\n return {\r\n ...state,\r\n fetchAddressesStatus: CallResult.Succeeded,\r\n addresses: a.data\r\n }\r\n }\r\n case FETCHING_GEO_MODELS_STARTED: {\r\n return {\r\n ...state,\r\n fetchGeoModelsStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_GEO_MODELS_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchGeoModelsStatus: CallResult.Failed,\r\n fetchGeoModelsError: a.message\r\n }\r\n }\r\n case FETCHING_GEO_MODELS_SUCCESS: {\r\n const a = action as DataAction<GeoModel[] | null>\r\n return {\r\n ...state,\r\n fetchGeoModelsStatus: CallResult.Succeeded,\r\n geoModels: a.data !== null ? a.data : undefined\r\n }\r\n }\r\n case FETCHING_MAP_LEGEND_STARTED: {\r\n return {\r\n ...state,\r\n fetchMapLegendStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_MAP_LEGEND_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchMapLegendStatus: CallResult.Failed,\r\n fetchMapLegendError: a.message\r\n }\r\n }\r\n case FETCHING_MAP_LEGEND_SUCCESS: {\r\n const a = action as DataAction<MapLegendObject[] | null>\r\n return {\r\n ...state,\r\n fetchMapLegendStatus: CallResult.Succeeded,\r\n mapLegend: a.data !== null ? a.data : undefined\r\n }\r\n }\r\n case SET_ADDRESS_QUERY: {\r\n const a = action as DataAction<string>\r\n return {\r\n ...state,\r\n addressQuery: a.data\r\n }\r\n }\r\n case SET_ADDRESSES: {\r\n const a = action as DataAction<AddressResult[]>\r\n return {\r\n ...state,\r\n addresses: a.data\r\n }\r\n }\r\n case SET_BOTTOM_BAR_HEIGHT: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n bottomBarHeight: a.data\r\n }\r\n }\r\n case SET_BOTTOM_BAR_WIDTH: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n bottomBarWidth: a.data\r\n }\r\n }\r\n case SET_BOTTOM_BAR_DRAGGING: {\r\n const a = action as DataAction<Boolean>\r\n return {\r\n ...state,\r\n bottomBarDragging: a.data\r\n }\r\n }\r\n case SET_DATA_THEME: {\r\n const a = action as DataAction<DataTheme>\r\n return {\r\n ...state,\r\n dataTheme: a.data\r\n }\r\n }\r\n case SET_RIGHT_SIDE_BAR_DRAGGING: {\r\n const a = action as DataAction<Boolean>\r\n return {\r\n ...state,\r\n rightSideBarDragging: a.data\r\n }\r\n }\r\n case SET_RIGHT_SIDE_BAR_WIDTH: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n rightSideBarWidth: a.data\r\n }\r\n }\r\n case SET_SELECTED_GEO_MODEL: {\r\n const a = action as DataAction<GeoModel>\r\n return {\r\n ...state,\r\n selectedGeoModel: a.data\r\n }\r\n }\r\n case SET_SELECTED_GRAPH: {\r\n const a = action as DataAction<Graph>\r\n return {\r\n ...state,\r\n selectedGraph: a.data\r\n }\r\n }\r\n case SET_SELECTED_TOOL: {\r\n const a = action as DataAction<ToolType>\r\n return {\r\n ...state,\r\n selectedTool: a.data\r\n }\r\n }\r\n case SET_SHOW_LEFT_SIDE_BAR: {\r\n const a = action as DataAction<boolean>\r\n return {\r\n ...state,\r\n showLeftSideBar: a.data\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { BaseAction, DataAction } from 'src/CustomTypes'\r\nimport { SET_TOKEN, SET_USER_CREDENTIALS, LOGIN_SUCCESS, LOGIN_FAILURE, LOGIN_STARTED, LOGOUT, SET_TOKEN_EXPIRED, TokenBundle, UserCredentials } from '../actions/AuthAction'\r\n\r\nexport interface AuthState {\r\n loginInProgress: boolean\r\n isLoggedIn: boolean\r\n isLoginError: boolean\r\n token: string\r\n tokenExpirationTimestamp?: number\r\n username: string\r\n password: string\r\n}\r\n\r\nexport const authStateInitial: AuthState = {\r\n loginInProgress: false,\r\n isLoggedIn: false,\r\n isLoginError: false,\r\n token: '',\r\n tokenExpirationTimestamp: undefined,\r\n username: '',\r\n password: ''\r\n}\r\n\r\nexport function authReducer (\r\n state: AuthState = authStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): AuthState {\r\n switch (action.type) {\r\n case SET_TOKEN: {\r\n const a = action as DataAction<TokenBundle>\r\n return {\r\n ...state,\r\n token: a.data.token,\r\n loginInProgress: false,\r\n isLoggedIn: true,\r\n tokenExpirationTimestamp: a.data.tokenExpirationTimestamp\r\n }\r\n }\r\n case SET_USER_CREDENTIALS: {\r\n const a = action as DataAction<UserCredentials>\r\n return {\r\n ...state,\r\n username: a.data.username,\r\n password: a.data.password\r\n }\r\n }\r\n case SET_TOKEN_EXPIRED: {\r\n return {\r\n ...state,\r\n loginInProgress: false,\r\n isLoggedIn: false,\r\n token: '',\r\n tokenExpirationTimestamp: undefined\r\n }\r\n }\r\n case LOGIN_STARTED: {\r\n return {\r\n ...state,\r\n loginInProgress: true,\r\n isLoginError: false\r\n }\r\n }\r\n case LOGIN_SUCCESS: {\r\n return {\r\n ...state,\r\n loginInProgress: false,\r\n isLoggedIn: true,\r\n isLoginError: false\r\n }\r\n }\r\n case LOGIN_FAILURE: {\r\n return {\r\n ...state,\r\n loginInProgress: false,\r\n isLoginError: true\r\n }\r\n }\r\n case LOGOUT: {\r\n return {\r\n ...state,\r\n isLoggedIn: false,\r\n isLoginError: false,\r\n loginInProgress: false,\r\n username: '',\r\n password: '',\r\n token: '',\r\n tokenExpirationTimestamp: undefined\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { ThunkAction, ThunkDispatch } from 'redux-thunk'\r\nimport { AnyAction } from 'redux'\r\nimport GeoAuth from '../dataSources/geo/GeoAuth'\r\nimport jwtDecode, { JwtPayload } from 'jwt-decode'\r\nimport { DataAction, EmptyAction, MessageAction } from '../CustomTypes'\r\n\r\nexport const REDIRECT = 'REDIRECT_ACTION_REDIRECT'\r\nexport const REDIRECT_DONE = 'REDIRECT_ACTION_REDIRECT_DONE'\r\n\r\nexport interface RedirectBundle {\r\n path: string | undefined\r\n}\r\n\r\ninterface RedirectActions {\r\n redirect: (path: string | undefined) => DataAction<RedirectBundle>,\r\n redirectDone: () => EmptyAction\r\n}\r\n\r\nexport const redirectActions: RedirectActions = {\r\n redirect: (path: string | undefined) : DataAction<RedirectBundle> => {\r\n return {\r\n type: REDIRECT,\r\n data: {path},\r\n }\r\n },\r\n redirectDone: () => {\r\n return {\r\n type: REDIRECT_DONE,\r\n payload: {},\r\n }\r\n }\r\n}","import { BaseAction, DataAction } from '../CustomTypes'\r\nimport { RedirectBundle } from '../actions/RedirectAction'\r\nimport { REDIRECT, REDIRECT_DONE } from '../actions/RedirectAction'\r\n\r\nexport interface RedirectState {\r\n path: string | undefined\r\n}\r\n\r\nexport const redirectStateInitial: RedirectState = {\r\n path: undefined\r\n}\r\n\r\nexport function redirectReducer (\r\n state: RedirectState = redirectStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): RedirectState {\r\n switch (action.type) {\r\n case REDIRECT:\r\n const a = action as DataAction<RedirectBundle>\r\n return {path: a.data.path}\r\n case REDIRECT_DONE:\r\n return {path: undefined};\r\n default:\r\n return state\r\n }\r\n}\r\n","import { NearestBoreholeObject } from '../dataSources/geo/NearestBoreHoles'\r\nimport { AddressReverseResult } from '../dataSources/dataforsyningen/AddressReverse'\r\nimport {\r\n FETCHING_BOREHOLE_FAILURE, FETCHING_BOREHOLE_STARTED, FETCHING_BOREHOLE_SUCCESS,\r\n FETCHING_ADDRESS_FAILURE, FETCHING_ADDRESS_STARTED, FETCHING_ADDRESS_SUCCESS,\r\n FETCHING_IMAGE_SUCCESS, FETCHING_IMAGE_STARTED, FETCHING_IMAGE_FAILURE,\r\n FETCHING_LEGEND_SUCCESS, FETCHING_LEGEND_STARTED, FETCHING_LEGEND_FAILURE, CLEAR_STATE\r\n} from '../actions/BoreholeInfoActions'\r\nimport { CallResult, MessageAction, DataAction, BaseAction } from '../CustomTypes'\r\nimport { BoreholeLegendObject } from '../dataSources/geo/BoreholeLegend'\r\n\r\nexport interface BoreholeInfoState {\r\n fetchBoreholeStatus: CallResult\r\n fetchBoreholeError: string\r\n selectedBorehole?: NearestBoreholeObject\r\n\r\n fetchAddressStatus: CallResult\r\n fetchAddressError: string\r\n addressInfo?: AddressReverseResult\r\n\r\n fetchImageStatus: CallResult\r\n fetchImageError: string\r\n boreholeSvg: string\r\n\r\n fetchLegendStatus: CallResult\r\n fetchLegendError: string\r\n legend?: BoreholeLegendObject\r\n}\r\n\r\nexport const boreholeInfoStateInitial: BoreholeInfoState = {\r\n fetchBoreholeStatus: CallResult.Initial,\r\n fetchBoreholeError: '',\r\n selectedBorehole: undefined,\r\n fetchAddressStatus: CallResult.Initial,\r\n fetchAddressError: '',\r\n addressInfo: undefined,\r\n fetchImageStatus: CallResult.Initial,\r\n fetchImageError: '',\r\n boreholeSvg: '',\r\n fetchLegendStatus: CallResult.Initial,\r\n fetchLegendError: '',\r\n legend: undefined\r\n}\r\n\r\nexport function boreholeInfoReducer (\r\n state: BoreholeInfoState = boreholeInfoStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): BoreholeInfoState {\r\n switch (action.type) {\r\n case FETCHING_BOREHOLE_STARTED: {\r\n return {\r\n ...state,\r\n fetchBoreholeStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_BOREHOLE_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchBoreholeStatus: CallResult.Failed,\r\n fetchBoreholeError: a.message\r\n }\r\n }\r\n case FETCHING_BOREHOLE_SUCCESS: {\r\n const a = action as DataAction<NearestBoreholeObject | null>\r\n return {\r\n ...state,\r\n fetchBoreholeStatus: CallResult.Succeeded,\r\n selectedBorehole: a.data !== null ? a.data : undefined\r\n }\r\n }\r\n case FETCHING_ADDRESS_STARTED: {\r\n return {\r\n ...state,\r\n fetchAddressStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_ADDRESS_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchAddressStatus: CallResult.Failed,\r\n fetchAddressError: a.message\r\n }\r\n }\r\n case FETCHING_ADDRESS_SUCCESS: {\r\n const a = action as DataAction<AddressReverseResult>\r\n return {\r\n ...state,\r\n fetchAddressStatus: CallResult.Succeeded,\r\n addressInfo: a.data\r\n }\r\n }\r\n case FETCHING_IMAGE_STARTED: {\r\n return {\r\n ...state,\r\n fetchImageStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_IMAGE_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchImageStatus: CallResult.Failed,\r\n fetchImageError: a.message\r\n }\r\n }\r\n case FETCHING_IMAGE_SUCCESS: {\r\n const a = action as DataAction<string>\r\n return {\r\n ...state,\r\n fetchImageStatus: CallResult.Succeeded,\r\n boreholeSvg: a.data\r\n }\r\n }\r\n case FETCHING_LEGEND_STARTED: {\r\n return {\r\n ...state,\r\n fetchLegendStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_LEGEND_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchLegendStatus: CallResult.Failed,\r\n fetchLegendError: a.message\r\n }\r\n }\r\n case FETCHING_LEGEND_SUCCESS: {\r\n const a = action as DataAction<BoreholeLegendObject>\r\n return {\r\n ...state,\r\n fetchLegendStatus: CallResult.Succeeded,\r\n legend: a.data\r\n }\r\n }\r\n case CLEAR_STATE: {\r\n return {\r\n ...state,\r\n ...boreholeInfoStateInitial\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { AddressReverseResult } from '../dataSources/dataforsyningen/AddressReverse'\r\nimport {\r\n FETCHING_ADDRESS_FAILURE, FETCHING_ADDRESS_STARTED, FETCHING_ADDRESS_SUCCESS,\r\n FETCHING_IMAGE_SUCCESS, FETCHING_IMAGE_STARTED, FETCHING_IMAGE_FAILURE,\r\n SET_MAX_DEPTH, SET_COORDINATES, CLEAR_STATE, CLEAR_ADDRESS_STATE, CLEAR_IMAGE_STATE\r\n} from '../actions/VirtualBoreholeInfoActions'\r\nimport { CallResult, MessageAction, DataAction, BaseAction } from '../CustomTypes'\r\n\r\nexport interface VirtualBoreholeInfoState {\r\n fetchAddressStatus: CallResult\r\n fetchAddressError: string\r\n addressInfo?: AddressReverseResult\r\n\r\n fetchImageStatus: CallResult\r\n fetchImageError: string\r\n virtualBoreholePng: string\r\n\r\n maxDepth: number\r\n coordinates: number[]\r\n}\r\n\r\nconst initialAddressState = {\r\n fetchAddressStatus: CallResult.Initial,\r\n fetchAddressError: '',\r\n addressInfo: undefined\r\n}\r\n\r\nconst initialImageState = {\r\n fetchImageStatus: CallResult.Initial,\r\n fetchImageError: '',\r\n virtualBoreholePng: ''\r\n}\r\n\r\nexport const virtualBoreholeInfoStateInitial: VirtualBoreholeInfoState = {\r\n ...initialAddressState,\r\n ...initialImageState,\r\n maxDepth: -130,\r\n coordinates: [-1, -1]\r\n}\r\n\r\nexport function virtualBoreholeInfoReducer (\r\n state: VirtualBoreholeInfoState = virtualBoreholeInfoStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction): VirtualBoreholeInfoState {\r\n switch (action.type) {\r\n case FETCHING_ADDRESS_STARTED: {\r\n return {\r\n ...state,\r\n fetchAddressStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_ADDRESS_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchAddressStatus: CallResult.Failed,\r\n fetchAddressError: a.message\r\n }\r\n }\r\n case FETCHING_ADDRESS_SUCCESS: {\r\n const a = action as DataAction<AddressReverseResult>\r\n return {\r\n ...state,\r\n fetchAddressStatus: CallResult.Succeeded,\r\n addressInfo: a.data\r\n }\r\n }\r\n case FETCHING_IMAGE_STARTED: {\r\n return {\r\n ...state,\r\n fetchImageStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_IMAGE_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchImageStatus: CallResult.Failed,\r\n fetchImageError: a.message\r\n }\r\n }\r\n case FETCHING_IMAGE_SUCCESS: {\r\n const a = action as DataAction<string>\r\n return {\r\n ...state,\r\n fetchImageStatus: CallResult.Succeeded,\r\n virtualBoreholePng: a.data\r\n }\r\n }\r\n case SET_MAX_DEPTH: {\r\n const a = action as DataAction<number>\r\n return {\r\n ...state,\r\n maxDepth: a.data\r\n }\r\n }\r\n case SET_COORDINATES: {\r\n const a = action as DataAction<number[]>\r\n return {\r\n ...state,\r\n coordinates: a.data\r\n }\r\n }\r\n case CLEAR_ADDRESS_STATE: {\r\n return {\r\n ...state,\r\n ...initialAddressState\r\n }\r\n }\r\n case CLEAR_IMAGE_STATE: {\r\n return {\r\n ...state,\r\n ...initialImageState\r\n }\r\n }\r\n case CLEAR_STATE: {\r\n return {\r\n ...state,\r\n fetchAddressStatus: CallResult.Initial,\r\n fetchAddressError: '',\r\n addressInfo: undefined,\r\n fetchImageStatus: CallResult.Initial,\r\n fetchImageError: '',\r\n virtualBoreholePng: '',\r\n coordinates: [-1, -1]\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { FETCHING_HYDRO_MODELS_FAILURE, FETCHING_HYDRO_MODELS_STARTED, FETCHING_HYDRO_MODELS_SUCCESS } from 'src/actions/HydroModelActions'\r\nimport { BaseAction, CallResult, DataAction, MessageAction } from 'src/CustomTypes'\r\nimport { HydroModelObject } from 'src/dataSources/geo/HydroModel'\r\n\r\nexport interface HydroModelState {\r\n fetchHydroModelsStatus: CallResult\r\n fetchHydroModelsError: string\r\n hydroModels: HydroModelObject[]\r\n}\r\n\r\nexport const hydroModelStateInitial: HydroModelState = {\r\n fetchHydroModelsStatus: CallResult.Initial,\r\n fetchHydroModelsError: '',\r\n hydroModels: []\r\n}\r\n\r\nexport function hydroModelReducer (\r\n state: HydroModelState = hydroModelStateInitial, // eslint-disable-line @typescript-eslint/default-param-last\r\n action: BaseAction\r\n): HydroModelState {\r\n switch (action.type) {\r\n case FETCHING_HYDRO_MODELS_STARTED: {\r\n return {\r\n ...state,\r\n fetchHydroModelsStatus: CallResult.Running\r\n }\r\n }\r\n case FETCHING_HYDRO_MODELS_FAILURE: {\r\n const a = action as MessageAction\r\n return {\r\n ...state,\r\n fetchHydroModelsStatus: CallResult.Failed,\r\n fetchHydroModelsError: a.message\r\n }\r\n }\r\n case FETCHING_HYDRO_MODELS_SUCCESS: {\r\n const a = action as DataAction<HydroModelObject[]>\r\n return {\r\n ...state,\r\n fetchHydroModelsStatus: CallResult.Succeeded,\r\n hydroModels: a.data\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { generalReducer, GeneralState, generalStateInitial } from './reducers/GeneralReducer'\r\nimport { authReducer, AuthState, authStateInitial } from './reducers/AuthReducer'\r\nimport { redirectReducer, RedirectState, redirectStateInitial } from './reducers/RedirectReducer'\r\nimport { boreholeInfoReducer, BoreholeInfoState, boreholeInfoStateInitial } from './reducers/BoreholeInfoReducer'\r\nimport { virtualBoreholeInfoReducer, VirtualBoreholeInfoState, virtualBoreholeInfoStateInitial } from './reducers/VirtualBoreholeInfoReducer'\r\nimport { hydroModelReducer, HydroModelState, hydroModelStateInitial } from './reducers/HydroModelReducer'\r\nimport { mapReducer, MapState, mapStateInitial } from './reducers/MapReducer'\r\nimport { infoMenuReducer, InfoMenuState, infoMenuStateInitial } from './reducers/InfoMenuReducer'\r\nimport { profileReducer, ProfileState, profileStateInitial } from './reducers/ProfileReducer'\r\nimport { wikiReducer, WikiState, wikiStateInitial } from './reducers/WikiReducer'\r\nimport { persistStore, persistReducer, createMigrate, MigrationManifest } from 'redux-persist'\r\nimport storage from 'redux-persist/lib/storage'\r\nimport {SET_TOKEN} from './actions/AuthAction'\r\n\r\nimport thunk from 'redux-thunk'\r\nimport { createStore, applyMiddleware, combineReducers } from 'redux'\r\n\r\nexport interface RootState {\r\n generalState: GeneralState\r\n authState: AuthState\r\n redirectState: RedirectState\r\n boreholeInfo: BoreholeInfoState\r\n hydroModelState: HydroModelState\r\n virtualBoreholeInfoState: VirtualBoreholeInfoState\r\n mapState: MapState\r\n infoMenuState: InfoMenuState\r\n profileState: ProfileState\r\n wikiState: WikiState\r\n}\r\n\r\nexport const rootStateInitial = {\r\n generalState: generalStateInitial,\r\n authState: authStateInitial,\r\n redirectState: redirectStateInitial,\r\n boreholeInfo: boreholeInfoStateInitial,\r\n hydroModelState: hydroModelStateInitial,\r\n virtualBoreholeInfoState: virtualBoreholeInfoStateInitial,\r\n mapState: mapStateInitial,\r\n infoMenuState: infoMenuStateInitial,\r\n profileState: profileStateInitial,\r\n wikiState: wikiStateInitial\r\n}\r\n\r\nconst persistVersion = 6\r\nconst migrations: MigrationManifest = {}\r\nmigrations[persistVersion] = (state) => ({\r\n _persist: {\r\n version: 0,\r\n rehydrated: false\r\n }\r\n})\r\n\r\n// persist configurations\r\nconst rootPersistConfig = {\r\n key: 'root',\r\n version: persistVersion,\r\n storage,\r\n blacklist: ['authState'],\r\n migrate: createMigrate(migrations, { debug: false })\r\n}\r\n\r\n// persist config\r\nconst authPersistConfig = {\r\n key: 'authState',\r\n version: persistVersion,\r\n storage,\r\n blacklist: ['password', 'isLoginError'],\r\n migrate: createMigrate(migrations, { debug: false })\r\n}\r\n\r\nconst rootReducer = combineReducers({\r\n generalState: generalReducer,\r\n authState: persistReducer(authPersistConfig, authReducer),\r\n redirectState: redirectReducer,\r\n hydroModelState: hydroModelReducer,\r\n boreholeInfo: boreholeInfoReducer,\r\n virtualBoreholeInfoState: virtualBoreholeInfoReducer,\r\n mapState: mapReducer,\r\n infoMenuState: infoMenuReducer,\r\n profileState: profileReducer,\r\n wikiState: wikiReducer\r\n})\r\n\r\nconst persistedReducer = persistReducer(rootPersistConfig, rootReducer)\r\n\r\nconst refreshOnLoginMiddleware = (store:any) => (next:any) => (action:any) => {\r\n if (action.type === SET_TOKEN) {\r\n setTimeout(() => {window.location = \"/\"}, 200);\r\n }\r\n next(action);\r\n}\r\n\r\nconst middlewares = [thunk, refreshOnLoginMiddleware]\r\nconst store = createStore(persistedReducer, applyMiddleware(...middlewares))\r\nexport const persistor = persistStore(store)\r\n\r\nexport default store\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const mainContentViewStyle = makeStyles(theme => ({\r\n root: {\r\n width: '100%',\r\n height: '100%'\r\n }\r\n}))\r\n","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\nexport class HeightMap {\r\n constructor(mapDimension = 64, unitSize = 1, roughness = 0.5) {\r\n this.mapDimension = mapDimension;\r\n this.unitSize = unitSize;\r\n this.roughness = roughness;\r\n this.map = Array(mapDimension + 1)\r\n .fill(0)\r\n .map((el) => new Array(mapDimension + 1).fill(0).map((el) => 0));\r\n this.startDisplacement();\r\n }\r\n\r\n mapData() {\r\n return this.map;\r\n }\r\n\r\n // Starts off the map generation, seeds the first 4 corners\r\n startDisplacement() {\r\n const map = this.map;\r\n const mapDimension = this.mapDimension;\r\n\r\n // top left\r\n map[0][0] = Math.random();\r\n\r\n // bottom left\r\n map[0][mapDimension] = Math.random();\r\n\r\n // top right\r\n map[mapDimension][0] = Math.random();\r\n\r\n // bottom right\r\n map[mapDimension][mapDimension] = Math.random();\r\n\r\n // Center\r\n map[mapDimension / 2][mapDimension / 2] = Math.random() * 0.7;\r\n\r\n this.midpointDisplacment(mapDimension);\r\n }\r\n\r\n midpointDisplacment(plot) {\r\n const map = this.map;\r\n const mapDimension = this.mapDimension;\r\n const unitSize = this.unitSize;\r\n const subPlot = plot / 2;\r\n\r\n if (subPlot > unitSize) {\r\n for (let i = subPlot; i <= mapDimension; i += subPlot) {\r\n for (let j = subPlot; j <= mapDimension; j += subPlot) {\r\n const x = i - subPlot / 2;\r\n const y = j - subPlot / 2;\r\n\r\n const topLeft = map[i - subPlot][j - subPlot];\r\n const topRight = map[i][j - subPlot];\r\n const bottomLeft = map[i - subPlot][j];\r\n const bottomRight = map[i][j];\r\n\r\n // Center\r\n map[x][y] =\r\n (topLeft + topRight + bottomLeft + bottomRight) / 4 +\r\n this.displace(plot);\r\n map[x][y] = this.normalize(map[x][y]);\r\n\r\n const center = map[x][y];\r\n\r\n // Top\r\n const top = topLeft + topRight + center;\r\n\r\n if (j > subPlot) {\r\n map[x][j - subPlot] =\r\n (top + map[x][j - plot + subPlot / 2]) / 4 + this.displace(plot);\r\n } else {\r\n map[x][j - subPlot] = top / 3 + this.displace(plot);\r\n }\r\n\r\n map[x][j - subPlot] = this.normalize(map[x][j - subPlot]);\r\n\r\n // Bottom\r\n const bottom = bottomLeft + bottomRight + center;\r\n\r\n if (j < mapDimension) {\r\n map[x][j] =\r\n (bottom + map[x][j + subPlot / 2]) / 4 + this.displace(plot);\r\n } else {\r\n map[x][j] = bottom / 3 + this.displace(plot);\r\n }\r\n\r\n map[x][j] = this.normalize(map[x][j]);\r\n\r\n //Right\r\n const right = topRight + bottomRight + center;\r\n\r\n if (i < mapDimension) {\r\n map[i][y] =\r\n (right + map[i + subPlot / 2][y]) / 4 + this.displace(plot);\r\n } else {\r\n map[i][y] = right / 3 + this.displace(plot);\r\n }\r\n\r\n map[i][y] = this.normalize(map[i][y]);\r\n\r\n // Left\r\n const left = topLeft + bottomLeft + center;\r\n\r\n if (i > subPlot) {\r\n map[i - subPlot][y] =\r\n (left + map[i - plot + subPlot / 2][y]) / 4 + this.displace(plot);\r\n } else {\r\n map[i - subPlot][y] = left / 3 + this.displace(plot);\r\n }\r\n\r\n map[i - subPlot][y] = this.normalize(map[i - subPlot][y]);\r\n }\r\n }\r\n\r\n this.midpointDisplacment(subPlot);\r\n }\r\n }\r\n\r\n // Random function to offset the center\r\n displace(amount) {\r\n const max = (amount / (this.mapDimension * 4)) * this.roughness;\r\n return (Math.random() - 0.5) * max;\r\n }\r\n\r\n // Normalize the value to make sure its within bounds\r\n normalize(value) {\r\n return Math.max(Math.min(value, 1), 0);\r\n }\r\n}\r\n","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\n/* eslint-disable eqeqeq */\r\n\r\n// webasm //////////////////////////////////////////////////////////\r\nimport VoxelBrickMesher from '../webasm/VoxelBrickMesher.js';\r\n\r\n// Imports /////////////////////////////////////////////////////////\r\nimport {WQueue, wVertexType} from 'wfundament';\r\nimport {HeightMap} from '../HeightMap.js';\r\nimport {vec2, vec3, vec4} from 'gl-matrix';\r\n\r\nimport {\r\n wgRenderingPrimitives,\r\n WgShader,\r\n WgVertexBuffer,\r\n WgVertexDescriptor,\r\n} from 'wgtek';\r\n\r\n////////////////////////////////////////////////////////////////////\r\nconst voxelVertexShaderSource = `#version 300 es\r\nprecision highp float;\r\nin vec4 Pos;\r\nin vec4 Normal;\r\n\r\nflat out int voxelType;\r\nout vec4 normalAo;\r\nout vec2 uv;\r\n\r\nout float zViewDepth;\r\n\r\nuniform mat4 VP;\r\nuniform mat4 V;\r\nuniform mat4 modelWorld;\r\n\r\nuniform float anim;\r\nuniform float heightOffset;\r\nuniform float heightScale;\r\nuniform float domainSize;\r\n\r\nvoid main() {\r\n vec4 position = modelWorld * vec4(Pos.xyz, 1.0) + smoothstep(1.0,0.0, anim) * vec4(0.0,0.0,1.0*heightOffset,0.0);\r\n uv = position.xy/domainSize;\r\n \r\n position.z = position.z*heightScale;\r\n voxelType = int(Pos.w);\r\n\r\n normalAo = vec4(Normal.x, -Normal.z, Normal.y, Normal.w);\r\n\r\n vec4 viewPos = V * position;\r\n zViewDepth = min(255.0,abs(viewPos.z) * 0.2);\r\n\r\n gl_Position = VP * position;\r\n}\r\n`;\r\n\r\nconst voxelFragmentShaderSource = `#version 300 es\r\nprecision highp float;\r\nout vec4 outColor;\r\n\r\nflat in int voxelType;\r\n\r\nin vec2 uv;\r\n\r\nin vec4 normalAo;\r\nin float zViewDepth;\r\n\r\n\r\nuniform sampler2D overlayTex;\r\nuniform vec3 cameraDir;\r\nuniform float brickAlpha;\r\nuniform float dimLight;\r\nuniform int useTexture;\r\nuniform float pickingMode;\r\n\r\n\r\nuniform sampler2D VoxelTransferTexture;\r\n\r\nvoid main()\r\n{\r\n vec3 norm = normalize(normalAo.xyz);\r\n vec3 lightDir = normalize(vec3(0.3,1.0,0.4));\r\n vec3 lightDir2 = cameraDir;\r\n\r\n float diffuseLight = max(0.2, dot(norm, lightDir) ) * 0.35;\r\n float directLight = max(0.3, dot(norm, lightDir2) );\r\n diffuseLight += directLight;\r\n diffuseLight = clamp(0.0,1.0, diffuseLight);\r\n\r\n\r\n\r\n vec4 col = texture(VoxelTransferTexture, vec2(float(voxelType) / 255.0, 0.5 ));// getVoxelColor(voxelType);\r\n\r\n //vec4 col = getVoxelColor(voxelType);\r\n if ( useTexture != 0 && normalAo.z > 0.7)\r\n {\r\n col.rgb *= texture(overlayTex, vec2(uv.x, 1.0-uv.y)).rgb;\r\n }\r\n\r\n //float ao = smoothstep(0.0,0.8 - directLight * 0.1,normalAo.w);\r\n //outColor = vec4(col.xyz * diffuseLight * ao * dimLight,brickAlpha);// normalAo * normalAo.w;\r\n\r\n\r\n float ao = smoothstep(0.0,0.8 - directLight * 0.1,normalAo.w);\r\n float fVoxelType = float(voxelType) / 255.0;\r\n vec4 pickingColor = vec4(fVoxelType,fVoxelType,zViewDepth / 255.0,1.0);\r\n outColor = (pickingMode > 0.0) ? pickingColor : vec4(col.xyz * diffuseLight * ao * dimLight,brickAlpha);\r\n\r\n}\r\n`;\r\n\r\n// Globals /////////////////////////////////////////////////////////\r\nconst gVertexBufferSize = 4096 * 3 * 8; // TODO\r\nconst gHeightMapDimension = 256;\r\n\r\nconst VoxelAttributes = {\r\n AIR: 0,\r\n GRASS: 1,\r\n MUD: 2,\r\n CLAY: 3,\r\n SAND: 4,\r\n ROCK: 5,\r\n WATER: 6,\r\n MOREANELER: 7,\r\n FYLD: 8,\r\n NEDRE_LER: 9,\r\n KALK: 10,\r\n SKRIVEKRIDT: 11,\r\n MELLEMSAND: 12,\r\n OEVRESAND: 13,\r\n BEDROCK: 14,\r\n LAVA: 15,\r\n};\r\n\r\nconst BrickClipState = {\r\n NOT_CLIPPED: 0,\r\n FULLY_CLIPPED: 1,\r\n CLIPPED: 2, // there is a clipping plane interscetion\r\n};\r\n\r\nfunction VoxelBrickIndexCompare(a, b) {\r\n if (a.depth_ <= b.depth_) {\r\n return 1;\r\n }\r\n return -1;\r\n}\r\n\r\nclass VoxelBrickIndex {\r\n constructor(index) {\r\n this.index_ = index;\r\n this.depth_ = 0.0;\r\n }\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////\r\nclass VoxelBrick {\r\n constructor(index, x, y) {\r\n this.x_ = x;\r\n this.y_ = y;\r\n this.index_ = index; // linear index into\r\n this.isCulled_ = false;\r\n this.isValid_ = false;\r\n this.brickClippingState_ = BrickClipState.NOT_CLIPPED;\r\n this.numberOfClipEdges_ = 0;\r\n\r\n this.cornerPosition_ = vec3.create();\r\n this.animation_ = 1.0;\r\n this.vertexBuffer_ = null;\r\n this.vertexCount_ = 0;\r\n this.alpha_ = 1.0;\r\n this.center_ = vec3.create();\r\n\r\n // bounding box\r\n // animation\r\n // info\r\n // perhaps voxel information\r\n }\r\n\r\n updateAnimation() {\r\n this.animation_ += this.isValid_ ? -0.05 : 0.05;\r\n this.animation_ = Math.min(1.0, Math.max(0.0, this.animation_));\r\n }\r\n\r\n getIndex() {\r\n return this.index_;\r\n }\r\n\r\n getVertexBuffer() {\r\n return this.vertexBuffer_;\r\n }\r\n\r\n getClippingState() {\r\n return this.brickClippingState_;\r\n }\r\n\r\n updateClippingState(clippingState) {\r\n if (\r\n clippingState === this.brickClippingState_ &&\r\n clippingState !== BrickClipState.CLIPPED\r\n ) {\r\n return false;\r\n }\r\n this.brickClippingState_ = clippingState; // clipping state changed, need\r\n // to flag for brick update.\r\n this.isValid_ = false;\r\n return true;\r\n }\r\n\r\n setClippingState(clippingState) {\r\n this.brickClippingState_ = clippingState;\r\n this.isValid_ = false;\r\n }\r\n}\r\n\r\nclass VoxelClipPlanes {\r\n constructor() {\r\n this.clipXMin_ = 0;\r\n this.clipXMax_ = 512.0;\r\n this.clipZMin_ = 0;\r\n this.clipZMax_ = 512.0;\r\n }\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////\r\nclass VoxelModel {\r\n constructor(\r\n glContext,\r\n resourceCache,\r\n brickDimension,\r\n brickHeight,\r\n voxelSizeInMeter,\r\n voxelHeightInMeter\r\n ) {\r\n this.context_ = glContext;\r\n this.resourceCache_ = resourceCache;\r\n this.brickDim_ = 8;\r\n this.brickDimension_ = brickDimension;\r\n this.brickHeight_ = brickHeight;\r\n this.heightOffset_ = 0.0;\r\n this.heightScale_ = 1.0;\r\n this.voxelSizeInMeter_ = voxelSizeInMeter;\r\n this.voxelHeightInMeter_ = voxelHeightInMeter;\r\n this.voxelCopyBrick_ = new Int32Array(\r\n this.brickDimension_ * this.brickDimension_ * this.brickHeight_\r\n );\r\n this.vertexBufferData_ = new Float32Array(gVertexBufferSize);\r\n\r\n this.voxelBricks_ = [];\r\n this.voxelBrickIndices_ = [];\r\n this.voxelData_ = null;\r\n this.voxelDimension_ = [0, 0, 0];\r\n this.voxelUpdateQueue_ = new WQueue(true);\r\n this.totalVertexCount_ = 0;\r\n this.clipPlanes_ = new VoxelClipPlanes();\r\n\r\n this.brickClipPolygonEdges_ = new Float32Array(128); // max 64 edges\r\n this.brickClipPolygonNormal_ = new Float32Array(128); // max 64 edges\r\n this.numberOfClipPolyEdges_ = 0;\r\n\r\n this.overlayTexture_ = null;\r\n }\r\n\r\n async init() {\r\n this.createVoxelBricks();\r\n this.createShaders();\r\n //this.createTestHeightMaps();\r\n\r\n this.VoxelBrickMesher_ = await VoxelBrickMesher();\r\n this.voxelBrickTriangulator_ = new this.VoxelBrickMesher_.VoxelBrick(\r\n this.brickDimension_,\r\n this.brickHeight_\r\n );\r\n this.voxelBrickLod1_ = new this.VoxelBrickMesher_.VoxelBrick(\r\n this.brickDimension_ / 2,\r\n this.brickHeight_ / 2\r\n );\r\n }\r\n\r\n setVoxelData(nx, ny, nz, data /* Array*/) {\r\n this.voxelDimension_[0] = nx;\r\n this.voxelDimension_[1] = ny;\r\n this.voxelDimension_[2] = nz;\r\n this.voxelData_ = new Int32Array(data);\r\n }\r\n\r\n setTransferTexture(voxelTransferTexture) {\r\n this.voxelTransferTexture_ = voxelTransferTexture;\r\n }\r\n\r\n getVoxelDimension() {\r\n return this.voxelDimension_;\r\n }\r\n\r\n getVoxelEmpty(x, y, z) {\r\n const border = 5;\r\n if (x < border || x >= this.voxelDimension_[0] - border) {\r\n return true;\r\n }\r\n if (y < border || y >= this.voxelDimension_[1] - border) {\r\n return true;\r\n }\r\n if (z < border || z >= this.voxelDimension_[2] - border) {\r\n return true;\r\n }\r\n\r\n if (x < this.clipPlanes_.clipXMin_ + border) {\r\n return true;\r\n }\r\n if (z < this.clipPlanes_.clipZMin_ + border) {\r\n return true;\r\n }\r\n\r\n return (\r\n this.voxelData_[\r\n x +\r\n (this.voxelDimension_[2] - 1 - z) * this.voxelDimension_[0] +\r\n y * this.voxelDimension_[0] * this.voxelDimension_[2]\r\n ] == 0\r\n );\r\n }\r\n\r\n setOverlayTexture(tex) {\r\n this.overlayTexture_ = tex;\r\n }\r\n\r\n createVoxelBricks() {\r\n const gl = this.context_.gl();\r\n let vertexT = wVertexType.VT_VertexColor4;\r\n let voxelVertexDescriptor = new WgVertexDescriptor(vertexT, gl);\r\n\r\n for (let y = 0; y < this.brickDim_; y++) {\r\n for (let x = 0; x < this.brickDim_; x++) {\r\n const brickIndex = x + y * this.brickDim_;\r\n const brickSortIndex = new VoxelBrickIndex(brickIndex);\r\n const voxelBrick = new VoxelBrick(brickIndex, x, y);\r\n\r\n //voxelBrick.cornerPosition_ = vec3.fromValues(x *\r\n // this.brickDimension_, 0.0, z * this.brickDimension_);\r\n vec3.set(\r\n voxelBrick.cornerPosition_,\r\n x * this.brickDimension_,\r\n y * this.brickDimension_,\r\n 0.0\r\n );\r\n\r\n vec3.set(\r\n voxelBrick.center_,\r\n x * this.brickDimension_ * this.voxelSizeInMeter_ +\r\n this.brickDimension_ * this.voxelSizeInMeter_ * 0.5,\r\n (this.brickDim_ - 1 - y) *\r\n this.brickDimension_ *\r\n this.voxelSizeInMeter_ +\r\n this.brickDimension_ * this.voxelSizeInMeter_ * 0.5,\r\n 0.0\r\n );\r\n\r\n /*\r\n voxelBrick.center_ = vec3.fromValues(\r\n x * this.brickDimension_ * this.voxelSizeInMeter_ + (this.brickDimension_ * this.voxelSizeInMeter_ * 0.5),\r\n 0.0,//(this.brickHeight_ / 2.0) * this.voxelSizeInMeter_ * 0.1,\r\n z * this.brickDimension_ * this.voxelSizeInMeter_ + (this.brickDimension_ * this.voxelSizeInMeter_ * 0.5));\r\n */\r\n\r\n voxelBrick.vertexBuffer_ = new WgVertexBuffer(\r\n \"VoxelVertexBuffer\" + voxelBrick.getIndex(),\r\n this.context_\r\n );\r\n voxelBrick.vertexBuffer_.createVertexBuffer(\r\n gl.DYNAMIC_DRAW,\r\n voxelVertexDescriptor.vertexLayout_,\r\n gVertexBufferSize,\r\n voxelVertexDescriptor.getVertexSizeInBytes(),\r\n null\r\n );\r\n this.voxelBricks_.push(voxelBrick);\r\n this.voxelBrickIndices_.push(brickSortIndex);\r\n }\r\n }\r\n }\r\n\r\n findVoxelBrickIndex(index) {\r\n for (let i = 0; i < this.voxelBrickIndices_.length; i++) {\r\n if (this.voxelBrickIndices_[i].index_ == index) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n updateVoxelBrickDepths(cameraViewMatrix) {\r\n for (let i = 0; i < this.voxelBricks_.length; i++) {\r\n let voxelBrick = this.voxelBricks_[i];\r\n let voxelBrickIndex = this.findVoxelBrickIndex(voxelBrick.index_);\r\n let c = voxelBrick.center_;\r\n let v = vec4.fromValues(c[0], c[1], c[2], 1.0);\r\n let camPos = vec4.create();\r\n vec4.transformMat4(camPos, v, cameraViewMatrix);\r\n this.voxelBrickIndices_[voxelBrickIndex].depth_ =\r\n -camPos[2] / this.voxelSizeInMeter_ + 0.7071 * this.brickDimension_; // z\r\n // is\r\n // negative.\r\n // Add\r\n // an\r\n // offset\r\n // to\r\n // prevent\r\n // negative\r\n // depth\r\n // if the center is behind the camera but part of the brick is still\r\n // visible.\r\n }\r\n this.voxelBrickIndices_.sort(VoxelBrickIndexCompare); // front to back\r\n // sorting for the\r\n // blending\r\n }\r\n\r\n createShaders() {\r\n this.shader_ = new WgShader(\"voxelTriangleShader\", this.context_);\r\n this.shader_.createShaderProgram(\r\n voxelVertexShaderSource,\r\n voxelFragmentShaderSource,\r\n { Pos: 0, Normal: 1 }\r\n );\r\n }\r\n\r\n getVoxelColor(voxelAttrib) {\r\n switch (voxelAttrib) {\r\n case VoxelAttributes.GRASS:\r\n return vec4.fromValues(0.0, 1.0, 0.0, 1.0);\r\n\r\n case VoxelAttributes.MOREANELER:\r\n return vec4.fromValues(0.3, 0.3, 0.5, 1.0);\r\n\r\n case VoxelAttributes.CLAY:\r\n return vec4.fromValues(0.4, 0.4, 0.4, 1.0);\r\n\r\n case VoxelAttributes.SAND:\r\n return vec4.fromValues(0.7, 0.65, 0.15, 1.0);\r\n\r\n case VoxelAttributes.WATER:\r\n return vec4.fromValues(0.2, 0.2, 0.85, 1.0);\r\n\r\n case VoxelAttributes.MUD:\r\n return vec4.fromValues(0.5, 0.35, 0.1, 1.0);\r\n\r\n case VoxelAttributes.ROCK:\r\n return vec4.fromValues(0.25, 0.25, 0.29, 1.0);\r\n default:\r\n return vec4.fromValues(1.0, 0.0, 0.0, 1.0);\r\n }\r\n }\r\n\r\n getHeightOffset() {\r\n return this.heightOffset_;\r\n }\r\n\r\n setHeightOffset(offset) {\r\n this.heightOffset_ = offset;\r\n }\r\n\r\n getHeightScale() {\r\n return this.heightScale_;\r\n }\r\n\r\n setHeightScale(scale) {\r\n this.heightScale_ = scale;\r\n }\r\n\r\n update() {\r\n let isUpdated = false;\r\n\r\n if (!this.voxelUpdateQueue_.isEmpty()) {\r\n let peekIndex = this.voxelUpdateQueue_.peek();\r\n if (peekIndex != undefined) {\r\n if (this.voxelBricks_[peekIndex].animation_ > 0.99) {\r\n let index = this.voxelUpdateQueue_.pop();\r\n if (index != undefined) {\r\n this.updateBrick(index);\r\n isUpdated = true;\r\n }\r\n }\r\n }\r\n }\r\n return isUpdated;\r\n }\r\n\r\n resetAllVoxelBricks() {\r\n this.totalVertexCount_ = 0;\r\n for (let i = 0; i < this.voxelBricks_.length; i++) {\r\n this.voxelBricks_[i].setClippingState(BrickClipState.NOT_CLIPPED);\r\n this.voxelBricks_[i].isValid_ = false;\r\n this.voxelBricks_[i].numberOfClipEdges_ = 0;\r\n this.voxelUpdateQueue_.pushBack(i);\r\n }\r\n }\r\n\r\n updateCulling() {\r\n // TODO frustum culling\r\n }\r\n\r\n // TODO calculate involved bricks\r\n updateClipPlane() {\r\n this.totalVertexCount_ = 0;\r\n\r\n for (let i = 0; i < this.voxelBricks_.length; i++) {\r\n let vb = this.voxelBricks_[i];\r\n let vbMinx = vb.x_ * this.brickDimension_;\r\n let vbMaxx = vb.x_ * this.brickDimension_ + this.brickDimension_;\r\n\r\n let vbMinz = vb.y_ * this.brickDimension_;\r\n let vbMaxz = vb.y_ * this.brickDimension_ + this.brickDimension_;\r\n\r\n let clipState = BrickClipState.NOT_CLIPPED;\r\n\r\n if (\r\n this.clipPlanes_.clipXMin_ < vbMinx &&\r\n this.clipPlanes_.clipZMin_ < vbMinz\r\n ) {\r\n clipState = BrickClipState.NOT_CLIPPED;\r\n } else if (\r\n this.clipPlanes_.clipXMin_ > vbMaxx &&\r\n this.clipPlanes_.clipZMin_ > vbMaxz\r\n ) {\r\n clipState = BrickClipState.FULLY_CLIPPED;\r\n } else {\r\n clipState = BrickClipState.CLIPPED;\r\n }\r\n\r\n if (vb.updateClippingState(clipState)) {\r\n // return true if the bricks clip state\r\n // has been updated\r\n this.voxelUpdateQueue_.pushBack(i);\r\n }\r\n }\r\n }\r\n\r\n updateClipPolygon(clipPolygon) {\r\n this.numberOfClipPolyEdges_ = Math.min(64, clipPolygon.getNumberOfPoints());\r\n\r\n for (let i = 0; i < this.numberOfClipPolyEdges_ - 1; i++) {\r\n let p0 = clipPolygon.getPoint(i);\r\n let n0 = clipPolygon.getNormal(i);\r\n this.brickClipPolygonEdges_[i * 2] = p0[0];\r\n this.brickClipPolygonEdges_[i * 2 + 1] = p0[1];\r\n this.brickClipPolygonNormal_[i * 2] = n0[0];\r\n this.brickClipPolygonNormal_[i * 2 + 1] = n0[1];\r\n }\r\n\r\n for (let i = 0; i < this.voxelBricks_.length; i++) {\r\n const vb = this.voxelBricks_[i];\r\n let vbMinx = vb.x_ * this.brickDimension_;\r\n let vbMaxx = vb.x_ * this.brickDimension_ + this.brickDimension_;\r\n let vbMinz = vb.y_ * this.brickDimension_;\r\n let vbMaxz = vb.y_ * this.brickDimension_ + this.brickDimension_;\r\n // let brickCenter = vec2.fromValues(vbMinx + (vbMaxx - vbMinx) * 0.5,\r\n // vbMinz + (vbMaxz - vbMinz) * 0.5);\r\n\r\n let brickCorners = [\r\n vec2.fromValues(vbMinx, vbMinz),\r\n vec2.fromValues(vbMaxx, vbMinz),\r\n vec2.fromValues(vbMaxx, vbMaxz),\r\n vec2.fromValues(vbMinx, vbMaxz),\r\n ];\r\n\r\n let clipState = BrickClipState.NOT_CLIPPED;\r\n let allPointsInside = true;\r\n vb.numberOfClipEdges_ = 0;\r\n\r\n for (let j = 0; j < brickCorners.length; j++) {\r\n if (!clipPolygon.isPointInside(brickCorners[j])) {\r\n allPointsInside = false;\r\n break;\r\n }\r\n }\r\n\r\n if (!allPointsInside) {\r\n if (clipPolygon.boxPolygonIntersection(brickCorners)) {\r\n clipState = BrickClipState.CLIPPED;\r\n vb.numberOfClipEdges_ = 1;\r\n } else {\r\n clipState = BrickClipState.FULLY_CLIPPED;\r\n // vb.numberOfClipEdges_ = 1;\r\n }\r\n }\r\n\r\n if (vb.updateClippingState(clipState)) {\r\n // return true if the bricks clip state\r\n // has been updated\r\n this.voxelUpdateQueue_.pushBack(i);\r\n }\r\n }\r\n }\r\n\r\n render(\r\n cameraViewProjection,\r\n cameraView,\r\n cameraDir,\r\n lightValue,\r\n renderPickingMode\r\n ) {\r\n const gl = this.context_.gl();\r\n gl.disable(gl.CULL_FACE);\r\n gl.cullFace(gl.BACK);\r\n\r\n this.voxelTransferTexture_.bind();\r\n\r\n this.shader_.bindProgram();\r\n if (this.overlayTexture_) {\r\n this.overlayTexture_.bind();\r\n this.overlayTexture_.activeTexture_ = gl.TEXTURE1;\r\n this.shader_.setTextureUniform(\"overlayTex\", 1);\r\n this.shader_.setUniform1i(\"useTexture\", 1);\r\n this.shader_.setUniform1f(\r\n \"domainSize\",\r\n this.brickDimension_ * this.brickDim_ * this.voxelSizeInMeter_\r\n );\r\n } else {\r\n this.shader_.setUniform1i(\"useTexture\", 0);\r\n }\r\n this.shader_.setUniformMat4fv(\"VP\", cameraViewProjection);\r\n const modelWorld = new Float32Array([\r\n 0.2,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n (3 / 200) * 0.2,\r\n 0,\r\n 0,\r\n -0.2,\r\n 0,\r\n 0,\r\n 0,\r\n this.brickDimension_ * this.brickDim_ * this.voxelSizeInMeter_,\r\n 0,\r\n 1,\r\n ]);\r\n this.shader_.setUniformMat4fv(\"modelWorld\", modelWorld);\r\n this.shader_.setUniform1f(\"dimLight\", lightValue);\r\n this.shader_.setUniform3fv(\"cameraDir\", cameraDir);\r\n //this.shader_.setUniform1f(\"heightOffset\", this.heightOffset_);\r\n this.shader_.setUniform1f(\"heightOffset\", this.heightOffset_);\r\n this.shader_.setUniform1f(\"heightScale\", this.heightScale_);\r\n\r\n if (renderPickingMode) {\r\n for (let i = this.voxelBrickIndices_.length - 1; i >= 0; i--) {\r\n let brickID = this.voxelBrickIndices_[i].index_;\r\n var vb = this.voxelBricks_[brickID];\r\n if (vb.isCulled_) {\r\n continue;\r\n }\r\n if (vb.brickClippingState_ == BrickClipState.FULLY_CLIPPED) {\r\n continue;\r\n }\r\n if (vb.vertexCount_ == 0) {\r\n continue;\r\n }\r\n\r\n this.shader_.bindProgram();\r\n this.shader_.setUniformMat4fv(\"VP\", cameraViewProjection);\r\n this.shader_.setUniformMat4fv(\"V\", cameraView);\r\n this.shader_.setUniform1f(\"anim\", vb.animation_);\r\n this.shader_.setUniform1f(\"pickingMode\", 1.0);\r\n this.shader_.setUniform1f(\"brickAlpha\", 1.0);\r\n this.shader_.setUniform1f(\"dimLight\", lightValue);\r\n this.shader_.setUniform3fv(\"cameraDir\", cameraDir);\r\n this.shader_.setTextureUniform(\"VoxelTransferTexture\", 0);\r\n\r\n vb.vertexBuffer_.bind();\r\n gl.drawArrays(wgRenderingPrimitives.TRIANGLES, 0, vb.vertexCount_);\r\n vb.vertexBuffer_.unbind();\r\n this.shader_.unbindProgram();\r\n }\r\n\r\n this.voxelTransferTexture_.unbind();\r\n gl.disable(gl.CULL_FACE);\r\n return;\r\n }\r\n // front to back opaque\r\n this.shader_.setUniform1f(\"brickAlpha\", 1.0);\r\n\r\n for (let i = this.voxelBrickIndices_.length - 1; i >= 0; i--) {\r\n let brickID = this.voxelBrickIndices_[i].index_;\r\n let d = Math.max(0.0, this.voxelBrickIndices_[i].depth_);\r\n let alpha = d < 8 ? 0.0 : Math.min(1.0, (1.0 / 48.0) * d);\r\n if (alpha < 0.99) {\r\n continue;\r\n }\r\n\r\n let vb = this.voxelBricks_[brickID];\r\n vb.updateAnimation();\r\n\r\n if (vb.isCulled_) {\r\n continue;\r\n }\r\n if (vb.brickClippingState_ == BrickClipState.FULLY_CLIPPED) {\r\n continue;\r\n }\r\n if (vb.vertexCount_ == 0) {\r\n continue;\r\n }\r\n if (alpha < 0.0001) {\r\n continue;\r\n }\r\n\r\n this.shader_.setUniform1f(\"anim\", vb.animation_);\r\n\r\n this.shader_.bindProgram();\r\n this.shader_.setUniformMat4fv(\"VP\", cameraViewProjection);\r\n this.shader_.setUniformMat4fv(\"V\", cameraView);\r\n this.shader_.setUniform1f(\"anim\", vb.animation_);\r\n this.shader_.setUniform1f(\"pickingMode\", -1.0);\r\n this.shader_.setUniform1f(\"brickAlpha\", 1.0);\r\n this.shader_.setUniform1f(\"dimLight\", lightValue);\r\n this.shader_.setUniform3fv(\"cameraDir\", cameraDir);\r\n\r\n this.shader_.setTextureUniform(\"VoxelTransferTexture\", 0);\r\n\r\n vb.vertexBuffer_.bind();\r\n gl.drawArrays(wgRenderingPrimitives.TRIANGLES, 0, vb.vertexCount_);\r\n vb.vertexBuffer_.unbind();\r\n }\r\n\r\n // transparent voxel bricks back to front rendering\r\n gl.enable(gl.CULL_FACE);\r\n gl.enable(gl.BLEND);\r\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\r\n\r\n // for (let i = 0; i < this.voxelBricks_.length; i++) {\r\n for (let i = 0; i < this.voxelBrickIndices_.length; i++) {\r\n //var vb = this.voxelBricks_[i];\r\n let brickID = this.voxelBrickIndices_[i].index_;\r\n let d = Math.max(0.0, this.voxelBrickIndices_[i].depth_);\r\n let alpha = d < 8 ? 0.0 : Math.min(1.0, (1.0 / 48.0) * d);\r\n if (alpha > 0.99) {\r\n continue;\r\n }\r\n\r\n let vb = this.voxelBricks_[brickID];\r\n vb.updateAnimation();\r\n\r\n if (vb.isCulled_) {\r\n continue;\r\n }\r\n if (vb.brickClippingState_ == BrickClipState.FULLY_CLIPPED) {\r\n continue;\r\n }\r\n if (vb.vertexCount_ == 0) {\r\n continue;\r\n }\r\n if (alpha < 0.0001) {\r\n continue;\r\n }\r\n\r\n this.shader_.bindProgram();\r\n this.shader_.setUniformMat4fv(\"VP\", cameraViewProjection);\r\n this.shader_.setUniformMat4fv(\"V\", cameraView);\r\n\r\n this.shader_.setUniform1f(\"anim\", vb.animation_);\r\n this.shader_.setUniform1f(\"pickingMode\", -1.0);\r\n this.shader_.setUniform1f(\"brickAlpha\", alpha);\r\n this.shader_.setTextureUniform(\"VoxelTransferTexture\", 0);\r\n\r\n vb.vertexBuffer_.bind();\r\n gl.drawArrays(wgRenderingPrimitives.TRIANGLES, 0, vb.vertexCount_);\r\n vb.vertexBuffer_.unbind();\r\n }\r\n\r\n this.voxelTransferTexture_.unbind();\r\n\r\n this.shader_.unbindProgram();\r\n gl.disable(gl.BLEND);\r\n gl.disable(gl.CULL_FACE);\r\n }\r\n\r\n createTestHeightMaps(mapDimension = gHeightMapDimension) {\r\n let gHm = new HeightMap(mapDimension);\r\n let ghMap = gHm.mapData();\r\n\r\n let sHm = new HeightMap(mapDimension);\r\n let shMap = sHm.mapData();\r\n\r\n let wHm = new HeightMap(mapDimension);\r\n let whMap = wHm.mapData();\r\n\r\n let cHm = new HeightMap(mapDimension);\r\n let chMap = cHm.mapData();\r\n\r\n let rHm = new HeightMap(mapDimension);\r\n let rhMap = rHm.mapData();\r\n\r\n const grassHeight = 120.0;\r\n const sandHeight = 90.0;\r\n const clayHeight = 40.0;\r\n const waterHeight = 25.0;\r\n const rockHeight = 10.0;\r\n\r\n if (this.grassLevel_ == null) {\r\n this.grassLevel_ = new Float32Array(mapDimension * mapDimension);\r\n this.sandLevel_ = new Float32Array(mapDimension * mapDimension);\r\n this.clayLevel_ = new Float32Array(mapDimension * mapDimension);\r\n this.waterLevel_ = new Float32Array(mapDimension * mapDimension);\r\n this.rockLevel_ = new Float32Array(mapDimension * mapDimension);\r\n }\r\n\r\n for (let y = 0; y < mapDimension; y++) {\r\n for (let x = 0; x < mapDimension; x++) {\r\n const index = x + y * mapDimension;\r\n\r\n let gh = ghMap[x][y];\r\n let sh = shMap[x][y];\r\n let wh = whMap[x][y];\r\n let ch = chMap[x][y];\r\n let rh = rhMap[x][y];\r\n\r\n let grassH = gh * grassHeight;\r\n let sandH = sh * sandHeight;\r\n let clayH = ch * clayHeight;\r\n let waterH = wh * waterHeight;\r\n let rockH = rh * rockHeight;\r\n\r\n this.grassLevel_[index] = grassH;\r\n this.sandLevel_[index] = sandH;\r\n this.clayLevel_[index] = clayH;\r\n this.waterLevel_[index] = waterH;\r\n this.rockLevel_[index] = rockH;\r\n }\r\n }\r\n }\r\n\r\n updateGlobalAo(vertexCount, vertexBufferData) {\r\n const dist = 1;\r\n for (let i = 0; i < vertexCount; i++) {\r\n let x = this.vertexBufferData_[i * 8];\r\n let y = this.vertexBufferData_[i * 8 + 1];\r\n let z = this.vertexBufferData_[i * 8 + 2];\r\n\r\n let grid = [];\r\n /* grid.push(this.getVoxelEmpty(x - dist, y, z- dist));\r\n grid.push(this.getVoxelEmpty(x , y, z-dist));\r\n grid.push(this.getVoxelEmpty(x - dist, y, z));\r\n grid.push(this.getVoxelEmpty(x, y, z));*/\r\n\r\n // grid.push(this.getVoxelEmpty(x, y, z));\r\n grid.push(this.getVoxelEmpty(x - dist, y, z - dist));\r\n grid.push(this.getVoxelEmpty(x - dist, y, z));\r\n grid.push(this.getVoxelEmpty(x, y, z - dist));\r\n grid.push(this.getVoxelEmpty(x, y, z));\r\n\r\n let numOcc = 0;\r\n\r\n for (let j = 0; j < 4; j++) {\r\n numOcc += grid[j] ? 1 : 0;\r\n }\r\n\r\n let vao = vertexBufferData[i * 8 + 7]; // the ao mask from the web asm\r\n // triangulation: -1 == clip edge.\r\n let ao = 1.0 - Math.min(1.0 / numOcc, 0.65);\r\n vertexBufferData[i * 8 + 7] = vao < 0.0 ? 1.0 : ao;\r\n }\r\n }\r\n\r\n updateBrick(index) {\r\n // fill the voxel brick\r\n\r\n let vb = this.voxelBricks_[index];\r\n vb.isValid_ = true;\r\n let xOffset = vb.x_ * this.brickDimension_;\r\n let yOffset = vb.y_ * this.brickDimension_;\r\n\r\n for (let z = 0; z < this.brickDimension_; z++) {\r\n for (let x = 0; x < this.brickDimension_; x++) {\r\n for (let y = 0; y < this.brickHeight_; y++) {\r\n const index =\r\n x +\r\n y * this.brickDimension_ +\r\n z * this.brickDimension_ * this.brickHeight_;\r\n this.voxelCopyBrick_[index] = 0;\r\n\r\n if (x + xOffset < this.clipPlanes_.clipXMin_) {\r\n continue;\r\n }\r\n if (x + xOffset > this.clipPlanes_.clipXMax_) {\r\n continue;\r\n }\r\n\r\n if (z + yOffset < this.clipPlanes_.clipZMin_) {\r\n continue;\r\n }\r\n if (z + yOffset > this.clipPlanes_.clipZMax_) {\r\n continue;\r\n }\r\n\r\n const hmIndex =\r\n x +\r\n xOffset +\r\n (this.voxelDimension_[2] - 1 - (z + yOffset)) *\r\n this.voxelDimension_[0] +\r\n y * this.voxelDimension_[0] * this.voxelDimension_[2];\r\n this.voxelCopyBrick_[index] = this.voxelData_[hmIndex];\r\n }\r\n }\r\n }\r\n\r\n if (vb.numberOfClipEdges_ == 1) {\r\n // vb.clipState == BrickClipState.CLIPPED)\r\n this.voxelBrickTriangulator_.setClipPolygon(\r\n this.brickClipPolygonEdges_.buffer\r\n );\r\n this.voxelBrickTriangulator_.setClipPolygonNormals(\r\n this.brickClipPolygonNormal_.buffer\r\n );\r\n this.voxelBrickTriangulator_.setNumberOfPolygonEdges(\r\n this.numberOfClipPolyEdges_\r\n );\r\n } else {\r\n this.voxelBrickTriangulator_.setNumberOfPolygonEdges(0);\r\n }\r\n\r\n this.voxelBrickTriangulator_.setVoxels(this.voxelCopyBrick_.buffer);\r\n this.voxelBrickTriangulator_.setOffsetAndScale(xOffset, 0.0, yOffset, 1.0);\r\n this.vertexBufferData_ = this.voxelBrickTriangulator_.triangulate();\r\n const vertexCount = this.vertexBufferData_.length / 8;\r\n\r\n this.updateGlobalAo(vertexCount, this.vertexBufferData_); // TEST\r\n\r\n // Add color from w component\r\n if (vertexCount >= gVertexBufferSize) {\r\n console.log(\"not enough room in vertex buffer:\" + vertexCount);\r\n return;\r\n }\r\n\r\n vb.vertexBuffer_.updateVertexBufferData(0, this.vertexBufferData_);\r\n vb.vertexCount_ = vertexCount;\r\n this.totalVertexCount_ += vertexCount;\r\n // console.log(\"total Triangle count\" + this.totalVertexCount_ / 3);\r\n }\r\n}\r\n\r\nexport { VoxelModel };\r\n","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\nimport { vec2 } from \"gl-matrix\";\r\nimport { WMath } from \"wfundament\";\r\n\r\nexport class ClipPolygon {\r\n constructor() {\r\n this.polygon_ = []; // vec2d array\r\n this.polygonNormals_ = [];\r\n this.isValid_ = false;\r\n this.isClosed_ = false;\r\n this.closePolygonRadius_ = 3.0;\r\n this.isClockwize_ = true;\r\n }\r\n\r\n clear() {\r\n this.polygon_.length = 0;\r\n this.polygonNormals_.length = 0;\r\n this.isValid_ = false;\r\n this.isClosed_ = false;\r\n }\r\n\r\n isValid() {\r\n return this.isValid_;\r\n }\r\n\r\n isClosed() {\r\n return this.isClosed_;\r\n }\r\n\r\n setClosePolygonRadius(radius) {\r\n this.closePolygonRadius_ = radius;\r\n }\r\n\r\n getClosePolygonRadius() {\r\n return this.closePolygonRadius_;\r\n }\r\n\r\n addPoint(point) {\r\n // test for closing\r\n if (this.getNumberOfPoints() > 1) {\r\n const distToInitialPoint = vec2.length(\r\n WMath.vec2Sub(this.getPoint(0), point)\r\n );\r\n if (distToInitialPoint < this.getClosePolygonRadius()) {\r\n this.closePolygon();\r\n return;\r\n }\r\n }\r\n\r\n this.polygon_.push(point);\r\n if (this.getNumberOfPoints() > 1) {\r\n const edge = WMath.vec2Sub(\r\n point,\r\n this.getPoint(this.getNumberOfPoints() - 2)\r\n );\r\n let edgeNormal = WMath.vec2GetOrthogonalNegative(edge);\r\n this.polygonNormals_.push(WMath.vec2Normalize(edgeNormal));\r\n }\r\n\r\n this.isValid_ = this.validateClipPolygon(); // test for selfintersections\r\n\r\n if (!this.isValid_) {\r\n this.clear();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n isPointInsideClosingCircle(point) {\r\n if (this.getNumberOfPoints() === 0) {\r\n return false;\r\n }\r\n const distToInitialPoint = vec2.length(\r\n WMath.vec2Sub(this.getPoint(0), point)\r\n );\r\n return distToInitialPoint < this.getClosePolygonRadius();\r\n }\r\n\r\n closePolygon() {\r\n this.polygon_.push(this.getPoint(0));\r\n const edge = WMath.vec2Sub(\r\n this.getPoint(0),\r\n this.getPoint(this.getNumberOfPoints() - 2)\r\n );\r\n let edgeNormal = WMath.vec2GetOrthogonalNegative(edge);\r\n this.polygonNormals_.push(WMath.vec2Normalize(edgeNormal));\r\n this.isClosed_ = true;\r\n let signedArea = this.calculateSignedArea();\r\n this.isClockwize_ = signedArea >= 0.0;\r\n\r\n if (this.isClockwize_) {\r\n console.log(\"polygon is clockwize\");\r\n } else {\r\n console.log(\"polygon is counter clockwize\");\r\n this.changeWinding();\r\n }\r\n return true;\r\n }\r\n\r\n changeWinding() {\r\n let tmpPoly = [];\r\n let tmpPolyNormals = [];\r\n\r\n for (let i = 0; i < this.polygon_.length; i++) {\r\n var p = vec2.create();\r\n vec2.copy(p, this.polygon_[i]);\r\n tmpPoly.push(p);\r\n }\r\n\r\n for (let i = 0; i < this.polygonNormals_.length; i++) {\r\n var n = WMath.vec2Scale(this.polygonNormals_[i], -1.0);\r\n tmpPolyNormals.push(n);\r\n }\r\n\r\n this.polygon_.length = 0;\r\n this.polygonNormals_.length = 0;\r\n\r\n for (let i = tmpPoly.length - 1; i >= 0; i--) {\r\n let p = vec2.create();\r\n vec2.copy(p, tmpPoly[i]);\r\n this.polygon_.push(p);\r\n }\r\n\r\n for (let i = tmpPolyNormals.length - 1; i >= 0; i--) {\r\n this.polygonNormals_.push(tmpPolyNormals[i]);\r\n }\r\n }\r\n\r\n calculateSignedArea() {\r\n var signedArea = 0.0;\r\n for (let i = 0; i < this.getNumberOfPoints() - 1; i++) {\r\n let p0 = this.getPoint(i);\r\n let p1 = this.getPoint(i + 1);\r\n signedArea += p0[0] * p1[1] - p0[1] * p1[0];\r\n }\r\n return signedArea * 0.5;\r\n }\r\n\r\n getNumberOfPoints() {\r\n return this.polygon_.length;\r\n }\r\n\r\n getPoint(index) {\r\n let p = vec2.create();\r\n if (index > this.getNumberOfPoints()) {\r\n return p;\r\n }\r\n vec2.copy(p, this.polygon_[index]);\r\n return p;\r\n }\r\n\r\n getNormal(index) {\r\n let n = vec2.create();\r\n if (index > this.getNumberOfPoints() - 1) {\r\n return n;\r\n }\r\n vec2.copy(n, this.polygonNormals_[index]);\r\n return n;\r\n }\r\n\r\n isPointInside(point) {\r\n // let windingNumber = WMath.calculateWindingNumber2D(point, this.polygon_);\r\n let windingNumber = WMath.getWindingNumber(point, this.polygon_);\r\n return windingNumber === 1; // (windingNumber % 2 == 1);\r\n }\r\n\r\n validateClipPolygon() {\r\n if (this.polygon_.length < 4) {\r\n return true;\r\n } // less than two lines\r\n\r\n for (let i = 0; i < this.polygon_.length - 1; i++) {\r\n let v0 = this.polygon_[i];\r\n let v1 = this.polygon_[i + 1];\r\n\r\n for (let j = i + 1; j < this.polygon_.length - 1; j++) {\r\n let v2 = this.polygon_[j];\r\n let v3 = this.polygon_[j + 1];\r\n\r\n let t = WMath.lineLineIntersection(\r\n v0[0],\r\n v0[1],\r\n v1[0],\r\n v1[1],\r\n v2[0],\r\n v2[1],\r\n v3[0],\r\n v3[1]\r\n );\r\n\r\n if (t > 0.0) {\r\n return false;\r\n } // there is an intersection\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n pointInsideBox(point, boxVertices) {\r\n // let windingNumber = WMath.calculateWindingNumber2D(point, boxVertices);\r\n // return (windingNumber % 2 == 1);\r\n let windingNumber = WMath.getWindingNumber(point, boxVertices);\r\n return windingNumber === 1; // (windingNumber % 2 == 1);\r\n }\r\n\r\n findBoxPolygonIntersectionSegments(boxVertices, polyEdges) {\r\n let numPolyEdges = 0;\r\n for (let i = 0; i < this.getNumberOfPoints() - 1; i++) {\r\n const p0 = this.polygon_[i];\r\n const p1 = this.polygon_[i + 1];\r\n let edgeIntersection = false;\r\n\r\n // test if any of the points are contained\r\n if (this.pointInsideBox(p0, boxVertices)) {\r\n edgeIntersection = true;\r\n } else if (this.pointInsideBox(p1, boxVertices)) {\r\n edgeIntersection = true;\r\n } else {\r\n // line/line intersection\r\n for (let j = 0; j < 4; j++) {\r\n const b0 = boxVertices[j];\r\n const b1 = boxVertices[(j + 1) % 4];\r\n let t = WMath.lineLineIntersection(\r\n p0[0],\r\n p0[1],\r\n p1[0],\r\n p1[1],\r\n b0[0],\r\n b0[1],\r\n b1[0],\r\n b1[1]\r\n );\r\n\r\n if (t >= 0.0) {\r\n edgeIntersection = true;\r\n }\r\n }\r\n }\r\n\r\n if (edgeIntersection) {\r\n polyEdges[numPolyEdges * 4] = p0[0];\r\n polyEdges[numPolyEdges * 4 + 1] = p0[1];\r\n polyEdges[numPolyEdges * 4 + 2] = p1[0];\r\n polyEdges[numPolyEdges * 4 + 3] = p1[1];\r\n numPolyEdges++;\r\n }\r\n }\r\n return numPolyEdges;\r\n }\r\n\r\n boxPolygonIntersection(boxVertices) {\r\n if (boxVertices.length !== 4) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < 4; i++) {\r\n let b0 = boxVertices[i];\r\n let b1 = boxVertices[(i + 1) % 4];\r\n\r\n if (this.linePolygonIntersection(b0, b1)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n linePolygonIntersection(v0, v1) {\r\n for (let i = 0; i < this.getNumberOfPoints() - 1; i++) {\r\n let p0 = this.polygon_[i];\r\n // let p1 = this.polygon_[(i + 1) % this.getNumberOfPoints()];\r\n let p1 = this.polygon_[i + 1];\r\n\r\n let t = WMath.lineLineIntersection(\r\n v0[0],\r\n v0[1],\r\n v1[0],\r\n v1[1],\r\n p0[0],\r\n p0[1],\r\n p1[0],\r\n p1[1]\r\n );\r\n\r\n if (t >= 0.0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\nimport {WColor} from 'wfundament';\r\n\r\n/*\r\n \"Color\": \"#73A000\",\r\n \"Id\": \"7000\",\r\n \"LongName\": \"100_Postglacial_toerv\",\r\n \"Name\": \"Postglacial tørv\",\r\n \"SortOrder\": \"1\"\r\n */\r\n\r\nclass VoxelTransferElement {\r\n constructor(colorHex, id, longName, name, sortOrder) {\r\n this.colorHex_ = colorHex;\r\n let tmp = WColor.hexToRgb(this.colorHex_);\r\n this.color_ = WColor.RgbToVec4(tmp);\r\n this.id_ = id;\r\n this.sortOrder = sortOrder;\r\n this.name_ = name;\r\n this.longName_ = longName;\r\n }\r\n}\r\n\r\nclass VoxelTransferFunction {\r\n constructor() {\r\n this.transferFunctionColors_ = new Float32Array(256 * 4);\r\n this.transferMasks_ = [];\r\n this.voxelTransferElements_ = [];\r\n this.voxelNames_ = [];\r\n }\r\n\r\n async loadVoxelTransfer(fileName) {\r\n const response = await fetch(fileName);\r\n this.voxelTransferJson_ = await response.json();\r\n this.initialize();\r\n }\r\n\r\n getVoxelName(index) {\r\n if (index < 0 || index >= 256) {\r\n return \"None\";\r\n }\r\n\r\n return this.voxelNames_[index];\r\n }\r\n\r\n initialize() {\r\n if (this.voxelTransferJson_ === undefined) {\r\n return;\r\n }\r\n\r\n // create the transfer function data\r\n for (let i = 0; i < 256; i++) {\r\n this.transferFunctionColors_[i * 4] = Math.random(); // 1.0;\r\n this.transferFunctionColors_[i * 4 + 1] = Math.random(); //1.0;\r\n this.transferFunctionColors_[i * 4 + 2] = Math.random(); //1.0;\r\n this.transferFunctionColors_[i * 4 + 3] = 1.0;\r\n this.transferMasks_.push(1.0);\r\n this.voxelNames_.push(\"None\");\r\n }\r\n\r\n for (let i = 0; i < this.voxelTransferJson_.MapRoot.MapLegend.length; i++) {\r\n let mapElm = this.voxelTransferJson_.MapRoot.MapLegend[i];\r\n let id = parseInt(mapElm.LongName.split(\"_\")[0]) / 100;\r\n var voxElement = new VoxelTransferElement(\r\n mapElm.Color,\r\n id,\r\n mapElm.LongName,\r\n mapElm.Name,\r\n mapElm.sortOrder\r\n );\r\n this.voxelTransferElements_.push(voxElement);\r\n\r\n // update the color\r\n if (voxElement.id_ >= 0 && voxElement.id_ < 256) {\r\n this.transferFunctionColors_[voxElement.id_ * 4] = voxElement.color_[0];\r\n this.transferFunctionColors_[voxElement.id_ * 4 + 1] =\r\n voxElement.color_[1];\r\n this.transferFunctionColors_[voxElement.id_ * 4 + 2] =\r\n voxElement.color_[2];\r\n this.transferFunctionColors_[voxElement.id_ * 4 + 3] =\r\n voxElement.color_[3];\r\n\r\n this.voxelNames_[voxElement.id_] = voxElement.name_;\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport { VoxelTransferFunction };\r\n","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\n/* eslint-disable no-unused-vars, default-case */\r\n\r\nimport {mat4, vec3} from 'gl-matrix';\r\nimport {load} from '@loaders.gl/core';\r\n\r\nimport {Tiles3DLoader} from '@loaders.gl/3d-tiles';\r\n\r\n// Fundament\r\nimport {WOrientedBox, WSphere, wVec3Basics} from 'wfundament';\r\n\r\nexport const wTileTypes = {\r\n ModelUnknown: -1,\r\n BatchedModel: 0,\r\n InstancedModel: 1,\r\n PointModel: 2,\r\n CompositeModel: 3,\r\n JsonModel: 4,\r\n};\r\n\r\nexport const wTileRefineStrategy = {\r\n RefineUnknown: -1,\r\n RefineReplace: 0,\r\n RefineAdd: 1,\r\n};\r\n\r\nclass W3DTile {\r\n constructor(json, resourcePath, parentRefineStrategy, parentTileIndex) {\r\n this.resourcePath_ = resourcePath;\r\n\r\n // json\r\n this.json_ = json;\r\n this.content_ = json.content;\r\n this.boundingVolumeJson_ = json.boundingVolume;\r\n this.refineStrategy_ = json.refine ? json.refine : parentRefineStrategy;\r\n\r\n if (this.content_ && this.content_.uri) {\r\n this.tileDataUrl_ = this.content_.uri\r\n ? this.content_.uri\r\n : this.content_.url;\r\n this.tileType_ = this.findTileType(this.tileDataUrl_);\r\n }\r\n\r\n // Rendering info\r\n this.geometricError_ = json.geometricError;\r\n this.transform_ = mat4.create();\r\n\r\n // Feature and batch tables\r\n\r\n // bounding volume\r\n this.hasBoundingSphere_ = false;\r\n this.hasBoundingObb_ = false;\r\n this.createBoundingVolume();\r\n\r\n // caching info\r\n this.cacheIndex_ = -1;\r\n this.isLoaded_ = false;\r\n this.isVisible_ = false; // frustum culling\r\n\r\n // tree information\r\n this.parentIndex_ = parentTileIndex;\r\n this.childInidices_ = [];\r\n\r\n // debug\r\n this.vertexData_ = null;\r\n this.indexData_ = null;\r\n }\r\n\r\n getName() {\r\n return this.tileDataUrl_;\r\n }\r\n\r\n addChildIndex(childIndex) {\r\n this.childInidices_.push(childIndex);\r\n }\r\n\r\n setGeometricError(geometricError) {\r\n this.geometricError_ = geometricError;\r\n }\r\n\r\n getRefineStrategy() {\r\n return this.refineStrategy_;\r\n }\r\n\r\n createBoundingVolume() {\r\n this.obb_ = new WOrientedBox(\r\n \"TileObb\",\r\n vec3.fromValues(0.0, 0.0, 0.0),\r\n wVec3Basics.X,\r\n wVec3Basics.Y,\r\n wVec3Basics.Z\r\n );\r\n this.boundSphere_ = new WSphere(vec3.fromValues(0.0, 0.0, 0.0), 1.0);\r\n }\r\n\r\n findTileType(url) {\r\n if (!url) {\r\n return wTileTypes.ModelUnknown;\r\n }\r\n if (url.substr(0, 4) !== \"http\") {\r\n url = this.resourcePath_ + url;\r\n }\r\n\r\n this.dataUrl_ = url;\r\n const type = url.slice(-4);\r\n switch (type) {\r\n case \"b3dm\":\r\n return wTileTypes.BatchedModel;\r\n\r\n case \"json\":\r\n return wTileTypes.JsonModel;\r\n\r\n case \"pnts\":\r\n return wTileTypes.PointModel;\r\n\r\n case \"i3dm\":\r\n return wTileTypes.InstancedModel;\r\n\r\n case \"cmpt\":\r\n return wTileTypes.CompositeModel;\r\n }\r\n return wTileTypes.ModelUnknown;\r\n }\r\n\r\n async loadTileData() {\r\n switch (this.tileType_) {\r\n case wTileTypes.BatchedModel:\r\n await this.loadB3dmTile(this.dataUrl_);\r\n break;\r\n case wTileTypes.InstancedModel:\r\n break;\r\n case wTileTypes.PointModel:\r\n break;\r\n case wTileTypes.CompositeModel:\r\n break;\r\n }\r\n }\r\n\r\n async loadB3dmTile(url) {\r\n let gltf = await load(url, Tiles3DLoader);\r\n const mesh = gltf.gltf.meshes[0];\r\n\r\n let positionData = null;\r\n let colorData = null;\r\n let normalData = null;\r\n let batchData = null;\r\n\r\n const vertexCount = 0;\r\n\r\n let vertexType = \"vertex3\";\r\n let stride = 3;\r\n if (mesh.primitives[0].attributes.POSITION) {\r\n positionData = mesh.primitives[0].attributes.POSITION.value;\r\n }\r\n\r\n let hasNormals = false;\r\n if (mesh.primitives[0].attributes.NORMAL) {\r\n normalData = mesh.primitives[0].attributes.NORMAL.value;\r\n stride += 3;\r\n hasNormals = true;\r\n vertexType += \"Normal3\";\r\n }\r\n let hasColors = false;\r\n if (mesh.primitives[0].attributes.COLOR_0) {\r\n colorData = mesh.primitives[0].attributes.COLOR_0.value;\r\n stride += 3;\r\n hasColors = true;\r\n vertexType += \"Color3\";\r\n }\r\n\r\n let hasBatchIDs = false;\r\n if (mesh.primitives[0].attributes._BATCHID) {\r\n batchData = mesh.primitives[0].attributes._BATCHID.value;\r\n stride += 1;\r\n hasBatchIDs = true;\r\n vertexType += \"BatchID1\";\r\n }\r\n\r\n this.vertexType_ = vertexType;\r\n\r\n mat4.copy(this.transform_, gltf.gltf.nodes[0].matrix);\r\n\r\n let batchid = null;\r\n if (hasBatchIDs) {\r\n batchid = new Uint32Array(gltf.batchTableBinary.buffer);\r\n }\r\n\r\n // let offsetX = gltf.gltf.scene.nodes[0].matrix[12];\r\n // let offsetY = gltf.gltf.scene.nodes[0].matrix[14];\r\n // let stride = 7 // [x, y, z, nx, ny, nz, batchid]\r\n const vertices = positionData.length / 3;\r\n const normOffset = 3;\r\n const triangles = vertices / 3;\r\n this.vertexData_ = new Float32Array(stride * vertices);\r\n // let u32vboview = new Uint32Array(vbodata.buffer);\r\n for (let i = 0; i < vertices; i++) {\r\n let j = stride * i;\r\n this.vertexData_[j++] = positionData[3 * i];\r\n this.vertexData_[j++] = positionData[3 * i + 1];\r\n this.vertexData_[j++] = positionData[3 * i + 2];\r\n\r\n if (hasNormals) {\r\n this.vertexData_[j++] = normalData[3 * i];\r\n this.vertexData_[j++] = normalData[3 * i + 1];\r\n this.vertexData_[j++] = normalData[3 * i + 2];\r\n }\r\n\r\n if (hasColors) {\r\n this.vertexData_[j++] = colorData[3 * i];\r\n this.vertexData_[j++] = colorData[3 * i + 1];\r\n this.vertexData_[j++] = colorData[3 * i + 2];\r\n }\r\n\r\n if (hasBatchIDs) {\r\n this.vertexData_[j++] = batchid[batchData[i]];\r\n }\r\n\r\n // u32vboview[stride*i + 6] = batchid[Math.floor(batchptr[i])];\r\n }\r\n\r\n /* meshdata.matrixWorld = mat4.create();\r\n\r\n //console.log(vbodata);\r\n let v = [vec3.create(), vec3.create(), vec3.create()];\r\n let e1 = vec3.create();\r\n let e2 = vec3.create();\r\n let nn = vec3.create();\r\n let n = vec3.create();\r\n for ( let i = 0; i < triangles; i++ )\r\n {\r\n for ( let j = 0; j < 3; j++ )\r\n {\r\n //vec3.set(v[j], pos[9*i+3*j], pos[9*i+3*j+1], pos[9*i+3*j+2]);\r\n vec3.set(v[j], vbodata[3*stride*i+stride*j], vbodata[3*stride*i+stride*j+1], vbodata[3*stride*i+stride*j+2]);\r\n }\r\n\r\n vec3.sub(e1, v[1], v[0]);\r\n vec3.sub(e2, v[2], v[0]);\r\n\r\n vec3.cross(nn, e1, e2);\r\n vec3.normalize(n, nn);\r\n for ( let j = 0; j < 3; j++ )\r\n {\r\n vbodata[3*stride*i+stride*j+3] = n[0];\r\n vbodata[3*stride*i+stride*j+4] = n[1];\r\n vbodata[3*stride*i+stride*j+5] = n[2];\r\n }\r\n }\r\n meshdata.vertex = vbodata; */\r\n\r\n if (mesh.primitives[0].indices && mesh.primitives[0].indices.value) {\r\n this.indexData_ = mesh.primitives[0].indices.value.slice();\r\n }\r\n /*\r\n meshdata.index = new Uint32Array(3*triangles);\r\n for (let i = 0; i < triangles; i++ )\r\n {\r\n meshdata.index[3*i] = 3*i;\r\n meshdata.index[3*i+1] = 3*i+1;\r\n meshdata.index[3*i+2] = 3*i+2;\r\n } */\r\n\r\n positionData = null;\r\n normalData = null;\r\n batchData = null;\r\n gltf = null;\r\n }\r\n}\r\n\r\nexport { W3DTile };\r\n","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\n/* eslint-disable no-unused-vars */\r\n\r\nimport {vec3} from 'gl-matrix';\r\nimport {W3DTile} from './W3DTile.js';\r\nimport {intersectsBox} from 'frustum-intersects';\r\nimport {WBox} from 'wfundament';\r\n\r\nclass W3DTileSet {\r\n constructor() {\r\n this.tiles_ = [];\r\n this.metaData_ = null;\r\n this.gisInfo_ = null;\r\n this.rootTransform_ = null;\r\n }\r\n\r\n extractUrlBase(url) {\r\n const index = url.lastIndexOf(\"/\");\r\n if (index === -1) {\r\n return \"./\";\r\n }\r\n return url.substr(0, index + 1);\r\n }\r\n\r\n load3DTileSet(json, url) {\r\n this.resourcePath_ = this.extractUrlBase(url);\r\n const rootTile = new W3DTile(json, this.resourcePath_, \"ADD\", -1);\r\n rootTile.setGeometricError(json.geometricError);\r\n this.rootTransform = json.transform;\r\n this.tiles_.push(rootTile);\r\n\r\n const childIndices = [];\r\n\r\n if (json.children) {\r\n for (let i = 0; i < json.children.length; i++) {\r\n var tileNode = new W3DTile(\r\n json.children[i],\r\n this.resourcePath_,\r\n rootTile.getRefineStrategy(),\r\n 0\r\n );\r\n const tileNodeIndex = this.tiles_.length;\r\n this.tiles_.push(tileNode);\r\n this.addChildIndexToTile(0, tileNodeIndex);\r\n childIndices.push(tileNodeIndex);\r\n }\r\n }\r\n\r\n // defer load on this level to have the root children close at hand for\r\n // inspection.\r\n for (let i = 0; i < childIndices.length; i++) {\r\n this.loadChildTiles(tileNode.json_, childIndices[i]);\r\n }\r\n }\r\n\r\n loadChildTiles(json, tileNodeIndex) {\r\n const parentTile = this.getTile(tileNodeIndex);\r\n\r\n if (json.children) {\r\n for (let i = 0; i < json.children.length; i++) {\r\n const tileNode = new W3DTile(\r\n json.children[i],\r\n this.resourcePath_,\r\n parentTile.getRefineStrategy(),\r\n tileNodeIndex\r\n );\r\n const tileIndex = this.tiles_.length;\r\n this.tiles_.push(tileNode);\r\n this.addChildIndexToTile(tileNodeIndex, tileIndex);\r\n\r\n if (tileNode.json_.children) {\r\n this.loadChildTiles(tileNode.json_, tileIndex); // recurse\r\n }\r\n }\r\n }\r\n }\r\n\r\n filterVisibleLeaves(\r\n camera /* instance of wOrbitCamera */,\r\n transform /* mat4 */,\r\n maxDistance /* number */\r\n ) {\r\n const vp = camera.getViewProjection();\r\n // Transform is an optional mat4 transformation from geographical to\r\n // frustum coordinates.\r\n const nodeIntersection = (node, hitRecord) => {\r\n const b = node.boundingVolume.box;\r\n const bbMin = vec3.create();\r\n const bbMax = vec3.create();\r\n\r\n if (transform) {\r\n vec3.transformMat4(\r\n bbMin,\r\n [b[0] - b[3], b[1] - b[7], b[2] - b[11]],\r\n transform\r\n );\r\n vec3.transformMat4(\r\n bbMax,\r\n [b[0] + b[3], b[1] + b[7], b[2] + b[11]],\r\n transform\r\n );\r\n } else {\r\n vec3.set(bbMin, [b[0] - b[3], b[1] - b[7], b[2] - b[11]]);\r\n vec3.set(bbMax, [b[0] + b[3], b[1] + b[7], b[2] + b[11]]);\r\n }\r\n\r\n const bbox = new WBox(\"bb\", bbMin, bbMax);\r\n if (!intersectsBox(vp, [bbMin, bbMax])) {\r\n return false;\r\n }\r\n // if ( frustum.frustumCullBox(bbox) ) {\r\n // return false;\r\n // }\r\n if (!node.children) {\r\n node.distance_ = vec3.distance(camera.getPosition(), [\r\n 0.5 * (bbMin[0] + bbMax[0]),\r\n 0.5 * (bbMin[1] + bbMax[1]),\r\n 0.5 * (bbMin[2] + bbMax[2]),\r\n ]);\r\n if (maxDistance && node.distance_ > maxDistance) {\r\n return false;\r\n } else {\r\n hitRecord.hitNodes.push(node);\r\n return true;\r\n }\r\n }\r\n\r\n let isec = false;\r\n for (let i = 0; i < node.children.length; i++) {\r\n isec |= nodeIntersection(node.children[i], hitRecord);\r\n }\r\n\r\n return isec;\r\n };\r\n\r\n const hitRecord = { hitNodes: [] };\r\n\r\n nodeIntersection(this.tiles_[0].json_, hitRecord);\r\n\r\n // Sort from camera pos\r\n hitRecord.hitNodes.sort((a, b) => {\r\n return a.distance_ - b.distance_;\r\n });\r\n\r\n return hitRecord;\r\n }\r\n\r\n addChildIndexToTile(tileIndex, childIndex) {\r\n this.tiles_[tileIndex].addChildIndex(childIndex);\r\n }\r\n\r\n getTile(tileIndex) {\r\n return this.tiles_[tileIndex];\r\n }\r\n}\r\n\r\nexport { W3DTileSet };\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"static/js/TileLoader.worker.6b154cf1.worker.js\");\n}\n","export default __webpack_public_path__ + \"316339631776fd6f7f753f2fb6304f9d.nrrd\";","export default __webpack_public_path__ + \"32201161c60dd2b5937f86ce529a8e3f.txt\";","export default __webpack_public_path__ + \"c5ff534d6f781e0d09bd65bb331bf2a7.txt\";","export default __webpack_public_path__ + \"59d2771f5721046b0cb0d0cfa459f532.png\";","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\n/* eslint-disable no-unused-vars, eqeqeq */\r\n\r\n// External ////////////////////////////////////////////////////////\r\nimport { mat3, mat4, vec2, vec3, vec4 } from 'gl-matrix';\r\n\r\n// wfundament ////////////////////////////////////////////////////////////\r\nimport {\r\n WBox,\r\n WCylinder,\r\n WFrustum,\r\n WImageLoader,\r\n WKeyboardEventHandler,\r\n WLruCache,\r\n WMath,\r\n wMathConst,\r\n wMouseButtons,\r\n WMouseEventHandler,\r\n WOrbitCamera,\r\n WSphere,\r\n WTextLayout,\r\n WTouchEventHandler,\r\n wVec4Colors,\r\n} from 'wfundament';\r\nimport { wClipPlaneAxis } from 'wfundament/source/wuxi/WClipPlane.js';\r\nimport { WUxi } from 'wfundament/source/wuxi/WUxi.js';\r\n\r\n// wgtek ///////////////////////////////////////////////////////////\r\nimport {\r\n WgBuffer,\r\n WgContext,\r\n WgFbo,\r\n WgFontRender,\r\n WgPrimRender,\r\n WgResourceCache,\r\n WgShader,\r\n WgTexture,\r\n WgVertexBuffer,\r\n WgVertexDescriptor,\r\n WgWuxiRender,\r\n} from 'wgtek';\r\n\r\n// webasm //////////////////////////////////////////////////////////\r\nimport nrrd from 'nrrd-js';\r\nimport { VoxelModel } from './voxel/VoxelModel.js';\r\n////////////////////////////////////////////////////////////////////////\r\nimport { ClipPolygon } from './ClipPolygon.js';\r\nimport { VoxelTransferFunction } from './voxel/VoxelTransferFunction.js';\r\n\r\nimport { W3DTileSet } from './tile3d/W3DTileSet.js';\r\nimport { W3DTile } from './tile3d/W3DTile.js';\r\n\r\n// webasm //////////////////////////////////////////////////////////\r\n/* eslint-disable import/no-webpack-loader-syntax */\r\nimport Worker from 'worker-loader!./tile3d/TileLoader.worker.js';\r\nimport aarhus_nrrd from '!!file-loader!../assets/aarhus_compress.nrrd';\r\nimport voxelDefinition from '!!file-loader!../assets/VoxelDefinition.json.txt'; //\r\nimport verdana_json from '!!file-loader!../assets/verdana.json.txt'; //\r\n//import verdana_png from '!!file-loader!../assets/verdana.png';\r\n//const verdana_json = \"assets/verdana.json\"; //\r\nimport verdana_png from \"!!file-loader!../assets/verdana.png\";\r\n\r\nconst tilesetPath = process.env.PUBLIC_URL + '/boreholes/';\r\nconst buildingsTilesetPath = process.env.PUBLIC_URL + '/citymodel/';\r\n//const tilesetPath = \"assets/boreholes/\";\r\n//const buildingsTilesetPath = \"assets/aarhus/\";\r\nconst gFontTextureName = \"FontTexture\";\r\nconst DISABLE_PICKING = false;\r\nconst kftoken_ = \"fdf320eb064dce1c5db925a2d7f32783\";\r\nlet aarhus_overlay_image_url = `https://api.dataforsyningen.dk/topo_skaermkort_DAF?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=TRUE&SERVICENAME=topo_skaermkort_DAF&LAYERS=dtk_skaermkort_graa&TOKEN=${kftoken_}&STYLES=&WIDTH=1024&HEIGHT=1024&SRS=EPSG:25832&BBOX=`\r\n\r\n// UI EVENTS ///////////////////////////////////////////////////////////\r\nlet buttonEvent_ = false;\r\nlet toggleDrawClipPlaneEvent_ = false;\r\nlet currentClipPlaneAxis_ = 0;\r\n\r\n// ui ids\r\nconst hasPassive = false;\r\nconst ToggleClipPlaneDrawButtonId = 2;\r\nconst ToggleAxisAlignedClipPlaneId = 3;\r\nconst ToggleClipPlaneLabelId = 4;\r\nconst AxisClipPlaneLabelId = 5;\r\nconst AxisClipPlaneToggleAxisLabelId = 6;\r\nconst ClipPlaneFrameId = 10;\r\n\r\nconst PickingInfoFrameId = 20;\r\nconst PickingIdLabel_ = 21;\r\nconst PickingNameLabel_ = 22;\r\nconst PickingNameStr_ = \"Selected voxel name: \";\r\nconst PickingIdStr_ = \"Selected voxel id: \";\r\n\r\nconst clipPlanePosXIndex = 64;\r\nconst clipPlanePosZIndex = 65;\r\n\r\nconst drawHeight = 1;\r\n\r\nlet PerformPickingPass = false;\r\n\r\n///////////////////////////////////////////////////////////////////////\r\nfunction buttonCallBack(id) {\r\n //console.log(\"button id: \" + id + \" clicked\");\r\n\r\n if (id === 0) {\r\n buttonEvent_ = true;\r\n }\r\n\r\n if (id === ToggleAxisAlignedClipPlaneId) {\r\n currentClipPlaneAxis_++;\r\n if (currentClipPlaneAxis_ > 2) {\r\n currentClipPlaneAxis_ = 0;\r\n }\r\n }\r\n\r\n if (id === ToggleClipPlaneDrawButtonId) {\r\n toggleDrawClipPlaneEvent_ = true;\r\n }\r\n}\r\n\r\nconst buildingsVsSrc = `#version 300 es\r\nprecision mediump float;\r\nin vec4 Pos;\r\nin vec3 Normal;\r\nout vec3 n;\r\nuniform mat4 VP;\r\n\r\nvoid main()\r\n{\r\nn = Normal;\r\ngl_Position = VP * Pos;\r\n}`;\r\nconst buildingsFsSrc = `#version 300 es\r\nprecision mediump float;\r\nin vec3 n;\r\nout vec4 fragData;\r\nuniform float transparency;\r\n\r\nvoid main()\r\n{\r\nvec3 lightDir = vec3(1.0)/1.73;\r\nfragData = vec4(vec3(clamp(dot(n, lightDir),0.0,1.0)*0.8 +0.2) , 1.0-transparency);\r\n}\r\n`;\r\n\r\nconst boreholeVsSrc = `#version 300 es\r\nprecision mediump float;\r\nin vec4 Pos;\r\nin vec3 Normal;\r\nin vec3 Color;\r\nout vec3 n;\r\nout vec3 col;\r\nuniform mat4 VP;\r\n\r\nvoid main()\r\n{\r\ncol = Color;\r\nn = Normal;\r\ngl_Position = VP * Pos;\r\n}`;\r\n\r\nconst boreholeFsSrc = `#version 300 es\r\nprecision mediump float;\r\nin vec3 n;\r\nin vec3 col;\r\nout vec4 fragData;\r\nuniform float transparency;\r\n\r\nvoid main()\r\n{\r\nvec3 lightDir = vec3(1.0)/1.73;\r\nfragData = vec4(col*vec3(clamp(dot(n, lightDir),0.0,1.0)*0.4 +0.6) , 1.0-transparency);\r\n}\r\n`;\r\n\r\nconst boreholeIdVsSrc = `#version 300 es\r\nprecision mediump float;\r\nin vec4 Pos;\r\nin highp float BatchId;\r\nout highp float id;\r\nuniform mat4 VP;\r\n\r\nvoid main()\r\n{\r\nid = BatchId;\r\ngl_Position = VP * Pos;\r\n}`;\r\n\r\nconst boreholeIdFsSrc = `#version 300 es\r\nprecision mediump float;\r\nin highp float id;\r\nout vec4 fragData;\r\n\r\nvoid main()\r\n{\r\nuint uid = uint(id);\r\nfragData.x = float((uid>>24u) & 0xFFu)/255.0;\r\nfragData.y = float((uid>>16u) & 0xFFu)/255.0;\r\nfragData.z = float((uid>>8u) & 0xFFu)/255.0;\r\nfragData.w = float(uid & 0xFFu)/255.0;\r\n}\r\n`;\r\n\r\n////////////////////////////////////////////////////////////////////\r\n\r\nexport const AppMode = {\r\n AppNormal: 0,\r\n AppDrawClipPlane: 1,\r\n AppTopView: 2,\r\n};\r\n\r\n// app /////////////////////////////////////////////////////////////\r\nexport class WgApp {\r\n constructor(canvas) {\r\n const gl = canvas.getContext(\"webgl2\", { preserveDrawingBuffer: true });\r\n\r\n this.glContext_ = new WgContext(gl, canvas);\r\n this.gl = gl;\r\n this.frameCount_ = 0;\r\n this.lastFps_ = 0;\r\n this.resourceCache_ = new WgResourceCache(); // a convinient way to share\r\n // textures and other graphics\r\n // resources.\r\n\r\n this.appMode_ = AppMode.AppNormal;\r\n this.voxelLightValue_ = 1.0;\r\n\r\n this.cameraPosition_ = vec3.fromValues(0, 4, 25.6 - 15);\r\n this.orbitCamera_ = new WOrbitCamera(\"orbitCamera\");\r\n this.orbitCamera_.nearPlane_ = 0.01;\r\n this.orbitCamera_.setViewport(\r\n this.glContext_.getCanvasWidth(),\r\n this.glContext_.getCanvasHeight()\r\n );\r\n this.orbitCamera_.setOrbitPivotTarget([25.6, 25.6, 0.0]);\r\n this.orbitCamera_.setPerspective(60.0);\r\n this.orbitCamera_.setUpvector(vec3.fromValues(0.0, 0.0, 1.0));\r\n this.orbitCamera_.setZoomSpeed(3.0);\r\n this.orbitCamera_.setCameraPosition(this.cameraPosition_);\r\n this.cameraActiveCounter_ = 0; // used to make sure that the active camera\r\n // keeps the focus\r\n\r\n this.frustum_ = new WFrustum();\r\n this.frustum_.updateFromViewProjection(\r\n this.orbitCamera_.getViewProjection()\r\n );\r\n this.frustum_.updateFrustumPoints(this.orbitCamera_.getViewProjection());\r\n\r\n this.lruCache_ = [new WLruCache(64), new WLruCache(96)];\r\n this.visibleTiles_ = [[], []];\r\n this.tilesMaxDistance_ = 10.0;\r\n\r\n this.buildingsShader_ = new WgShader(\"shader\", this.glContext_);\r\n this.buildingsShader_.createShaderProgram(buildingsVsSrc, buildingsFsSrc, {\r\n Pos: 0,\r\n Normal: 1,\r\n });\r\n\r\n this.boreholeShader_ = new WgShader(\"boreholeshader\", this.glContext_);\r\n this.boreholeShader_.createShaderProgram(boreholeVsSrc, boreholeFsSrc, {\r\n Pos: 0,\r\n Normal: 1,\r\n Color: 2,\r\n });\r\n\r\n this.boreholeIdShader_ = new WgShader(\"idshader\", this.glContext_);\r\n this.boreholeIdShader_.createShaderProgram(\r\n boreholeIdVsSrc,\r\n boreholeIdFsSrc,\r\n { Pos: 0, BatchId: 3 }\r\n );\r\n\r\n this.showTileset_ = [true, true];\r\n\r\n // Font rendering\r\n this.fontRender_ = null;\r\n this.primRender_ = null;\r\n this.wuxiRender_ = null;\r\n this.wuxi_ = null;\r\n\r\n //event handlers\r\n this.keyboard_handler_ = new WKeyboardEventHandler();\r\n this.mouseEventHander_ = new WMouseEventHandler();\r\n this.touchEventHandler_ = new WTouchEventHandler();\r\n this.image_loader_ = new WImageLoader(\"image_loader\");\r\n\r\n // dat gui\r\n this.browerInfo_ = {\r\n browser: \"unknown\",\r\n winner: true,\r\n };\r\n\r\n this.slider_ = {\r\n name: \"Slider\",\r\n value: 0.0,\r\n maxSize: 1.0,\r\n };\r\n\r\n this.appInfo_ = {\r\n appName: \"GeoNovo project 3D\",\r\n appDeveloper: \"Trier & Kjeldsen\",\r\n fps: 0,\r\n visibleTilesBorehole: 0,\r\n visibleTilesBuildings: 0,\r\n };\r\n\r\n this.domainSize_ = [1, 1];\r\n this.domainOrigin_ = [0, 0, 0];\r\n this.geoTransform_ = mat4.create();\r\n this.heightScale_ = 1.0;\r\n\r\n this.pickingRay_ = null;\r\n /*\r\n this.debugGui_ = new dat.GUI({ name: 'Debug input' });\r\n this.debugGui_.add(this.appInfo_, 'appName');\r\n let fpsController = this.debugGui_.add(this.appInfo_, 'fps');\r\n let cullController = this.debugGui_.add(this.appInfo_, 'visibleTilesBorehole');\r\n let cullBuildingsController = this.debugGui_.add(this.appInfo_, 'visibleTilesBuildings');\r\n this.debugGui_.add(this.slider_, \"value\").min(0.0).max(1.0);\r\n\r\n\r\n setInterval(() => {\r\n fpsController.setValue(this.appInfo_.fps);\r\n cullController.setValue(this.appInfo_.visibleTilesBorehole);\r\n cullBuildingsController.setValue(this.appInfo_.visibleTilesBuildings);\r\n }, 1000);\r\n */\r\n\r\n this.clipLine_ = [];\r\n this.currentAxisClipPlane_ = -1;\r\n\r\n this.clipPolygon_ = new ClipPolygon();\r\n this.clipPolygon_.setClosePolygonRadius(1.0);\r\n this.boxIsecPoint_ = vec3.create();\r\n\r\n this.scheduleRender_ = true;\r\n this.tileset_ = [];\r\n //this.tileLoaderWorker_ = new Worker(new URL('./TileLoader.worker.js',\r\n // import.meta.url));\r\n this.tileLoaderWorker_ = new Worker();\r\n\r\n // Set hander when tile data is loaded in worker\r\n this.tileLoaderWorker_.onmessage = ({ data }) => {\r\n const tile = data.tile;\r\n if (!this.lruCache_[tile.tilesetIndex_].inCache(tile.json_.content.uri)) {\r\n data = null;\r\n return;\r\n }\r\n\r\n tile.vertexBuffer_ = new WgVertexBuffer(\r\n `vbo${tile.dataUrl_}`,\r\n this.glContext_\r\n );\r\n\r\n const gl = this.glContext_.gl();\r\n let desc = new WgVertexDescriptor(tile.vertexType_, this.glContext_.gl());\r\n\r\n tile.vertexBuffer_.createVertexBuffer(\r\n gl.STATIC_DRAW,\r\n desc.vertexLayout_,\r\n tile.vertexData_.length /\r\n (desc.getVertexSizeInBytes() / Float32Array.BYTES_PER_ELEMENT),\r\n desc.getVertexSizeInBytes(),\r\n tile.vertexData_\r\n );\r\n tile.vertexData_ = null;\r\n tile.indexBuffer_ = null;\r\n if (tile.indexData_) {\r\n tile.indexBuffer_ = new WgBuffer(\"testIndexbuffer\", this.glContext_);\r\n tile.indexBuffer_.createBuffer(\r\n gl.ELEMENT_ARRAY_BUFFER,\r\n gl.STATIC_DRAW,\r\n tile.indexData_.length,\r\n tile.indexData_.BYTES_PER_ELEMENT,\r\n tile.indexData_\r\n );\r\n\r\n tile.vertexBuffer_.bind();\r\n tile.indexBuffer_.bind();\r\n tile.vertexBuffer_.unbind();\r\n tile.indexBuffer_.unbind();\r\n tile.indexData_ = null;\r\n }\r\n\r\n // Insert the real tile in the cache\r\n if (this.lruCache_[tile.tilesetIndex_].inCache(tile.json_.content.uri)) {\r\n this.lruCache_[tile.tilesetIndex_].remove(tile.json_.content.uri);\r\n this.lruCache_[tile.tilesetIndex_].insert(tile.json_.content.uri, tile);\r\n\r\n tile.getName = function () {\r\n return `${tile.dataUrl_}`;\r\n }; // Set method\r\n // for\r\n // resource\r\n // cache\r\n this.resourceCache_.addResource(tile);\r\n }\r\n\r\n this.scheduleRender_ = true;\r\n };\r\n\r\n this.lruCache_[1].setOnElementRemoved((key) => {\r\n let resourceKey = this.tileset_[1].resourcePath_ + key;\r\n let tile = this.resourceCache_.findResourceByName(resourceKey);\r\n if (tile) {\r\n tile.vertexBuffer_.deleteVertexBuffer();\r\n tile.indexBuffer_.deleteBuffer();\r\n this.resourceCache_.removeResource(resourceKey);\r\n }\r\n\r\n //console.log(this.resourceCache_.findResourceByName(this.tileset_[1].resourcePath_\r\n // + key)); console.log(this.lruCache_[1]); this.lruCache_[1];\r\n });\r\n /*\r\n worker.postMessage({\r\n question:\r\n 'The Answer to the Ultimate Question of Life, The Universe, and Everything.',\r\n });\r\n worker.onmessage = ({ data: { answer } }) => {\r\n console.log(answer);\r\n };\r\n */\r\n\r\n this.readBackPixelX_ = 0;\r\n this.readBackPixelY_ = 0;\r\n\r\n this.voxelSelectionPoint_ = vec3.create();\r\n\r\n // event handling\r\n window.addEventListener(\"keydown\", (event) => {\r\n this.getKeyboardEventHandler().keyDown(event);\r\n });\r\n window.addEventListener(\"keyup\", (event) => {\r\n this.getKeyboardEventHandler().keyUp(event);\r\n });\r\n\r\n canvas.addEventListener(\"mousedown\", (event) => {\r\n this.getMouseEventHandler().onMouseDown(event);\r\n });\r\n canvas.addEventListener(\"mouseup\", (event) => {\r\n this.getMouseEventHandler().onMouseUp(event);\r\n });\r\n canvas.addEventListener(\"mousemove\", (event) => {\r\n this.getMouseEventHandler().onMouseMove(event);\r\n });\r\n canvas.addEventListener(\"mouseleave\", (event) => {\r\n this.getMouseEventHandler().onMouseLeave(event);\r\n });\r\n canvas.addEventListener(\"click\", (event) => {\r\n this.getMouseEventHandler().onMouseClick(event);\r\n });\r\n canvas.addEventListener(\"dblclick\", (event) => {\r\n this.getMouseEventHandler().onMouseDoubleClick(event);\r\n });\r\n canvas.addEventListener(\"wheel\", (event) => {\r\n event.preventDefault();\r\n this.getMouseEventHandler().onMouseWheel(event);\r\n });\r\n canvas.addEventListener(\r\n \"touchstart\",\r\n (event) => {\r\n this.getTouchEventHandler().onTouchStart(event);\r\n },\r\n hasPassive ? { passive: false } : false\r\n );\r\n canvas.addEventListener(\r\n \"touchend\",\r\n (event) => {\r\n this.getTouchEventHandler().onTouchEnd(event);\r\n },\r\n hasPassive ? { passive: false } : false\r\n );\r\n canvas.addEventListener(\r\n \"touchcancel\",\r\n (event) => {\r\n this.getTouchEventHandler().onTouchCancel(event);\r\n },\r\n hasPassive ? { passive: false } : false\r\n );\r\n canvas.addEventListener(\r\n \"touchmove\",\r\n (event) => {\r\n this.getTouchEventHandler().onTouchMove(event);\r\n },\r\n hasPassive ? { passive: false } : false\r\n );\r\n\r\n canvas.addEventListener(\r\n \"contextmenu\",\r\n (e) => {\r\n e.preventDefault();\r\n this.getMouseEventHandler().onMouseRightClick();\r\n },\r\n false\r\n );\r\n\r\n // Event loop\r\n this.lastTimeStamp_ = 0;\r\n\r\n this.init().then(() => {\r\n requestAnimationFrame((timestamp) => {\r\n this.loop(timestamp);\r\n });\r\n });\r\n }\r\n\r\n loop(timestamp) {\r\n let deltaTime = timestamp - this.lastTimeStamp_;\r\n this.update(deltaTime / 100);\r\n this.render(timestamp);\r\n this.lastTimeStamp_ = timestamp;\r\n requestAnimationFrame((ts) => {\r\n this.loop(ts);\r\n });\r\n }\r\n\r\n getKeyboardEventHandler() {\r\n return this.keyboard_handler_;\r\n }\r\n\r\n getMouseEventHandler() {\r\n return this.mouseEventHander_;\r\n }\r\n\r\n getTouchEventHandler() {\r\n return this.touchEventHandler_;\r\n }\r\n\r\n async init() {\r\n // Load and create resources\r\n await this.loadImageResources(verdana_png, gFontTextureName);\r\n\r\n await this.loadBmFont();\r\n\r\n //this.VoxelBrickMesher_ = await VoxelBrickMesher();\r\n //this.voxelBrick_ = new this.VoxelBrickMesher_.VoxelBrick(VoxelDim,\r\n // VoxelHeight);\r\n this.voxelModel_ = new VoxelModel(\r\n this.glContext_,\r\n this.resourceCache_,\r\n 32,\r\n 64,\r\n 0.2,\r\n 0.003\r\n );\r\n\r\n this.voxelTransferFunction_ = new VoxelTransferFunction();\r\n\r\n await this.loadVoxelData();\r\n await this.voxelModel_.init();\r\n await this.voxelTransferFunction_.loadVoxelTransfer(voxelDefinition);\r\n\r\n const gl = this.glContext_.gl();\r\n this.voxelTransferTexture_ = new WgTexture(\r\n \"voxelTransferTexture\",\r\n this.glContext_\r\n );\r\n this.voxelTransferTexture_.create2D(gl.RGBA16F, 256, 1, true, false);\r\n this.voxelTransferTexture_.uploadDataToTexture(\r\n gl.RGBA,\r\n gl.FLOAT,\r\n this.voxelTransferFunction_.transferFunctionColors_\r\n );\r\n this.resourceCache_.addResource(this.voxelTransferTexture_);\r\n\r\n this.voxelModel_.setTransferTexture(this.voxelTransferTexture_);\r\n\r\n this.loadTileset();\r\n\r\n this.createFbo();\r\n\r\n this.primRender_ = new WgPrimRender(\"primitiveRender\", this.glContext_);\r\n this.wuxiRender_ = new WgWuxiRender(\r\n \"WuxiRender\",\r\n this.glContext_,\r\n this.resourceCache_\r\n );\r\n\r\n this.clipPolygon_.setClosePolygonRadius(0.01 * this.domainSize_[0]);\r\n this.createUi();\r\n\r\n this.createPrimitives();\r\n // voxel model\r\n this.voxelModel_.resetAllVoxelBricks();\r\n }\r\n\r\n loadTileset() {\r\n this.tileset_ = [null, null];\r\n\r\n fetch(`${tilesetPath}/tileset.json`, { mode: \"cors\" }).then((resp) => {\r\n resp.json().then((json) => {\r\n this.tileset_[0] = new W3DTileSet();\r\n\r\n this.tileset_[0].load3DTileSet(json.root, tilesetPath);\r\n\r\n this.tileset_[0].filterVisibleLeaves(\r\n this.orbitCamera_,\r\n this.geoTransform_\r\n );\r\n });\r\n });\r\n\r\n fetch(`${buildingsTilesetPath}/tileset.json`, { mode: \"cors\" }).then(\r\n (resp) => {\r\n resp.json().then((json) => {\r\n this.tileset_[1] = new W3DTileSet();\r\n\r\n this.tileset_[1].load3DTileSet(json.root, buildingsTilesetPath);\r\n\r\n this.tileset_[1].filterVisibleLeaves(\r\n this.orbitCamera_,\r\n this.geoTransform_\r\n );\r\n });\r\n }\r\n );\r\n }\r\n\r\n createFbo() {\r\n const gl = this.glContext_.gl();\r\n this.readBackFbo_ = new WgFbo(\"ReadBackFbo\", this.glContext_);\r\n this.readBackTexture_ = new WgTexture(\"readBackTexture\", this.glContext_);\r\n this.readBackTexture_.create2D(\r\n gl.RGBA8,\r\n this.glContext_.getCanvasWidth(),\r\n this.glContext_.getCanvasHeight(),\r\n true,\r\n false\r\n );\r\n this.readBackTexture_.activeTexture_ = gl.TEXTURE0;\r\n this.readBackFbo_.attachTexture(this.readBackTexture_);\r\n this.readBackFbo_.createDepthStencilBuffer(\r\n this.glContext_.getCanvasWidth(),\r\n this.glContext_.getCanvasHeight()\r\n );\r\n this.readBackFbo_.unbind();\r\n }\r\n\r\n createPrimitives() {\r\n this.sphere_ = new WSphere(vec3.fromValues(100.0, 5.0, 100.0), 8.0);\r\n this.cylinder1_ = new WCylinder(\"cyl1\", 25.0, 2.0);\r\n this.cylinder1_.setCenterPosition(vec3.fromValues(150, 10.0, 200.0));\r\n\r\n this.cylinder2_ = new WCylinder(\"cyl2\", 25.0, 2.0);\r\n this.cylinder2_.setCenterPosition(vec3.fromValues(170, 10.0, 200.0));\r\n\r\n this.cylinder3_ = new WCylinder(\"cyl3\", 25.0, 2.0);\r\n this.cylinder3_.setCenterPosition(vec3.fromValues(185, 10.0, 210.0));\r\n\r\n this.cylinder4_ = new WCylinder(\"cyl4\", 25.0, 2.0);\r\n this.cylinder4_.setCenterPosition(vec3.fromValues(185, 10.0, 170.0));\r\n\r\n this.cylinder5_ = new WCylinder(\"cyl5\", 25.0, 2.0);\r\n this.cylinder5_.setCenterPosition(vec3.fromValues(150, 10.0, 170.0));\r\n\r\n this.cylinder6_ = new WCylinder(\"cyl5\", 25.0, 1.5);\r\n this.cylinder6_.setCenterPosition(vec3.fromValues(150, 10.0, 155.0));\r\n\r\n //this.box0_ = new WBox(\"box0\", vec3.fromValues(0.0, 0.0, 0.0),\r\n // vec3.fromValues(256.0, 256.0, drawHeight));\r\n this.clipPlaneDrawBox_ = new WBox(\r\n \"box0\",\r\n vec3.fromValues(0.0, 0.0, 0.0),\r\n vec3.fromValues(\r\n this.voxelModel_.getVoxelDimension()[0],\r\n this.voxelModel_.getVoxelDimension()[2],\r\n drawHeight\r\n )\r\n );\r\n\r\n let ellipsOrientation = mat3.create();\r\n mat3.fromRotation(ellipsOrientation, wMathConst.fPI_HALF * 0.9);\r\n\r\n /* let covMat = mat3.fromValues(\r\n 1.0, 2.0, 0.0,\r\n 2.0, 1.0, 0.0,\r\n 0.0, 0.0, 1.0\r\n )\r\n\r\n let covMat2 = mat3.fromValues(\r\n 1.25425468, 0.1824987, 0.18482315,\r\n 0.1824987, 0.97253923, 0.07018075,\r\n 0.18482315, 0.07018075, 0.91375323\r\n )\r\n\r\n let eigenValues = vec3.create();\r\n let eigenVectors = WMath.calculateEigenValues(covMat2, eigenValues);\r\n\r\n this.ellipsoid0_ = new WEllipsoid(\"ellipsoid0\", vec3.fromValues(-20.0, 20.0, 0.0), vec3.fromValues(17.0, 12.0, 9.0), eigenVectors);// ellipsOrientation);*/\r\n }\r\n\r\n createUi() {\r\n // Wuxi\r\n this.wuxi_ = new WUxi(\"Wuxi\");\r\n this.wuxi_.addButton(\r\n 0,\r\n \"Button1\",\r\n vec3.fromValues(-10.0, 70.0, 0.0),\r\n 28.0,\r\n 8.0\r\n );\r\n\r\n this.wuxi_.addButton(\r\n ToggleClipPlaneDrawButtonId,\r\n \"Toggle clip Button\",\r\n vec3.fromValues(115.0, 80.0, 20.0),\r\n 50.0,\r\n 16.0\r\n );\r\n this.wuxi_.addTextLabel(\r\n ToggleClipPlaneLabelId,\r\n \"textLabel1\",\r\n vec3.fromValues(115.0, 95.0, 20.0),\r\n 50.0,\r\n 10.0,\r\n \"Toggle draw clipplane mode\",\r\n this.textLayout_\r\n );\r\n\r\n this.wuxi_.addButton(\r\n ToggleAxisAlignedClipPlaneId,\r\n \"ToggleAxisClipplanes\",\r\n vec3.fromValues(170.0, 80.0, 20.0),\r\n 50.0,\r\n 16.0\r\n );\r\n this.wuxi_.addTextLabel(\r\n AxisClipPlaneToggleAxisLabelId,\r\n \"textLabel2\",\r\n vec3.fromValues(170.0, 95.0, 20.0),\r\n 50.0,\r\n 10.0,\r\n \"Toggle axis clipplanes\",\r\n this.textLayout_\r\n );\r\n this.wuxi_.addTextLabel(\r\n AxisClipPlaneLabelId,\r\n \"axisClipLabel\",\r\n vec3.fromValues(this.domainSize_[0], this.domainSize_[1], 2),\r\n 2.0,\r\n 2.0,\r\n \"X\",\r\n this.textLayout_\r\n );\r\n\r\n this.wuxi_.addFrame(ClipPlaneFrameId, \"ClipPlaneFrame\");\r\n\r\n // Clipping frame\r\n let clipPlaneFrame = this.wuxi_.findUiElement(ClipPlaneFrameId);\r\n //clipPlaneFrame.addWidget(this.wuxi_.findUiElement(ToggleClipPlaneDrawButtonId));\r\n // clipPlaneFrame.addWidget(this.wuxi_.findUiElement(ToggleClipPlaneLabelId));\r\n // clipPlaneFrame.addWidget(this.wuxi_.findUiElement(ToggleAxisAlignedClipPlaneId));\r\n // clipPlaneFrame.addWidget(this.wuxi_.findUiElement(AxisClipPlaneToggleAxisLabelId));\r\n\r\n clipPlaneFrame.addWidget(this.wuxi_.findUiElement(AxisClipPlaneLabelId));\r\n clipPlaneFrame.setColor(vec4.fromValues(1.0, 0.5, 0.0, 0.2));\r\n this.wuxi_.findUiElement(ClipPlaneFrameId).setFrameBorder(0.3);\r\n\r\n this.wuxi_.addClipPlane(\r\n clipPlanePosXIndex,\r\n \"Xpos\",\r\n vec3.fromValues(0.0, this.domainSize_[1] * 0.5, 0.0),\r\n 10,\r\n this.domainSize_[0],\r\n wClipPlaneAxis.X_POS_AXIS\r\n );\r\n this.wuxi_.addClipPlane(\r\n clipPlanePosZIndex,\r\n \"Zpos\",\r\n vec3.fromValues(this.domainSize_[0] * 0.5, this.domainSize_[1], 0.0),\r\n this.domainSize_[1],\r\n 10,\r\n wClipPlaneAxis.Y_POS_AXIS\r\n );\r\n // picking frame\r\n this.wuxi_.addFrame(PickingInfoFrameId, \"PickingIdFrame\");\r\n let pickingFrame = this.wuxi_.findUiElement(PickingInfoFrameId);\r\n pickingFrame.setFrameBorder(0.3);\r\n this.wuxi_.addTextLabel(\r\n PickingNameLabel_,\r\n \"PickingNameLabel\",\r\n vec3.fromValues(0.0, 14.0, 0.0),\r\n 4.0,\r\n 0.8,\r\n PickingNameStr_ + \"None\",\r\n this.textLayout_\r\n );\r\n this.wuxi_.addTextLabel(\r\n PickingIdLabel_,\r\n \"PickingIdLabel\",\r\n vec3.fromValues(0.0, 15.0, 0.0),\r\n 4.0,\r\n 0.8,\r\n PickingIdStr_ + \"-1\",\r\n this.textLayout_\r\n );\r\n\r\n pickingFrame.addWidget(this.wuxi_.findUiElement(PickingNameLabel_));\r\n pickingFrame.addWidget(this.wuxi_.findUiElement(PickingIdLabel_));\r\n this.wuxi_.findUiElement(PickingInfoFrameId).setHidden();\r\n\r\n this.wuxi_.findUiElement(clipPlanePosXIndex).setHidden();\r\n this.wuxi_.findUiElement(clipPlanePosZIndex).setHidden();\r\n\r\n this.wuxi_.findUiElement(0).setColor(vec4.fromValues(1.0, 0.3, 0.3, 0.8));\r\n this.wuxi_.findUiElement(0).registerButtonClickCallback(buttonCallBack);\r\n this.wuxi_.findUiElement(0).setHidden();\r\n\r\n this.wuxi_\r\n .findUiElement(ToggleClipPlaneDrawButtonId)\r\n .registerButtonClickCallback(buttonCallBack);\r\n this.wuxi_\r\n .findUiElement(ToggleAxisAlignedClipPlaneId)\r\n .registerButtonClickCallback(buttonCallBack);\r\n\r\n this.wuxi_.findUiElement(ToggleClipPlaneLabelId).setHidden();\r\n this.wuxi_.findUiElement(AxisClipPlaneLabelId).setHidden();\r\n this.wuxi_.findUiElement(ToggleClipPlaneDrawButtonId).setHidden();\r\n this.wuxi_.findUiElement(ToggleAxisAlignedClipPlaneId).setHidden();\r\n this.wuxi_.findUiElement(AxisClipPlaneToggleAxisLabelId).setHidden();\r\n }\r\n\r\n createTextureFromImage(image, textureName, createMipMap) {\r\n const texture_res = new WgTexture(textureName, this.glContext_);\r\n texture_res.create2dFromImage(\r\n image,\r\n this.glContext_.gl().RGBA,\r\n this.glContext_.gl().RGBA,\r\n this.glContext_.gl().UNSIGNED_BYTE,\r\n false,\r\n createMipMap\r\n );\r\n this.resourceCache_.addResource(texture_res);\r\n }\r\n\r\n async loadImageResources(url, name) {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = () => {\r\n this.createTextureFromImage(img, name, true);\r\n resolve(img);\r\n };\r\n img.onerror = () => {\r\n reject(new Error(`Could not load image ${url}`));\r\n };\r\n img.crossOrigin = \"Anonymous\";\r\n img.src = url;\r\n });\r\n }\r\n\r\n async loadBmFont() {\r\n const response = await fetch(verdana_json);\r\n this.fontInfo_ = await response.json();\r\n this.textLayout_ = new WTextLayout(this.fontInfo_);\r\n const fontTexture =\r\n this.resourceCache_.findResourceByName(gFontTextureName);\r\n this.fontRender_ = new WgFontRender(\r\n \"FontRender\",\r\n this.glContext_,\r\n this.textLayout_,\r\n fontTexture\r\n );\r\n }\r\n\r\n async loadVoxelData() {\r\n // let voxels = new Int32Array(voxelDim * voxelDim * voxelHeight);\r\n let resp = await fetch(aarhus_nrrd);\r\n let buf = await resp.arrayBuffer();\r\n let nrrdData = nrrd.parse(buf);\r\n const triScale = nrrdData.spaceDirections[0][0] / 1000.0; // 1 gl unit is\r\n // 1km\r\n // domainSize used to scale positions to uv\r\n this.domainSize_[0] = nrrdData.sizes[0] * triScale;\r\n this.domainSize_[1] = nrrdData.sizes[1] * triScale;\r\n vec3.copy(this.domainOrigin_, nrrdData.spaceOrigin);\r\n this.voxelModel_.setVoxelData(\r\n nrrdData.sizes[0],\r\n nrrdData.sizes[2],\r\n nrrdData.sizes[1],\r\n nrrdData.data\r\n );\r\n\r\n this.voxelModel_.setHeightOffset(0.001 * nrrdData.spaceOrigin[2]);\r\n this.voxelModel_.setHeightScale(this.heightScale_);\r\n\r\n //mat4.set(this.geoTransform_, 1/1000, 0, 0, 0, 0, 1/1000, 0, 0, 0, 0,\r\n // 1/1000, 0, -nrrdData.spaceOrigin[0]/1000, -nrrdData.spaceOrigin[1]/1000,\r\n // -nrrdData.spaceOrigin[2]/1000.0, 1);\r\n mat4.set(\r\n this.geoTransform_,\r\n 1 / 1000,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 1 / 1000,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 1 / 1000,\r\n 0,\r\n -nrrdData.spaceOrigin[0] / 1000,\r\n -nrrdData.spaceOrigin[1] / 1000,\r\n 0.0,\r\n 1\r\n );\r\n\r\n let bb = [\r\n this.domainOrigin_[0],\r\n this.domainOrigin_[1],\r\n this.domainOrigin_[0] + 1000 * this.domainSize_[0],\r\n this.domainOrigin_[1] + 1000 * this.domainSize_[1],\r\n ];\r\n\r\n try {\r\n await this.loadImageResources(\r\n aarhus_overlay_image_url + bb.join(\",\"),\r\n \"overlay\",\r\n true\r\n );\r\n } catch (error) {\r\n console.log(\"error\");\r\n }\r\n\r\n\r\n this.voxelModel_.setOverlayTexture(\r\n this.resourceCache_.findResourceByName(\"overlay\")\r\n );\r\n }\r\n\r\n updateWuxi(isLeftMouseDown, cameraHasFocus) {\r\n // wuxi ui update\r\n if (!this.wuxi_) {\r\n return;\r\n }\r\n this.wuxi_.updateUiElements(\r\n this.orbitCamera_.getView(),\r\n this.orbitCamera_.getRight()\r\n );\r\n let uiElements = this.wuxi_.getUiElements();\r\n let updateHover = !cameraHasFocus;\r\n let wuxiElementActive = false;\r\n const R = this.orbitCamera_.getRight();\r\n const U = this.orbitCamera_.getUp();\r\n\r\n for (let i = 0; i < uiElements.length; i++) {\r\n let uiElement = uiElements[i];\r\n\r\n if (uiElement.getIsHidden()) {\r\n continue;\r\n }\r\n\r\n if (updateHover) {\r\n uiElement.updateState(this.pickingRay_, isLeftMouseDown);\r\n } else {\r\n uiElement.resetHover();\r\n }\r\n\r\n if (uiElement.getState().hover_) {\r\n updateHover = false;\r\n }\r\n\r\n if (uiElement.getIsActive()) {\r\n wuxiElementActive = true;\r\n }\r\n\r\n if (!uiElement.hasParent()) {\r\n uiElement.updateOrientation(R, U);\r\n } else {\r\n uiElement.updateFromParent();\r\n }\r\n }\r\n return wuxiElementActive;\r\n }\r\n\r\n /*\r\n this.cameraActiveCounter_--;\r\n let cameraHasFocus = this.cameraActiveCounter_ > 0;\r\n\r\n let fx = this.getMouseEventHandler().getNormX();\r\n let fy = this.getMouseEventHandler().getNormY();\r\n this.pickingRay_ = this.orbitCamera_.getPickingRay(fx, fy);\r\n let isLeftMouseDown = this.getMouseEventHandler().isDown(wMouseButtons.LeftButton);\r\n */\r\n\r\n updateAxisClipPlane() {\r\n if (!this.wuxi_) {\r\n return;\r\n }\r\n let clipX = this.wuxi_.findUiElement(clipPlanePosXIndex);\r\n let clipZ = this.wuxi_.findUiElement(clipPlanePosZIndex);\r\n // update axis aligned clip planes\r\n if (this.currentAxisClipPlane_ != currentClipPlaneAxis_) {\r\n this.currentAxisClipPlane_ = currentClipPlaneAxis_;\r\n\r\n if (this.currentAxisClipPlane_ == 0) {\r\n this.wuxi_.findUiElement(clipPlanePosXIndex).setVisible();\r\n this.wuxi_.findUiElement(clipPlanePosZIndex).setHidden();\r\n this.wuxi_.findUiElement(AxisClipPlaneLabelId).setLabelText(\"X\");\r\n this.wuxi_.findUiElement(AxisClipPlaneLabelId).setVisible();\r\n this.wuxi_\r\n .findUiElement(ClipPlaneFrameId)\r\n .setPosition(\r\n vec3.fromValues(\r\n clipX.getClipPosition(),\r\n 0.5 * this.domainSize_[1],\r\n 10\r\n )\r\n );\r\n this.wuxi_\r\n .findUiElement(AxisClipPlaneLabelId)\r\n .setColor(vec4.fromValues(1.0, 0.2, 0.2, 0.8));\r\n }\r\n\r\n if (this.currentAxisClipPlane_ == 1) {\r\n this.wuxi_.findUiElement(clipPlanePosXIndex).setHidden();\r\n this.wuxi_.findUiElement(clipPlanePosZIndex).setVisible();\r\n this.wuxi_.findUiElement(AxisClipPlaneLabelId).setLabelText(\"Y\");\r\n this.wuxi_.findUiElement(AxisClipPlaneLabelId).setVisible();\r\n this.wuxi_\r\n .findUiElement(ClipPlaneFrameId)\r\n .setPosition(\r\n vec3.fromValues(\r\n 0.5 * this.domainSize_[0],\r\n clipZ.getClipPosition(),\r\n 10\r\n )\r\n );\r\n this.wuxi_\r\n .findUiElement(AxisClipPlaneLabelId)\r\n .setColor(vec4.fromValues(0.0, 0.2, 1.0, 0.8));\r\n }\r\n\r\n if (this.currentAxisClipPlane_ == 2) {\r\n this.wuxi_.findUiElement(clipPlanePosXIndex).setHidden();\r\n this.wuxi_.findUiElement(clipPlanePosZIndex).setHidden();\r\n this.wuxi_.findUiElement(AxisClipPlaneLabelId).setHidden();\r\n }\r\n }\r\n\r\n if (clipX.getIsActive() && !clipX.getIsHidden()) {\r\n this.voxelModel_.clipPlanes_.clipXMin_ =\r\n (clipX.getClipPosition() * this.voxelModel_.voxelDimension_[0]) /\r\n this.domainSize_[0];\r\n this.voxelModel_.updateClipPlane();\r\n this.wuxi_\r\n .findUiElement(ClipPlaneFrameId)\r\n .setPosition(\r\n vec3.fromValues(\r\n clipX.getClipPosition(),\r\n 0.5 * this.domainSize_[1],\r\n 10\r\n )\r\n );\r\n\r\n this.scheduleRender_ = true;\r\n }\r\n\r\n if (clipZ.getIsActive() && !clipZ.getIsHidden()) {\r\n this.wuxi_\r\n .findUiElement(ClipPlaneFrameId)\r\n .setPosition(\r\n vec3.fromValues(\r\n 0.5 * this.domainSize_[0],\r\n clipZ.getClipPosition(),\r\n 10\r\n )\r\n );\r\n this.voxelModel_.clipPlanes_.clipZMin_ =\r\n this.voxelModel_.voxelDimension_[2] -\r\n (clipZ.getClipPosition() * this.voxelModel_.voxelDimension_[2]) /\r\n this.domainSize_[1];\r\n this.voxelModel_.updateClipPlane();\r\n this.scheduleRender_ = true;\r\n }\r\n }\r\n\r\n updateClipPolygon(cameraHasFocus) {\r\n // user clip plane drawing\r\n if (this.appMode_ == AppMode.AppDrawClipPlane && !cameraHasFocus) {\r\n let hitinfo = this.clipPlaneDrawBox_.getIntersection(this.pickingRay_);\r\n\r\n if (hitinfo.validHit_) {\r\n let isecPos;\r\n isecPos = this.pickingRay_.evaluateRay(hitinfo.hitTimes_[0]);\r\n vec3.copy(this.boxIsecPoint_, isecPos);\r\n //isecPos[0] = (isecPos[0]); // snap to voxel\r\n //isecPos[1] = (isecPos[1]);\r\n isecPos[2] += 0.001;\r\n }\r\n\r\n if (this.getMouseEventHandler().isClicked(wMouseButtons.LeftButton)) {\r\n if (hitinfo.validHit_ && !this.clipPolygon_.isClosed()) {\r\n if (this.clipPolygon_.isClosed()) {\r\n this.clipPolygon_.clear();\r\n }\r\n this.clipPolygon_.addPoint(\r\n vec2.fromValues(\r\n Math.round(this.boxIsecPoint_[0]) - 0.001,\r\n Math.round(this.boxIsecPoint_[1]) - 0.001\r\n )\r\n );\r\n\r\n if (this.clipPolygon_.isClosed()) {\r\n if (this.clipPolygon_.isValid()) {\r\n // Create a clip polygon in voxel space\r\n let scaledClipPolygon = new ClipPolygon();\r\n const voxelDim = this.voxelModel_.getVoxelDimension();\r\n for (let i = 0; i < this.clipPolygon_.getNumberOfPoints(); i++) {\r\n let point = this.clipPolygon_.getPoint(\r\n this.clipPolygon_.getNumberOfPoints() - 1 - i\r\n );\r\n\r\n point[0] = Math.round(\r\n (point[0] * voxelDim[0]) / this.domainSize_[0]\r\n );\r\n point[1] = Math.round(\r\n voxelDim[2] -\r\n 1 -\r\n (point[1] * voxelDim[2]) / this.domainSize_[1]\r\n );\r\n scaledClipPolygon.addPoint(point);\r\n }\r\n this.voxelModel_.updateClipPolygon(scaledClipPolygon);\r\n } else {\r\n this.voxelModel_.resetAllVoxelBricks();\r\n }\r\n\r\n this.appMode_ = AppMode.AppNormal;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n handleWuxiEvents() {\r\n if (buttonEvent_) {\r\n buttonEvent_ = false;\r\n this.voxelModel_.resetAllVoxelBricks();\r\n }\r\n\r\n if (toggleDrawClipPlaneEvent_) {\r\n toggleDrawClipPlaneEvent_ = false;\r\n if (this.appMode_ == AppMode.AppNormal) {\r\n this.appMode_ = AppMode.AppDrawClipPlane;\r\n this.wuxi_\r\n .findUiElement(ToggleClipPlaneDrawButtonId)\r\n .setColor(vec4.fromValues(0.3, 0.6, 0.3, 0.5));\r\n this.clipPolygon_.clear();\r\n this.voxelModel_.resetAllVoxelBricks();\r\n\r\n this.wuxi_.findUiElement(clipPlanePosXIndex).setHidden();\r\n this.wuxi_.findUiElement(clipPlanePosZIndex).setHidden();\r\n this.wuxi_.findUiElement(AxisClipPlaneLabelId).setHidden();\r\n } else {\r\n this.appMode_ = AppMode.AppNormal;\r\n this.wuxi_\r\n .findUiElement(ToggleClipPlaneDrawButtonId)\r\n .setColor(vec4.fromValues(0.3, 0.3, 0.3, 0.75));\r\n }\r\n }\r\n }\r\n\r\n update(deltaTime) {\r\n this.cameraActiveCounter_--;\r\n const cameraHasFocus = this.cameraActiveCounter_ > 0;\r\n const isLeftMouseDown = this.getMouseEventHandler().isDown(\r\n wMouseButtons.LeftButton\r\n );\r\n\r\n this.pickingRay_ = this.orbitCamera_.getPickingRay(\r\n this.getMouseEventHandler().getNormX(),\r\n this.getMouseEventHandler().getNormY()\r\n );\r\n\r\n this.voxelLightValue_ +=\r\n this.appMode_ == AppMode.AppDrawClipPlane ? -0.01 : 0.01;\r\n this.voxelLightValue_ = WMath.clampF(this.voxelLightValue_, 0.75, 1.0);\r\n\r\n if (this.appMode_ == AppMode.AppDrawClipPlane) {\r\n this.updateClipPolygon(cameraHasFocus);\r\n this.scheduleRender_ = true;\r\n } else {\r\n this.updateAxisClipPlane();\r\n }\r\n\r\n this.handleWuxiEvents();\r\n\r\n let wuxiElementActive = this.updateWuxi(isLeftMouseDown, cameraHasFocus);\r\n if (wuxiElementActive) {\r\n this.scheduleRender_ = true;\r\n }\r\n\r\n if (this.voxelModel_.update()) {\r\n this.scheduleRender_ = true;\r\n }\r\n\r\n // in case of no wuxi interaction we can update the camera\r\n if (!wuxiElementActive) {\r\n if (\r\n this.orbitCamera_.update(\r\n deltaTime,\r\n this.getMouseEventHandler(),\r\n this.getKeyboardEventHandler(),\r\n this.getTouchEventHandler()\r\n )\r\n ) {\r\n this.voxelModel_.updateVoxelBrickDepths(this.orbitCamera_.getView());\r\n\r\n this.cameraActiveCounter_ = 4;\r\n this.scheduleRender_ = true;\r\n // Update frustum to follow camera\r\n this.frustum_.updateFromViewProjection(\r\n this.orbitCamera_.getViewProjection()\r\n );\r\n this.frustum_.updateFrustumPoints(\r\n this.orbitCamera_.getViewProjection()\r\n );\r\n for (let k = 0; k < this.tileset_.length; k++) {\r\n if (this.tileset_[k] && this.showTileset_[k]) {\r\n this.visibleTiles_[k] = this.tileset_[k].filterVisibleLeaves(\r\n this.orbitCamera_,\r\n this.geoTransform_,\r\n this.tilesMaxDistance_\r\n ).hitNodes;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.visibleTiles_.forEach((visibleTiles, j) => {\r\n if (!this.showTileset_[j]) {\r\n return;\r\n }\r\n for (let i = 0; i < visibleTiles.length; i++) {\r\n const node = visibleTiles[i];\r\n\r\n if (!this.lruCache_[j].inCache(node.content.uri)) {\r\n let cachedTile = this.loadTile(node, j);\r\n if (cachedTile) {\r\n this.lruCache_[j].insert(node.content.uri, cachedTile);\r\n } else {\r\n // Insert dummy object for future replacement.\r\n this.lruCache_[j].insert(node.content.uri, {});\r\n }\r\n break;\r\n } else {\r\n this.lruCache_[j].update(visibleTiles[i].content.uri);\r\n }\r\n }\r\n });\r\n\r\n //this.scheduleRender_ = true;\r\n\r\n /* if (this.getKeyboardEventHandler().isPressed('p')) {\r\n PerformPickingPass = true;\r\n console.log(\"picking\");\r\n }*/\r\n\r\n if (this.getMouseEventHandler().isDoubleClicked(wMouseButtons.LeftButton)) {\r\n PerformPickingPass = true;\r\n }\r\n\r\n if (PerformPickingPass) {\r\n this.readBackPixelX_ = this.getMouseEventHandler().clientX_;\r\n this.readBackPixelY_ =\r\n this.glContext_.getCanvasHeight() -\r\n 1 -\r\n this.getMouseEventHandler().clientY_;\r\n\r\n if (\r\n this.readBackPixelX_ < 0 ||\r\n this.readBackPixelX_ >= this.glContext_.getCanvasWidth()\r\n ) {\r\n console.log(\"invalid mouse x readback pos:\" + this.readBackPixelX_);\r\n PerformPickingPass = false;\r\n }\r\n\r\n if (\r\n this.readBackPixelY_ < 0 ||\r\n this.readBackPixelY_ >= this.glContext_.getCanvasHeight()\r\n ) {\r\n console.log(\"invalid mouse y readback pos:\" + this.readBackPixelY_);\r\n PerformPickingPass = false;\r\n }\r\n this.scheduleRender_ = true; // Make sure to schedule at new render\r\n // with picking has taken place\r\n }\r\n\r\n this.getMouseEventHandler().flush();\r\n this.getTouchEventHandler().flush();\r\n }\r\n\r\n updatePrimRender() {\r\n /*\r\n this.primRender_.clearTextures();\r\n this.primRender_.addGridXZ(10, 51.2)\r\n this.primRender_.addFrustumWireframe(this.frustum_.frustumPoints_, wVec4Colors.Orange);\r\n\r\n this.primRender_.addSphere(this.sphere_, wVec4Colors.Green);\r\n this.primRender_.addCylinder(this.cylinder1_, wVec4Colors.Grey);\r\n this.primRender_.addCylinder(this.cylinder2_, wVec4Colors.LightGrey);\r\n this.primRender_.addCylinder(this.cylinder3_, wVec4Colors.Yellow);\r\n this.primRender_.addCylinder(this.cylinder4_, wVec4Colors.Orange);\r\n this.primRender_.addCylinder(this.cylinder5_, wVec4Colors.Red);\r\n this.primRender_.addCylinder(this.cylinder6_, wVec4Colors.Orange);\r\n this.primRender_.addTexture2D(0.0, 0.4, 0.01, 0.02, this.voxelTransferTexture_);\r\n // this.primRender_.addTexture2D(0.8, 1.0, 0.8, 1.0, this.readBackFbo_.getAttachment(0));\r\n\r\n /* let ellipsoidVerts = this.ellipsoid0_.getTriangulation();\r\n for (let i = 0; i < ellipsoidVerts.length; i += 3) {\r\n\r\n this.primRender_.addTriangle(\r\n WMath.vec4FromVec3(ellipsoidVerts[i]), wVec4Colors.Red,\r\n WMath.vec4FromVec3(ellipsoidVerts[i + 1]), wVec4Colors.Green,\r\n WMath.vec4FromVec3(ellipsoidVerts[i + 2]), wVec4Colors.Blue,\r\n );\r\n }\r\n */\r\n let voxelInfoFrame = this.wuxi_.findUiElement(PickingInfoFrameId);\r\n\r\n if (!voxelInfoFrame.getIsHidden()) {\r\n let frameBottom = WMath.vec3Sub(\r\n voxelInfoFrame.getCenterPosition(),\r\n vec3.fromValues(0.0, 0.0, voxelInfoFrame.getHeight() * 0.51)\r\n );\r\n let toFrame = WMath.vec3Sub(frameBottom, this.voxelSelectionPoint_);\r\n let lineEnd = WMath.vec3Add(this.voxelSelectionPoint_, toFrame);\r\n this.primRender_.clearPrimitive();\r\n this.primRender_.addLine(\r\n WMath.vec4FromVec3(this.voxelSelectionPoint_),\r\n wVec4Colors.White,\r\n WMath.vec4FromVec3(lineEnd),\r\n wVec4Colors.LightGrey\r\n );\r\n }\r\n\r\n this.primRender_.addTexture2D(\r\n 0.0,\r\n 0.4,\r\n 0.01,\r\n 0.04,\r\n this.voxelTransferTexture_\r\n );\r\n\r\n if (this.appMode_ == AppMode.AppDrawClipPlane) {\r\n this.primRender_.clearPrimitive();\r\n\r\n for (let i = 0; i < this.clipPolygon_.getNumberOfPoints(); i++) {\r\n let cp0;\r\n let cp1;\r\n\r\n if (i == 0 && !this.clipPolygon_.isClosed()) {\r\n let initialPoint = this.clipPolygon_.getPoint(i);\r\n const p = vec4.fromValues(\r\n initialPoint[0],\r\n initialPoint[1],\r\n drawHeight,\r\n 1.0\r\n );\r\n cp1 = vec2.fromValues(this.boxIsecPoint_[0], this.boxIsecPoint_[1]);\r\n\r\n const cirlceColor = this.clipPolygon_.isPointInsideClosingCircle(cp1)\r\n ? wVec4Colors.Green\r\n : wVec4Colors.White;\r\n this.primRender_.addCircleWireFrameXY(\r\n p,\r\n this.clipPolygon_.getClosePolygonRadius(),\r\n cirlceColor\r\n );\r\n }\r\n\r\n if (\r\n !this.clipPolygon_.isClosed() &&\r\n i == this.clipPolygon_.getNumberOfPoints() - 1\r\n ) {\r\n cp0 = this.clipPolygon_.getPoint(i);\r\n cp1 = vec2.fromValues(this.boxIsecPoint_[0], this.boxIsecPoint_[1]);\r\n } else {\r\n cp0 = this.clipPolygon_.getPoint(i);\r\n cp1 = this.clipPolygon_.getPoint(\r\n (i + 1) % this.clipPolygon_.getNumberOfPoints()\r\n );\r\n }\r\n\r\n const v0 = vec4.fromValues(cp0[0], cp0[1], drawHeight, 1.0);\r\n const v1 = vec4.fromValues(cp1[0], cp1[1], drawHeight, 1.0);\r\n\r\n if (i < this.clipPolygon_.getNumberOfPoints() - 1) {\r\n let polyNormal = this.clipPolygon_.getNormal(i);\r\n const midPoint = vec4.fromValues(\r\n cp0[0] + (cp1[0] - cp0[0]) * 0.5,\r\n cp0[1] + (cp1[1] - cp0[1]) * 0.5,\r\n drawHeight,\r\n 1.0\r\n );\r\n let normLen =\r\n 0.5 * (this.domainSize_[0] + this.domainSize_[1]) * 0.01;\r\n const norm = vec4.fromValues(\r\n midPoint[0] + polyNormal[0] * normLen,\r\n midPoint[1] + polyNormal[1] * normLen,\r\n drawHeight,\r\n 1.0\r\n );\r\n this.primRender_.addLine(\r\n midPoint,\r\n wVec4Colors.Green,\r\n norm,\r\n wVec4Colors.Yellow\r\n );\r\n }\r\n\r\n this.primRender_.addLine(v0, wVec4Colors.White, v1, wVec4Colors.White);\r\n this.primRender_.addPoint(v0, wVec4Colors.Red);\r\n }\r\n }\r\n }\r\n\r\n updateWuxiRender() {\r\n if (!this.wuxiRender_) {\r\n return;\r\n }\r\n\r\n // render update back to front by reversing the list\r\n this.wuxiRender_.clearElements();\r\n let uiElements = this.wuxi_.getUiElements();\r\n for (let i = uiElements.length - 1; i >= 0; i--) {\r\n let uiElement = uiElements[i];\r\n if (!uiElement.getIsHidden()) {\r\n this.wuxiRender_.addUiElement(uiElement);\r\n }\r\n }\r\n }\r\n\r\n loadTile(node, tilesetIndex) {\r\n if (!node.content) {\r\n return;\r\n }\r\n\r\n if (\r\n this.resourceCache_.findResourceByName(\r\n this.tileset_[tilesetIndex].resourcePath_ + node.content.uri\r\n )\r\n ) {\r\n return this.resourceCache_.findResourceByName(\r\n this.tileset_[tilesetIndex].resourcePath_ + node.content.uri\r\n );\r\n } else {\r\n let wtile = new W3DTile(node, this.tileset_[tilesetIndex].resourcePath_);\r\n wtile.tilesetIndex_ = tilesetIndex;\r\n this.tileLoaderWorker_.postMessage(wtile);\r\n return null;\r\n //this.tileLoaderWorker_.onmessage(wtile);\r\n //await wtile.loadB3dmTile(this.tileset_.resourcePath_ +\r\n // node.content.uri); this.resourceCache_.addResource(wtile); return\r\n // wtile;\r\n }\r\n }\r\n\r\n renderPickingFbo(vp, v) {\r\n const gl = this.gl;\r\n gl.clearColor(0.0, 0.0, 0.0, 1.0);\r\n\r\n this.readBackFbo_.bind();\r\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\r\n this.boreholeIdShader_.bindProgram();\r\n\r\n this.boreholeIdShader_.unbindProgram();\r\n this.voxelModel_.render(\r\n vp,\r\n v,\r\n this.orbitCamera_.getDir(),\r\n this.voxelLightValue_,\r\n true\r\n );\r\n const pixels = new Uint8Array(4);\r\n gl.readPixels(\r\n this.readBackPixelX_,\r\n this.readBackPixelY_,\r\n 1,\r\n 1,\r\n gl.RGBA,\r\n gl.UNSIGNED_BYTE,\r\n pixels\r\n );\r\n this.readBackFbo_.unbind();\r\n\r\n PerformPickingPass = false;\r\n\r\n if (pixels[3] > 0 && pixels[0] > 0) {\r\n let idLabel = this.wuxi_.findUiElement(PickingIdLabel_);\r\n let voxelNameLabel = this.wuxi_.findUiElement(PickingNameLabel_);\r\n idLabel.setLabelText(PickingIdStr_ + pixels[0]);\r\n //console.log(\"pixel readback values:\" + pixels[0] + \",\" + pixels[1] +\r\n // \",\" + pixels[2] + \",\" + pixels[3]);\r\n\r\n let voxelName = this.voxelTransferFunction_.getVoxelName(pixels[0]);\r\n voxelNameLabel.setLabelText(PickingNameStr_ + voxelName);\r\n\r\n let voxelInfoFrame = this.wuxi_.findUiElement(PickingInfoFrameId);\r\n this.voxelSelectionPoint_ = this.pickingRay_.evaluateRay(pixels[2] * 5.0);\r\n let isecPos = this.pickingRay_.evaluateRay(\r\n Math.max(1.0, pixels[2] * 5.0)\r\n );\r\n isecPos[2] = Math.max(isecPos[2], 3.35);\r\n voxelInfoFrame.setFrameCenterPosition(isecPos);\r\n voxelInfoFrame.setVisible();\r\n\r\n //this.orbitCamera_.setOrbitPivotTarget(this.voxelSelectionPoint_);\r\n } else {\r\n this.wuxi_.findUiElement(PickingInfoFrameId).setHidden();\r\n }\r\n }\r\n\r\n renderTile(cache, node, shader) {\r\n if (!cache.inCache(node.content.uri)) {\r\n return false;\r\n }\r\n const tile = cache.cache_[node.content.uri].value_;\r\n if (!tile.vertexBuffer_) {\r\n return false;\r\n }\r\n\r\n const gl = this.gl;\r\n //console.log(this.lruCache_.cache_[node.content.uri].value_);\r\n //tile.indexBuffer_.bind();\r\n let mvp = mat4.create();\r\n let transform = mat4.create();\r\n mat4.fromScaling(transform, [0.001, 0.001, 0.001 * this.heightScale_]);\r\n transform[12] = tile.transform_[12] * 0.001 + this.geoTransform_[12];\r\n transform[13] = -tile.transform_[14] * 0.001 + this.geoTransform_[13];\r\n\r\n mat4.multiply(mvp, this.orbitCamera_.getViewProjection(), transform);\r\n\r\n let transparency = 0.0;\r\n let blendOnsetFraction = 0.8;\r\n let blendEnabled = false;\r\n if (node.distance_ > blendOnsetFraction * this.tilesMaxDistance_) {\r\n gl.enable(gl.BLEND);\r\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\r\n transparency =\r\n (node.distance_ - blendOnsetFraction * this.tilesMaxDistance_) /\r\n ((1.0 - blendOnsetFraction) * this.tilesMaxDistance_);\r\n blendEnabled = true;\r\n }\r\n shader.setUniformMat4fv(\"VP\", mvp);\r\n shader.setUniform1f(\"transparency\", transparency);\r\n\r\n tile.vertexBuffer_.bind();\r\n gl.drawElements(\r\n gl.TRIANGLES,\r\n tile.indexBuffer_.numberOfElements_,\r\n gl.UNSIGNED_INT,\r\n 0\r\n );\r\n tile.vertexBuffer_.unbind();\r\n\r\n if (blendEnabled) {\r\n gl.disable(gl.BLEND);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n render() {\r\n const vp = this.orbitCamera_.getViewProjection();\r\n const v = this.orbitCamera_.getView();\r\n if (!DISABLE_PICKING) {\r\n if (PerformPickingPass) {\r\n this.renderPickingFbo(vp, v);\r\n this.updateWuxi(false, false);\r\n this.scheduleRender_ = true;\r\n }\r\n }\r\n\r\n if (!this.scheduleRender_) {\r\n return;\r\n }\r\n this.updateWuxiRender();\r\n const gl = this.glContext_.gl();\r\n this.updateFps();\r\n\r\n this.updatePrimRender();\r\n\r\n gl.clearColor(0.3, 0.3, 0.3, 1.0);\r\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\r\n gl.enable(gl.DEPTH_TEST);\r\n\r\n // actual rendering\r\n\r\n let renderedTiles = [0, 0];\r\n let shaders = [this.boreholeShader_, this.buildingsShader_];\r\n for (let k = 0; k < this.visibleTiles_.length; k++) {\r\n if (this.showTileset_[k]) {\r\n let shader = shaders[k];\r\n\r\n shader.bindProgram();\r\n\r\n for (let i = 0; i < this.visibleTiles_[k].length; i++) {\r\n const node = this.visibleTiles_[k][i];\r\n\r\n let tileRendered = this.renderTile(this.lruCache_[k], node, shader);\r\n if (tileRendered) {\r\n renderedTiles[k]++;\r\n }\r\n\r\n if (renderedTiles[k] > 64) {\r\n break;\r\n }\r\n }\r\n shader.unbindProgram();\r\n }\r\n\r\n if (k == 0) {\r\n //const mvp = mat4.create();\r\n //mat4.multiply(mvp, vp, [0.2,0,0,0 , 0,0,0.1,0, 0,-0.066,0,0,\r\n // 0,100,-51.2,1 ] ); this.voxelModel_.setHeightScale(1);\r\n // this.voxelModel_.setHeightOffset(0);\r\n\r\n //this.voxelModel_.render(vp, this.orbitCamera_.getDir(),\r\n // this.voxelLightValue_);\r\n this.voxelModel_.render(\r\n vp,\r\n v,\r\n this.orbitCamera_.getDir(),\r\n this.voxelLightValue_,\r\n false\r\n );\r\n }\r\n }\r\n\r\n this.appInfo_.visibleTilesBorehole = renderedTiles[0];\r\n this.appInfo_.visibleTilesBuildings = renderedTiles[1];\r\n\r\n // debug\r\n let clipPlaneController = this.wuxi_.findUiElement(clipPlanePosXIndex);\r\n // this.primRender_.addWLine(clipPlaneController.getClipOrthoLine(),wVec4Colors.Green,wVec4Colors.Yellow);\r\n // this.primRender_.addPoint(clipPlaneController.orthoLinePoint_,\r\n // wVec4Colors.Yellow );\r\n // this.primRender_.addPoint(clipPlaneController.lineProjectedPoint_,\r\n // wVec4Colors.Red );\r\n\r\n this.primRender_.render(vp);\r\n\r\n //this.voxelModel_.render(vp, this.orbitCamera_.getDir(),\r\n // this.voxelLightValue_);\r\n\r\n this.wuxiRender_.render(\r\n vp,\r\n this.orbitCamera_.getRight(),\r\n this.orbitCamera_.getUp()\r\n );\r\n this.fontRender_.render();\r\n\r\n // var glErr = this.gl.getError();\r\n this.scheduleRender_ = false;\r\n }\r\n\r\n updateFps() {\r\n this.frameCount_++;\r\n let timeSinceLastFpsMeasure = (performance.now() - this.lastFps_) / 1000.0;\r\n if (timeSinceLastFpsMeasure > 1.0) {\r\n let fps = this.frameCount_ / timeSinceLastFpsMeasure;\r\n this.lastFps_ = performance.now();\r\n this.frameCount_ = 0;\r\n this.appInfo_.fps = Math.round(fps);\r\n }\r\n }\r\n\r\n resize(width, height) {\r\n this.glContext_.canvas_.width = width;\r\n this.glContext_.canvas_.height = height;\r\n this.orbitCamera_.setViewport(\r\n this.glContext_.getCanvasWidth(),\r\n this.glContext_.getCanvasHeight()\r\n );\r\n this.orbitCamera_.setReversedZPerspective(60.0);\r\n if (this.readBackFbo_) {\r\n this.readBackFbo_.resize(width, height);\r\n }\r\n this.glContext_.gl_.viewport(0, 0, width, height);\r\n if (this.fontRender_) {\r\n this.fontRender_.resize();\r\n }\r\n }\r\n\r\n setHeightScale(scale) {\r\n if (scale != this.heightScale_) {\r\n this.heightScale_ = Math.max(1, scale);\r\n if (this.voxelModel_) {\r\n this.voxelModel_.setHeightScale(this.heightScale_);\r\n }\r\n this.scheduleRender_ = true;\r\n }\r\n }\r\n\r\n getHeightScale() {\r\n return this.heightScale_;\r\n }\r\n\r\n setBuildingsEnabled(enabled) {\r\n this.showTileset_[1] = enabled;\r\n this.scheduleRender_ = true;\r\n }\r\n\r\n setBoreholesEnabled(enabled) {\r\n this.showTileset_[0] = enabled;\r\n this.scheduleRender_ = true;\r\n }\r\n\r\n setShowOverlayTexture(show) {\r\n if (this.voxelModel_) {\r\n if (show == false) {\r\n this.voxelModel_.setOverlayTexture(null);\r\n } else {\r\n this.voxelModel_.setOverlayTexture(\r\n this.resourceCache_.findResourceByName(\"overlay\")\r\n );\r\n }\r\n this.scheduleRender_ = true;\r\n }\r\n }\r\n\r\n setClipPolygonEnabled(enabled) {\r\n if (this.voxelModel_) {\r\n this.voxelModel_.resetAllVoxelBricks();\r\n }\r\n this.clipPolygon_.clear();\r\n if (enabled) {\r\n this.appMode_ = AppMode.AppDrawClipPlane;\r\n } else {\r\n this.appMode_ = AppMode.AppNormal;\r\n }\r\n this.scheduleRender_ = true;\r\n }\r\n\r\n setClipAxis(axisId) {\r\n currentClipPlaneAxis_ = axisId;\r\n this.updateAxisClipPlane();\r\n this.updateWuxiRender();\r\n this.scheduleRender_ = true;\r\n }\r\n}\r\n","/*\r\nCopyright 2022 Alexandra Instituttet\r\n\r\nDer er givet en begrænset licens af denne software til GEO. Licensen\r\ngiver dem ret til at benytte, videreudvikle og fejlrette udelukkende\r\nmed henblik på brug i GeoAtlasStudy web-applikationen.\r\n*/\r\nimport React, { useEffect, useRef } from \"react\";\r\nimport { WgApp } from \"./WgApp.js\";\r\n\r\nfunction WgAppComponent(props) {\r\n // HTML canvas reference needed by the WgApp.\r\n const canvasRef = React.createRef();\r\n let app = useRef();\r\n\r\n // Setup of the webGL app done on load?\r\n useEffect(() => {\r\n if (!app.current) {\r\n let top = canvasRef.current.getBoundingClientRect().top;\r\n canvasRef.current.width = window.innerWidth;\r\n canvasRef.current.height = window.innerHeight - top;\r\n\r\n app.current = new WgApp(canvasRef.current);\r\n\r\n window.addEventListener(\"resize\", () => {\r\n app.current.resize(window.innerWidth, window.innerHeight - top);\r\n });\r\n }\r\n }, [canvasRef]);\r\n\r\n useEffect(() => {\r\n if (app.current) {\r\n app.current.setHeightScale(0.1 * props.heightScale);\r\n app.current.setBoreholesEnabled(props.boreholesEnabled);\r\n app.current.setBuildingsEnabled(props.buildingsEnabled);\r\n app.current.setShowOverlayTexture(props.mapEnabled);\r\n app.current.setClipAxis(parseInt(props.clipAxis));\r\n }\r\n }, [\r\n props.heightScale,\r\n props.buildingsEnabled,\r\n props.mapEnabled,\r\n props.boreholesEnabled,\r\n props.clipAxis,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (app.current) {\r\n app.current.setClipPolygonEnabled(props.clipPolygonEnabled);\r\n }\r\n }, [props.clipPolygonEnabled]);\r\n\r\n // Render the application.\r\n return (\r\n <div>\r\n <canvas ref={canvasRef} />\r\n </div>\r\n );\r\n}\r\n\r\nexport default WgAppComponent;\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const mapView3dStyle = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n background: 'grey'\r\n },\r\n appBar: {\r\n zIndex: 0,\r\n background: theme.palette.geoColors.contextBar.main,\r\n top: 'auto',\r\n bottom: 0\r\n }\r\n}))\r\n","import React, { FC, useState } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport InputLabel from '@material-ui/core/InputLabel'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport Switch from '@material-ui/core/Switch'\r\nimport Slider from '@material-ui/core/Slider'\r\nimport AppBar from '@material-ui/core/AppBar'\r\nimport Toolbar from '@material-ui/core/Toolbar'\r\nimport Select from '@material-ui/core/Select'\r\n\r\nimport { headerHeight, leftSidebarToolsWidth } from '../../Constants'\r\nimport WgAppComponent from '../3d/geonovop0/src/WgAppComponent.jsx'\r\n\r\nimport { mapView3dStyle } from './MapView3D.style'\r\n\r\nexport interface MapView3DProps {} // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\n/**\r\n * MapView3D React component.\r\n * @param {object} props React properties object.\r\n * @returns React view component.\r\n */\r\nexport const MapView3D: FC<MapView3DProps> = (props: MapView3DProps) => {\r\n const classes = mapView3dStyle()\r\n const intl = useIntl()\r\n\r\n const menuRef = React.createRef()\r\n\r\n const [geoModelId, setGeoModelId] = useState(702)\r\n const [heightScale, setHeightScale] = useState(30)\r\n const [clipAxis, setClipAxis] = useState(0)\r\n const [clipPolygonEnabled, setClipPolygonEnabled] = useState(false)\r\n const [buildingsEnabled, setBuildingsEnabled] = useState(true)\r\n const [boreholesEnabled, setBoreholesEnabled] = useState(true)\r\n const [mapEnabled, setMapEnabled] = useState(true)\r\n\r\n return (\r\n <div\r\n className={classes.root}\r\n style={{ height: `calc(100vh - ${headerHeight}px)` }}\r\n >\r\n <WgAppComponent\r\n heightScale={heightScale}\r\n geoModelId={geoModelId}\r\n buildingsEnabled={buildingsEnabled}\r\n boreholesEnabled={boreholesEnabled}\r\n mapEnabled={mapEnabled}\r\n clipPolygonEnabled={clipPolygonEnabled}\r\n clipAxis={clipAxis}\r\n />\r\n <AppBar\r\n className={classes.appBar}\r\n style={{ left: leftSidebarToolsWidth }}\r\n ref={menuRef}\r\n >\r\n <Toolbar>\r\n <Grid container direction='row' justify='center' alignItems='center' spacing={3}>\r\n <Grid item xs={2}>\r\n <InputLabel shrink>{intl.formatMessage({ id: '3d.model' })}</InputLabel>\r\n <Select value={geoModelId} onChange={(e: any) => setGeoModelId(e.target.value)}>\r\n <MenuItem value='702'>{intl.formatMessage({ id: '3d.value.model.fohm' })}</MenuItem>\r\n </Select>\r\n </Grid>\r\n <Grid item xs={2}>\r\n <InputLabel shrink>{intl.formatMessage({ id: '3d.label.heightscale' })}</InputLabel>\r\n <Slider\r\n color='primary'\r\n onChange={(_e, val) => setHeightScale(val as number)}\r\n value={heightScale}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n <InputLabel shrink>{intl.formatMessage({ id: '3d.label.buildings' })}</InputLabel>\r\n <Switch\r\n color='primary'\r\n onChange={(_e, val) => { setBuildingsEnabled(val) }}\r\n checked={buildingsEnabled}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n <InputLabel shrink>{intl.formatMessage({ id: '3d.label.boreholes' })}</InputLabel>\r\n <Switch\r\n color='primary'\r\n onChange={(_e, val) => setBoreholesEnabled(val)}\r\n checked={boreholesEnabled}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n <InputLabel shrink>{intl.formatMessage({ id: '3d.label.showmap' })}</InputLabel>\r\n <Switch\r\n color='primary'\r\n onChange={(_e, val) => setMapEnabled(val)}\r\n checked={mapEnabled}\r\n />\r\n </Grid>\r\n <Grid item xs={2}>\r\n <InputLabel shrink>{intl.formatMessage({ id: '3d.label.clippolygon' })}</InputLabel>\r\n <Switch\r\n color='primary'\r\n onChange={(_e, val) => setClipPolygonEnabled(val)}\r\n checked={clipPolygonEnabled}\r\n />\r\n </Grid>\r\n <Grid item xs={2}>\r\n {!clipPolygonEnabled && (\r\n <>\r\n <InputLabel shrink>{intl.formatMessage({ id: '3d.label.clipaxis' })}</InputLabel>\r\n <Select value={clipAxis} onChange={(e: any, _val) => { setClipAxis(e.target.value) }}>\r\n <MenuItem value='0'>{intl.formatMessage({ id: '3d.value.clipaxis.x' })}</MenuItem>\r\n <MenuItem value='1'>{intl.formatMessage({ id: '3d.value.clipaxis.y' })}</MenuItem>\r\n <MenuItem value='2'>{intl.formatMessage({ id: '3d.value.clipaxis.none' })}</MenuItem>\r\n </Select>\r\n </>\r\n )}\r\n </Grid>\r\n </Grid>\r\n </Toolbar>\r\n </AppBar>\r\n </div>\r\n )\r\n}\r\n","import { FC } from 'react'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport OpenLayersMap from '../openlayersmap/OpenLayersMap'\r\nimport store, { RootState } from '../../Store'\r\nimport { mainContentViewStyle } from './MainContentView.style'\r\nimport { ToolType } from 'src/Enums'\r\nimport { MapView3D } from '../mapview3d/MapView3D'\r\nimport { LayerType } from 'src/dataSources/layers/LayerRegistry'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { infoMenuActions } from 'src/actions/InfoMenuActions'\r\n\r\nexport interface MainContentViewProps { // eslint-disable-line @typescript-eslint/no-empty-interface\r\n}\r\n\r\nconst defaultProps: MainContentViewProps = {\r\n}\r\n\r\nexport const MainContentView: FC<MainContentViewProps> = (props: MainContentViewProps) => {\r\n const classes = mainContentViewStyle()\r\n const dispatch = useDispatch()\r\n const enabledLayers = useSelector((state: RootState): LayerType[] => state.mapState.enabledLayers)\r\n const selectedTool = useSelector((state: RootState): ToolType => state.generalState.selectedTool)\r\n\r\n const leftClickHandler = (coords: number[]): void => {\r\n // We need to fetch the current state using the store handle here,\r\n // because of the way the binding with useSelector is done.\r\n // Otherwise we get stale state information.\r\n const selectedTool = store.getState().generalState.selectedTool\r\n const enabledLayers = store.getState().mapState.enabledLayers\r\n\r\n switch (selectedTool) {\r\n case ToolType.INFO: {\r\n const boreholeLayerEnabled = enabledLayers.some(layerType => layerType === LayerType.BORE_HOLES)\r\n if (boreholeLayerEnabled) {\r\n dispatch(wikiActions.clearViews())\r\n dispatch(infoMenuActions.boreholeInfo(coords))\r\n }\r\n break\r\n }\r\n case ToolType.PROFILE:\r\n break\r\n case ToolType.VIRTUAL_BOREHOLE:\r\n dispatch(wikiActions.clearViews())\r\n dispatch(infoMenuActions.virtualBoreholeInfo(coords))\r\n break\r\n }\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n {selectedTool !== ToolType._3D_VIEW && (\r\n <OpenLayersMap layerTypes={enabledLayers} onLeftClick={leftClickHandler} />\r\n )}\r\n {selectedTool === ToolType._3D_VIEW && (\r\n <MapView3D />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nMainContentView.defaultProps = defaultProps\r\n\r\nexport default MainContentView\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { headerHeight } from '../../Constants'\r\n\r\nexport const rightSideBarStyle = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: `calc(100vh - ${headerHeight}px)`,\r\n background: theme.palette.common.white,\r\n borderLeftWidth: '1px',\r\n borderLeftColor: theme.palette.primary.main,\r\n borderLeftStyle: 'solid',\r\n overflowY: 'auto'\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n color: theme.palette.geoColors.headerText.main,\r\n right: 5,\r\n top: 0,\r\n zIndex: 1\r\n },\r\n closeButtonIcon: {\r\n color: theme.palette.geoColors.headerText.main\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const boreholeInfoStyle = makeStyles(theme => ({\r\n nested: {\r\n paddingLeft: theme.spacing(4)\r\n },\r\n nestedListSubheader: {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.geoColors.headerText.main,\r\n userSelect: 'none',\r\n zIndex: 0\r\n },\r\n nestedListSubheaderIcon: {\r\n float: 'right',\r\n paddingTop: '0.5rem'\r\n },\r\n figure: {\r\n display: 'flex'\r\n },\r\n noBoreholes: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(2),\r\n fontWeight: 500,\r\n color: theme.palette.geoColors.text.light,\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n textAlign: 'center'\r\n },\r\n errorIcon: {\r\n marginBottom: theme.spacing(1)\r\n },\r\n progress: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n color: theme.palette.geoColors.text.light\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const boreholeFigureStyle = makeStyles(theme => ({\r\n root: {\r\n padding: theme.spacing(1)\r\n }\r\n}))\r\n","import { FC } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../../Store'\r\nimport { boreholeFigureStyle } from './BoreholeFigure.style'\r\nimport { NearestBoreholeObject } from 'src/dataSources/geo/NearestBoreHoles'\r\n\r\n/**\r\n * BoreholeFigureProps contains properties for the component.\r\n */\r\nexport interface BoreholeFigureProps {\r\n selectedBorehole: NearestBoreholeObject | undefined\r\n}\r\n\r\n/**\r\n * BoreholeFigure displays figures and legend for boreholes.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const BoreholeFigure: FC<BoreholeFigureProps> = (props: BoreholeFigureProps) => {\r\n const classes = boreholeFigureStyle()\r\n const image = useSelector((state: RootState) => state.boreholeInfo.boreholeSvg)\r\n\r\n return (\r\n <>\r\n <div className={classes.root} dangerouslySetInnerHTML={{ __html: image }} />\r\n </>\r\n )\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const boreholeLegendStyle = makeStyles(theme => ({\r\n root: {\r\n padding: theme.spacing(1),\r\n paddingTop: theme.spacing(2)\r\n },\r\n layer: {\r\n display: 'flex'\r\n },\r\n color: {\r\n minWidth: '20px',\r\n minHeight: '20px',\r\n marginRight: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.common.black\r\n },\r\n description: {\r\n fontSize: '0.7rem'\r\n }\r\n}))\r\n","import React, { FC } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../../Store'\r\nimport { boreholeLegendStyle } from './BoreholeLegend.style'\r\nimport { BoreholeLegendLayerObject } from '../../../dataSources/geo/BoreholeLegend'\r\n\r\n/**\r\n * BoreholeLegendProps contains properties for the component.\r\n */\r\nexport interface BoreholeLegendProps { // eslint-disable-line @typescript-eslint/no-empty-interface\r\n}\r\n\r\n/**\r\n * BoreholeLegend displays legend for boreholes.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const BoreholeLegend: FC<BoreholeLegendProps> = (props: BoreholeLegendProps) => {\r\n const classes = boreholeLegendStyle()\r\n const legend = useSelector((state: RootState) => state.boreholeInfo.legend)\r\n\r\n return (\r\n <div className={classes.root}>\r\n {legend?.Layers.map((layer: BoreholeLegendLayerObject, index: number) =>\r\n <div className={classes.layer} key={index}>\r\n <div className={classes.color} style={{ backgroundColor: layer.Color }} />\r\n <div className={classes.description}>\r\n {layer.Description}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const boreholeMetaStyle = makeStyles(theme => ({\r\n root: {\r\n paddingTop: theme.spacing(1),\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n paddingBottom: theme.spacing(2),\r\n fontSize: '0.8rem'\r\n },\r\n title: {\r\n fontWeight: 500,\r\n fontSize: '0.7rem',\r\n color: theme.palette.geoColors.text.light\r\n }\r\n}))\r\n","/**\r\nService for fetching information about the borehole sources.\r\n*/\r\n\r\nimport { GeoWebServiceClient } from './GeoWebServiceClient'\r\n\r\n/**\r\n * The object type returned by the webservice.\r\n */\r\nexport interface BoreholeSource {\r\n Id: number\r\n Name: string\r\n Color: string\r\n ShortName: string\r\n Description: string\r\n}\r\n\r\nlet fetchedBoreholeSources: boolean = false\r\nconst boreholeSourceDict: {[key: number]: BoreholeSource} = {}\r\n\r\n/**\r\n * Service for fetching information about the borehole sources.\r\n */\r\nexport class DataList extends GeoWebServiceClient {\r\n static async getBoreholeSourceById (id: number, token: string): Promise<BoreholeSource> {\r\n if (!fetchedBoreholeSources) {\r\n // Fetch the sources now.\r\n const ws = new DataList(token)\r\n const data = await ws.fetchDataList()\r\n data.forEach((boreholeSource: BoreholeSource) => {\r\n boreholeSourceDict[boreholeSource.Id] = boreholeSource\r\n })\r\n }\r\n fetchedBoreholeSources = true\r\n if (id in boreholeSourceDict) {\r\n return boreholeSourceDict[id]\r\n } else {\r\n throw new Error('No source with the given id found.')\r\n }\r\n }\r\n\r\n static get URL (): string { return 'https://data.geo.dk/api/v3/datalist' }\r\n\r\n /**\r\n * Constructor.\r\n * @param token The Geo auth token.\r\n */\r\n constructor (token: string) {\r\n const defaultParams = {\r\n Datalistid: '1'\r\n }\r\n super(DataList.URL, token, defaultParams)\r\n }\r\n\r\n /**\r\n * Calls the web service.\r\n * @returns A promise bearing the nearest borehole information objects fetched.\r\n */\r\n async fetchDataList (): Promise<BoreholeSource[]> {\r\n const response: Response = await fetch(this.url(), { headers: { Authorization: `Bearer ${this.token}` } })\r\n if (!response.ok) {\r\n throw new Error('Got invalid HTTP response.')\r\n }\r\n\r\n const responseData = await response.json()\r\n return responseData\r\n }\r\n}\r\n","import { FC, useState } from 'react'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { Grid } from '@material-ui/core'\r\nimport { AddressReverseResult } from 'src/dataSources/dataforsyningen/AddressReverse'\r\nimport { NearestBoreholeObject } from 'src/dataSources/geo/NearestBoreHoles'\r\nimport { boreholeMetaStyle } from './BoreholeMeta.style'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from 'src/Store'\r\nimport { DataList, BoreholeSource } from 'src/dataSources/geo/DataList'\r\n/**\r\n * BoreholeMetaProps contains properties for the component.\r\n */\r\nexport interface BoreholeMetaProps {\r\n selectedBorehole: NearestBoreholeObject | undefined\r\n postalAddress?: AddressReverseResult\r\n}\r\n\r\n/**\r\n * BoreholeMeta displays meta information for boreholes.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const BoreholeMeta: FC<BoreholeMetaProps> = (props: BoreholeMetaProps) => {\r\n const classes = boreholeMetaStyle()\r\n const tokenSelector = useSelector((state: RootState) => state.authState.token)\r\n\r\n const [dataSourceName, setDataSourceName] = useState('')\r\n if (props.selectedBorehole !== undefined) {\r\n DataList.getBoreholeSourceById(props.selectedBorehole?.DatasourceId, tokenSelector)\r\n .then((boreholeSource: BoreholeSource) => {\r\n setDataSourceName(boreholeSource.ShortName)\r\n })\r\n .catch(err => {\r\n console.error(err)\r\n })\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Grid container>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='borehole.info.number' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n {props.selectedBorehole?.BoreholeNumber}<br />\r\n </Grid>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='borehole.info.id' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n {props.selectedBorehole?.BoreholeId}<br />\r\n </Grid>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='borehole.info.source' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n {dataSourceName}<br />\r\n </Grid>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='borehole.info.coordinates' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n {props.selectedBorehole?.X}, {props.selectedBorehole?.Y}<br />\r\n </Grid>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='borehole.info.address' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n {props.postalAddress?.betegnelse}\r\n </Grid>\r\n </Grid>\r\n </div>\r\n )\r\n}\r\n","import { FC } from 'react'\r\nimport { List, ListSubheader, CircularProgress } from '@material-ui/core'\r\nimport { Error } from '@material-ui/icons'\r\nimport { boreholeInfoStyle } from './BoreholeInfo.style'\r\nimport { BoreholeFigure } from './boreholefigure/BoreholeFigure'\r\nimport { BoreholeLegend } from './boreholelegend/BoreholeLegend'\r\nimport { BoreholeMeta } from './boreholemeta/BoreholeMeta'\r\nimport { NearestBoreholeObject } from 'src/dataSources/geo/NearestBoreHoles'\r\nimport { CallResult } from 'src/CustomTypes'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from 'src/Store'\r\nimport { AddressReverseResult } from 'src/dataSources/dataforsyningen/AddressReverse'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { appStyle } from 'src/App.style'\r\n\r\n/**\r\n * BoreholeInfoProps contains properties for the component.\r\n */\r\nexport interface BoreholeInfoProps { // eslint-disable-line @typescript-eslint/no-empty-interface\r\n}\r\n\r\n/**\r\n * BoreholeInfo displays information related to bore holes such as meta data and figures.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const BoreholeInfo: FC<BoreholeInfoProps> = (props: BoreholeInfoProps) => {\r\n const classes = boreholeInfoStyle()\r\n const appClasses = appStyle()\r\n\r\n const selectedBorehole = useSelector((state: RootState): NearestBoreholeObject | undefined => state.boreholeInfo.selectedBorehole)\r\n const fetchBoreholeStatus = useSelector((state: RootState): CallResult => state.boreholeInfo.fetchBoreholeStatus)\r\n const fetchImageStatus = useSelector((state: RootState): CallResult => state.boreholeInfo.fetchImageStatus)\r\n const fetchLegendStatus = useSelector((state: RootState): CallResult => state.boreholeInfo.fetchLegendStatus)\r\n const postalAddress = useSelector((state: RootState): AddressReverseResult | undefined => state.boreholeInfo.addressInfo)\r\n\r\n const fetched = fetchBoreholeStatus === CallResult.Succeeded\r\n const noBoreholesFound = selectedBorehole === undefined\r\n const error = fetchBoreholeStatus === CallResult.Failed\r\n const running = fetchBoreholeStatus === CallResult.Running\r\n return (\r\n <>\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={classes.nestedListSubheader} id='nested-list-subheader'>\r\n <FormattedMessage id='borehole.info' />\r\n <div className={classes.nestedListSubheaderIcon} />\r\n </ListSubheader>\r\n }\r\n />\r\n {running && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {error && (\r\n <div className={appClasses.errorMessage}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='common.loading.error' />\r\n </div>\r\n )}\r\n {fetched && noBoreholesFound && (\r\n <div className={classes.noBoreholes}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='borehole.info.noboreholes' />\r\n </div>\r\n )}\r\n {fetched && !noBoreholesFound && (\r\n <>\r\n <BoreholeMeta selectedBorehole={selectedBorehole} postalAddress={postalAddress} />\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={classes.nestedListSubheader} id='nested-list-subheader'>\r\n <FormattedMessage id='borehole.info.figure' />\r\n <div className={classes.nestedListSubheaderIcon} />\r\n </ListSubheader>\r\n }\r\n />\r\n {(fetchImageStatus === CallResult.Running || fetchLegendStatus === CallResult.Running) && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {fetchImageStatus === CallResult.Succeeded && fetchLegendStatus === CallResult.Succeeded && (\r\n <div className={classes.figure}>\r\n <BoreholeFigure selectedBorehole={selectedBorehole} />\r\n <BoreholeLegend />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const virtualBoreholeInfoStyle = makeStyles(theme => ({\r\n nested: {\r\n paddingLeft: theme.spacing(4)\r\n },\r\n nestedListSubheader: {\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.geoColors.headerText.main,\r\n userSelect: 'none',\r\n zIndex: 0\r\n },\r\n nestedListSubheaderIcon: {\r\n float: 'right',\r\n paddingTop: '0.5rem'\r\n },\r\n figure: {\r\n display: 'flex'\r\n },\r\n progress: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n color: theme.palette.geoColors.text.light\r\n },\r\n noBoreholes: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(2),\r\n fontWeight: 500,\r\n color: theme.palette.geoColors.text.light,\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n textAlign: 'center'\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const virtualBoreholeFigureStyle = makeStyles(theme => ({\r\n root: {\r\n flex: 1,\r\n width: 350 - theme.spacing(2),\r\n padding: theme.spacing(1)\r\n }\r\n}))\r\n","import { FC } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport { virtualBoreholeFigureStyle } from './VirtualBoreholeFigure.style'\r\n\r\n/**\r\n * VirtualBoreholeFigureProps contains properties for the component.\r\n */\r\nexport interface VirtualBoreholeFigureProps {\r\n image: string\r\n}\r\n\r\n/**\r\n * VirtualBoreholeFigure displays figures and legend for virtual boreholes.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const VirtualBoreholeFigure: FC<VirtualBoreholeFigureProps> = (props: VirtualBoreholeFigureProps) => {\r\n const classes = virtualBoreholeFigureStyle()\r\n const intl = useIntl()\r\n\r\n return <img className={classes.root} src={props.image} alt={intl.formatMessage({ id: 'tools.virtualborehole' })} />\r\n}\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const virtualBoreholeMetaStyle = makeStyles(theme => ({\r\n root: {\r\n paddingTop: theme.spacing(1),\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n paddingBottom: theme.spacing(2),\r\n fontSize: '0.8rem'\r\n },\r\n title: {\r\n fontWeight: 500,\r\n fontSize: '0.7rem',\r\n color: theme.palette.geoColors.text.light\r\n }\r\n}))\r\n","import { FC } from 'react'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { Grid } from '@material-ui/core'\r\nimport { AddressReverseResult } from 'src/dataSources/dataforsyningen/AddressReverse'\r\nimport { virtualBoreholeMetaStyle } from './VirtualBoreholeMeta.style'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from 'src/Store'\r\n\r\n/**\r\n * VirtualBoreholeMetaProps contains properties for the component.\r\n */\r\nexport interface VirtualBoreholeMetaProps {\r\n postalAddress?: AddressReverseResult\r\n}\r\n\r\n/**\r\n * VirtualBoreholeMeta displays meta information for virtual boreholes.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const VirtualBoreholeMeta: FC<VirtualBoreholeMetaProps> = (props: VirtualBoreholeMetaProps) => {\r\n const classes = virtualBoreholeMetaStyle()\r\n const coords = useSelector((state: RootState): number[] => state.virtualBoreholeInfoState.coordinates)\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Grid container>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='virtualborehole.info.source' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n Geo<br />\r\n </Grid>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='virtualborehole.info.coordinates' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n {\r\n coords.length > 1 ? `${coords[0]}, ${coords[1]}` : ''\r\n }<br />\r\n </Grid>\r\n <Grid item xs={3}>\r\n <span className={classes.title}><FormattedMessage id='virtualborehole.info.address' /></span>\r\n </Grid>\r\n <Grid item xs={9}>\r\n {props.postalAddress?.betegnelse}\r\n </Grid>\r\n </Grid>\r\n </div>\r\n )\r\n}\r\n","import { FC } from 'react'\r\nimport { List, ListSubheader, CircularProgress } from '@material-ui/core'\r\nimport { Error } from '@material-ui/icons'\r\nimport { virtualBoreholeInfoStyle } from './VirtualBoreholeInfo.style'\r\nimport { VirtualBoreholeFigure } from './virtualboreholefigure/VirtualBoreholeFigure'\r\nimport { VirtualBoreholeMeta } from './virtualboreholemeta/VirtualBoreholeMeta'\r\nimport { CallResult } from 'src/CustomTypes'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from 'src/Store'\r\nimport { AddressReverseResult } from 'src/dataSources/dataforsyningen/AddressReverse'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { appStyle } from 'src/App.style'\r\n\r\n/**\r\n * VirtualBoreholeInfoProps contains properties for the component.\r\n */\r\nexport interface VirtualBoreholeInfoProps { // eslint-disable-line @typescript-eslint/no-empty-interface\r\n}\r\n\r\n/**\r\n * VirtualBoreholeInfo displays information related to virtual bore holes such as meta data and figures.\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const VirtualBoreholeInfo: FC<VirtualBoreholeInfoProps> = (props: VirtualBoreholeInfoProps) => {\r\n const classes = virtualBoreholeInfoStyle()\r\n const appClasses = appStyle()\r\n\r\n const virtualBorehole = useSelector((state: RootState): string => state.virtualBoreholeInfoState.virtualBoreholePng)\r\n const fetchImageStatus = useSelector((state: RootState): CallResult => state.virtualBoreholeInfoState.fetchImageStatus)\r\n const postalAddress = useSelector((state: RootState): AddressReverseResult | undefined => state.virtualBoreholeInfoState.addressInfo)\r\n const fetchAddressStatus = useSelector((state: RootState): CallResult => state.virtualBoreholeInfoState.fetchAddressStatus)\r\n\r\n const fetched = fetchImageStatus === CallResult.Succeeded || fetchAddressStatus === CallResult.Succeeded\r\n const virtualBoreholeFound = virtualBorehole !== ''\r\n const running = fetchImageStatus === CallResult.Running && fetchAddressStatus === CallResult.Running\r\n return (\r\n <>\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={classes.nestedListSubheader} id='nested-list-subheader'>\r\n <FormattedMessage id='virtualborehole.info' />\r\n <div className={classes.nestedListSubheaderIcon} />\r\n </ListSubheader>\r\n }\r\n />\r\n {running && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {fetched && (\r\n <>\r\n {fetchAddressStatus === CallResult.Running && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {fetchAddressStatus === CallResult.Failed && (\r\n <div className={appClasses.errorMessage}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='common.loading.error' />\r\n </div>\r\n )}\r\n {fetchAddressStatus === CallResult.Succeeded && (\r\n <VirtualBoreholeMeta postalAddress={postalAddress} />\r\n )}\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={classes.nestedListSubheader} id='nested-list-subheader'>\r\n <FormattedMessage id='virtualborehole.info.figure' />\r\n <div className={classes.nestedListSubheaderIcon} />\r\n </ListSubheader>\r\n }\r\n />\r\n {fetchImageStatus === CallResult.Running && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {fetchImageStatus === CallResult.Failed && (\r\n <div className={appClasses.errorMessage}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='common.loading.error' />\r\n </div>\r\n )}\r\n {fetchImageStatus === CallResult.Succeeded && !virtualBoreholeFound && (\r\n <div className={classes.noBoreholes}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='virtualborehole.info.novirtualboreholes' />\r\n </div>\r\n )}\r\n {fetchImageStatus === CallResult.Succeeded && virtualBoreholeFound && (\r\n <div className={classes.figure}>\r\n <VirtualBoreholeFigure image={virtualBorehole} />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )\r\n}\r\n","import { FC } from 'react'\r\nimport { Transition, TransitionStatus } from 'react-transition-group'\r\nimport { IconButton } from '@material-ui/core'\r\nimport Close from '@material-ui/icons/Close'\r\nimport { rightSideBarStyle } from './RightSideBar.style'\r\nimport { RootState } from '../../Store'\r\nimport { maxSidebarWidth, sidebarAnimationDuration, rightSidebarWidth as sidebarWidth } from '../../Constants'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { InfoView } from '../../reducers/InfoMenuReducer'\r\nimport { BoreholeInfo } from '../boreholeinfo/BoreholeInfo'\r\nimport { infoMenuActions } from 'src/actions/InfoMenuActions'\r\nimport { VirtualBoreholeInfo } from '../virtualboreholeinfo/VirtualBoreholeInfo'\r\nimport { Rnd } from 'react-rnd'\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { getBarStyle, getBarTransitionStyle } from 'src/utils/Utils'\r\n\r\nexport interface RightSideBarProps { } // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\nconst defaultProps: RightSideBarProps = {}\r\n\r\n/**\r\n * RightSideBar React component.\r\n * @param {object} props React properties object.\r\n * @returns React view component.\r\n */\r\nexport const RightSideBar: FC<RightSideBarProps> = (\r\n props: RightSideBarProps\r\n) => {\r\n const dispatch = useDispatch()\r\n const classes = rightSideBarStyle()\r\n const currentView = useSelector((state: RootState): InfoView => state.infoMenuState.currentView)\r\n const dragging = useSelector((state: RootState): Boolean => state.generalState.rightSideBarDragging)\r\n const rightSideBarWidth = useSelector((state: RootState): number => state.generalState.rightSideBarWidth)\r\n\r\n const sidebarStyle = getBarStyle(dragging === true ? 0 : sidebarAnimationDuration)\r\n const sidebarTransitionStyles = getBarTransitionStyle(rightSideBarWidth)\r\n\r\n /**\r\n * Set to empty view when close button is clicked.\r\n */\r\n const closeSideBarClicked = (): void => {\r\n dispatch(infoMenuActions.currentView(InfoView.Empty))\r\n }\r\n\r\n return (\r\n <>\r\n <Transition in={currentView !== InfoView.Empty} timeout={0}>\r\n {(state: TransitionStatus) => (\r\n <>\r\n {currentView !== InfoView.Empty && (\r\n <div\r\n className={`${classes.root}`}\r\n style={{ ...sidebarStyle, ...sidebarTransitionStyles[state] }}\r\n >\r\n <Rnd\r\n disableDragging\r\n enableResizing={{ left: true }}\r\n position={{ x: 0, y: 0 }}\r\n size={{ width: rightSideBarWidth, height: 'auto' }}\r\n minWidth={sidebarWidth}\r\n maxWidth={maxSidebarWidth}\r\n onResizeStart={() => {\r\n dispatch(generalActions.setRightSideBarDragging(true))\r\n }}\r\n onResize={(e, direction, ref, delta, position) => {\r\n dispatch(generalActions.setRightSideBarWidth(parseInt(ref.style.width)))\r\n }}\r\n onResizeStop={(e, direction, ref, delta, position) => {\r\n dispatch(generalActions.setRightSideBarWidth(parseInt(ref.style.width)))\r\n dispatch(generalActions.setRightSideBarDragging(false))\r\n }}\r\n >\r\n {dragging === false && (\r\n <div className={classes.root}>\r\n {currentView === InfoView.BoreholeInfo && (\r\n <BoreholeInfo />\r\n )}\r\n {currentView === InfoView.VirtualBoreholeInfo && (\r\n <VirtualBoreholeInfo />\r\n )}\r\n <div className={classes.closeButton}>\r\n <IconButton size='medium' className={classes.closeButtonIcon} onClick={closeSideBarClicked}>\r\n <Close />\r\n </IconButton>\r\n </div>\r\n </div>\r\n )}\r\n </Rnd>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </Transition>\r\n </>\r\n )\r\n}\r\n\r\nRightSideBar.defaultProps = defaultProps\r\n\r\nexport default RightSideBar\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nconst border = {\r\n width: '95%',\r\n cursor: 'pointer',\r\n borderStyle: 'solid',\r\n borderWidth: '3px',\r\n borderRadius: '0.3rem',\r\n marginBottom: '1rem'\r\n}\r\n\r\nexport const themePickerStyle = makeStyles(theme => ({\r\n root: {\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none'\r\n }\r\n },\r\n themes: {\r\n width: '100%',\r\n color: theme.palette.geoColors.text.light,\r\n lineHeight: '1.3rem',\r\n marginTop: 10\r\n },\r\n actions: {\r\n height: 50,\r\n textAlign: 'center'\r\n },\r\n themeText: {\r\n paddingLeft: '0.5rem',\r\n paddingRight: '1rem',\r\n cursor: 'pointer'\r\n },\r\n closeButton: {\r\n color: theme.palette.primary.main\r\n },\r\n iceAgeImage: {\r\n ...border,\r\n borderColor: theme.palette.dataThemeIceAge.main\r\n },\r\n climateBorder: {\r\n ...border,\r\n borderColor: theme.palette.dataThemeClimate.main\r\n },\r\n energyBorder: {\r\n ...border,\r\n borderColor: theme.palette.dataThemeEnergy.main\r\n },\r\n environmentBorder: {\r\n ...border,\r\n borderColor: theme.palette.dataThemeEnvironment.main\r\n },\r\n nnfImage: {\r\n position: 'relative',\r\n float: 'right',\r\n height: 36,\r\n }\r\n}))\r\n","export default __webpack_public_path__ + \"static/media/energi.38fe3ae4.jpg\";","export default __webpack_public_path__ + \"static/media/istid.2e92ebb9.jpg\";","export default __webpack_public_path__ + \"static/media/klima.14622a83.jpg\";","export default __webpack_public_path__ + \"static/media/miljo.4bfa646b.jpg\";","import { FC } from 'react'\r\nimport { FormattedMessage, useIntl } from 'react-intl'\r\nimport { Button, Dialog, DialogContent, DialogContentText, DialogTitle, Grid } from '@material-ui/core'\r\nimport { themePickerStyle } from './ThemePicker.style'\r\nimport energi from '../../img/energi.jpg'\r\nimport istid from '../../img/istid.jpg'\r\nimport klima from '../../img/klima.jpg'\r\nimport miljo from '../../img/miljo.jpg'\r\nimport { DataTheme } from 'src/Enums'\r\n\r\nexport interface ThemePickerProps {\r\n open: boolean\r\n handleClose: () => void\r\n handleThemeSelected: (dataTheme: DataTheme) => void\r\n}\r\n\r\nconst defaultProps: ThemePickerProps = {\r\n open: false,\r\n handleClose: (): void => {},\r\n handleThemeSelected: (dataTheme: DataTheme): void => {}\r\n}\r\n\r\nexport const ThemePicker: FC<ThemePickerProps> = (props: ThemePickerProps) => {\r\n const classes = themePickerStyle()\r\n const intl = useIntl()\r\n\r\n return (\r\n <Dialog open={props.open} onClose={props.handleClose} fullWidth maxWidth='md' aria-labelledby='form-dialog-title' className={classes.root}>\r\n <DialogTitle id='form-dialog-title'>\r\n <FormattedMessage id='themepicker.title' />\r\n <a href='https://novonordiskfonden.dk' target='_blank' rel='noreferrer noopener'>\r\n <img\r\n src='nnf.png'\r\n alt='Novo Nordisk Fonden logo'\r\n className={classes.nnfImage}\r\n />\r\n </a>\r\n </DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n <FormattedMessage id='themepicker.description' />\r\n </DialogContentText>\r\n <Grid container className={classes.themes}>\r\n <Grid item xs={3} onClick={() => { props.handleThemeSelected(DataTheme.ICE_AGE) }}><img src={istid} className={classes.iceAgeImage} alt={intl.formatMessage({ id: 'theme.iceage' })} /></Grid>\r\n <Grid item xs={3} className={classes.themeText} onClick={() => { props.handleThemeSelected(DataTheme.ICE_AGE) }}><b><FormattedMessage id='theme.iceage' /></b><br /><FormattedMessage id='theme.iceage.description' /></Grid>\r\n <Grid item xs={3} onClick={() => { props.handleThemeSelected(DataTheme.CLIMATE) }}><img src={klima} className={classes.climateBorder} alt={intl.formatMessage({ id: 'theme.climate' })} /></Grid>\r\n <Grid item xs={3} className={classes.themeText} onClick={() => { props.handleThemeSelected(DataTheme.CLIMATE) }}><b><FormattedMessage id='theme.climate' /></b><br /><FormattedMessage id='theme.climate.description' /></Grid>\r\n <Grid item xs={3} onClick={() => { props.handleThemeSelected(DataTheme.ENERGY) }}><img src={energi} className={classes.energyBorder} alt={intl.formatMessage({ id: 'theme.energy' })} /></Grid>\r\n <Grid item xs={3} className={classes.themeText} onClick={() => { props.handleThemeSelected(DataTheme.ENERGY) }}><b><FormattedMessage id='theme.energy' /></b><br /><FormattedMessage id='theme.energy.description' /></Grid>\r\n <Grid item xs={3} onClick={() => { props.handleThemeSelected(DataTheme.ENVIRONMENT) }}><img src={miljo} className={classes.environmentBorder} alt={intl.formatMessage({ id: 'theme.environment' })} /></Grid>\r\n <Grid item xs={3} className={classes.themeText} onClick={() => { props.handleThemeSelected(DataTheme.ENVIRONMENT) }}><b><FormattedMessage id='theme.environment' /></b><br /><FormattedMessage id='theme.environment.description' /></Grid>\r\n </Grid>\r\n <Grid container className={classes.themes}>\r\n <Grid item xs={12} className={classes.actions}>\r\n <Button variant='contained' onClick={() => { props.handleThemeSelected(DataTheme.NONE) }}>\r\n <FormattedMessage id='themepicker.notheme' />\r\n </Button>\r\n </Grid>\r\n </Grid>\r\n </DialogContent>\r\n </Dialog>\r\n )\r\n}\r\n\r\nThemePicker.defaultProps = defaultProps\r\n\r\nexport default ThemePicker\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const modelPickerStyle = makeStyles(theme => ({\r\n root: {\r\n width: '100%'\r\n },\r\n formControl: {\r\n marginTop: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n width: '100%',\r\n borderRadius: 5\r\n },\r\n modelLabel: {\r\n color: theme.palette.geoColors.toolBar.main,\r\n marginLeft: theme.spacing(0.2),\r\n marginTop: theme.spacing(0.2),\r\n fontSize: '0.9rem',\r\n userSelect: 'none'\r\n },\r\n modelSelect: {\r\n fontSize: '0.8rem',\r\n paddingLeft: theme.spacing(0.5)\r\n }\r\n}))\r\n","import React, { FC, useEffect } from 'react'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core'\r\n\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { profileActions } from 'src/actions/ProfileActions'\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport { RootState } from 'src/Store'\r\n\r\nimport { modelPickerStyle } from './ModelPicker.style'\r\n\r\nexport interface ModelPickerProps {} // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\nconst defaultProps: ModelPickerProps = {\r\n}\r\n\r\nexport const ModelPicker: FC<ModelPickerProps> = (props: ModelPickerProps) => {\r\n const classes = modelPickerStyle()\r\n const dispatch = useDispatch()\r\n const tokenSelector = useSelector((state: RootState) => state.authState.token)\r\n const models = useSelector((state: RootState): GeoModel[] | undefined => state.generalState.geoModels)\r\n const selectedGeoModel = useSelector((state: RootState): GeoModel | undefined => state.generalState.selectedGeoModel)\r\n\r\n useEffect(() => {\r\n if (tokenSelector === '') {\r\n return\r\n }\r\n dispatch(generalActions.fetchGeoModels(undefined, undefined))\r\n // eslint-disable-next-line\r\n }, [tokenSelector])\r\n\r\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>): void => {\r\n if (models === undefined) {\r\n return\r\n }\r\n const modelId = event.target.value as string\r\n if (modelId === 'default') {\r\n dispatch(profileActions.clearState())\r\n dispatch(generalActions.setSelectedGeoModel(undefined))\r\n } else {\r\n for (const model of models) {\r\n if (model.ID === modelId) {\r\n dispatch(generalActions.setSelectedGeoModel(model))\r\n break\r\n }\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <FormControl className={classes.formControl}>\r\n <InputLabel shrink id='model-id-label' className={classes.modelLabel}><FormattedMessage id='toolbar.model' /></InputLabel>\r\n <Select\r\n labelId='model-id-label'\r\n id='model-id'\r\n value={selectedGeoModel !== undefined ? selectedGeoModel.ID : 'default'}\r\n onChange={handleChange}\r\n displayEmpty\r\n className={classes.modelSelect}\r\n disableUnderline\r\n >\r\n <MenuItem key='default' value='default'><FormattedMessage id='models.default' /></MenuItem>\r\n {models?.map((geoModel: GeoModel, index: number) => {\r\n return (\r\n <MenuItem key={index} value={geoModel.ID}>{geoModel.Name}</MenuItem>\r\n )\r\n })}\r\n </Select>\r\n </FormControl>\r\n </div>\r\n )\r\n}\r\n\r\nModelPicker.defaultProps = defaultProps\r\n\r\nexport default ModelPicker\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { toolbarHeight } from 'src/Constants'\r\n\r\nexport const toolBarStyle = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n height: toolbarHeight - 1,\r\n background: theme.palette.geoColors.contextBar.main,\r\n display: 'flex',\r\n borderBottomWidth: '1px',\r\n borderBottomColor: theme.palette.geoColors.contextBar.dark,\r\n borderBottomStyle: 'solid'\r\n },\r\n breadcrumb: {\r\n display: 'table'\r\n },\r\n breadcrumbText: {\r\n maxWidth: 150,\r\n height: toolbarHeight,\r\n lineHeight: `${toolbarHeight}px`,\r\n fontSize: '0.9rem',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n userSelect: 'none'\r\n },\r\n homeIcon: {\r\n color: theme.palette.primary.main\r\n },\r\n breadcrumbSeparator: {\r\n marginLeft: -5,\r\n marginRight: 5,\r\n color: theme.palette.geoColors.topBar.main,\r\n height: toolbarHeight\r\n },\r\n separatorBar: {\r\n height: toolbarHeight,\r\n lineHeight: `${toolbarHeight - 5}px`,\r\n fontSize: '2rem',\r\n fontWeight: 100,\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n textAlign: 'center',\r\n color: theme.palette.geoColors.topBar.main\r\n },\r\n toolParamsWrapper: {\r\n display: 'flex',\r\n width: '100%',\r\n backgroundColor: theme.palette.secondary.main,\r\n marginTop: theme.spacing(0.8),\r\n marginBottom: theme.spacing(0.8),\r\n paddingLeft: theme.spacing(1),\r\n paddingRight: theme.spacing(1),\r\n borderRadius: theme.spacing(1),\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.geoColors.toolBar.light\r\n },\r\n noToolSelected: {\r\n background: theme.palette.geoColors.contextBar.main,\r\n width: '100%'\r\n },\r\n models: {\r\n width: '20%',\r\n maxWidth: 200,\r\n marginRight: theme.spacing(2)\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const toolBarSliderStyle = makeStyles((theme) => ({\r\n discreteSlider: {\r\n display: 'flex',\r\n margin: 0,\r\n marginRight: theme.spacing(2),\r\n fontSize: '0.7rem',\r\n alignSelf: 'left',\r\n whiteSpace: 'nowrap',\r\n color: theme.palette.geoColors.toolBar.main,\r\n height: 15\r\n },\r\n slider: {\r\n color: theme.palette.primary.main,\r\n paddingTop: 10\r\n },\r\n sliderContainer: {\r\n maxWidth: 200,\r\n display: 'flex',\r\n flexDirection: 'row'\r\n },\r\n input: {\r\n padding: 0,\r\n width: 60,\r\n textAlign: 'center',\r\n fontSize: '0.9rem',\r\n marginLeft: theme.spacing(1),\r\n height: 22,\r\n backgroundColor: theme.palette.common.white,\r\n borderRadius: theme.spacing(1),\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: theme.palette.geoColors.toolBar.light,\r\n '& input::-webkit-clear-button, & input::-webkit-outer-spin-button, & input::-webkit-inner-spin-button': {\r\n display: 'none'\r\n }\r\n },\r\n unit: {\r\n fontSize: '0.9rem',\r\n marginLeft: theme.spacing(0.5),\r\n height: 20,\r\n lineHeight: '20px'\r\n }\r\n}))\r\n","import React, { FC } from 'react'\r\nimport { FormattedMessage } from 'react-intl'\r\n\r\nimport { Input, Slider, Typography } from '@material-ui/core'\r\n\r\nimport { toolBarSliderStyle } from './ToolBarSlider.style'\r\n\r\nexport interface ToolBarSliderProps {\r\n onChangeHandler: (value: number, commit: boolean) => void\r\n label: string\r\n name: string\r\n value: number\r\n unit: string\r\n min: number\r\n max: number\r\n step: number\r\n}\r\n\r\nconst defaultProps: ToolBarSliderProps = {\r\n onChangeHandler: (value: number, commit: boolean): void => {},\r\n label: '',\r\n name: '',\r\n value: 0,\r\n unit: '',\r\n min: -200,\r\n max: 200,\r\n step: 10\r\n}\r\n\r\nexport const ToolBarSlider: FC<ToolBarSliderProps> = (props: ToolBarSliderProps) => {\r\n const classes = toolBarSliderStyle()\r\n\r\n const handleSliderChange = (value: number | number[], commit: boolean): void => {\r\n props.onChangeHandler(value as number, commit)\r\n }\r\n\r\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>, min: number, max: number): void => {\r\n const value = Number(event.target.value)\r\n if (value < min || value > max) {\r\n return\r\n }\r\n props.onChangeHandler(value, true)\r\n }\r\n\r\n return (\r\n <div>\r\n <Typography id={`discrete-slider-${props.name}`} className={classes.discreteSlider} gutterBottom>\r\n <FormattedMessage id={props.label} />\r\n </Typography>\r\n\r\n <div className={classes.sliderContainer}>\r\n <Slider\r\n name={props.name}\r\n aria-labelledby={`discrete-slider-${props.name}`}\r\n valueLabelDisplay='off'\r\n min={props.min}\r\n max={props.max}\r\n value={props.value}\r\n onChange={(event: any, newValue: number | number[]): void => { handleSliderChange(newValue, false) }}\r\n onChangeCommitted={(event: any, newValue: number | number[]): void => { handleSliderChange(newValue, true) }}\r\n className={classes.slider}\r\n />\r\n <Input\r\n name={props.name}\r\n className={classes.input}\r\n value={props.value}\r\n margin='dense'\r\n disableUnderline\r\n onChange={(event: React.ChangeEvent<HTMLInputElement>): void => { handleInputChange(event, -200, 200) }}\r\n inputProps={{\r\n style: { textAlign: 'center', padding: 0 },\r\n step: props.step,\r\n min: props.min,\r\n max: props.max,\r\n type: 'number',\r\n 'aria-labelledby': 'input-slider'\r\n }}\r\n /> <span className={classes.unit}>{props.unit}</span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nToolBarSlider.defaultProps = defaultProps\r\n\r\nexport default ToolBarSlider\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const virtualBoreholeSettingsStyle = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n width: '100%'\r\n },\r\n setting: {\r\n display: 'flex',\r\n width: '100%',\r\n flexDirection: 'column'\r\n },\r\n toolIcon: {\r\n paddingTop: theme.spacing(1),\r\n width: 35\r\n }\r\n}))\r\n","import { FC, useState, useEffect } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport { RootState } from 'src/Store'\r\n\r\nimport { GeoModel } from 'src/dataSources/geo/GeoModel'\r\nimport { ToolType } from 'src/Enums'\r\nimport { virtualBoreholeInfoActions } from 'src/actions/VirtualBoreholeInfoActions'\r\nimport { virtualBoreholeInfoStateInitial } from 'src/reducers/VirtualBoreholeInfoReducer'\r\n\r\nimport ToolBarSlider from '../toolbarslider/ToolBarSlider'\r\n\r\nimport { virtualBoreholeSettingsStyle } from './VirtualBoreholeSettings.style'\r\nimport { Tooltip } from '@material-ui/core'\r\nimport { tooltipDelay } from 'src/Constants'\r\nimport { LeftSideBarIcon, LeftSideBarIconType } from 'src/components/leftsidebar/leftsidebaricon/LeftSideBarIcon'\r\nimport { useIntl } from 'react-intl'\r\nimport { LayerParams } from 'src/dataSources/layers/LayerRegistry'\r\n\r\nexport interface VirtualBoreholeSettingsProps { } // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\nconst defaultProps: VirtualBoreholeSettingsProps = {}\r\n\r\nexport const VirtualBoreholeSettings: FC<VirtualBoreholeSettingsProps> = (props: VirtualBoreholeSettingsProps) => {\r\n const dispatch = useDispatch()\r\n const classes = virtualBoreholeSettingsStyle()\r\n const intl = useIntl()\r\n\r\n const layerParams = useSelector((state: RootState): LayerParams[] => state.mapState.layerParams)\r\n const selectedGeoModel = useSelector((state: RootState): GeoModel | undefined => state.generalState.selectedGeoModel)\r\n const selectedTool = useSelector((state: RootState): ToolType => state.generalState.selectedTool)\r\n const virtualBoreholeMaxDepth = useSelector((state: RootState): number => state.virtualBoreholeInfoState.maxDepth)\r\n const virtualBoreholeCoords = useSelector((state: RootState): number[] => state.virtualBoreholeInfoState.coordinates)\r\n\r\n const [updatingVirtualBorehole, setUpdatingVirtualBorehole] = useState<number | undefined>(undefined)\r\n\r\n useEffect(() => {\r\n if (selectedTool === ToolType.VIRTUAL_BOREHOLE) {\r\n dispatch(virtualBoreholeInfoActions.updateVirtualBorehole(virtualBoreholeCoords))\r\n }\r\n // eslint-disable-next-line\r\n }, [selectedGeoModel, layerParams])\r\n\r\n const startUpdateVirtualBoreholeInterval = (): void => {\r\n const timeout = window.setTimeout(() => {\r\n dispatch(virtualBoreholeInfoActions.updateVirtualBorehole(virtualBoreholeCoords))\r\n setUpdatingVirtualBorehole(undefined)\r\n }, 500)\r\n setUpdatingVirtualBorehole(timeout)\r\n }\r\n\r\n const setMaxDepth = (maxDepth: number, refreshVirtualBorehole: boolean): void => {\r\n dispatch(virtualBoreholeInfoActions.setMaxDepth(maxDepth))\r\n if (refreshVirtualBorehole && virtualBoreholeCoords !== virtualBoreholeInfoStateInitial.coordinates) {\r\n if (updatingVirtualBorehole === undefined) {\r\n startUpdateVirtualBoreholeInterval()\r\n } else {\r\n clearTimeout(updatingVirtualBorehole)\r\n startUpdateVirtualBoreholeInterval()\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'tools.virtualborehole' })}\r\n enterDelay={tooltipDelay}\r\n placement='bottom'\r\n >\r\n <div className={classes.toolIcon}>\r\n <LeftSideBarIcon icon={LeftSideBarIconType.VirtualBorehole} selected disabled={false} />\r\n </div>\r\n </Tooltip>\r\n <div className={classes.setting}>\r\n <ToolBarSlider label='tools.virtualborehole.maxDepth' name='maxdepth' min={-200} max={200} step={10} unit='m' value={virtualBoreholeMaxDepth} onChangeHandler={setMaxDepth} />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nVirtualBoreholeSettings.defaultProps = defaultProps\r\n\r\nexport default VirtualBoreholeSettings\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const profileSettingsStyle = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n width: '100%'\r\n },\r\n setting: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minWidth: 150,\r\n marginRight: theme.spacing(4)\r\n },\r\n viewLabel: {\r\n display: 'flex',\r\n margin: 0,\r\n marginRight: theme.spacing(2),\r\n fontSize: '0.7rem',\r\n alignSelf: 'left',\r\n whiteSpace: 'nowrap',\r\n color: theme.palette.geoColors.toolBar.main,\r\n height: 15\r\n },\r\n viewButton: {\r\n width: 30,\r\n height: 40\r\n },\r\n viewSettings: {\r\n padding: theme.spacing(1),\r\n fontSize: '0.8rem'\r\n },\r\n viewSettingsDescription: {\r\n paddingTop: theme.spacing(1),\r\n paddingBottom: theme.spacing(1)\r\n },\r\n viewSettingsLabel: {\r\n width: '100%',\r\n height: 35,\r\n marginLeft: 0,\r\n '& .MuiTypography-root': {\r\n fontSize: '0.8rem'\r\n }\r\n },\r\n spacer: {\r\n width: '100%'\r\n },\r\n toolIcon: {\r\n paddingTop: theme.spacing(1),\r\n paddingLeft: theme.spacing(0.5),\r\n paddingRight: theme.spacing(1.5),\r\n width: 35\r\n }\r\n}))\r\n","import { FC, useState } from 'react'\r\nimport { FormattedMessage, useIntl } from 'react-intl'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport { FormControlLabel, IconButton, Popover, Switch, Tooltip } from '@material-ui/core'\r\nimport { Settings } from '@material-ui/icons'\r\n\r\nimport { RootState } from 'src/Store'\r\nimport { profileActions } from 'src/actions/ProfileActions'\r\n\r\nimport ToolBarSlider from '../toolbarslider/ToolBarSlider'\r\nimport { ProfileSetting } from 'src/reducers/ProfileReducer'\r\n\r\nimport { profileSettingsStyle } from './ProfileSettings.style'\r\nimport { LeftSideBarIcon, LeftSideBarIconType } from 'src/components/leftsidebar/leftsidebaricon/LeftSideBarIcon'\r\nimport { tooltipDelay } from 'src/Constants'\r\n\r\nexport interface ProfileSettingsProps { } // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\nconst defaultProps: ProfileSettingsProps = {}\r\n\r\nexport const ProfileSettings: FC<ProfileSettingsProps> = (props: ProfileSettingsProps) => {\r\n const dispatch = useDispatch()\r\n const classes = profileSettingsStyle()\r\n const intl = useIntl()\r\n\r\n const profileMaxDepth = useSelector((state: RootState): number => state.profileState.maxDepth)\r\n const profileMaxBoreholeDistance = useSelector((state: RootState): number => state.profileState.maxBoreholeDistance)\r\n const enabledProfileSettings = useSelector((state: RootState): ProfileSetting[] => state.profileState.enabledSettings)\r\n const [updatingProfile, setUpdatingProfile] = useState<number | undefined>(undefined)\r\n\r\n // Logic for view settings popover\r\n const [anchorEl, setAnchorEl] = useState(null)\r\n const open = Boolean(anchorEl)\r\n const id = open ? 'view-settings' : undefined\r\n\r\n /**\r\n * Handle click to show the popover.\r\n * @param event Mouse event.\r\n */\r\n const handleClick = (event: any): void => { // TODO: What type should be provided here?\r\n setAnchorEl(event.currentTarget)\r\n }\r\n\r\n /**\r\n * Handle closing the popover.\r\n */\r\n const handleClose = (): void => {\r\n setAnchorEl(null)\r\n }\r\n\r\n /**\r\n * Is a given profile setting enabled?\r\n * @param setting Layer to check.\r\n * @returns true if layer is selected, false otherwise.\r\n */\r\n const isProfileSettingEnabled = (setting: ProfileSetting): boolean => {\r\n return enabledProfileSettings.some(enabledSetting => enabledSetting === setting)\r\n }\r\n\r\n /**\r\n * Refresh profile with a small delay to avoid too many request sent.\r\n */\r\n const refresh = (): void => {\r\n if (updatingProfile === undefined) {\r\n startUpdateProfileInterval()\r\n } else {\r\n clearTimeout(updatingProfile)\r\n startUpdateProfileInterval()\r\n }\r\n }\r\n\r\n /**\r\n * Set the max borehole distance.\r\n * @param distance Distance to set.\r\n * @param refreshProfile Refresh the profile on the map.\r\n */\r\n const setMaxBoreholeDistance = (distance: number, refreshProfile: boolean): void => {\r\n dispatch(profileActions.setMaxBoreholeDistance(distance))\r\n if (refreshProfile) {\r\n refresh()\r\n }\r\n }\r\n\r\n /**\r\n * Set the max depth.\r\n * @param depth Depth to set.\r\n * @param refreshProfile Refresh the profile on the map.\r\n */\r\n const setMaxDepth = (depth: number, refreshProfile: boolean): void => {\r\n dispatch(profileActions.setMaxDepth(depth))\r\n if (refreshProfile) {\r\n refresh()\r\n }\r\n }\r\n\r\n /**\r\n * Start delay before update the profile on the map.\r\n */\r\n const startUpdateProfileInterval = (): void => {\r\n const timeout = window.setTimeout(() => {\r\n dispatch(profileActions.fetchProfile())\r\n setUpdatingProfile(undefined)\r\n }, 500)\r\n setUpdatingProfile(timeout)\r\n }\r\n\r\n /**\r\n * Generate view settings switch.\r\n * @param setting Setting to generate switch for.\r\n * @returns Switch element\r\n */\r\n const generateProfileSettingSwitch = (setting: ProfileSetting): JSX.Element => {\r\n const checked = isProfileSettingEnabled(setting)\r\n const name = intl.formatMessage({ id: `tools.profile.view.${setting as string}` })\r\n const disabled = setting === ProfileSetting.SHOW_WATER_LEVEL && !isProfileSettingEnabled(ProfileSetting.SHOW_WATER_LEVEL_SYMBOL)\r\n return (\r\n <div>\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n checked={checked}\r\n name={name}\r\n color='primary'\r\n disabled={disabled}\r\n onChange={event => handleSwitchChange(setting, event.target.checked)}\r\n />\r\n }\r\n label={name}\r\n className={classes.viewSettingsLabel}\r\n />\r\n </div>\r\n )\r\n }\r\n\r\n /**\r\n * Handle when a switch value is changed.\r\n * @param setting Setting to change.\r\n * @param checked true if checked, false otherwise.\r\n */\r\n const handleSwitchChange = (setting: ProfileSetting, checked: boolean): void => {\r\n dispatch(checked ? profileActions.enableSetting(setting) : profileActions.disableSetting(setting))\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'tools.profile' })}\r\n enterDelay={tooltipDelay}\r\n placement='bottom'\r\n >\r\n <div className={classes.toolIcon}>\r\n <LeftSideBarIcon icon={LeftSideBarIconType.Profile} selected disabled={false} />\r\n </div>\r\n </Tooltip>\r\n <div className={classes.setting}>\r\n <ToolBarSlider label='tools.profile.depth' name='depth' unit='m' min={-200} max={200} step={10} value={profileMaxDepth} onChangeHandler={setMaxDepth} />\r\n </div>\r\n <div className={classes.setting}>\r\n <ToolBarSlider label='tools.profile.boreholedist' name='boreholeDistance' min={0} max={1000} step={10} unit='m' value={profileMaxBoreholeDistance} onChangeHandler={setMaxBoreholeDistance} />\r\n </div>\r\n <div className={classes.spacer} />\r\n <div>\r\n <div>\r\n <IconButton color='primary' className={classes.viewButton} onClick={handleClick}>\r\n <Settings />\r\n </IconButton>\r\n <Popover\r\n id={id}\r\n open={open}\r\n anchorEl={anchorEl}\r\n onClose={handleClose}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'left'\r\n }}\r\n >\r\n <div className={classes.viewSettings}>\r\n <div className={classes.viewSettingsDescription}>\r\n <FormattedMessage id='tools.profile.view.description' />\r\n </div>\r\n {generateProfileSettingSwitch(ProfileSetting.SHOW_BOREHOLE_LABEL)}\r\n {generateProfileSettingSwitch(ProfileSetting.SHOW_GEOLOGY_LABEL)}\r\n {generateProfileSettingSwitch(ProfileSetting.SHOW_FILTER_LEVEL)}\r\n {generateProfileSettingSwitch(ProfileSetting.SHOW_WATER_LEVEL_SYMBOL)}\r\n {generateProfileSettingSwitch(ProfileSetting.SHOW_WATER_LEVEL)}\r\n {generateProfileSettingSwitch(ProfileSetting.SHOW_GEO_LOGO)}\r\n {generateProfileSettingSwitch(ProfileSetting.SHOW_PROFILE_BUFFER)}\r\n </div>\r\n </Popover>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nProfileSettings.defaultProps = defaultProps\r\n\r\nexport default ProfileSettings\r\n","import { FC, useState } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport { Grid, IconButton, Tooltip } from '@material-ui/core'\r\nimport { ChevronRight, HomeOutlined } from '@material-ui/icons'\r\n\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { tooltipDelay } from 'src/Constants'\r\nimport { RootState } from 'src/Store'\r\nimport { getDataThemeName } from 'src/utils/Utils'\r\n\r\nimport ModelPicker from '../modelpicker/ModelPicker'\r\nimport ThemePicker from '../themepicker/ThemePicker'\r\nimport { toolBarStyle } from './ToolBar.style'\r\nimport { DataTheme, ToolType } from 'src/Enums'\r\n\r\nimport VirtualBoreholeSettings from './virtualboreholesettings/VirtualBoreholeSettings'\r\nimport ProfileSettings from './profilesettings/ProfileSettings'\r\nimport { LayerType } from 'src/dataSources/layers/LayerRegistry'\r\nimport { resetSelectedLayers } from 'src/utils/MapLayerUtils'\r\n\r\nexport interface ToolBarProps { } // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\nconst defaultProps: ToolBarProps = {}\r\n\r\nexport const ToolBar: FC<ToolBarProps> = (props: ToolBarProps) => {\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n const classes = toolBarStyle()\r\n\r\n const currentDataTheme = useSelector((state: RootState): DataTheme => state.generalState.dataTheme)\r\n const selectedTool = useSelector((state: RootState): ToolType => state.generalState.selectedTool)\r\n const enabledLayers = useSelector((state: RootState): LayerType[] => state.mapState.enabledLayers)\r\n\r\n const [themePickerOpen, setThemePickerOpen] = useState(false)\r\n\r\n const handleClose = (): void => {\r\n setThemePickerOpen(false)\r\n }\r\n\r\n const handleThemeSelected = (dataTheme: DataTheme): void => {\r\n if (dataTheme !== currentDataTheme) {\r\n resetSelectedLayers(enabledLayers, dispatch)\r\n }\r\n dispatch(generalActions.setDataTheme(dataTheme))\r\n setThemePickerOpen(false)\r\n }\r\n\r\n const homeButtonClicked = (): void => {\r\n setThemePickerOpen(true)\r\n }\r\n\r\n const settingsAvailable = (): boolean => {\r\n return selectedTool === ToolType.VIRTUAL_BOREHOLE || selectedTool === ToolType.PROFILE\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Tooltip title={intl.formatMessage({ id: 'toolbar.home' })} enterDelay={tooltipDelay} placement='right'>\r\n <IconButton size='medium' onClick={homeButtonClicked}>\r\n <HomeOutlined className={classes.homeIcon} />\r\n </IconButton>\r\n </Tooltip>\r\n <ChevronRight className={classes.breadcrumbSeparator} />\r\n <div className={classes.breadcrumb}>\r\n <Tooltip title={getDataThemeName(currentDataTheme)} enterDelay={tooltipDelay} placement='right'>\r\n <div className={classes.breadcrumbText}>\r\n {getDataThemeName(currentDataTheme)}\r\n </div>\r\n </Tooltip>\r\n </div>\r\n <ThemePicker open={themePickerOpen} handleThemeSelected={handleThemeSelected} handleClose={handleClose} />\r\n {settingsAvailable() && (\r\n <>\r\n <div className={classes.separatorBar}>\r\n |\r\n </div>\r\n <div className={classes.toolParamsWrapper}>\r\n {selectedTool === ToolType.PROFILE &&\r\n <ProfileSettings />}\r\n {selectedTool === ToolType.VIRTUAL_BOREHOLE &&\r\n <VirtualBoreholeSettings />}\r\n </div>\r\n </>\r\n )}\r\n {!settingsAvailable() && (\r\n <div className={classes.noToolSelected}>\r\n <Grid container alignItems='center' />\r\n </div>\r\n )}\r\n <div className={classes.separatorBar}>\r\n |\r\n </div>\r\n <div className={classes.models}>\r\n <ModelPicker />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nToolBar.defaultProps = defaultProps\r\n\r\nexport default ToolBar\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { topbarHeight } from 'src/Constants'\r\n\r\nexport const userInfoStyle = makeStyles(theme => ({\r\n root: {\r\n },\r\n userIcon: {\r\n color: theme.palette.common.white,\r\n height: topbarHeight\r\n }\r\n}))\r\n","import { FC, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { Divider, IconButton, Menu, MenuItem } from '@material-ui/core'\r\nimport { AccountCircle, ExitToApp, Person } from '@material-ui/icons'\r\nimport { RootState } from '../../Store'\r\nimport { userInfoStyle } from './UserInfo.style'\r\nimport { FormattedMessage } from 'react-intl'\r\nimport { authActions } from 'src/actions/AuthAction'\r\n\r\nexport interface UserInfoProps {} // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\nconst defaultProps: UserInfoProps = {\r\n}\r\n\r\nexport const UserInfo: FC<UserInfoProps> = (props: UserInfoProps) => {\r\n const classes = userInfoStyle()\r\n const dispatch = useDispatch()\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\r\n const username = useSelector((state: RootState): string => state.authState.username)\r\n\r\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>): void => {\r\n setAnchorEl(event.currentTarget)\r\n }\r\n const handleClose = (): void => {\r\n setAnchorEl(null)\r\n }\r\n const handleLogout = (): void => {\r\n setAnchorEl(null)\r\n dispatch(authActions.logout())\r\n }\r\n return (\r\n <div className={classes.root}>\r\n <IconButton size='medium' className={classes.userIcon} onClick={handleClick}>\r\n <AccountCircle />\r\n </IconButton>\r\n <Menu\r\n id='simple-menu'\r\n anchorEl={anchorEl}\r\n getContentAnchorEl={null}\r\n keepMounted\r\n open={Boolean(anchorEl)}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\r\n transformOrigin={{ vertical: 'center', horizontal: 'center' }}\r\n onClose={handleClose}\r\n variant='selectedMenu'\r\n >\r\n <MenuItem>\r\n <Person /> {username}\r\n </MenuItem>\r\n <Divider />\r\n <MenuItem onClick={handleLogout}>\r\n <ExitToApp /> <FormattedMessage id='common.logout' />\r\n </MenuItem>\r\n </Menu>\r\n </div>\r\n )\r\n}\r\n\r\nUserInfo.defaultProps = defaultProps\r\n\r\nexport default UserInfo\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { topbarHeight } from 'src/Constants'\r\n\r\nexport const topBarStyle = makeStyles(theme => ({\r\n root: {\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'left',\r\n background: theme.palette.geoColors.topBar.main\r\n },\r\n logo: {\r\n width: '33%',\r\n height: topbarHeight\r\n },\r\n image: {\r\n marginLeft: theme.spacing(2),\r\n height: topbarHeight\r\n },\r\n buttons: {\r\n width: '33%',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'flex-end',\r\n paddingRight: theme.spacing(2),\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none'\r\n }\r\n },\r\n userInfo: {\r\n },\r\n searchField: {\r\n width: '33%',\r\n [theme.breakpoints.down('sm')]: {\r\n display: 'none'\r\n }\r\n },\r\n themeImage: {\r\n marginLeft: 20,\r\n color: theme.palette.common.white,\r\n fontSize: '1.5rem',\r\n height: topbarHeight\r\n },\r\n wikiButton: {\r\n },\r\n wikiIcon: {\r\n color: theme.palette.common.white,\r\n height: topbarHeight\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const searchFieldStyle = makeStyles(theme => ({\r\n root: {\r\n marginTop: theme.spacing(1),\r\n width: '100%'\r\n },\r\n loading: {\r\n position: 'absolute',\r\n right: theme.spacing(7),\r\n color: theme.palette.primary.main\r\n },\r\n textField: {\r\n backgroundColor: theme.palette.common.white,\r\n padding: theme.spacing(1),\r\n fontSize: '1rem',\r\n height: 35,\r\n borderRadius: '0.3rem'\r\n }\r\n}))\r\n","import React, { FC, useEffect, useRef } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\n\r\nimport Autocomplete from '@material-ui/lab/Autocomplete'\r\n\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { RootState } from 'src/Store'\r\n\r\nimport { searchFieldStyle } from './SearchField.style'\r\nimport { CircularProgress, TextField } from '@material-ui/core'\r\nimport { AddressResult } from 'src/dataSources/dataforsyningen/Address'\r\nimport { mapActions } from 'src/actions/MapActions'\r\nimport { useIntl } from 'react-intl'\r\n\r\n/**\r\n * SearchFieldProps contains properties for the component.\r\n */\r\nexport interface SearchFieldProps {} // eslint-disable-line @typescript-eslint/no-empty-interface\r\nconst defaultProps: SearchFieldProps = {\r\n}\r\n\r\n/**\r\n * SearchFieldOption represents an address option that can be selected.\r\n */\r\ninterface SearchFieldOption {\r\n label: string\r\n address?: AddressResult\r\n}\r\n\r\n/**\r\n * SearchField React component.\r\n * @param {object} props React properties object.\r\n * @returns React view component.\r\n */\r\nexport const SearchField: FC<SearchFieldProps> = (props: SearchFieldProps) => {\r\n const classes = searchFieldStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n const addresses = useSelector((state: RootState): AddressResult[] | undefined => state.generalState.addresses)\r\n const addressQuery = useSelector((state: RootState): string | undefined => state.generalState.addressQuery)\r\n const [open, setOpen] = React.useState(false)\r\n const [options, setOptions] = React.useState([] as SearchFieldOption[])\r\n const [updatingAddresses, setUpdatingAddresses] = React.useState<number|undefined>(undefined)\r\n\r\n const queryRef = useRef(addressQuery)\r\n queryRef.current = addressQuery\r\n\r\n const loading = open && options.length === 0 && addressQuery !== ''\r\n\r\n useEffect(() => {\r\n if (addresses === undefined) {\r\n return\r\n }\r\n const options: SearchFieldOption[] = []\r\n for (const address of addresses) {\r\n let fullAddress = ''\r\n if (address.data !== undefined) {\r\n if (address.data?.vejnavn !== undefined) {\r\n fullAddress += address.data.vejnavn\r\n }\r\n if (address.data?.husnr !== undefined) {\r\n fullAddress += ' ' + address.data.husnr\r\n }\r\n if (address.data?.supplerendebynavn !== undefined && address.data?.supplerendebynavn !== null) {\r\n fullAddress += ', ' + address.data.supplerendebynavn\r\n }\r\n if (address.data?.postnr !== undefined) {\r\n fullAddress += ', ' + address.data.postnr\r\n }\r\n if (address.data?.postnrnavn !== undefined) {\r\n fullAddress += ' ' + address.data.postnrnavn\r\n }\r\n if (fullAddress === '' && address.tekst !== undefined) {\r\n fullAddress = address.tekst\r\n }\r\n }\r\n const option: SearchFieldOption = { label: fullAddress, address: address }\r\n options.push(option)\r\n }\r\n setOptions(options)\r\n }, [addresses])\r\n\r\n /**\r\n * Start interval to add a delay before sending a query to service.\r\n */\r\n const startUpdateAddressesInterval = (): void => {\r\n const timeout = window.setTimeout(() => {\r\n if (queryRef.current === undefined || queryRef.current === '') {\r\n setUpdatingAddresses(undefined)\r\n return\r\n }\r\n dispatch(generalActions.fetchAddresses(queryRef.current))\r\n setUpdatingAddresses(undefined)\r\n }, 500)\r\n setUpdatingAddresses(timeout)\r\n }\r\n\r\n const handleChange = (event: React.ChangeEvent<{}>, value: SearchFieldOption | null, reason: string): void => {\r\n if (value === null) {\r\n return\r\n }\r\n if (value.address?.data?.x !== undefined && value.address?.data?.y !== undefined) {\r\n dispatch(mapActions.setMapCenter([value.address.data.x, value.address.data.y]))\r\n dispatch(mapActions.setMapCurrentZoom(18))\r\n }\r\n }\r\n const handleInputChange = (event: React.ChangeEvent<{}>, value: string, reason: string): void => {\r\n if (value.length > 2) {\r\n setOptions([])\r\n dispatch(generalActions.setAddressQuery(value))\r\n if (updatingAddresses !== undefined) {\r\n clearTimeout(updatingAddresses)\r\n }\r\n startUpdateAddressesInterval()\r\n }\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Autocomplete\r\n id='address'\r\n size='small'\r\n open={open}\r\n onOpen={() => {\r\n setOpen(true)\r\n }}\r\n onClose={() => {\r\n setOpen(false)\r\n }}\r\n getOptionSelected={(option, value) => option.label === value.label}\r\n getOptionLabel={(option) => option.label}\r\n options={options}\r\n loading={loading}\r\n loadingText={intl.formatMessage({ id: 'common.loading' })}\r\n onChange={handleChange}\r\n onInputChange={handleInputChange}\r\n noOptionsText={intl.formatMessage({ id: 'search.nooptions' })}\r\n renderInput={(params) => (\r\n <TextField\r\n {...params}\r\n placeholder={intl.formatMessage({ id: 'search.placeholder' })}\r\n variant='standard'\r\n InputProps={{\r\n ...params.InputProps,\r\n className: classes.textField,\r\n disableUnderline: true,\r\n endAdornment: (\r\n <>\r\n {loading ? <CircularProgress className={classes.loading} color='inherit' size={15} /> : null}\r\n {params.InputProps.endAdornment}\r\n </>\r\n )\r\n }}\r\n />\r\n )}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nSearchField.defaultProps = defaultProps\r\n\r\nexport default SearchField\r\n","import { FC } from 'react'\r\nimport UserInfo from '../userinfo/UserInfo'\r\nimport { topBarStyle } from './TopBar.style'\r\nimport { DataTheme } from 'src/Enums'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { RootState } from 'src/Store'\r\nimport { getDataThemeName } from 'src/utils/Utils'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faIcicles, faCloudSunRain, faLeaf, faBolt } from '@fortawesome/free-solid-svg-icons'\r\nimport { IconButton, Tooltip } from '@material-ui/core'\r\nimport HelpOutlineIcon from '@material-ui/icons/HelpOutline'\r\nimport { sidebarAnimationDuration, tooltipDelay } from 'src/Constants'\r\nimport { useIntl } from 'react-intl'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { SearchField } from '../searchfield/SearchField'\r\nimport { WikiView } from 'src/reducers/WikiReducer'\r\n\r\nexport interface TopBarProps {} // eslint-disable-line @typescript-eslint/no-empty-interface\r\n\r\nconst defaultProps: TopBarProps = {\r\n}\r\n\r\nexport const TopBar: FC<TopBarProps> = (props: TopBarProps) => {\r\n const classes = topBarStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n\r\n const dataTheme = useSelector((state: RootState): DataTheme => state.generalState.dataTheme)\r\n const currentWikiViews = useSelector((state: RootState): WikiView[] => state.wikiState.currentWikiViews)\r\n const showWikiSideBar = useSelector((state: RootState): boolean => state.wikiState.showWikiSideBar)\r\n\r\n /**\r\n * When toggle button is clicked the WikiSideBar is toggled.\r\n */\r\n const toggleWikiSideBarClicked = (): void => {\r\n if (showWikiSideBar) {\r\n if (currentWikiViews.includes(WikiView.WikiBrowser)) {\r\n dispatch(wikiActions.showWikiSideBar(false))\r\n setTimeout(function () {\r\n dispatch(wikiActions.clearViews())\r\n }, sidebarAnimationDuration * 1.5)\r\n } else {\r\n dispatch(wikiActions.clearViewStack())\r\n dispatch(wikiActions.pushView(WikiView.WikiBrowser))\r\n }\r\n } else {\r\n dispatch(wikiActions.pushView(WikiView.WikiBrowser))\r\n dispatch(wikiActions.showWikiSideBar(true))\r\n }\r\n dispatch(wikiActions.clearDocument())\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <div className={classes.logo}>\r\n <a href='https://www.geo.dk' target='_blank' rel='noreferrer noopener'>\r\n <img\r\n src='logo.png'\r\n alt='Geo logo'\r\n className={classes.image}\r\n />\r\n </a>\r\n {dataTheme === DataTheme.ICE_AGE && (<FontAwesomeIcon icon={faIcicles} title={getDataThemeName(dataTheme)} className={classes.themeImage} />)}\r\n {dataTheme === DataTheme.ENVIRONMENT && (<FontAwesomeIcon icon={faLeaf} title={getDataThemeName(dataTheme)} className={classes.themeImage} />)}\r\n {dataTheme === DataTheme.CLIMATE && (<FontAwesomeIcon icon={faCloudSunRain} title={getDataThemeName(dataTheme)} className={classes.themeImage} />)}\r\n {dataTheme === DataTheme.ENERGY && (<FontAwesomeIcon icon={faBolt} title={getDataThemeName(dataTheme)} className={classes.themeImage} />)}\r\n </div>\r\n <div className={classes.searchField}>\r\n <SearchField />\r\n </div>\r\n <div className={classes.buttons}>\r\n <div className={classes.wikiButton}>\r\n <Tooltip\r\n title={intl.formatMessage({ id: 'wiki.button.general' })}\r\n enterDelay={tooltipDelay}\r\n placement='right'\r\n >\r\n <IconButton size='medium' className={classes.wikiIcon} onClick={toggleWikiSideBarClicked}>\r\n <HelpOutlineIcon />\r\n </IconButton>\r\n </Tooltip>\r\n </div>\r\n <div className={classes.userInfo}>\r\n <UserInfo />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nTopBar.defaultProps = defaultProps\r\n\r\nexport default TopBar\r\n","import { makeStyles } from '@material-ui/core/styles'\r\nimport { headerHeight } from '../../../Constants'\r\n\r\nexport const wikiSideBarStyle = makeStyles((theme) => ({\r\n root: {\r\n height: `calc(100vh - ${headerHeight}px)`,\r\n background: theme.palette.common.white,\r\n borderLeftWidth: '1px',\r\n borderLeftColor: theme.palette.primary.main,\r\n borderLeftStyle: 'solid',\r\n overflowY: 'auto'\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n color: theme.palette.geoColors.headerText.main,\r\n right: 5,\r\n top: 0,\r\n zIndex: 1\r\n },\r\n closeButtonIcon: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n wrapper: {\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n zIndex: 1000\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const wikiBrowserStyle = makeStyles(theme => ({\r\n backButton: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n backButtonIcon: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n backButtonPadding: {\r\n paddingLeft: theme.spacing(1)\r\n },\r\n root: {\r\n width: '100%'\r\n },\r\n divider: {\r\n height: 1,\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n background: theme.palette.geoColors.contextBar.dark\r\n },\r\n disabledListItem: {\r\n cursor: 'default',\r\n pointerEvents: 'none',\r\n '&:hover': {\r\n backgroundColor: '#00000000'\r\n }\r\n },\r\n documentItem: {\r\n '& .MuiTypography-body1': {\r\n fontSize: '0.9rem'\r\n }\r\n },\r\n list: {\r\n paddingBottom: 0\r\n },\r\n nested: {\r\n paddingLeft: theme.spacing(4)\r\n },\r\n topMargin: {\r\n marginTop: theme.spacing(2)\r\n },\r\n nestedListSubheader: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n minHeight: '48px',\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.geoColors.headerText.main,\r\n userSelect: 'none',\r\n zIndex: 0\r\n },\r\n nestedListSubheaderIcon: {\r\n float: 'right',\r\n paddingTop: '0.5rem'\r\n },\r\n progress: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n color: theme.palette.geoColors.text.light\r\n },\r\n searchButton: {\r\n position: 'absolute',\r\n color: theme.palette.geoColors.headerText.main,\r\n right: 40,\r\n top: 0\r\n },\r\n searchButtonIcon: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n sectionListItem: {\r\n margin: 0,\r\n marginTop: theme.spacing(4),\r\n padding: 0,\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2),\r\n color: theme.palette.primary.main\r\n },\r\n title: {\r\n '& .MuiTypography-body1': {\r\n fontSize: '1.1rem'\r\n }\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const wikiSearchStyle = makeStyles(theme => ({\r\n root: {\r\n width: '100%',\r\n backgroundColor: theme.palette.secondary.main,\r\n paddingTop: theme.spacing(2),\r\n paddingBottom: theme.spacing(2),\r\n borderBottom: 1,\r\n borderBottomStyle: 'solid',\r\n borderBottomColor: theme.palette.primary.main\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n color: theme.palette.geoColors.headerText.main,\r\n right: 4,\r\n top: -5,\r\n zIndex: 1000\r\n },\r\n closeButtonIcon: {\r\n color: theme.palette.primary.main,\r\n fontSize: '1.2rem'\r\n },\r\n searchField: {\r\n display: 'flex',\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n borderRadius: 100,\r\n '& fieldset': {\r\n borderRadius: 5\r\n },\r\n '& .MuiInputLabel-outlined': {\r\n zIndex: 0\r\n }\r\n },\r\n triangle: {\r\n width: 0,\r\n height: 0,\r\n position: 'absolute',\r\n top: -10,\r\n right: 55,\r\n borderLeft: 10,\r\n borderLeftStyle: 'solid',\r\n borderLeftColor: 'transparent',\r\n borderRight: 10,\r\n borderRightStyle: 'solid',\r\n borderRightColor: 'transparent',\r\n borderBottom: 10,\r\n borderBottomStyle: 'solid',\r\n borderBottomColor: theme.palette.secondary.main\r\n }\r\n}))\r\n","import { FC, useEffect } from 'react'\r\nimport { useIntl } from 'react-intl'\r\nimport { wikiSearchStyle } from './WikiSearch.style'\r\nimport { TextField } from '@material-ui/core'\r\n\r\n/**\r\n * WikiSearchComponentProps contains properties for the component.\r\n */\r\nexport interface WikiSearchComponentProps {\r\n onInputChange: (input: string) => void\r\n onClose?: () => void\r\n}\r\n\r\n/**\r\n * WikiSearchComponent displays wiki search field\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const WikiSearchComponent: FC<WikiSearchComponentProps> = ({ onInputChange, onClose = () => {} }: WikiSearchComponentProps) => {\r\n const classes = wikiSearchStyle()\r\n const intl = useIntl()\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e: Event): void => {\r\n if (((e as unknown) as KeyboardEvent).key === 'Escape') {\r\n onClose()\r\n }\r\n }\r\n document.addEventListener('keydown', handleKeyDown, false)\r\n return () => {\r\n document.removeEventListener('keydown', handleKeyDown, false)\r\n }\r\n }, [onClose])\r\n\r\n return (\r\n <div className={classes.root}>\r\n <div className={classes.triangle} />\r\n <TextField\r\n className={classes.searchField}\r\n label={intl.formatMessage({ id: 'common.search' })}\r\n variant='outlined'\r\n size='small'\r\n autoFocus\r\n onChange={e => onInputChange(e.target.value)}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\nexport default WikiSearchComponent\r\n","import { FC, useEffect, useState } from 'react'\r\nimport { Box, CircularProgress, Collapse, IconButton, List, ListItem, ListItemText, ListSubheader } from '@material-ui/core'\r\nimport { Error, ExpandLess, ExpandMore, NavigateNext, Search } from '@material-ui/icons'\r\nimport { FormattedMessage, useIntl } from 'react-intl'\r\nimport { wikiBrowserStyle } from './WikiBrowser.style'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { appStyle } from 'src/App.style'\r\nimport { CallResult } from 'src/CustomTypes'\r\nimport { ContextTag, WikiDocumentMeta } from 'src/dataSources/wiki/Wiki'\r\nimport WikiSearchComponent from '../wikisearch/WikiSearch'\r\nimport { RootState } from 'src/Store'\r\nimport ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos'\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\r\nimport { faFolder } from '@fortawesome/free-regular-svg-icons'\r\n\r\n/**\r\n * WikiBrowserComponentProps contains properties for the component.\r\n */\r\nexport interface WikiBrowserComponentProps {\r\n enableSearch: boolean\r\n enableBackNavigation: boolean\r\n showContent: boolean\r\n onBackPress: () => void\r\n}\r\n\r\n/**\r\n * WikiBrowserComponent displays available wiki document\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const WikiBrowserComponent: FC<WikiBrowserComponentProps> = (props: WikiBrowserComponentProps) => {\r\n const classes = wikiBrowserStyle()\r\n const appClasses = appStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n\r\n const documentsMeta = useSelector((state: RootState): WikiDocumentMeta[] => state.wikiState.documentsMeta)\r\n const categories = useSelector((state: RootState): string[] => state.wikiState.categories)\r\n const fetchStatus = useSelector((state: RootState): CallResult => state.wikiState.fetchDocumentsMetaStatus)\r\n const contextTags = useSelector((state: RootState): ContextTag[] => state.wikiState.contextTags)\r\n\r\n const [relevantMeta, setRelevantMeta] = useState<WikiDocumentMeta[]>([])\r\n const [otherMeta, setOtherMeta] = useState<WikiDocumentMeta[]>([])\r\n const hasRelevantMeta = relevantMeta.length > 0\r\n\r\n const [contextSectionOpen, setContextSectionOpen] = useState<boolean>(true)\r\n const [allSectionOpen, setAllSectionOpen] = useState<boolean>(true)\r\n\r\n const [searchSelected, setSearchSelected] = useState<boolean>(false)\r\n const [searchText, setSearchText] = useState<string>('')\r\n const showSearchResult = searchText.length > 2\r\n\r\n const fetched = fetchStatus === CallResult.Succeeded\r\n const error = fetchStatus === CallResult.Failed\r\n const running = fetchStatus === CallResult.Running\r\n\r\n useEffect(() => {\r\n let filteredMeta = documentsMeta\r\n if (searchText.length > 2) {\r\n filteredMeta = documentsMeta.filter(meta => meta.title.toLowerCase().includes(searchText.toLowerCase()))\r\n }\r\n\r\n const relevant = filteredMeta\r\n .sort((a, b) => a.title.localeCompare(b.title))\r\n .filter(meta => meta.tags.some(tag => contextTags.includes(tag)))\r\n const other = filteredMeta\r\n .sort((a, b) => a.title.localeCompare(b.title))\r\n .filter(meta => !meta.tags.some(tag => contextTags.includes(tag)))\r\n\r\n setRelevantMeta(relevant)\r\n setOtherMeta(other)\r\n }, [documentsMeta, contextTags, searchText])\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e: Event): void => {\r\n const event = ((e as unknown) as KeyboardEvent)\r\n if (event.metaKey && event.key === 'f') {\r\n event.preventDefault()\r\n setSearchSelected(true)\r\n }\r\n }\r\n document.addEventListener('keydown', handleKeyDown, false)\r\n return () => {\r\n document.removeEventListener('keydown', handleKeyDown, false)\r\n }\r\n }, [setSearchSelected])\r\n\r\n const handleSearchClose = (): void => {\r\n setSearchSelected(false)\r\n setSearchText('')\r\n }\r\n\r\n return (\r\n <>\r\n <List\r\n component='nav'\r\n className={classes.list}\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={`${classes.nestedListSubheader} ${props.enableBackNavigation ? classes.backButtonPadding : ''}`} id='nested-list-subheader'>\r\n {props.enableBackNavigation && (\r\n <div className={classes.backButton}>\r\n <IconButton size='medium' className={classes.backButtonIcon} onClick={props.onBackPress}>\r\n <ArrowBackIosIcon />\r\n </IconButton>\r\n </div>\r\n )}\r\n <FormattedMessage id='wiki.browser.header' />\r\n </ListSubheader>\r\n }\r\n />\r\n {running && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {error && (\r\n <div className={appClasses.errorMessage}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='common.loading.error' />\r\n </div>\r\n )}\r\n {fetched && (\r\n <>\r\n {props.enableSearch && (\r\n <div className={classes.searchButton}>\r\n <IconButton\r\n size='medium'\r\n className={classes.searchButtonIcon}\r\n onClick={() => {\r\n setSearchSelected(!searchSelected)\r\n setSearchText('')\r\n }}\r\n >\r\n <Search />\r\n </IconButton>\r\n </div>\r\n )}\r\n <Collapse in={searchSelected} timeout='auto' unmountOnExit>\r\n <List component='div' disablePadding dense>\r\n <WikiSearchComponent onInputChange={input => setSearchText(input)} onClose={handleSearchClose} />\r\n </List>\r\n </Collapse>\r\n {props.showContent && (\r\n <>\r\n {showSearchResult && (\r\n <div className={`${relevantMeta.length === 0 ? classes.topMargin : ''}`}>\r\n <ListItem\r\n button\r\n onClick={() => { setAllSectionOpen(!allSectionOpen) }}\r\n className={classes.sectionListItem}\r\n >\r\n <ListItemText primary={intl.formatMessage({ id: 'wiki.browser.searchresult' })} className={classes.title} />\r\n </ListItem>\r\n <Collapse in={allSectionOpen} timeout='auto'>\r\n {[...relevantMeta, ...otherMeta].map((document, index) => {\r\n return (\r\n <div key={index}>\r\n {index > 0 && (\r\n <div className={classes.divider} />\r\n )}\r\n <ListItem\r\n button\r\n className={classes.documentItem}\r\n onClick={() => dispatch(wikiActions.fetchDocument(document.key))}\r\n >\r\n <ListItemText primary={document.title} className={classes.documentItem} />\r\n <NavigateNext />\r\n </ListItem>\r\n </div>\r\n )\r\n })}\r\n </Collapse>\r\n </div>\r\n )}\r\n {!showSearchResult && (\r\n <>\r\n {hasRelevantMeta && (\r\n <ListItem\r\n button\r\n onClick={() => { setContextSectionOpen(!contextSectionOpen) }}\r\n className={classes.sectionListItem}\r\n >\r\n <ListItemText primary={intl.formatMessage({ id: 'wiki.browser.relevant' })} className={classes.title} />\r\n {contextSectionOpen ? <ExpandLess /> : <ExpandMore />}\r\n </ListItem>\r\n )}\r\n <Collapse in={contextSectionOpen} timeout='auto'>\r\n {relevantMeta.map((document, index) => {\r\n return (\r\n <div key={index}>\r\n {index > 0 && (\r\n <div className={classes.divider} />\r\n )}\r\n <ListItem\r\n button\r\n className={classes.documentItem}\r\n onClick={() => dispatch(wikiActions.fetchDocument(document.key))}\r\n >\r\n <ListItemText primary={document.title} />\r\n <NavigateNext />\r\n </ListItem>\r\n </div>\r\n )\r\n })}\r\n </Collapse>\r\n <div className={`${relevantMeta.length === 0 ? classes.topMargin : ''}`}>\r\n {categories.length > 0 && (\r\n <ListItem\r\n button\r\n onClick={() => {\r\n if (hasRelevantMeta) {\r\n setAllSectionOpen(!allSectionOpen)\r\n }\r\n }}\r\n className={`${classes.sectionListItem} ${hasRelevantMeta ? '' : classes.disabledListItem}`}\r\n >\r\n <ListItemText primary={intl.formatMessage({ id: 'wiki.browser.categories' })} className={classes.title} />\r\n {hasRelevantMeta && (\r\n <>\r\n {allSectionOpen ? <ExpandLess /> : <ExpandMore />}\r\n </>\r\n )}\r\n </ListItem>\r\n )}\r\n <Collapse in={allSectionOpen} timeout='auto'>\r\n {categories.map((category, index) => {\r\n return (\r\n <div key={index}>\r\n {index > 0 && (\r\n <div className={classes.divider} />\r\n )}\r\n <ListItem\r\n button\r\n className={classes.documentItem}\r\n onClick={() => dispatch(wikiActions.openCategory(category))}\r\n >\r\n <Box mr={2}>\r\n <FontAwesomeIcon icon={faFolder} />\r\n </Box>\r\n <ListItemText primary={category} className={classes.documentItem} />\r\n <NavigateNext />\r\n </ListItem>\r\n </div>\r\n )\r\n })}\r\n </Collapse>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\nexport default WikiBrowserComponent\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const wikiDocumentStyle = makeStyles(theme => ({\r\n backButton: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n backButtonIcon: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n backButtonPadding: {\r\n paddingLeft: theme.spacing(1)\r\n },\r\n content: {\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n '& p': {\r\n margin: 0\r\n }\r\n },\r\n headerTitle: {\r\n maxWidth: '70%',\r\n alignSelf: 'center',\r\n lineHeight: '1rem',\r\n maxHeight: '1rem',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n userSelect: 'none'\r\n },\r\n footer: {\r\n paddingTop: theme.spacing(6),\r\n marginBottom: theme.spacing(2),\r\n fontSize: '0.7rem',\r\n fontStyle: 'italic'\r\n },\r\n nestedListSubheader: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n minHeight: '48px',\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.geoColors.headerText.main,\r\n userSelect: 'none'\r\n },\r\n progress: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'space-around',\r\n paddingTop: theme.spacing(2),\r\n fontSize: '0.8rem',\r\n color: theme.palette.geoColors.text.light\r\n },\r\n resume: {\r\n paddingTop: theme.spacing(1),\r\n fontSize: '0.8rem'\r\n },\r\n title: {\r\n paddingTop: theme.spacing(2),\r\n fontSize: '1.2rem',\r\n fontWeight: 'bold'\r\n },\r\n logo: {\r\n maxWidth: '50%'\r\n }\r\n}))\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const wikiSectionStyle = makeStyles(theme => ({\r\n content: {\r\n width: '100%'\r\n },\r\n contentListItem: {\r\n margin: 0,\r\n padding: 0\r\n },\r\n list: {\r\n paddingBottom: 0\r\n },\r\n sectionListItem: {\r\n margin: 0,\r\n marginTop: theme.spacing(4),\r\n padding: 0,\r\n color: theme.palette.primary.main\r\n },\r\n title: {\r\n '& .MuiTypography-body1': {\r\n fontSize: '1.1rem'\r\n }\r\n }\r\n}))\r\n","import { Collapse, List, ListItem, ListItemText } from '@material-ui/core'\r\nimport { ExpandLess, ExpandMore } from '@material-ui/icons'\r\nimport { FC } from 'react'\r\nimport WikiContentComponent, { WikiContent } from '../wikicontent/WikiContent'\r\nimport { wikiSectionStyle } from './WikiSection.style'\r\n\r\n/**\r\n * Object type describing a Section of a WikiDocument\r\n */\r\nexport interface WikiSection {\r\n id: string\r\n title: string\r\n content: WikiContent[]\r\n}\r\n\r\n/**\r\n * WikiSectionComponentProps contains properties for the component.\r\n */\r\nexport interface WikiSectionComponentProps {\r\n section: WikiSection\r\n open: boolean\r\n onClick: (sectionId: string) => void\r\n}\r\n\r\n/**\r\n * WikiSectionComponent displays a section from a WikiDocument\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const WikiSectionComponent: FC<WikiSectionComponentProps> = (props: WikiSectionComponentProps) => {\r\n const classes = wikiSectionStyle()\r\n\r\n return (\r\n <>\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n className={classes.list}\r\n >\r\n <ListItem\r\n button\r\n onClick={() => { props.onClick(props.section.id) }}\r\n className={classes.sectionListItem}\r\n >\r\n <ListItemText primary={props.section.title} className={classes.title} />\r\n {props.open ? <ExpandLess /> : <ExpandMore />}\r\n </ListItem>\r\n <div className={classes.content}>\r\n <Collapse in={props.open} timeout='auto'>\r\n {props.section.content.map((content, index) => {\r\n return (\r\n <div key={index}>\r\n <ListItem className={classes.contentListItem}>\r\n <WikiContentComponent content={content} />\r\n </ListItem>\r\n </div>\r\n )\r\n })}\r\n </Collapse>\r\n </div>\r\n </List>\r\n </>\r\n )\r\n}\r\n\r\nexport default WikiSectionComponent\r\n","import { FC, useEffect, useState } from 'react'\r\nimport { CircularProgress, IconButton, List, ListSubheader } from '@material-ui/core'\r\nimport { Error } from '@material-ui/icons'\r\nimport { FormattedMessage, useIntl } from 'react-intl'\r\nimport { wikiDocumentStyle } from './WikiDocument.style'\r\nimport WikiSectionComponent, { WikiSection } from './wikisection/WikiSection'\r\nimport ReactMarkdown from 'react-markdown'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { RootState } from 'src/Store'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { appStyle } from 'src/App.style'\r\nimport ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos'\r\nimport { CallResult } from 'src/CustomTypes'\r\nimport { sidebarAnimationDuration } from 'src/Constants'\r\n\r\n/**\r\n * Object type describing a Professor Document\r\n */\r\nexport interface WikiDocument {\r\n title: string\r\n logo?: string\r\n resume?: string\r\n footer?: string\r\n sections: WikiSection[]\r\n categories: string[]\r\n}\r\n\r\n/**\r\n * WikiDocumentComponentProps contains properties for the component.\r\n */\r\nexport interface WikiDocumentComponentProps {\r\n enableBackNavigation: boolean\r\n onBackPress: () => void\r\n}\r\n\r\n/**\r\n * WikiDocumentComponent displays information from a wiki document\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const WikiDocumentComponent: FC<WikiDocumentComponentProps> = (props: WikiDocumentComponentProps) => {\r\n const classes = wikiDocumentStyle()\r\n const appClasses = appStyle()\r\n const dispatch = useDispatch()\r\n const intl = useIntl()\r\n\r\n const openSectionIds = useSelector((state: RootState): string[] => state.wikiState.openSectionIds)\r\n const document = useSelector((state: RootState): WikiDocument|undefined => state.wikiState.document)\r\n const fetchDocumentStatus = useSelector((state: RootState): CallResult => state.wikiState.fetchDocumentStatus)\r\n\r\n // Used for showing spinner until the sidebare is done animating.\r\n const [fakeRunning, setFakeRunning] = useState<boolean>(true)\r\n\r\n const fetched = fetchDocumentStatus === CallResult.Succeeded\r\n const running = fetchDocumentStatus === CallResult.Running\r\n const error = fetchDocumentStatus === CallResult.Failed\r\n\r\n useEffect(() => {\r\n setTimeout(function () {\r\n setFakeRunning(false)\r\n }, sidebarAnimationDuration)\r\n }, [])\r\n\r\n return (\r\n <>\r\n <List\r\n component='nav'\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={`${classes.nestedListSubheader} ${props.enableBackNavigation ? classes.backButtonPadding : ''}`} id='nested-list-subheader'>\r\n {props.enableBackNavigation && (\r\n <div className={classes.backButton}>\r\n <IconButton size='medium' className={classes.backButtonIcon} onClick={props.onBackPress}>\r\n <ArrowBackIosIcon />\r\n </IconButton>\r\n </div>\r\n )}\r\n <div className={classes.headerTitle}>\r\n {fetched && document !== undefined ? document.title : ''}\r\n </div>\r\n </ListSubheader>\r\n }\r\n />\r\n {(running || fakeRunning) && (\r\n <div className={classes.progress}>\r\n <CircularProgress size={30} className={appClasses.progressIcon} />\r\n <FormattedMessage id='common.loading' />\r\n </div>\r\n )}\r\n {error && (\r\n <div className={appClasses.errorMessage}>\r\n <Error fontSize='large' className={appClasses.errorIcon} />\r\n <FormattedMessage id='common.loading.error' />\r\n </div>\r\n )}\r\n {fetched && document !== undefined && !fakeRunning && (\r\n <div className={classes.content}>\r\n {document.logo !== undefined && (\r\n <img src={document.logo} className={classes.logo} alt={intl.formatMessage({ id: 'wiki.document.logo' })} />\r\n )}\r\n <div className={classes.title}>{document.title}</div>\r\n {document.resume !== undefined && (\r\n <ReactMarkdown linkTarget='_blank' className={classes.resume}>{document.resume}</ReactMarkdown>\r\n )}\r\n {document.sections.map((section, index) => {\r\n return (\r\n <div key={index}>\r\n <WikiSectionComponent\r\n section={section}\r\n open={openSectionIds.includes(section.id)}\r\n onClick={(sectionId) => {\r\n if (openSectionIds.includes(sectionId)) {\r\n dispatch(wikiActions.removeOpenSectionId(sectionId))\r\n } else {\r\n dispatch(wikiActions.addOpenSectionId(sectionId))\r\n }\r\n }}\r\n />\r\n </div>\r\n )\r\n })}\r\n {document.footer !== undefined && (\r\n <ReactMarkdown linkTarget='_blank' className={classes.footer}>{document.footer}</ReactMarkdown>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\nexport default WikiDocumentComponent\r\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const wikiCategoryStyle = makeStyles(theme => ({\r\n backButton: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n backButtonIcon: {\r\n color: theme.palette.geoColors.headerText.main\r\n },\r\n backButtonPadding: {\r\n paddingLeft: theme.spacing(1)\r\n },\r\n divider: {\r\n height: 1,\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n background: theme.palette.geoColors.contextBar.dark\r\n },\r\n documentItem: {\r\n '& .MuiTypography-body1': {\r\n fontSize: '0.9rem'\r\n }\r\n },\r\n list: {\r\n paddingBottom: 0\r\n },\r\n nestedListSubheader: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n minHeight: '48px',\r\n backgroundColor: theme.palette.primary.main,\r\n color: theme.palette.geoColors.headerText.main,\r\n userSelect: 'none',\r\n zIndex: 0\r\n }\r\n}))\r\n","import { FC } from 'react'\r\nimport { IconButton, List, ListItem, ListItemText, ListSubheader } from '@material-ui/core'\r\nimport { NavigateNext } from '@material-ui/icons'\r\nimport { wikiCategoryStyle } from './WikiCategory.style'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { WikiDocumentMeta } from 'src/dataSources/wiki/Wiki'\r\nimport ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos'\r\nimport { RootState } from 'src/Store'\r\n\r\n/**\r\n * WikiCategoryComponentProps contains properties for the component.\r\n */\r\nexport interface WikiCategoryComponentProps {\r\n enableBackNavigation: boolean\r\n onBackPress: () => void\r\n}\r\n\r\n/**\r\n * WikiCategoryComponent displays wiki document in a category\r\n * @param props Properties for component.\r\n * @returns JSX component.\r\n */\r\nexport const WikiCategoryComponent: FC<WikiCategoryComponentProps> = (props: WikiCategoryComponentProps) => {\r\n const classes = wikiCategoryStyle()\r\n const dispatch = useDispatch()\r\n\r\n const category = useSelector((state: RootState): string => state.wikiState.category)\r\n const documentsMeta = useSelector((state: RootState): WikiDocumentMeta[] => state.wikiState.documentsMeta)\r\n\r\n return (\r\n <>\r\n <List\r\n component='nav'\r\n className={classes.list}\r\n aria-labelledby='nested-list-subheader'\r\n subheader={\r\n <ListSubheader component='div' className={`${classes.nestedListSubheader} ${props.enableBackNavigation ? classes.backButtonPadding : ''}`} id='nested-list-subheader'>\r\n {props.enableBackNavigation && (\r\n <div className={classes.backButton}>\r\n <IconButton size='medium' className={classes.backButtonIcon} onClick={props.onBackPress}>\r\n <ArrowBackIosIcon />\r\n </IconButton>\r\n </div>\r\n )}\r\n {category}\r\n </ListSubheader>\r\n }\r\n />\r\n {documentsMeta\r\n .filter(document => document.categories.includes(category))\r\n .map((document, index) => {\r\n return (\r\n <div key={index}>\r\n {index > 0 && (\r\n <div className={classes.divider} />\r\n )}\r\n <ListItem\r\n button\r\n className={classes.documentItem}\r\n onClick={() => dispatch(wikiActions.fetchDocument(document.key))}\r\n >\r\n <ListItemText primary={document.title} className={classes.documentItem} />\r\n <NavigateNext />\r\n </ListItem>\r\n </div>\r\n )\r\n })}\r\n </>\r\n )\r\n}\r\n\r\nexport default WikiCategoryComponent\r\n","import { FC, useEffect, useState } from 'react'\r\nimport { Transition, TransitionStatus } from 'react-transition-group'\r\nimport { IconButton } from '@material-ui/core'\r\nimport Close from '@material-ui/icons/Close'\r\nimport { wikiSideBarStyle } from './WikiSideBar.style'\r\nimport { maxSidebarWidth, sidebarAnimationDuration, rightSidebarWidth as sidebarWidth, wikiSideBarBaseZIndex } from '../../../Constants'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport WikiBrowserComponent from '../../wiki/wikibrowser/WikiBrowser'\r\nimport WikiDocumentComponent from '../../wiki/wikidocument/WikiDocument'\r\nimport { wikiActions } from 'src/actions/WikiActions'\r\nimport { WikiView } from 'src/reducers/WikiReducer'\r\nimport { RootState } from 'src/Store'\r\nimport { InfoView } from 'src/reducers/InfoMenuReducer'\r\nimport { Rnd } from 'react-rnd'\r\nimport { generalActions } from 'src/actions/GeneralActions'\r\nimport { getBarStyle, getBarTransitionStyle } from 'src/utils/Utils'\r\nimport WikiCategoryComponent from '../wikicategory/WikiCategory'\r\n\r\nexport interface WikiSideBarProps {\r\n viewType: WikiView\r\n navigationIndex: number\r\n}\r\n\r\nconst defaultProps: WikiSideBarProps = {\r\n viewType: WikiView.WikiBrowser,\r\n navigationIndex: 0\r\n}\r\n\r\n/**\r\n * WikiSideBar React component.\r\n * @param {object} props React properties object.\r\n * @returns React view component.\r\n */\r\nexport const WikiSideBar: FC<WikiSideBarProps> = (\r\n props: WikiSideBarProps\r\n) => {\r\n const dispatch = useDispatch()\r\n const classes = wikiSideBarStyle()\r\n\r\n const [animateIn, setAnimateIn] = useState<boolean>(false)\r\n const [showSearchIcon, setShowSearchIcon] = useState<boolean>(false)\r\n const [showCloseIcon, setShowCloseIcon] = useState<boolean>(false)\r\n\r\n const showWikiSideBar = useSelector((state: RootState): boolean => state.wikiState.showWikiSideBar)\r\n const currentInfoMenuView = useSelector((state: RootState): InfoView => state.infoMenuState.currentView)\r\n const dragging = useSelector((state: RootState): Boolean => state.generalState.rightSideBarDragging)\r\n const rightSideBarWidth = useSelector((state: RootState): number => state.generalState.rightSideBarWidth)\r\n\r\n const enableBackNavigation = props.navigationIndex > 0 || currentInfoMenuView !== InfoView.Empty\r\n\r\n const sidebarStyle = getBarStyle(dragging === true ? 0 : sidebarAnimationDuration)\r\n const sidebarTransitionStyles = getBarTransitionStyle(rightSideBarWidth)\r\n\r\n /**\r\n * Set to empty view when close button is clicked.\r\n */\r\n const closeSideBarClicked = (): void => {\r\n dispatch(wikiActions.clearViews())\r\n }\r\n\r\n useEffect(() => {\r\n setAnimateIn(true)\r\n setShowCloseIcon(true)\r\n setTimeout(function () {\r\n setShowSearchIcon(true)\r\n }, sidebarAnimationDuration)\r\n // eslint-disable-next-line\r\n }, [])\r\n\r\n useEffect(() => {\r\n setAnimateIn(showWikiSideBar)\r\n if (showWikiSideBar) {\r\n setShowCloseIcon(true)\r\n setTimeout(function () {\r\n setShowSearchIcon(true)\r\n }, sidebarAnimationDuration)\r\n } else {\r\n setShowCloseIcon(false)\r\n setShowSearchIcon(false)\r\n }\r\n // eslint-disable-next-line\r\n }, [showWikiSideBar])\r\n\r\n return (\r\n <div style={{ zIndex: wikiSideBarBaseZIndex + props.navigationIndex }}>\r\n <Transition in={animateIn} out={!animateIn} timeout={0}>\r\n {(state: TransitionStatus) => (\r\n <div className={classes.wrapper}>\r\n <div\r\n className={`${classes.root}`}\r\n style={{ ...sidebarStyle, ...sidebarTransitionStyles[state] }}\r\n >\r\n <Rnd\r\n disableDragging\r\n enableResizing={{ left: true }}\r\n position={{ x: 0, y: 0 }}\r\n size={{ width: rightSideBarWidth, height: 'auto' }}\r\n minWidth={sidebarWidth}\r\n maxWidth={maxSidebarWidth}\r\n onResizeStart={() => {\r\n dispatch(generalActions.setRightSideBarDragging(true))\r\n }}\r\n onResize={(e, direction, ref, delta, position) => {\r\n dispatch(generalActions.setRightSideBarWidth(parseInt(ref.style.width)))\r\n }}\r\n onResizeStop={(e, direction, ref, delta, position) => {\r\n dispatch(generalActions.setRightSideBarWidth(parseInt(ref.style.width)))\r\n dispatch(generalActions.setRightSideBarDragging(false))\r\n }}\r\n >\r\n {dragging === false && (\r\n <div className={classes.root}>\r\n {props.viewType === WikiView.WikiBrowser && (\r\n <WikiBrowserComponent\r\n showContent={animateIn}\r\n enableSearch={showSearchIcon}\r\n enableBackNavigation={enableBackNavigation}\r\n onBackPress={() => {\r\n setAnimateIn(false)\r\n setShowSearchIcon(false)\r\n setTimeout(function () {\r\n dispatch(wikiActions.clearViews())\r\n }, sidebarAnimationDuration)\r\n }}\r\n />\r\n )}\r\n {props.viewType === WikiView.WikiDocument && (\r\n <WikiDocumentComponent\r\n enableBackNavigation={enableBackNavigation}\r\n onBackPress={() => {\r\n dispatch(wikiActions.clearDocument())\r\n setAnimateIn(false)\r\n setTimeout(function () {\r\n dispatch(wikiActions.popView())\r\n }, sidebarAnimationDuration)\r\n }}\r\n />\r\n )}\r\n {props.viewType === WikiView.WikiCategory && (\r\n <WikiCategoryComponent\r\n enableBackNavigation={enableBackNavigation}\r\n onBackPress={() => {\r\n setAnimateIn(false)\r\n setTimeout(function () {\r\n dispatch(wikiActions.popView())\r\n }, sidebarAnimationDuration)\r\n }}\r\n />\r\n )}\r\n {showCloseIcon && (\r\n <div className={classes.closeButton}>\r\n <IconButton size='medium' className={classes.closeButtonIcon} onClick={closeSideBarClicked}>\r\n <Close />\r\n </IconButton>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </Rnd>\r\n </div>\r\n </div>\r\n )}\r\n </Transition>\r\n </div>\r\n )\r\n}\r\n\r\nWikiSideBar.defaultProps = defaultProps\r\n\r\nexport default WikiSideBar\r\n","import React, { useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { RootState } from '../../Store';\r\nimport { redirectActions } from \"../../actions/RedirectAction\";\r\n\r\nfunction RedirectRoute() {\r\n const redirectState = useSelector((state: RootState) => state.redirectState);\r\n const dispatch = useDispatch();\r\n const { path } = redirectState!;\r\n\r\n useEffect(() => {\r\n if (path) {\r\n dispatch(redirectActions.redirectDone());\r\n window.location = '/';\r\n }\r\n // eslint-disable-next-line\r\n }, [path])\r\n\r\n return (<></>)\r\n}\r\n\r\nexport default RedirectRoute","import { FC, useEffect, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { FormattedMessage, IntlProvider } from 'react-intl'\r\nimport { createMuiTheme, ThemeProvider } from '@material-ui/core/styles'\r\n\r\nimport { RootState } from './Store'\r\nimport { authActions } from './actions/AuthAction'\r\nimport { generalActions } from './actions/GeneralActions'\r\nimport { hydroModelActions } from './actions/HydroModelActions'\r\nimport { wikiActions } from './actions/WikiActions'\r\nimport { AuthState } from './reducers/AuthReducer'\r\nimport { WikiView } from './reducers/WikiReducer'\r\n\r\nimport messages_da from './translations/da.json'\r\nimport messages_en from './translations/en.json'\r\n\r\nimport { DataTheme } from './Enums'\r\nimport { getThemeOptionsByDataTheme } from './Themes'\r\nimport { LayerType } from './dataSources/layers/LayerRegistry'\r\n\r\nimport { appStyle } from './App.style'\r\n\r\nimport BottomBar from './components/bottombar/BottomBar'\r\nimport LeftSideBar from './components/leftsidebar/LeftSideBar'\r\nimport LoginDialog from './components/logindialog/LoginDialog'\r\nimport MainContentView from './components/maincontentview/MainContentView'\r\nimport RightSideBar from './components/rightsidebar/RightSideBar'\r\nimport ThemePicker from './components/themepicker/ThemePicker'\r\nimport ToolBar from './components/toolbar/ToolBar'\r\nimport TopBar from './components/topbar/TopBar'\r\nimport WikiSideBar from './components/wiki/wikisidebar/WikiSideBar'\r\nimport RedirectRoute from './components/redirectroute/RedirectRoute'\r\nimport { resetSelectedLayers } from './utils/MapLayerUtils'\r\n\r\n// Set up localization\r\nconst locale = 'da'\r\nconst messages = {\r\n da: messages_da,\r\n en: messages_en\r\n}\r\n\r\nconst tokenExpirationPadding = 3600000 // One hour\r\nconst checkTokenValidityInterval = 5000 // every 5 seconds\r\n\r\nconst App: FC = () => {\r\n const classes = appStyle()\r\n const dispatch = useDispatch()\r\n const [themePickerOpen, setThemePickerOpen] = useState(true)\r\n\r\n const {\r\n isLoggedIn,\r\n tokenExpirationTimestamp,\r\n username,\r\n password\r\n } = useSelector((state: RootState): AuthState => state.authState)\r\n const currentDataTheme: DataTheme = useSelector((state: RootState): DataTheme => state.generalState.dataTheme)\r\n const showLeftSideBar = useSelector((state: RootState): boolean => state.generalState.showLeftSideBar)\r\n const enabledLayers = useSelector((state: RootState): LayerType[] => state.mapState.enabledLayers)\r\n const currentWikiViews = useSelector((state: RootState): WikiView[] => state.wikiState.currentWikiViews)\r\n\r\n const handleClose = (): void => {\r\n setThemePickerOpen(false)\r\n }\r\n const handleThemeSelected = (dataTheme: DataTheme): void => {\r\n if (dataTheme !== currentDataTheme) {\r\n resetSelectedLayers(enabledLayers, dispatch)\r\n }\r\n dispatch(generalActions.setDataTheme(dataTheme))\r\n setThemePickerOpen(false)\r\n }\r\n\r\n /**\r\n * Handle the expiration of the GEO token.\r\n * Perform AUTOMATIC login/refresh token if username and password is available in memory.\r\n * Otherwise set the token to expired and trigger MANUAL login.\r\n */\r\n const handleExpiredGEOToken = (): void => {\r\n if (username === '' || password === '') {\r\n dispatch(authActions.setTokenExpired())\r\n } else if (password !== 'using-accesstoken') {\r\n dispatch(authActions.login({username: username, password: password}))\r\n }\r\n }\r\n\r\n /**\r\n * Checks if GEO token is valid.\r\n * Handle the event where the token is invalid or about to expire\r\n */\r\n const checkGEOToken = (): void => {\r\n if (tokenExpirationTimestamp === undefined) {\r\n handleExpiredGEOToken()\r\n } else {\r\n const nowMilli = new Date().getTime()\r\n const timeToExpiration = tokenExpirationTimestamp - nowMilli\r\n if (timeToExpiration < tokenExpirationPadding) {\r\n handleExpiredGEOToken()\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n checkGEOToken()\r\n const interval = setInterval(() => {\r\n checkGEOToken()\r\n }, checkTokenValidityInterval)\r\n return () => clearInterval(interval)\r\n // eslint-disable-next-line\r\n }, [tokenExpirationTimestamp, username, password])\r\n\r\n useEffect(() => {\r\n if (isLoggedIn) {\r\n dispatch(wikiActions.fetchDocumentsMeta())\r\n dispatch(hydroModelActions.fetchHydroModels())\r\n }\r\n // eslint-disable-next-line\r\n }, [isLoggedIn])\r\n\r\n return (\r\n <IntlProvider locale={locale} key={locale} messages={messages[locale]}>\r\n <RedirectRoute/>\r\n <ThemeProvider theme={createMuiTheme(getThemeOptionsByDataTheme(currentDataTheme))}>\r\n <LoginDialog open />\r\n {isLoggedIn && currentDataTheme === DataTheme.NONE &&\r\n <ThemePicker open={themePickerOpen} handleThemeSelected={handleThemeSelected} handleClose={handleClose} />}\r\n <div className={classes.mobileContainer}>\r\n <div className={classes.topBar}>\r\n <TopBar />\r\n </div>\r\n <div className={classes.mainArea}>\r\n <div className={classes.mobileWarning}>\r\n <FormattedMessage id='mobile.warning' />\r\n </div>\r\n </div>\r\n </div>\r\n <div className={classes.mainContainer}>\r\n <div className={classes.topBar}>\r\n <TopBar />\r\n </div>\r\n <div className={classes.toolbar}>\r\n <ToolBar />\r\n </div>\r\n <div className={classes.mainArea}>\r\n <div className={classes.mainContentArea}>\r\n <MainContentView />\r\n </div>\r\n <div className={classes.leftSideBar}>\r\n <LeftSideBar open={showLeftSideBar} />\r\n </div>\r\n <div className={classes.rightSideBar}>\r\n <RightSideBar />\r\n </div>\r\n <div className={classes.wikiSideBar}>\r\n {\r\n currentWikiViews.map((view, index) => {\r\n return (\r\n <WikiSideBar\r\n key={index}\r\n navigationIndex={index}\r\n viewType={view}\r\n />\r\n )\r\n })\r\n }\r\n </div>\r\n <div className={classes.bottomBar}>\r\n <BottomBar open={false} />\r\n </div>\r\n </div>\r\n </div>\r\n </ThemeProvider>\r\n </IntlProvider>\r\n )\r\n}\r\n\r\nexport default App\r\n","import {useParams} from 'react-router-dom';\r\nimport {FC, useEffect} from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { authActions } from './actions/AuthAction'\r\nimport { RootState } from './Store'\r\n\r\nexport const AccessTokenLogin : FC = () => {\r\n const { accessToken } = useParams();\r\n const dispatch = useDispatch();\r\n const loginError = useSelector((state: RootState): boolean => state.authState.isLoginError);\r\n \r\n useEffect(() => {\r\n if (!accessToken) return;\r\n dispatch(authActions.login({permaToken: accessToken}))\r\n }, [accessToken])\r\n\r\n return(<label>{loginError ? \"Fejl i login\" : \"Logger ind\"}</label>)\r\n}","import React, { FC } from 'react'\r\nimport App from './App'\r\nimport { Provider } from 'react-redux'\r\n\r\nimport store, { persistor } from './Store'\r\nimport { PersistGate } from 'redux-persist/integration/react'\r\nimport {Routes, Route} from 'react-router-dom'\r\nimport {AccessTokenLogin} from './AccessTokenLogin'\r\n\r\nconst AppWrapper: FC = () => {\r\n return (\r\n <Provider store={store}>\r\n <PersistGate persistor={persistor}>\r\n <Routes>\r\n <Route path='/access/:accessToken' element={<AccessTokenLogin />} />\r\n <Route path='*' element={<App />} />\r\n </Routes>\r\n </PersistGate>\r\n </Provider>\r\n )\r\n}\r\n\r\nexport default AppWrapper\r\n","import { ReportHandler } from 'web-vitals'\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if ((onPerfEntry != null) && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry)\r\n getFID(onPerfEntry)\r\n getFCP(onPerfEntry)\r\n getLCP(onPerfEntry)\r\n getTTFB(onPerfEntry)\r\n })\r\n }\r\n}\r\n\r\nexport default reportWebVitals\r\n","import React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport './index.css'\r\nimport AppWrapper from './AppWrapper'\r\nimport reportWebVitals from './reportWebVitals'\r\nimport {BrowserRouter} from 'react-router-dom'\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <BrowserRouter>\r\n <AppWrapper/>\r\n </BrowserRouter>\r\n </React.StrictMode>,\r\n document.getElementById('root')\r\n)\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals()\r\n"],"sourceRoot":""}