{"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","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","switchSubLayers","sublayers","reverse","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","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","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.9b2a1cde.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 {\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\r\n setUserCredentials: (username: string, password: string) => DataAction\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, {}, {}, AnyAction>\r\n}\r\n\r\nexport const authActions: AuthActions = {\r\n setToken: (token: string, tokenExpirationTimestamp: number): DataAction => {\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 => {\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, {}, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch<{}, {}, AnyAction>): Promise => {\r\n return await new Promise(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(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 {\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 {\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 {\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\r\n fetchingAddressesStarted: () => EmptyAction\r\n fetchingAddressesFailure: (message: string) => MessageAction\r\n fetchingAddressesSuccess: (addresses: AddressResult[]) => DataAction\r\n fetchingGeoModelsStarted: () => EmptyAction\r\n fetchingGeoModelsFailure: (message: string) => MessageAction\r\n fetchingGeoModelsSuccess: (geoModels: GeoModel[] | null) => DataAction\r\n fetchingMapLegendStarted: () => EmptyAction\r\n fetchingMapLegendFailure: (message: string) => MessageAction\r\n fetchingMapLegendSuccess: (mapLegend: MapLegendObject[] | null) => DataAction\r\n removeGraphGroup: (graph: string) => DataAction\r\n setAddressQuery: (query: string) => DataAction\r\n setBottomBarHeight: (height: number) => DataAction\r\n setBottomBarWidth: (width: number) => DataAction\r\n setBottomBarDragging: (dragging: Boolean) => DataAction\r\n setDataTheme: (dataTheme: DataTheme) => DataAction\r\n setRightSideBarDragging: (dragging: Boolean) => DataAction\r\n setRightSideBarWidth: (width: number) => DataAction\r\n setSelectedGeoModel: (model: GeoModel | undefined) => DataAction\r\n setSelectedGraph: (graph: Graph | undefined) => DataAction\r\n setSelectedTool: (toolType: ToolType) => DataAction\r\n setShowLeftSideBar: (show: boolean) => DataAction\r\n\r\n // Thunk actions.\r\n fetchAddresses: (query: string) => ThunkAction, RootState, {}, AnyAction>\r\n fetchGeoModels: (x: number | undefined, y: number | undefined) => ThunkAction, RootState, {}, AnyAction>\r\n fetchMapLegend: (modelId: string) => ThunkAction, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const generalActions: GeneralActions = {\r\n addGraphGroup: (graphGroup: string): DataAction => {\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 => {\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 => {\r\n return {\r\n type: FETCHING_GEO_MODELS_SUCCESS,\r\n data: models\r\n }\r\n },\r\n fetchAddresses: (query: string): ThunkAction, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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 => {\r\n return {\r\n type: FETCHING_MAP_LEGEND_SUCCESS,\r\n data: borehole\r\n }\r\n },\r\n fetchMapLegend: (modelId: string): ThunkAction, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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 => {\r\n return {\r\n type: REMOVE_GRAPH_GROUP,\r\n data: graphGroup\r\n }\r\n },\r\n setAddressQuery: (query: string): DataAction => {\r\n return {\r\n type: SET_ADDRESS_QUERY,\r\n data: query\r\n }\r\n },\r\n setBottomBarHeight: (height: number): DataAction => {\r\n return {\r\n type: SET_BOTTOM_BAR_HEIGHT,\r\n data: height\r\n }\r\n },\r\n setBottomBarWidth: (width: number): DataAction => {\r\n return {\r\n type: SET_BOTTOM_BAR_WIDTH,\r\n data: width\r\n }\r\n },\r\n setBottomBarDragging: (dragging: Boolean): DataAction => {\r\n return {\r\n type: SET_BOTTOM_BAR_DRAGGING,\r\n data: dragging\r\n }\r\n },\r\n setDataTheme: (dataTheme: DataTheme): DataAction => {\r\n return {\r\n type: SET_DATA_THEME,\r\n data: dataTheme\r\n }\r\n },\r\n setRightSideBarDragging: (dragging: Boolean): DataAction => {\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 => {\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 => {\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 => {\r\n return {\r\n type: SET_SELECTED_GRAPH,\r\n data: graph\r\n }\r\n },\r\n setSelectedTool: (toolType: ToolType): DataAction => {\r\n return {\r\n type: SET_SELECTED_TOOL,\r\n data: toolType\r\n }\r\n },\r\n setShowLeftSideBar: (show: boolean): DataAction => {\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 {\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\r\n\r\n // Thunk actions\r\n fetchHydroModels: () => ThunkAction, 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 => {\r\n return {\r\n type: FETCHING_HYDRO_MODELS_SUCCESS,\r\n data: hydroModels\r\n }\r\n },\r\n fetchHydroModels: (): ThunkAction, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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 = (props: VideoEmbedProps) => {\r\n const classes = videoEmbedStyle()\r\n const intl = useIntl()\r\n\r\n return (\r\n
\r\n \r\n
\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 = (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 \r\n \r\n {intl.formatMessage({\r\n \r\n \r\n \r\n \r\n \r\n \r\n \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 = (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(null)\r\n\r\n const [rootWidth, setRootWidth] = useState(0)\r\n const [fullSizeKey, setFullSizeKey] = useState(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
\r\n {props.content.type === WikiContentType.TEXT && (\r\n \r\n {props.content.text}\r\n \r\n )}\r\n {props.content.type === WikiContentType.IMAGE &&\r\n props.content.key !== undefined &&\r\n rootWidth > 10 && (\r\n <>\r\n setFullSizeKey(props.content.key)}\r\n />\r\n {props.content.text}\r\n \r\n )}\r\n {props.content.type === WikiContentType.VIDEO && props.content.url !== undefined && (\r\n <>\r\n \r\n {props.content.text}\r\n \r\n )}\r\n setFullSizeKey(undefined)}\r\n />\r\n
\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 {\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 {\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 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\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\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\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\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\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\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\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\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\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\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\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\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\r\n fetchingDocumentStarted: () => EmptyAction\r\n fetchingDocumentFailure: (message: string) => MessageAction\r\n fetchingDocumentSuccess: (document: WikiDocument) => DataAction\r\n addOpenSectionId: (id: string) => DataAction\r\n removeOpenSectionId: (id: string) => DataAction\r\n addContextTags: (contextTags: ContextTag[]) => DataAction\r\n removeContextTags: (contextTags: ContextTag[]) => DataAction\r\n addCategories: (categories: string[]) => DataAction\r\n setPointsOfInterest: (poi: WikiLocation[]) => DataAction\r\n setCategory: (category: string) => DataAction\r\n pushView: (wikiView: WikiView) => DataAction\r\n popView: () => EmptyAction\r\n removeView: (wikiView: WikiView) => DataAction\r\n clearViewStack: () => EmptyAction\r\n showWikiSideBar: (show: boolean) => DataAction\r\n clearDocumentsMeta: () => EmptyAction\r\n clearDocument: () => EmptyAction\r\n\r\n // Thunk actions\r\n clearViews: () => ThunkAction\r\n fetchDocumentsMeta: () => ThunkAction, RootState, {}, AnyAction>\r\n fetchDocument: (documentId: string) => ThunkAction, RootState, {}, AnyAction>\r\n openCategory: (category: string) => ThunkAction, 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 => {\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 => {\r\n return {\r\n type: FETCHING_DOCUMENT_SUCCESS,\r\n data: document\r\n }\r\n },\r\n addOpenSectionId: (id: string): DataAction => {\r\n return {\r\n type: ADD_OPEN_SECTION_ID,\r\n data: id\r\n }\r\n },\r\n removeOpenSectionId: (id: string): DataAction => {\r\n return {\r\n type: REMOVE_OPEN_SECTION_ID,\r\n data: id\r\n }\r\n },\r\n addContextTags: (contextTags: ContextTag[]): DataAction => {\r\n return {\r\n type: ADD_CONTEXT_TAGS,\r\n data: contextTags\r\n }\r\n },\r\n removeContextTags: (contextTags: ContextTag[]): DataAction => {\r\n return {\r\n type: REMOVE_CONTEXT_TAGS,\r\n data: contextTags\r\n }\r\n },\r\n addCategories: (categories: string[]): DataAction => {\r\n return {\r\n type: ADD_CATEGORIES,\r\n data: categories\r\n }\r\n },\r\n setPointsOfInterest: (poi: WikiLocation[]): DataAction => {\r\n return {\r\n type: SET_POINTS_OF_INTEREST,\r\n data: poi\r\n }\r\n },\r\n setCategory: (category: string): DataAction => {\r\n return {\r\n type: SET_CATEGORY,\r\n data: category\r\n }\r\n },\r\n pushView: (wikiView: WikiView): DataAction => {\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 => {\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 => {\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 => {\r\n return (dispatch: ThunkDispatch, 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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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 {\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\r\n setMapCurrentZoom: (currentZoom: number) => DataAction\r\n setMapExtent: (extent: Extent) => DataAction\r\n setColorsInFocus: (colorsInFocus: ColorInFocus[]) => DataAction\r\n addLayer: (layer: LayerType) => DataAction\r\n addLayerGroup: (layerGroup: LayerGroup) => DataAction\r\n clearLayers: () => EmptyAction\r\n removeLayer: (layer: LayerType) => DataAction\r\n removeLayerGroup: (layerGroup: LayerGroup) => DataAction\r\n setLayerActiveView: (layer: LayerType, view: LayerViewType) => DataAction\r\n setLayerParams: (config: LayerParams) => DataAction\r\n setLayerCapabilities: (capabilities: LayerCapabilities) => DataAction\r\n}\r\n\r\nexport const mapActions: MapActions = {\r\n setMapCenter: (center: ol.Coordinate): DataAction => {\r\n return {\r\n type: SET_MAP_CENTER,\r\n data: center\r\n }\r\n },\r\n setMapCurrentZoom: (currentZoom: number): DataAction => {\r\n return {\r\n type: SET_MAP_CURRENT_ZOOM,\r\n data: currentZoom\r\n }\r\n },\r\n setMapExtent: (mapExtent: Extent): DataAction => {\r\n return {\r\n type: SET_MAP_EXTENT,\r\n data: mapExtent\r\n }\r\n },\r\n setColorsInFocus: (colorsInFocus: ColorInFocus[]): DataAction => {\r\n return {\r\n type: SET_COLORS_IN_FOCUS,\r\n data: colorsInFocus\r\n }\r\n },\r\n addLayer: (layer: LayerType): DataAction => {\r\n return {\r\n type: ADD_LAYER,\r\n data: layer\r\n }\r\n },\r\n addLayerGroup: (layerGroup: LayerGroup): DataAction => {\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 => {\r\n return {\r\n type: REMOVE_LAYER,\r\n data: layer\r\n }\r\n },\r\n removeLayerGroup: (layerGroup: LayerGroup): DataAction => {\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 => {\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 => {\r\n return {\r\n type: SET_LAYER_PARAMS,\r\n data: params\r\n }\r\n },\r\n setLayerCapabilities: (capabilities: LayerCapabilities): DataAction => {\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 (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 { DataforsyningenToken } from '../dataforsyningen/Dataforsyningen'\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 WindmillsAtSea WMS source from Dataforsyningen.\r\n */\r\nclass WindmillsAtSeaLayer extends AbstractLayer implements GeoLayer {\r\n private static readonly token: string = DataforsyningenToken\r\n static readonly defaultParams: LayerParamsObject = {\r\n opacity: 1,\r\n switchSubLayers: {\r\n labelId: 'layerpicker.switchsublayer',\r\n sublayers: [\r\n {\r\n labelId: 'map.layer.soiltypes.sublayer.havvindmoelle',\r\n subLayer: 'havvindmoelle',\r\n enabled: true\r\n },\r\n {\r\n labelId: 'map.layer.soiltypes.sublayer.havvindmoellepark',\r\n subLayer: 'havvindmoellepark',\r\n enabled: true\r\n },\r\n {\r\n labelId: 'map.layer.soiltypes.sublayer.udbudsomraade',\r\n subLayer: 'udbudsomraade',\r\n enabled: true\r\n },\r\n {\r\n labelId: 'map.layer.soiltypes.sublayer.aabendoeransoegningsomraade',\r\n subLayer: 'aaben_doer_ansoegningsomraade',\r\n enabled: true\r\n },\r\n {\r\n labelId: 'map.layer.soiltypes.sublayer.aabendoerprocedure',\r\n subLayer: 'aaben_doer_procedure',\r\n enabled: true\r\n }\r\n ]\r\n }\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 { switchSubLayers, opacity } = options.params\r\n opacity = opacity === undefined ? WindmillsAtSeaLayer.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 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/havvind',\r\n params: {\r\n layers: subLayers,\r\n token: WindmillsAtSeaLayer.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.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: false,\r\n opacityEnabled: true,\r\n layerCopyright: layerCopyrights.Geodatastyrelsen\r\n }\r\n }\r\n}\r\n\r\nexport default WindmillsAtSeaLayer\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 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+FUAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwMiIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjcwIgogICBleGlmOkNvbG9yU3BhY2U9IjEiCiAgIHRpZmY6SW1hZ2VXaWR0aD0iMTAyIgogICB0aWZmOkltYWdlTGVuZ3RoPSI3MCIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIuMCIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIuMCIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIKICAgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIgogICB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0x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\"","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 = (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 = {\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()\r\nconst allLayerDescriptions = new Map([\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\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\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\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\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\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\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\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\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\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\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\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 => {\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): 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\r\n disableSetting: (setting: ProfileSetting) => DataAction\r\n enableSetting: (setting: ProfileSetting) => DataAction\r\n fetchingProfileStarted: () => EmptyAction\r\n fetchingProfileFailure: (message: string) => MessageAction\r\n fetchingProfileSuccess: (profile: ProfileObject) => DataAction\r\n setCoordinates: (coordinates: ol.Coordinate[]) => DataAction\r\n setMaxBoreholeDistance: (distance: number) => DataAction\r\n setMaxDepth: (depth: number) => DataAction\r\n setCrosshairDistance: (distance: number | undefined) => DataAction\r\n\r\n // Thunk actions\r\n fetchProfile: () => ThunkAction, 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 => {\r\n return {\r\n type: CURRENT_PROFILE_VIEW,\r\n data: viewType\r\n }\r\n },\r\n disableSetting: (setting: ProfileSetting): DataAction => {\r\n return {\r\n type: DISABLE_SETTING,\r\n data: setting\r\n }\r\n },\r\n enableSetting: (setting: ProfileSetting): DataAction => {\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 => {\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 => {\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 => {\r\n return {\r\n type: SET_CROSSHAIR_DISTANCE,\r\n data: distance\r\n }\r\n },\r\n fetchProfile: (): ThunkAction, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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\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\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\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\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\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\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\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\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 = (props: CO2LevelsOrgProps) => {\r\n const divRef = useRef(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 \r\n
\r\n
\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 = (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([])\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
\r\n {props.imageLegend === undefined && (\r\n \r\n {mapLegend?.map((legend, index) => {\r\n return (\r\n \r\n {\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
\r\n
\r\n {legend.Name}\r\n
\r\n
\r\n
\r\n )\r\n })}\r\n
\r\n )}\r\n {props.imageLegend !== undefined && (\r\n
\r\n {props.imageLegend.legendTextId !== undefined && (\r\n
{intl.formatMessage({ id: props.imageLegend.legendTextId })}
\r\n )}\r\n \r\n
\r\n )}\r\n
\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 => ({\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 {\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 {\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 {\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 {\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\r\n fetchingAddressStarted: () => EmptyAction\r\n fetchingAddressFailure: (message: string) => MessageAction\r\n fetchingAddressSuccess: (address: AddressReverseResult) => DataAction\r\n fetchingImageStarted: () => EmptyAction\r\n fetchingImageFailure: (message: string) => MessageAction\r\n fetchingImageSuccess: (data: string) => DataAction\r\n fetchingLegendStarted: () => EmptyAction\r\n fetchingLegendFailure: (message: string) => MessageAction\r\n fetchingLegendSuccess: (data: BoreholeLegendObject) => DataAction\r\n clearState: () => EmptyAction\r\n\r\n // Thunk actions.\r\n setCoordinate: (coords: number[]) => ThunkAction, RootState, {}, AnyAction>\r\n setBoreholeId: (id: number) => ThunkAction, 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 => {\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 => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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\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 {\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\r\n fetchingImageStarted: () => EmptyAction\r\n fetchingImageFailure: (message: string) => MessageAction\r\n fetchingImageSuccess: (image: string) => DataAction\r\n setMaxDepth: (maxDepth: number) => DataAction\r\n clearAddressState: () => EmptyAction\r\n clearImageState: () => EmptyAction\r\n clearState: () => EmptyAction\r\n\r\n // Thunk actions.\r\n setCoordinates: (coords: number[]) => DataAction\r\n updateVirtualBorehole: (coords: number[]) => ThunkAction, 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 => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch, getState: () => RootState): Promise => {\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\r\n boreholeInfo: (coords: number[]) => ThunkAction, RootState, {}, AnyAction>\r\n virtualBoreholeInfo: (coords: number[]) => ThunkAction, RootState, {}, AnyAction>\r\n}\r\n\r\nexport const infoMenuActions: InfoMenuActions = {\r\n currentView: (viewType: InfoView): DataAction => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch): Promise => {\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, RootState, {}, AnyAction> => {\r\n return async (dispatch: ThunkDispatch): Promise => {\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 = (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(null)\r\n const crosshairValueXCardRef = useRef(null)\r\n const crosshairValueYCardRef = useRef(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): 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('[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)\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)\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)\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)\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 = new Map()\r\n const gridValuesY: Map = 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 => {\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(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
\r\n {running && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {error && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetched && (\r\n
\r\n {props.selectedProfile?.Svg !== undefined && (\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n

{numberToDecimalString(valueX, 0)}

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

{numberToDecimalString(valueY, 1)}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )}\r\n
\r\n \r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","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): {} => {\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 = (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(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 \r\n {(state: TransitionStatus) => (\r\n <>\r\n {(currentView !== ProfileView.Empty || selectedGraph !== undefined) && (\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n {\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
\r\n {dragging === false && (\r\n <>\r\n {currentView !== ProfileView.Empty && (\r\n \r\n )}\r\n {selectedGraph === Graph.CO2Levels && (\r\n \r\n )}\r\n \r\n )}\r\n
\r\n \r\n \r\n )}\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n\r\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 = (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(false)\r\n const [opacity, setOpacity] = useState(0.5)\r\n const [depthEnabled, setDepthEnabled] = useState(false)\r\n const [depth, setDepth] = useState(0)\r\n const [levelEnabled, setLevelEnabled] = useState(false)\r\n const [level, setLevel] = useState(0)\r\n const [radioSublayersEnabled, setRadioSublayersEnabled] = useState(false)\r\n const [radioSublayers, setRadioSublayers] = useState({ labelId: '', selected: { labelId: '', subLayer: '' }, sublayers: [] })\r\n const [switchSublayersEnabled, setSwitchSublayersEnabled] = useState(false)\r\n const [switchSublayers, setSwitchSublayers] = useState({ labelId: '', sublayers: [] })\r\n const [subLayersEnabled, setSubLayersEnabled] = useState(false)\r\n const [subLayers, setSubLayers] = useState({ 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([] 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, 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
\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n {opacityEnabled && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n { 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 \r\n \r\n ): 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 \r\n \r\n \r\n )}\r\n {levelEnabled && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n { 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 \r\n \r\n ): 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 \r\n \r\n \r\n )}\r\n {depthEnabled && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n { 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 \r\n \r\n ): 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 \r\n \r\n \r\n )}\r\n {radioSublayersEnabled && (\r\n <>\r\n \r\n \r\n \r\n \r\n { 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 }\r\n label={intl.formatMessage({ id: subLayer.labelId })}\r\n className={classes.radioLabel}\r\n />\r\n )\r\n })\r\n }\r\n \r\n \r\n \r\n )}\r\n {switchSublayersEnabled && (\r\n <>\r\n \r\n \r\n \r\n \r\n {\r\n switchSublayers.sublayers.map((subLayer, index) => {\r\n return (\r\n 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
\r\n \r\n
\r\n )}\r\n
\r\n \r\n )}\r\n {subLayersEnabled && (\r\n <>\r\n \r\n {intl.formatMessage({ id: subLayers.labelId })}\r\n \r\n \r\n \r\n {\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 \r\n {subLayers.stepperEnabled === true && (\r\n \r\n \r\n \r\n <>\r\n {hasPrevSubLayer() &&\r\n selectPrevSubLayer()}>\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {subLayers.selected.label}\r\n
\r\n
\r\n {subLayers.selected.subLabel !== undefined &&\r\n \r\n handleSubLayerLabelClicked(subLayers.selected)}\r\n >\r\n {intl.formatMessage({ id: subLayers.selected.subLabel })}\r\n
\r\n }\r\n \r\n \r\n \r\n <>\r\n {hasNextSubLayer() &&\r\n selectNextSubLayer()}>\r\n \r\n }\r\n \r\n \r\n \r\n )}\r\n {subLayers.stepperEnabled !== true && (\r\n \r\n \r\n \r\n
\r\n {subLayers.selected.value}\r\n
\r\n
\r\n \r\n {subLayers.unit}\r\n \r\n
\r\n
\r\n )}\r\n \r\n \r\n )}\r\n \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 = (props: ConfirmProps) => {\r\n const classes = confirmStyle()\r\n return (\r\n props.handleCancel()}\r\n aria-labelledby='confirm-dialog'\r\n >\r\n \r\n \r\n {props.text}\r\n \r\n \r\n props.handleCancel()}\r\n color='default'\r\n >\r\n \r\n \r\n {\r\n props.handleConfirm()\r\n }}\r\n color='primary'\r\n className={classes.confirmButton}\r\n >\r\n \r\n \r\n \r\n \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 = (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()\r\n const [showWarning, setShowWarning] = React.useState(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
\r\n 0 ? classes.groupWithLayers : ''}`}\r\n onClick={() => { selectGroup(layerGroup) }}\r\n >\r\n \r\n {isLayerGroupSelected(layerGroup) ? : }\r\n \r\n \r\n \r\n {layerTypes.filter(layerType => getLayerDescriptionForType(layerType).group === layerGroup).map((layerType, index) => {\r\n return (\r\n
\r\n { layerClicked(layerType) }}>\r\n \r\n {!isBackgroundLayer(layerType) && (\r\n \r\n )}\r\n {isBackgroundLayer(layerType) && (\r\n \r\n )}\r\n \r\n \r\n {isLayerSelected(layerType) && (\r\n \r\n {isLayerLegendEnabled(layerType) && (\r\n \r\n { toggleLayerInfo(layerType) }}>\r\n \r\n \r\n )}\r\n {hasParameters(layerType) && (\r\n \r\n { toggleLayerParams(layerType) }}>\r\n \r\n \r\n \r\n )}\r\n {isOpacityEnabled(layerType) && (\r\n \r\n { toggleLayerOpacity(layerType) }}>\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n { toggleLayerParams(layerType) }} />\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n { toggleLayerOpacity(layerType) }} />\r\n \r\n \r\n \r\n
\r\n )\r\n })}\r\n \r\n
\r\n
\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
\r\n 0 ? classes.groupWithLayers : ''}\r\n onClick={() => { selectGraphGroup(graphGroup) }}\r\n >\r\n \r\n {isGraphGroupSelected(graphGroup) ? : }\r\n \r\n \r\n
\r\n \r\n
\r\n {graphGroupDescription.graphs.map((graph, index) => {\r\n const graphDescription = getGraphDescriptionForType(graph)\r\n return (\r\n \r\n )\r\n })}\r\n
\r\n
\r\n )\r\n graphs.push(graph)\r\n })\r\n return (\r\n
\r\n {\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 \r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n className={classes.list}\r\n style={{ display: props.visible ? '' : 'none' }}\r\n >\r\n
\r\n {groups}\r\n
\r\n \r\n {graphs.length > 0 && (\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n }\r\n className={classes.graphs}\r\n style={{ display: props.visible ? '' : 'none' }}\r\n >\r\n {graphs}\r\n \r\n )}\r\n
\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 = (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 \r\n \r\n \r\n )}\r\n {props.icon === LeftSideBarIconType.VirtualBorehole && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","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 = (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 \r\n {(state: TransitionStatus) => (\r\n \r\n \r\n
\r\n \r\n \r\n {showLeftSideBar && }\r\n {!showLeftSideBar && }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {username === 'geoatlas@alexandra.dk' && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\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 = (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('')\r\n const [password, setPassword] = useState('')\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): void => {\r\n if (e.key === 'Enter') {\r\n submit()\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {isError && (\r\n \r\n )}\r\n \r\n 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 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 \r\n \r\n \r\n \r\n \r\n \r\n \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 => ({\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()\r\n const [currentMouseCoordinates, setCurrentMouseCoordinates] = useState([0, 0])\r\n const [layerCopyrightMap, setLayerCopyrightMap] = useState>(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 => {\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, radius: number, units: typeof TemplateUnits): GeoJSON.FeatureCollection | 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 = ``\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
dispatch(mapActions.setColorsInFocus([]))} className={`${classes.root}${getControlsStyling()}`}>\r\n
\r\n

\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 © {item.name}\r\n )\r\n })}\r\n

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

\r\n E {numberToDecimalString(currentMouseCoordinates[0])} N {numberToDecimalString(currentMouseCoordinates[1])}\r\n

\r\n

(EPSG:25832)

\r\n
\r\n
\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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,\r\n redirectDone: () => EmptyAction\r\n}\r\n\r\nexport const redirectActions: RedirectActions = {\r\n redirect: (path: string | undefined) : DataAction => {\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\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\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\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\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\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\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\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\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\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\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 = \"/\"}, 500);\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
\r\n \r\n
\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 = (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 \r\n \r\n \r\n \r\n \r\n \r\n {intl.formatMessage({ id: '3d.model' })}\r\n \r\n \r\n \r\n {intl.formatMessage({ id: '3d.label.heightscale' })}\r\n setHeightScale(val as number)}\r\n value={heightScale}\r\n />\r\n \r\n \r\n {intl.formatMessage({ id: '3d.label.buildings' })}\r\n { setBuildingsEnabled(val) }}\r\n checked={buildingsEnabled}\r\n />\r\n \r\n \r\n {intl.formatMessage({ id: '3d.label.boreholes' })}\r\n setBoreholesEnabled(val)}\r\n checked={boreholesEnabled}\r\n />\r\n \r\n \r\n {intl.formatMessage({ id: '3d.label.showmap' })}\r\n setMapEnabled(val)}\r\n checked={mapEnabled}\r\n />\r\n \r\n \r\n {intl.formatMessage({ id: '3d.label.clippolygon' })}\r\n setClipPolygonEnabled(val)}\r\n checked={clipPolygonEnabled}\r\n />\r\n \r\n \r\n {!clipPolygonEnabled && (\r\n <>\r\n {intl.formatMessage({ id: '3d.label.clipaxis' })}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
\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 = (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
\r\n {selectedTool !== ToolType._3D_VIEW && (\r\n \r\n )}\r\n {selectedTool === ToolType._3D_VIEW && (\r\n \r\n )}\r\n
\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 = (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
\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 = (props: BoreholeLegendProps) => {\r\n const classes = boreholeLegendStyle()\r\n const legend = useSelector((state: RootState) => state.boreholeInfo.legend)\r\n\r\n return (\r\n
\r\n {legend?.Layers.map((layer: BoreholeLegendLayerObject, index: number) =>\r\n
\r\n
\r\n
\r\n {layer.Description}\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 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 {\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 {\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 = (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
\r\n \r\n \r\n \r\n \r\n \r\n {props.selectedBorehole?.BoreholeNumber}
\r\n
\r\n \r\n \r\n \r\n \r\n {props.selectedBorehole?.BoreholeId}
\r\n
\r\n \r\n \r\n \r\n \r\n {dataSourceName}
\r\n
\r\n \r\n \r\n \r\n \r\n {props.selectedBorehole?.X}, {props.selectedBorehole?.Y}
\r\n
\r\n \r\n \r\n \r\n \r\n {props.postalAddress?.betegnelse}\r\n \r\n
\r\n
\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 = (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 \r\n \r\n
\r\n \r\n }\r\n />\r\n {running && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {error && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetched && noBoreholesFound && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetched && !noBoreholesFound && (\r\n <>\r\n \r\n \r\n \r\n
\r\n \r\n }\r\n />\r\n {(fetchImageStatus === CallResult.Running || fetchLegendStatus === CallResult.Running) && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetchImageStatus === CallResult.Succeeded && fetchLegendStatus === CallResult.Succeeded && (\r\n
\r\n \r\n \r\n
\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 = (props: VirtualBoreholeFigureProps) => {\r\n const classes = virtualBoreholeFigureStyle()\r\n const intl = useIntl()\r\n\r\n return {intl.formatMessage({\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 = (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
\r\n \r\n \r\n \r\n \r\n \r\n Geo
\r\n
\r\n \r\n \r\n \r\n \r\n {\r\n coords.length > 1 ? `${coords[0]}, ${coords[1]}` : ''\r\n }
\r\n
\r\n \r\n \r\n \r\n \r\n {props.postalAddress?.betegnelse}\r\n \r\n
\r\n
\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 = (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 \r\n \r\n
\r\n \r\n }\r\n />\r\n {running && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetched && (\r\n <>\r\n {fetchAddressStatus === CallResult.Running && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetchAddressStatus === CallResult.Failed && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetchAddressStatus === CallResult.Succeeded && (\r\n \r\n )}\r\n \r\n \r\n
\r\n \r\n }\r\n />\r\n {fetchImageStatus === CallResult.Running && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetchImageStatus === CallResult.Failed && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetchImageStatus === CallResult.Succeeded && !virtualBoreholeFound && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetchImageStatus === CallResult.Succeeded && virtualBoreholeFound && (\r\n
\r\n \r\n
\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 = (\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 \r\n {(state: TransitionStatus) => (\r\n <>\r\n {currentView !== InfoView.Empty && (\r\n \r\n {\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
\r\n {currentView === InfoView.BoreholeInfo && (\r\n \r\n )}\r\n {currentView === InfoView.VirtualBoreholeInfo && (\r\n \r\n )}\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n
\r\n )}\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\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 = (props: ThemePickerProps) => {\r\n const classes = themePickerStyle()\r\n const intl = useIntl()\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n { props.handleThemeSelected(DataTheme.ICE_AGE) }}>{intl.formatMessage({\r\n { props.handleThemeSelected(DataTheme.ICE_AGE) }}>
\r\n { props.handleThemeSelected(DataTheme.CLIMATE) }}>{intl.formatMessage({\r\n { props.handleThemeSelected(DataTheme.CLIMATE) }}>
\r\n { props.handleThemeSelected(DataTheme.ENERGY) }}>{intl.formatMessage({\r\n { props.handleThemeSelected(DataTheme.ENERGY) }}>
\r\n { props.handleThemeSelected(DataTheme.ENVIRONMENT) }}>{intl.formatMessage({\r\n { props.handleThemeSelected(DataTheme.ENVIRONMENT) }}>
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\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 = (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
\r\n \r\n \r\n \r\n \r\n {models?.map((geoModel: GeoModel, index: number) => {\r\n return (\r\n {geoModel.Name}\r\n )\r\n })}\r\n \r\n \r\n
\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 = (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, 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
\r\n \r\n \r\n \r\n\r\n
\r\n { handleSliderChange(newValue, false) }}\r\n onChangeCommitted={(event: any, newValue: number | number[]): void => { handleSliderChange(newValue, true) }}\r\n className={classes.slider}\r\n />\r\n ): 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 /> {props.unit}\r\n
\r\n
\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 = (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(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
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\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 = (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(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
\r\n handleSwitchChange(setting, event.target.checked)}\r\n />\r\n }\r\n label={name}\r\n className={classes.viewSettingsLabel}\r\n />\r\n
\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
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\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
\r\n \r\n
\r\n
\r\n
\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 = (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
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n {getDataThemeName(currentDataTheme)}\r\n
\r\n
\r\n
\r\n \r\n {settingsAvailable() && (\r\n <>\r\n
\r\n |\r\n
\r\n
\r\n {selectedTool === ToolType.PROFILE &&\r\n }\r\n {selectedTool === ToolType.VIRTUAL_BOREHOLE &&\r\n }\r\n
\r\n \r\n )}\r\n {!settingsAvailable() && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n |\r\n
\r\n
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\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 = (props: UserInfoProps) => {\r\n const classes = userInfoStyle()\r\n const dispatch = useDispatch()\r\n const [anchorEl, setAnchorEl] = useState(null)\r\n const username = useSelector((state: RootState): string => state.authState.username)\r\n\r\n const handleClick = (event: React.MouseEvent): 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
\r\n \r\n \r\n \r\n \r\n \r\n {username}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\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 = (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(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
\r\n {\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 \r\n {loading ? : null}\r\n {params.InputProps.endAdornment}\r\n \r\n )\r\n }}\r\n />\r\n )}\r\n />\r\n
\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 = (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
\r\n
\r\n \r\n \r\n \r\n {dataTheme === DataTheme.ICE_AGE && ()}\r\n {dataTheme === DataTheme.ENVIRONMENT && ()}\r\n {dataTheme === DataTheme.CLIMATE && ()}\r\n {dataTheme === DataTheme.ENERGY && ()}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\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 = ({ 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
\r\n
\r\n onInputChange(e.target.value)}\r\n />\r\n
\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 = (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([])\r\n const [otherMeta, setOtherMeta] = useState([])\r\n const hasRelevantMeta = relevantMeta.length > 0\r\n\r\n const [contextSectionOpen, setContextSectionOpen] = useState(true)\r\n const [allSectionOpen, setAllSectionOpen] = useState(true)\r\n\r\n const [searchSelected, setSearchSelected] = useState(false)\r\n const [searchText, setSearchText] = useState('')\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 \r\n {props.enableBackNavigation && (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n }\r\n />\r\n {running && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {error && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetched && (\r\n <>\r\n {props.enableSearch && (\r\n
\r\n {\r\n setSearchSelected(!searchSelected)\r\n setSearchText('')\r\n }}\r\n >\r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n setSearchText(input)} onClose={handleSearchClose} />\r\n \r\n \r\n {props.showContent && (\r\n <>\r\n {showSearchResult && (\r\n
\r\n { setAllSectionOpen(!allSectionOpen) }}\r\n className={classes.sectionListItem}\r\n >\r\n \r\n \r\n \r\n {[...relevantMeta, ...otherMeta].map((document, index) => {\r\n return (\r\n
\r\n {index > 0 && (\r\n
\r\n )}\r\n dispatch(wikiActions.fetchDocument(document.key))}\r\n >\r\n \r\n \r\n \r\n
\r\n )\r\n })}\r\n \r\n
\r\n )}\r\n {!showSearchResult && (\r\n <>\r\n {hasRelevantMeta && (\r\n { setContextSectionOpen(!contextSectionOpen) }}\r\n className={classes.sectionListItem}\r\n >\r\n \r\n {contextSectionOpen ? : }\r\n \r\n )}\r\n \r\n {relevantMeta.map((document, index) => {\r\n return (\r\n
\r\n {index > 0 && (\r\n
\r\n )}\r\n dispatch(wikiActions.fetchDocument(document.key))}\r\n >\r\n \r\n \r\n \r\n
\r\n )\r\n })}\r\n \r\n
\r\n {categories.length > 0 && (\r\n {\r\n if (hasRelevantMeta) {\r\n setAllSectionOpen(!allSectionOpen)\r\n }\r\n }}\r\n className={`${classes.sectionListItem} ${hasRelevantMeta ? '' : classes.disabledListItem}`}\r\n >\r\n \r\n {hasRelevantMeta && (\r\n <>\r\n {allSectionOpen ? : }\r\n \r\n )}\r\n \r\n )}\r\n \r\n {categories.map((category, index) => {\r\n return (\r\n
\r\n {index > 0 && (\r\n
\r\n )}\r\n dispatch(wikiActions.openCategory(category))}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n })}\r\n \r\n
\r\n \r\n )}\r\n \r\n )}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default 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 = (props: WikiSectionComponentProps) => {\r\n const classes = wikiSectionStyle()\r\n\r\n return (\r\n <>\r\n \r\n { props.onClick(props.section.id) }}\r\n className={classes.sectionListItem}\r\n >\r\n \r\n {props.open ? : }\r\n \r\n
\r\n \r\n {props.section.content.map((content, index) => {\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n )\r\n })}\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n\r\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 = (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(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 \r\n {props.enableBackNavigation && (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n {fetched && document !== undefined ? document.title : ''}\r\n
\r\n \r\n }\r\n />\r\n {(running || fakeRunning) && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {error && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n {fetched && document !== undefined && !fakeRunning && (\r\n
\r\n {document.logo !== undefined && (\r\n {intl.formatMessage({\r\n )}\r\n
{document.title}
\r\n {document.resume !== undefined && (\r\n {document.resume}\r\n )}\r\n {document.sections.map((section, index) => {\r\n return (\r\n
\r\n {\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
\r\n )\r\n })}\r\n {document.footer !== undefined && (\r\n {document.footer}\r\n )}\r\n
\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 = (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 \r\n {props.enableBackNavigation && (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n {category}\r\n \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
\r\n {index > 0 && (\r\n
\r\n )}\r\n dispatch(wikiActions.fetchDocument(document.key))}\r\n >\r\n \r\n \r\n \r\n
\r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nexport default 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 = (\r\n props: WikiSideBarProps\r\n) => {\r\n const dispatch = useDispatch()\r\n const classes = wikiSideBarStyle()\r\n\r\n const [animateIn, setAnimateIn] = useState(false)\r\n const [showSearchIcon, setShowSearchIcon] = useState(false)\r\n const [showCloseIcon, setShowCloseIcon] = useState(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
\r\n \r\n {(state: TransitionStatus) => (\r\n
\r\n \r\n {\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
\r\n {props.viewType === WikiView.WikiBrowser && (\r\n {\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 {\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 {\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
\r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n )}\r\n \r\n
\r\n
\r\n )}\r\n \r\n
\r\n )\r\n}\r\n\r\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 \r\n \r\n \r\n \r\n {isLoggedIn && currentDataTheme === DataTheme.NONE &&\r\n }\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n {\r\n currentWikiViews.map((view, index) => {\r\n return (\r\n \r\n )\r\n })\r\n }\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\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()\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 \r\n \r\n \r\n } />\r\n } />\r\n \r\n \r\n \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 \r\n \r\n \r\n \r\n ,\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":""}