{"version":3,"sources":["reportWebVitals.ts","context/LayoutProvider.tsx","util/ol.ts","api/auth/index.ts","api/index.ts","api/datafordeleren/index.ts","config/map.ts","api/util.ts","config/layers.ts","config/interactions.ts","interfaces/IIndberetning.ts","context/ToastProvider.tsx","hooks/usePrevious.ts","hooks/useRouter.ts","context/AuthProvider.tsx","context/MapProvider.tsx","context/SessionTimerProvider.tsx","util/date.ts","api/fip/index.ts","config/FipConfig.ts","context/IndberetningFilterProvider.tsx","components/icons/ChevronRight.tsx","components/common/Indberetning/IndberetningListItem.tsx","components/common/LoadingSpinner.tsx","components/common/Section.tsx","components/common/IndberetningOversigt/IndberetningOversigt.tsx","components/icons/PlusCircleFill.tsx","components/icons/Close.tsx","components/common/Modal/Modal.tsx","hooks/useOnClickOutside.ts","components/common/FormElements/Select.tsx","components/common/FormElements/ValidationErrorMessage.tsx","components/common/Indberet/AddDrawingModal.tsx","components/common/Indberet/EditDrawingModal.tsx","routes/Fip/fipUtil.ts","components/common/Indberet/AddFileModal.tsx","components/icons/DrawPolygon.tsx","components/icons/ThreeDotsVertical.tsx","components/icons/Trash.tsx","components/icons/Download.tsx","components/common/Indberet/ModalConfirmDelete.tsx","components/icons/DrawLine.tsx","components/icons/DrawPoint.tsx","components/common/GeometryAvatar.tsx","components/common/Indberetning/FilListItem.tsx","components/common/Indberet/TemaSelect.tsx","components/common/Indberet/AccepterVilkår.tsx","components/common/Indberetning/DrawingListItem.tsx","components/common/Indberet/DrawInstructions.tsx","components/common/Indberet/EditFileModal.tsx","components/common/Indberet/EmailInput.tsx","components/common/FormElements/FileInput.tsx","routes/Fip/FipIndberet.tsx","components/icons/ChevronLeftSmall.tsx","components/common/Indberetning/IndberetningNav.tsx","components/common/Indberetning/PrintModal.tsx","components/common/Indberetning/PromptModal.tsx","components/common/Indberetning/Detaljevisning.tsx","components/common/Indberetning/Fip/RedigerIndberetningModal.tsx","components/common/Indberetning/Fip/VideresendIndberetningModal.tsx","components/common/Indberetning/Fip/VideresendIndberetningTilHoeringModal.tsx","components/common/Indberetning/Fip/RedigerHoeringsFristModal.tsx","components/common/Indberetning/AfslutIndberetningModal.tsx","components/common/Indberetning/Fip/Sagsbehandlerfunktioner.tsx","components/common/Indberetning/Fip/RedigerHoeringsSvarModal.tsx","components/common/Indberetning/Fip/Hoeringspartfunktioner.tsx","components/common/Indberetning/Chat/SkrivBeskedModal.tsx","components/common/Indberetning/Chat/ChatMessage.tsx","components/common/Indberetning/Chat/Sagsagt.tsx","components/common/Indberetning/Chat/Chat.tsx","routes/Fip/FipIndberetning.tsx","api/stednavn/index.ts","config/StednavnConfig.ts","components/icons/ChevronLeft.tsx","components/common/Indberetning/Stednavn/StednavnSagsbehandlerfunktioner.tsx","components/common/Indberetning/FeatureItem.tsx","routes/Stednavn/components/Drawing.tsx","routes/Stednavn/components/File.tsx","routes/Stednavn/components/KategoriSelect.tsx","routes/Stednavn/components/Kommentar.tsx","routes/Stednavn/components/StednavnInput.tsx","routes/Stednavn/components/Tilbage.tsx","routes/Stednavn/util.ts","api/geosearch/index.ts","components/common/Map/Search.tsx","routes/Stednavn/components/FindStednavn.tsx","routes/LoggetUd.tsx","routes/Fip/FipLoggetUd.tsx","routes/LoaTooLow.tsx","routes/routesConfig.ts","routes/Fip/Fip.tsx","routes/Fip/FipOversigt.tsx","routes/Stednavn/Stednavn.tsx","routes/Stednavn/StednavnIndberet.tsx","routes/Stednavn/StednavnIndberet/CreateStednavn.tsx","routes/Stednavn/StednavnIndberet/UpdateStednavn.tsx","routes/Stednavn/StednavnIndberet/DeleteStednavn.tsx","routes/Stednavn/StednavnIndberetninger.tsx","routes/Stednavn/StednavnIndberetning.tsx","routes/Postnr/Postnr.tsx","routes/Postnr/PostnrIndberet.tsx","routes/Postnr/PostnrIndberetninger.tsx","routes/Postnr/PostnrIndberetning.tsx","routes/Sogn/Sogn.tsx","routes/Sogn/SognIndberet.tsx","routes/Sogn/SognIndberetninger.tsx","routes/Sogn/SognIndberetning.tsx","components/common/BreadCrumbs/BreadCrumbs.tsx","components/common/BreadCrumbs/breadcrumbsUtil.ts","components/common/Dropdown/Dropdown.tsx","components/common/DemoSkiftBruger/DemoSkiftBruger.tsx","components/icons/Skat.tsx","components/layouts/Header/Header.tsx","components/layouts/TwoPaneLayout/TwoPaneLayout.tsx","hooks/useMedia.ts","components/icons/MinusSquare.tsx","components/icons/PlusSquare.tsx","components/common/Map/LayerToggleTemaselect.tsx","components/icons/HandPointing.tsx","components/common/Map/LayerToggle.tsx","components/icons/DrawSelect.tsx","components/common/Map/DrawTools.tsx","components/common/Map/DrawToolsToasts.tsx","components/common/Map/Map.tsx","context/ConfigProvider.tsx","routes/404/404.tsx","routes/Forbidden/Forbidden.tsx","routes/PrivateRoute.tsx","App.tsx","index.tsx"],"names":["reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","LayoutContext","createContext","paneToShow","setPaneToShow","LayoutProvider","children","useState","Provider","value","wktFormat","WKT","wfsFormat","WFS","version","gml32Format","GML32","convertWktToFeature","wkt","readFeature","convertFeatureToWkt","feature","writeFeature","translateGeometryType","geometryType","addLayerToMap","map","layer","layerTitle","get","Error","layersInMap","getLayers","getArray","shouldAddLayer","i","length","l","mapLayerTitle","console","error","addLayer","log","zoomToFeature","getView","fit","getGeometry","maxZoom","padding","addFeatureToSource","source","hasFeature","addFeature","removeFeatureFromSource","removeFeature","ol3Parser","jsts","OL3Parser","inject","Point","LineString","LinearRing","Polygon","MultiPoint","MultiLineString","MultiPolygon","AuthenticationMode","isValid","geometry","read","logOut","a","post","query","apiPrefix","baseUrl","Promise","reject","getMe","personId","prefix_url","getWithErrorObject","keepsessionalive","prefix","encodeURIComponent","Date","toISOString","api","process","loginUrl","logoutUrl","authenticationMode","parseInt","headers","axios","response","data","put","body","del","delete","getGeoDkVectorFeaturesForExtent","extent","type","queryParams","username","password","service","request","typenames","Version","BBOX","join","maxFeatures","URLSearchParams","toString","features","readFeatures","getStednavnFeaturesForExtent","projection","Projection","code","units","addProjection","proj4","defs","register","projectionExtent","getExtent","origin","getTopLeft","tileGrid","WMTSTileGrid","resolutions","matrixIds","getFilterValueUrlString","searchEmne","searchBeskrivelse","filter","getFilterValues","makeExtentWKT","drawingCallback","bboxLayer","VectorLayer","properties","title","zIndex","VectorSource","style","res","Style","getType","e","pixWidth","fill","Fill","color","stroke","Stroke","width","image","CircleStyle","radius","geodanmark","ImageLayer","visible","ImageWMS","url","params","LAYERS","STYLES","TOKEN","VERSION","topoSkærmkort","TileLayer","maxResolution","WMTS","matrixSet","topoSkærmkortGraa","kommunegrænser","USERNAME","PASSWORD","TRANSPARENT","adresser","matrikler","stednavneWMS","fireCmHistorisk","FORMAT","højeMålestoksblade","laveMålestoksblade","kort25","kort50","kort100","kort200","udvalgteGeoDKTemaer","ortofoto","format","dhmOverflade","dhmTerræn","updateFipSagWmsParams","options","filterId","rolleId","filterValues","fipSagWmsSource","updateParams","VIEWPARAMS","fipSagWMSLayer","updateStednavnSagWmsParams","stednavnSagWmsSource","stednavnSagWMSLayer","bygningerWFSSource","strategy","bbox","loader","resolution","success","failure","addFeatures","catch","err","bygningerWFSLayer","vejogstimidteWFSSource","vejogstimidteWFSLayer","vejkantWFSSource","vejkantWFSLayer","søWFSSource","søWFSLayer","vandløbWFSSource","vandløbWFSLayer","selectableLayers","stednavneWFSSource","stednavneWFSLayer","text","Text","font","overflow","hoveredImageStyle","hoveredStrokeStyle","hoveredFillStyle","drawStroke","drawFill","getDrawLayerFeatureText","featuretype","drawLayerStyle","offsetY","drawInteractionSource","wrapX","tempDrawingSource","tempDrawLayer","lineDash","finishedDrawingSource","drawLayer","modifySource","modify","Modify","geometryIsValid","geom","polygon","getLinearRing","getCoordinates","mp","getPolygon","modifyLayer","imageStyle","modifyLayerPolygonVertices","valid","coordinates","c","concat","j","setDrawingCallback","callback","onDrawEnd","event","set","uniqueId","ok","strokeStyle","fillStyle","pointDraw","Draw","GeometryType","POINT","stopClick","on","lineDraw","LINE_STRING","polygonDraw","POLYGON","f","selectFeature","Select","layers","getFeatures","clear","selected","isBygning","isVej","isVandløb","DomaeneTypeIdEnum","PrioritetIdEnum","disableAllInteractions","setActive","statusIdEnum","IndlaegTypeIdEnum","RessourceRolleIdEnum","convertIndberetningDTO","input","beskrivelse","domaeneType","domaeneTypeId","emne","fraTs","frist","id","isOwner","oprettetTs","prioritet","sagsnummer","statusId","undefined","isHoeringssag","sag","hoeringsansvarligmappe","isFipLayer","AllSearchFilters","getSearchFilterByValue","find","initialState","toasts","ToastContext","ToastProvider","useReducer","state","action","content","message","toast","t","dispatch","useCallback","createToastWithId","setTimeout","className","aria-live","removeToast","ToastComponent","props","bgClass","role","aria-atomic","header","aria-label","onClick","usePrevious","ref","useRef","useEffect","current","useRouter","useLocation","search","appRoot","pathname","split","isFipGenerel","isStednavn","isPostnr","isSogn","searchQuery","useMemo","editFeatureCallback","fipDemoUsers","navn","loaTooLow","stednavnDemoUsers","AuthContext","authState","currentUser","setAuthState","setCurrentUserEmail","AuthProvider","location","stillMounted","prefix_path","toLowerCase","includes","authApi","bruger","fetchData","email","SessionTimerContext","resetSessionTimer","SESSION_TIMEOUT_SEC","SESSION_TIMEOUT_WARNING_SEC","SessionTimerProvider","useContext","warningTimer","sessionState","sessionTimer","countdownTimer","isAuthenticated","clearTimeout","resetTimer","SessionTimeoutWarning","window","assign","seconds","tabIndex","aria-modal","Math","round","href","baselayers","activeDrawTool","hoveredFeatures","editGeometryState","active","originalGeometry","viewState","center","zoom","tema","MapContext","mapState","dispatchToMap","MapProvider","maplayer","setVisible","folderLayer","loading","updated","drawTool","forEach","indexOf","cancelEditGeometrySideEffects","geometryToEdit","clonedOriginalGeometry","clone","clonedGeometry","modifyFeatures","modifyFeature","setGeometry","prevDrawTool","prevEditState","formatDateString","dateString","dateformat","locale","da","formatDottedDate","formatDashedDate","getIndberetninger","iDTOs","getIndberetning","indberetningId","iDTO","postIndberetning","uploadFile","formData","r","resp","JSON","parse","replace","replaceAll","errormsg","skrivChatBesked","sagId","stringify","tagIndberetning","user","indberetning","nyRessource","organisationId","organisationsnavn","sagsbehandler","tilTs","tagIndberetningFraSagsbehandler","ressource","opretHoeringssag","tagHoeringssagFraHoeringspart","afbrydHoering","daværendeRessource","redigerHoeringspartMappe","hoeringspartmappe","redigerIndberetning","videresendIndberetning","videresendIndberetningTilHoering","personIdHoeringsPart","kommentar","høringspart","iHoering","videresendIndberetningTilHoeringInternt","ressourceId","afslutHoeringsbehandling","objekttyperCache","personerCache","hoeringsPersonerCache","getObjekttyper","domaeneId","objekttyper","getPersoner","p","personer","getHoeringsPersoner","organisationsId","redigerSagsakt","openLayersId","dato","nySagsakt","uploadAendringsforslagGeometri","aendringTypeId","aendringType","featureType","featureTypeId","geometri","geometriType","mappeId","nytAendringsforslag","kortforsyningId","mimetype","nr","originalFilNavn","supplinfo","udpeget","redigerAendringsforslag","uploadSagsaktGeometri","filId","supplInfo","redigerSagsaktGeometri","nySagsaktGeometri","uploadSagsaktFil","deleteSagsakt","deleteAendringsforslag","afslutIndberetning","indlaeg","indhold","organisationForkortelse","organisationNavn","personNavn","ts","typeId","typeNavn","r1","resp1","getFipFeatureInfo","height","x","y","QUERY_LAYERS","INFO_FORMAT","SRS","FEATURE_COUNT","featureCollection","sagsbehandlingApi","defaultLayerSet","featuresSelectable","name","domainId","baseLayers","baseLayerId","statusStore","rolleStore","prioritetStore","domeneTyper","getDomeneTypeById","dt","domaeneStore","filtersForRolle","IndberetningFilterContext","setFilter","filters","setFilters","setSearch","searchInputText","setSearchInputText","searchExtent","IndberetningFilterProvider","setSearchExtent","prev","ChevronRight","ariaLabel","classNames","class","xmlns","viewBox","fillRule","d","IndberetningListItem","showDomain","bboxSource","getSource","history","useHistory","push","onMouseEnter","onMouseLeave","whiteSpace","aria-hidden","s","LoadingSpinner","aria-valuetext","aria-busy","Section","IndberetningOversigt","indberetningerState","hideBecauseEmptySearch","allowSearchBeskrivelse","indberetninger","titelRef","useLayoutEffect","focus","onChange","newfilter","target","placeholder","aria-describedby","PlusCircleFill","Close","Modal","ModalContext","closeModal","modal","handler","listener","contains","document","addEventListener","removeEventListener","useOnClickOutside","element","querySelector","createPortal","AnimatePresence","motion","div","initial","opacity","animate","exit","aria-labelledby","onKeyDown","key","show","showModal","ModalProvider","setModal","closeModalCallback","withCallback","useModal","forwardRef","labelText","mandatory","disabled","classes","htmlFor","focusable","aria-required","option","label","ValidationErrorMessage","notify","resetNotify","activateVoiceOverMessage","setActivateVoiceOverMessage","AddDrawingModal","drawing","submit","hideObjekttype","hideAendringstype","ændringsTyper","objektTyper","mappedObjektType","objekttypeOptions","æt","defaultObjektType","objekttype","setObjekttype","ændringstypeOptions","ændringstype","setÆndringstype","setKommentar","touched","validation","setValidation","objekttypeRef","ændringstypeRef","kommentarRef","objekttypeDisabled","ot","o","æ","EditDrawingModal","selectionStart","validateNyIndberetningForm","fil","vilkårAccepteret","form","fields","filEllerGeometri","prepareSag","temaId","esdhJournalId","esdhJournalNummer","indberetningsmappe","fejlSet","filreference","g","korttemaId","korrespondance","sagsbehandlermappe","sagsid","getSagsaktFeaturesFromHoeringssag","mappe","geometriId","getDownloadGeometryLink","sagsaktId","AddFileModal","firstFocusRef","addFile","setBeskrivelse","DrawPolygon","data-name","transform","strokeWidth","cx","cy","ThreeDotsVertical","Trash","ModalConfirmDelete","confirm","DrawLine","y1","x2","DrawPoint","GeometryAvatar","FilListItem","index","hideDeleteOption","hideEditOptions","hideOptions","downloadFileLink","downloadGeometryLink","removeFil","onEditClick","onEditGeometryClick","geometrytype","dropdownMenuButtonId","item","hovered","download","textDecoration","rel","data-bs-toggle","aria-expanded","stopPropagation","Wrapper","TemaSelect","isInvalid","setTema","AccepterVilkår","checked","setChecked","showValidationWarning","validationWarningMessage","DrawingListItem","downloadLink","setHoveredFeatures","zoomToDrawing","onDeleteClick","DrawInstructions","EditFileModal","currentBeskrivelse","updateFile","EmailInput","disableForm","setEmail","notifyValidationWarning","resetNotifyValidationWarning","autoComplete","FileInput","marginBottom","inputRef","preventDefault","click","ChevronLeftSmall","IndberetningNav","setActivePaneState","activePaneState","hoeringsansvarligmappeListe","indberetningsmappeListe","sagsbehandlermappeListe","showSagsbehandlingButton","gæst","showHøringssagButton","indberetter","aria-controls","aria-selected","data-bs-target","PrintModal","sagsbeskrivelse","setSagsbeskrivelse","kort","setKort","setKorrespondance","kommentarer","setKommentarer","geometrier","setGeometrier","filer","setFiler","method","onSubmit","display","readOnly","BeskedType","Detaljevisning","zoomToIndberetning","useClipboard","successDuration","setCopied","aktivHøringspart","aktivIndberetter","isHøringsSag","svar","svarFrist","korttema","PromptModal","acceptPrompt","RedigerIndberetningModal","setIndberetning","domaene","values","setValues","handleChange","dto","nyIndberetning","VideresendIndberetningModal","person","setPersoner","didPressSend","setDidPressSend","setNotify","getPersonerAsync","nuvaerendeRessource","findIndex","overdragelseskommentar","nytIndlaeg","VideresendIndberetningTilHoeringModal","setState","RedigerHoeringsFristModal","nyHoeringspartmappe","AfslutIndberetningModal","Sagsbehandlerfunktioner","cancelDrawingAndUploadFile","indberetningIsAfsluttet","afsluttet","isIndberetningMine","underBehandling","geoDanmark","RedigerHoeringsSvarModal","hoeringssvar","Hoeringspartfunktioner","m","isHoeringActive","isOrganisationAktivHoeringspart","beskedTypeMap","intern","tilIndberetter","fraIndberetter","afslutningsKommentar","beskedFraHoeringsAnsvarlig","beskedTiLHoeringsAnsvarlig","beskedFraHoeringspart","beskedTilHoeringspart","fraSagsbehandler","tilSagsbehandler","SkrivBeskedModal","skrivBesked","besked","setBesked","notifyBesked","setNotifyBesked","showValidationError","ChatMessage","left","convertTypeidToClass","data-bs-placement","convertTypeidToType","classname","Sagsagt","isMe","fromBehandler","isHoeringssagChat","setChatState","onEditGeometry","ids","sagsAktType","currentFeature","hideEdit","currentSagsbehandler","isIndberetningAfsluttet","whitelistSagsbehandling","whitelistHoeringssag","Chat","chatState","newFile","setNewFile","scrollPos","setScrollPos","context","chatRef","bottomOfChat","cancelEditGeometry","messages","setMessages","setObjekttyper","fileInputRef","addDrawing","drawingInfo","mappeid","file","fileInfo","renderMessages","prevNumMessages","scrollTo","top","offsetTop","scrollToBottom","getObjekttyperForTema","viewElements","k","date","component","sort","b","sagsId","senestOpdateret","senestOpdateretVoiceOver","showButtons","dangerouslySetInnerHTML","__html","flex","onScroll","scrollTop","slice","reverse","høringsansvarlig","rolleTypeToIndlaegType","files","FormData","append","errorMsg","isAxiosError","status","isMine","afsluttetGST","putIndberetningDSSYS","getStednavnFeatureInfo","Kategori","KategoriServiceMapning","ChevronLeft","StednavnSagsbehandlerfunktioner","klarmeldtTilDSSYS","oprettet","FeatureItem","kategori","Drawing","setDrawTool","File","KategoriSelect","currentKategori","setCurrentKategori","kategorier","Kommentar","validationMessage","StednavnInput","stednavn","setStednavn","Tilbage","to","routes","stednavnIndberet","path","mapKategori","mappedType","mappedKategori","prepareCreateStednavnSag","prepareUpdateStednavnSag","prepareDeleteStednavnSag","getSearchResult","resources","resourcesString","result","Search","onResult","containerClassName","containerStyle","inputClassName","inputStyle","listStyle","listItemStyle","extSearchString","extSetSearchString","inputId","intSearchString","intSetSearchString","searchString","setSearchString","searchResult","setSearchResult","isOpen","setIsOpen","cache","menuClassname","itemToString","presentationString","onOuterClick","onSelect","geometryWkt","blur","highlightedIndex","selectItem","getItemProps","getMenuProps","getInputProps","onFocus","minWidth","maxHeight","overflowY","margin","cursor","overflowX","textOverflow","backgroundColor","FindStednavn","boxShadow","position","right","LoggetUd","FipLoggetUd","LoaTooLow","loginA","createElement","setAttribute","isPublic","Component","paths","kortIndberet","kortIndberetninger","temaSelectRef","emneSectionRef","filSectionRef","sendSectionRef","emailRef","indberetningValidation","setIndberetningValidation","resetValidationNotifies","updateDrawing","currentFile","updatedFile","newFilArray","splice","fileIndex","drawings","updatedDrawing","newGeometriArray","drawingIndex","userEmail","temaOptions","cancelFileUploadAndDrawing","emneId","beskrivelseId","removeDrawing","kortIndberetning","scrollIntoView","behavior","setIndberetningerState","timer","filtersForUser","getFilteredIndberetningerForUser","useParams","handleError","useErrorHandler","indberetningState","setIndberetningState","indberetningStateHandler","hash","sagsbehandlingChatScrollPos","setSagsbehandlingChatScrollPos","høringsChatScrollPos","setHøringsChatScrollPos","hentIndberetning","didZoomAlready","indberetningTema","loadingRef","hoeringspartmappeListe","indberettere","sagsbehandlere","kortLoggetUd","kortLoaTooLow","stednavnIndberetninger","stednavnIndberetCreate","aria-current","stednavnIndberetUpdate","stednavnIndberetDelete","kategoriRef","stednavnInputRef","tegningInputRef","nytStednavn","Object","entries","stednavnIndberetning","searchRef","findStednavnRef","testApi","stednavnLoggetUd","stednavnLoaTooLow","postnr","postnrIndberet","postnrIndberetninger","postnrIndberetning","sogn","sognIndberet","sognIndberetninger","sognIndberetning","routesArray","keys","reduce","curr","BreadCrumbs","crumbs","pathnameParts","routePathParts","Number","isInteger","route","makeBreadCrumbs","crumb","Dropdown","_uniqueId","dropdownMenu","buttonStyle","buttonSize","DemoSkiftBruger","brugere","currentBruger","Skat","marginRight","Header","correctedPathname","setPathname","routeSet","root","indberet","forms","none","setCurrentBruger","TwoPaneLayout","rightPane","shouldHidePane","queries","defaultValue","mediaQueryLists","q","matchMedia","getValue","mql","matches","setValue","addListener","removeListener","useMedia","leftPaneClassNames","rightPaneClassNames","guideLink","updateSize","canvasEl","getElementsByTagName","strokeLinejoin","strokeLinecap","marginTop","marginLeft","MinusSquare","clipPath","PlusSquare","LayerToggleTemaselect","HandPointing","LayerToggle","setLayerVisibility","setVisibleBaselayer","expanded","setExpanded","currResolution","folder","FolderItem","LayerItem","getMaxResolution","DrawSelect","DrawTools","showToast","allowedDrawTools","focusRef","isActive","DrawToolButton","DrawToolsToasts","setShowToast","renderToast","Map","prevLayers","prevBaselayers","showDrawTools","mapId","renderMapDiv","hoveredFeaturesRef","onMapClick","pixel","size","getSize","calculateExtent","trunc","first","sagid","SagId","newmap","controls","defaultControls","attribution","extend","ScaleLine","interactions","defaultInteractions","altShiftDragRotate","pinchRotate","view","View","enableRotation","getFeaturesAtPixel","isEqual","getResolution","getCenter","getZoom","addInteraction","mapElement","getElementById","getTarget","hit","forEachFeatureAtPixel","getActive","addDrawInteractionsToMap","layersChanged","currLayers","removeLayer","folderLayers","containerClasses","ConfigContext","ConfigProvider","setLoadingCallback","stednavnBaselayers","stednavnLayers","tilelayer","progress","loaded","imageLayer","vectorLayer","NotFound","Forbidden","PrivateRoute","autentifikationId","referrer","exact","render","ErrorFallback","resetErrorBoundary","App","FallbackComponent","onReset","AppWrapper","StrictMode","base","getAttribute","ReactDOM","basename"],"mappings":"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","file":"static/js/main.8eef4dba.chunk.js","sourcesContent":["import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && 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 { createContext, useState } from \"react\";\r\n\r\nexport const LayoutContext = createContext<{\r\n paneToShow: \"left\" | \"right\";\r\n setPaneToShow: (paneToShow: \"left\" | \"right\") => void;\r\n}>({\r\n paneToShow: \"left\",\r\n setPaneToShow: () => {},\r\n});\r\n\r\nexport const LayoutProvider = ({ children }) => {\r\n let [paneToShow, setPaneToShow] = useState<\"left\" | \"right\">(\"left\");\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { Feature, Map } from \"ol\";\r\nimport { WFS, WKT } from \"ol/format\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport SimpleGeometry from \"ol/geom/SimpleGeometry\";\r\nimport BaseLayer from \"ol/layer/Base\";\r\nimport { Vector } from \"ol/source\";\r\nimport GML32 from \"ol/format/GML32\";\r\nimport * as jsts from \"jsts\";\r\nimport Point from \"ol/geom/Point\";\r\nimport LineString from \"ol/geom/LineString\";\r\nimport LinearRing from \"ol/geom/LinearRing\";\r\nimport Polygon from \"ol/geom/Polygon\";\r\nimport MultiPoint from \"ol/geom/MultiPoint\";\r\nimport MultiLineString from \"ol/geom/MultiLineString\";\r\nimport MultiPolygon from \"ol/geom/MultiPolygon\";\r\n\r\nexport const wktFormat = new WKT();\r\n\r\nexport const wfsFormat = new WFS({\r\n version: \"2.0.0\",\r\n});\r\n\r\nexport const gml32Format = new GML32();\r\n\r\n/**\r\n * Convert string WKT feature to OpenLayers Feature\r\n * @param wkt WKT formatted feature string\r\n * @returns OpenLayers Feature\r\n */\r\nexport function convertWktToFeature(wkt: string): Feature {\r\n return wktFormat.readFeature(wkt);\r\n}\r\n\r\n/**\r\n * Convert OpenLayers Feature to string WKT feature\r\n * @param feature OpenLayers Feature\r\n * @returns string WKT feature\r\n */\r\nexport function convertFeatureToWkt(feature: Feature): string {\r\n return wktFormat.writeFeature(feature);\r\n}\r\n\r\n/**\r\n * Translate OpenLayers geometry type to Danish\r\n * @param geometryType String value representing geometry type\r\n * @returns String value of geometry type translated to Danish\r\n */\r\nexport function translateGeometryType(geometryType: string) {\r\n switch (geometryType) {\r\n case \"Point\":\r\n return \"Punkt\";\r\n case \"LineString\":\r\n return \"Linje\";\r\n default:\r\n return geometryType;\r\n }\r\n}\r\n\r\n/**\r\n * Adds layer to map, unless it already exists. Throws error\r\n * if layer does not have title property or if there is a layer\r\n * in the map without title property.\r\n * @param map OpenLayers Map to add layer to\r\n * @param layer Layer to add\r\n */\r\nexport function addLayerToMap(map: Map, layer: BaseLayer) {\r\n const layerTitle = layer.get(\"title\");\r\n if (!layerTitle) throw new Error(\"Layer should have title property\");\r\n const layersInMap = map.getLayers().getArray();\r\n let shouldAddLayer = true;\r\n for (let i = 0; i < layersInMap.length; i++) {\r\n const l = layersInMap[i];\r\n const mapLayerTitle = l.get(\"title\");\r\n if (!mapLayerTitle) {\r\n console.error(l);\r\n throw new Error(\"Found layer in map without title\");\r\n }\r\n if (mapLayerTitle === layerTitle) shouldAddLayer = false;\r\n }\r\n if (shouldAddLayer) map.addLayer(layer);\r\n else console.log(\"Skipped adding existing layer to map\", layerTitle);\r\n}\r\n\r\nexport const zoomToFeature = (map: Map, feature: Feature) => {\r\n map.getView().fit(feature.getGeometry() as SimpleGeometry, {\r\n maxZoom: 12,\r\n padding: [100, 100, 100, 100],\r\n });\r\n};\r\n\r\n/**\r\n * Safely adds feature to source. If feature already\r\n * exist in source, nothing happens.\r\n * @param feature\r\n * @param source\r\n */\r\nexport const addFeatureToSource = (\r\n feature: Feature,\r\n source: Vector\r\n) => {\r\n if (!source.hasFeature(feature)) source.addFeature(feature);\r\n};\r\n/**\r\n * Safely removes feature from source. If feature does not\r\n * exist in source, nothing happens.\r\n * @param feature\r\n * @param source\r\n */\r\nexport const removeFeatureFromSource = (\r\n feature: Feature,\r\n source: Vector\r\n) => {\r\n if (source.hasFeature(feature)) source.removeFeature(feature);\r\n};\r\n\r\nconst ol3Parser = new jsts.io.OL3Parser();\r\nol3Parser.inject(\r\n Point,\r\n LineString,\r\n LinearRing,\r\n Polygon,\r\n MultiPoint,\r\n MultiLineString,\r\n MultiPolygon\r\n);\r\n\r\nexport const isValid = (geometry: Geometry) => {\r\n const jstsFeature = ol3Parser.read(geometry);\r\n return jstsFeature.isValid() as boolean;\r\n};\r\n","import { baseUrl, getWithErrorObject, post } from \"../index\";\r\n\r\nconst logOut = async () => {\r\n try {\r\n return await post({\r\n query: `prelogout.ashx`,\r\n apiPrefix: baseUrl,\r\n });\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const getMe = async (\r\n personId: number,\r\n prefix_url: string\r\n): Promise => {\r\n try {\r\n return await getWithErrorObject({\r\n query: `${prefix_url}api/brugerauth/getme?personId=${personId}`,\r\n apiPrefix: baseUrl,\r\n });\r\n } catch (error) {\r\n return Promise.reject(error); // Error is an axios error object here, not a string message\r\n }\r\n};\r\n\r\nexport const keepsessionalive = async (prefix: string) => {\r\n try {\r\n return await getWithErrorObject({\r\n query: `${prefix}app/keepsessionalive?${encodeURIComponent(\r\n new Date().toISOString()\r\n )}`,\r\n apiPrefix: baseUrl,\r\n });\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nconst api: BrugerAuth = {\r\n logOut,\r\n getMe,\r\n keepsessionalive,\r\n};\r\n\r\nexport default api;\r\n\r\nexport interface BrugerAuth {\r\n logOut: {\r\n (): Promise;\r\n };\r\n getMe: {\r\n (personId, prefix_url): Promise;\r\n };\r\n keepsessionalive: { (prefix: string): Promise };\r\n}\r\n\r\nexport enum AuthenticationMode {\r\n none = 0,\r\n windows = 1,\r\n forms = 2,\r\n}\r\n","import axios, { AxiosResponse } from \"axios\";\r\nimport { AuthenticationMode } from \"./auth\";\r\n// import authState from \"context/AuthProvider\";\r\nexport const baseUrl = process.env.REACT_APP_API_BASEURL\r\n ? process.env.REACT_APP_API_BASEURL\r\n : \"/\";\r\n\r\n// TODO: Skal udskiftet med baseUrl, når vi skifter til sso site\r\nexport const loginUrl = `${baseUrl}login.ashx`;\r\nexport const logoutUrl = `${baseUrl}prelogout.ashx`;\r\n\r\nexport const authenticationMode = process.env.REACT_APP_AUTHENTICATION_MODE\r\n ? parseInt(process.env.REACT_APP_AUTHENTICATION_MODE)\r\n : AuthenticationMode.none;\r\n\r\nexport async function get({\r\n query = \"\",\r\n apiPrefix = baseUrl,\r\n headers = {},\r\n}): Promise {\r\n try {\r\n const response = await axios.get(`${apiPrefix}${query}`, headers);\r\n return response.data;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n}\r\nexport async function getWithErrorObject({\r\n query = \"\",\r\n apiPrefix = baseUrl,\r\n}): Promise {\r\n try {\r\n const response = await axios.get(`${apiPrefix}${query}`);\r\n return response.data;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n}\r\nexport async function getResponse({\r\n query = \"\",\r\n apiPrefix = baseUrl,\r\n}): Promise> {\r\n try {\r\n const response = await axios.get(`${apiPrefix}${query}`);\r\n return response;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n}\r\n\r\nexport async function put({\r\n query = \"\",\r\n body = {},\r\n apiPrefix = baseUrl,\r\n}): Promise {\r\n try {\r\n const response = await axios.put(`${apiPrefix}${query}`, body);\r\n return response.data;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n}\r\n\r\nexport async function post({\r\n query = \"\",\r\n body = {},\r\n apiPrefix = baseUrl,\r\n headers = {},\r\n}): Promise {\r\n try {\r\n const response = await axios.post(`${apiPrefix}${query}`, body, headers);\r\n return response.data;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n}\r\nexport async function del({\r\n query = \"\",\r\n body = {},\r\n apiPrefix = baseUrl,\r\n}): Promise> {\r\n try {\r\n return await axios.delete(`${apiPrefix}${query}`, body);\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n}\r\n","import { get } from \"api\";\r\nimport { Feature } from \"ol\";\r\nimport { gml32Format, wfsFormat } from \"util/ol\";\r\n\r\nexport const getGeoDkVectorFeaturesForExtent = async (\r\n extent: number[],\r\n type: \"Bygning\" | \"Soe\" | \"Vandloebsmidte\" | \"Vejkant\" | \"Vejmidte\"\r\n): Promise[]> => {\r\n const queryParams: any = {\r\n username: process.env.REACT_APP_DAFUSERNAME,\r\n password: process.env.REACT_APP_DAFPASSWORD,\r\n service: \"WFS\",\r\n request: \"getfeature\",\r\n typenames: type,\r\n Version: \"2.0.0\",\r\n BBOX: extent.join(\",\"),\r\n maxFeatures: 50,\r\n };\r\n const features = await get({\r\n apiPrefix:\r\n \"https://services.datafordeler.dk/GeoDanmarkVektor/GeoDanmark60_NOHIST_GML3/1.0.0/WFS?\",\r\n query: new URLSearchParams(queryParams).toString(),\r\n });\r\n return wfsFormat.readFeatures(features);\r\n};\r\n\r\nexport const getStednavnFeaturesForExtent = async (\r\n extent: number[]\r\n): Promise[]> => {\r\n const queryParams: any = {\r\n username: process.env.REACT_APP_DAFUSERNAME,\r\n password: process.env.REACT_APP_DAFPASSWORD,\r\n service: \"WFS\",\r\n request: \"getfeature\",\r\n typenames:\r\n \"Bygning,Campingplads,Fortidsminde,Naturareal,Sevaerdighed,Soe,Vandloeb,Vej,Begravelsesplads,FaergeruteLinje,Idraetsanlaeg,Friluftsbad,Lufthavn,Navigationsanlaeg\",\r\n Version: \"2.0.0\",\r\n BBOX: extent.join(\",\"),\r\n maxFeatures: 50,\r\n };\r\n const features = await get({\r\n apiPrefix:\r\n \"https://services.datafordeler.dk/Stednavn/STEDNAVNE_BEARBEJDET_GML3SFP/1/WFS?\",\r\n query: new URLSearchParams(queryParams).toString(),\r\n });\r\n return gml32Format.readFeatures(features);\r\n};\r\n","import WMTSTileGrid from \"ol/tilegrid/WMTS\";\r\nimport Projection from \"ol/proj/Projection.js\";\r\nimport { addProjection } from \"ol/proj.js\";\r\nimport { register } from \"ol/proj/proj4.js\";\r\nimport { getTopLeft } from \"ol/extent.js\";\r\nimport proj4 from \"proj4\";\r\nimport { Map } from \"ol\";\r\nimport { defaults as defaultControls, ScaleLine } from \"ol/control.js\";\r\nimport { defaults as defaultInteractions } from \"ol/interaction.js\";\r\nimport View from \"ol/View.js\";\r\n\r\nexport const projection = new Projection({\r\n code: \"EPSG:25832\",\r\n extent: [120000, 5661139.2, 958860.8, 6500000],\r\n units: \"m\",\r\n});\r\naddProjection(projection);\r\nproj4.defs(\r\n \"EPSG:25832\",\r\n \"+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs\"\r\n);\r\nregister(proj4);\r\nexport const extent: [number, number, number, number] = [\r\n 120000, 5904000, 958860.8, 6499000,\r\n];\r\n\r\nexport const resolutions = [\r\n 1638.4, 819.2, 409.6, 204.8, 102.4, 51.2, 25.6, 12.8, 6.4, 3.2, 1.6, 0.8, 0.4,\r\n 0.2, 0.1, 0.05,\r\n];\r\nexport const matrixIds = [\r\n \"0\",\r\n \"1\",\r\n \"2\",\r\n \"3\",\r\n \"4\",\r\n \"5\",\r\n \"6\",\r\n \"7\",\r\n \"8\",\r\n \"9\",\r\n \"10\",\r\n \"11\",\r\n \"12\",\r\n \"13\",\r\n \"14\",\r\n \"15\",\r\n];\r\nconst projectionExtent = projection.getExtent();\r\nconst origin = getTopLeft(projectionExtent);\r\nexport const tileGrid = new WMTSTileGrid({\r\n origin,\r\n resolutions,\r\n matrixIds,\r\n});\r\n\r\nexport const createMap = (target: string) => {\r\n return new Map({\r\n target,\r\n controls: defaultControls({\r\n attribution: false,\r\n zoom: true,\r\n }).extend([new ScaleLine()]),\r\n interactions: defaultInteractions({\r\n altShiftDragRotate: false,\r\n pinchRotate: false,\r\n }),\r\n view: new View({\r\n center: [604000, 6230000],\r\n extent: [390000, 5900000, 920000, 6600000],\r\n zoom: 0,\r\n maxResolution: 819.2,\r\n maxZoom: 12,\r\n enableRotation: false,\r\n projection: projection,\r\n }),\r\n });\r\n};\r\n","export function getFilterValueUrlString(\r\n searchEmne: string | undefined,\r\n searchBeskrivelse: string | undefined\r\n) {\r\n searchEmne = searchEmne ? `Emne_like_${searchEmne}` : \"\";\r\n searchBeskrivelse = searchBeskrivelse\r\n ? `Beskrivelse_like_${searchBeskrivelse}`\r\n : \"\";\r\n const response = [searchEmne, searchBeskrivelse]\r\n .filter((a) => a !== \"\")\r\n .join(\"|\");\r\n return response;\r\n}\r\n\r\nexport function makeExtentWKT(extent: number[]) {\r\n if (extent.length !== 4) return undefined;\r\n return `POLYGON((${extent[0]} ${extent[1]}, ${extent[2]} ${extent[1]}, ${extent[2]} ${extent[3]}, ${extent[0]} ${extent[3]}, ${extent[0]} ${extent[1]}))`;\r\n}\r\nexport function getFilterValues(\r\n extent: number[] | undefined,\r\n searchEmne: string | undefined,\r\n searchBeskrivelse: string | undefined\r\n) {\r\n return extent\r\n ? makeExtentWKT(extent)\r\n : getFilterValueUrlString(searchEmne, searchBeskrivelse);\r\n}\r\n","import {\r\n getGeoDkVectorFeaturesForExtent,\r\n getStednavnFeaturesForExtent,\r\n} from \"api/datafordeleren\";\r\nimport { Tile as TileLayer, Vector as VectorLayer } from \"ol/layer\";\r\nimport { WMTS, Vector as VectorSource, ImageWMS } from \"ol/source\";\r\nimport { Stroke, Style, Circle as CircleStyle, Fill, Text } from \"ol/style\";\r\nimport { extent, tileGrid } from \"./map\";\r\nimport { bbox } from \"ol/loadingstrategy\";\r\nimport ImageLayer from \"ol/layer/Image\";\r\nimport Polygon from \"ol/geom/Polygon\";\r\nimport Point from \"ol/geom/Point\";\r\nimport { getFilterValues } from \"api/util\";\r\n\r\nexport const bboxLayer = new VectorLayer({\r\n properties: { title: \"indberetninger bbox\" },\r\n zIndex: 99,\r\n source: new VectorSource(),\r\n style: function (feature, res) {\r\n return new Style({\r\n geometry: function (feature) {\r\n if (feature.getGeometry().getType() === \"Polygon\") {\r\n const poly = feature.getGeometry() as Polygon;\r\n const e = poly.getExtent();\r\n const pixWidth = (e[2] - e[0]) / res;\r\n const pixHeight = (e[3] - e[1]) / res;\r\n if (pixHeight < 30 || pixWidth < 30)\r\n return new Point([(e[2] + e[0]) / 2, (e[3] + e[1]) / 2]);\r\n }\r\n return feature.getGeometry();\r\n },\r\n fill: new Fill({\r\n color: \"#ff8d2740\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"#ff8d27\",\r\n width: 4,\r\n }),\r\n image: new CircleStyle({\r\n radius: 30,\r\n fill: new Fill({\r\n color: \"#ff8d2740\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"#ff8d27\",\r\n width: 4,\r\n }),\r\n }),\r\n });\r\n },\r\n});\r\n\r\nexport const geodanmark = new ImageLayer({\r\n properties: { title: \"GeoDanmark\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://api.dataforsyningen.dk/forvaltning2?\",\r\n params: {\r\n LAYERS: [\"basis_kort\", \"Vejnavne_basiskort\", \"Stednavne_basiskort\"],\r\n STYLES: \"default\",\r\n TOKEN: process.env.REACT_APP_KFTOKEN,\r\n VERSION: \"1.1.1\",\r\n },\r\n }),\r\n});\r\n\r\nexport const topoSkærmkort = new TileLayer({\r\n properties: { title: \"Skærmkort\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n maxResolution: 1640,\r\n source: new WMTS({\r\n url: `https://services.datafordeler.dk/Dkskaermkort/topo_skaermkort_daempet/1.0.0/wmts?username=${process.env.REACT_APP_DAFUSERNAME}&password=${process.env.REACT_APP_DAFPASSWORD}`,\r\n tileGrid,\r\n layer: \"topo_skaermkort_daempet\",\r\n matrixSet: \"View1\",\r\n style: \"default\",\r\n }),\r\n});\r\n\r\nexport const topoSkærmkortGraa = new TileLayer({\r\n properties: { title: \"Skærmkort gråtone\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n maxResolution: 1640,\r\n source: new WMTS({\r\n url: `https://services.datafordeler.dk/Dkskaermkort/topo_skaermkort_graa/1.0.0/wmts?username=${process.env.REACT_APP_DAFUSERNAME}&password=${process.env.REACT_APP_DAFPASSWORD}`,\r\n tileGrid,\r\n layer: \"topo_skaermkort_graa\",\r\n matrixSet: \"View1\",\r\n style: \"default\",\r\n }),\r\n});\r\n\r\nexport const kommunegrænser = new ImageLayer({\r\n properties: { title: \"Kommunegrænser\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/DAGIM/dagi/1.0.0/WMS\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"Kommuneinddeling\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"TRUE\",\r\n },\r\n }),\r\n});\r\nexport const adresser = new ImageLayer({\r\n properties: { title: \"Husnumre\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://kort.aws.dk/geoserver/aws4/wms\",\r\n params: {\r\n LAYERS: [\"adgangsadresser\"],\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"TRUE\",\r\n },\r\n }),\r\n});\r\n\r\nexport const matrikler = new ImageLayer({\r\n properties: { title: \"Matrikler\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/Matrikel/MatrikelGaeldendeOgForeloebigWMS/1.0.0/WMS\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"Jordstykke_Gaeldende\"],\r\n STYLES: \"Jordstykke_Gaeldende_Roed\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"TRUE\",\r\n },\r\n }),\r\n});\r\n\r\nexport const stednavneWMS = new ImageLayer({\r\n properties: { title: \"Stednavne\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/STEDNAVN/Danske_Stednavne/1.0.0/WMS\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"danske_stednavne\"],\r\n // STYLES: \"Jordstykke_Gaeldende_Roed\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"TRUE\",\r\n },\r\n }),\r\n});\r\n\r\nexport const fireCmHistorisk = new ImageLayer({\r\n properties: { title: \"4cm historisk\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/DKTopografiskeKortvaerk/topo4cm_1980_2001/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"dtk_4cm_1980_2001\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"FALSE\",\r\n FORMAT: \"image/jpeg\",\r\n },\r\n }),\r\n});\r\n\r\nexport const højeMålestoksblade = new ImageLayer({\r\n properties: { title: \"Høje målebordsblade\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/HoejeMaalebordsblade/topo20_hoeje_maalebordsblade/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"dtk_hoeje_maalebordsblade\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"FALSE\",\r\n FORMAT: \"image/jpeg\",\r\n },\r\n }),\r\n});\r\n\r\nexport const laveMålestoksblade = new ImageLayer({\r\n properties: { title: \"Lave målebordsblade\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/LaveMaalebordsblade/topo20_lave_maalebordsblade/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"dtk_lave_maalebordsblade\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"FALSE\",\r\n FORMAT: \"image/jpeg\",\r\n },\r\n }),\r\n});\r\n\r\nexport const kort25 = new ImageLayer({\r\n properties: { title: \"Kort25\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/DKtopokort/dtk_25/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"dtk_25\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"FALSE\",\r\n FORMAT: \"image/jpeg\",\r\n },\r\n }),\r\n});\r\n\r\nexport const kort50 = new ImageLayer({\r\n properties: { title: \"Kort50\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/DKtopokort/dtk_50/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"dtk_50\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"FALSE\",\r\n FORMAT: \"image/jpeg\",\r\n },\r\n }),\r\n});\r\n\r\nexport const kort100 = new ImageLayer({\r\n properties: { title: \"Kort100\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/DKtopokort/dtk_100/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"dtk_100\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"FALSE\",\r\n FORMAT: \"image/jpeg\",\r\n },\r\n }),\r\n});\r\n\r\nexport const kort200 = new ImageLayer({\r\n properties: { title: \"Kort200 - Færdselskort\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/DKtopokort/dtk_200/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\"dtk_200\"],\r\n STYLES: \"default\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"FALSE\",\r\n FORMAT: \"image/jpeg\",\r\n },\r\n }),\r\n});\r\n\r\nexport const udvalgteGeoDKTemaer = new ImageLayer({\r\n properties: { title: \"Udvalgte GeoDanmark-temaer\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n source: new ImageWMS({\r\n url: \"https://services.datafordeler.dk/GeoDanmarkVektor/GeoDanmark_60_NOHIST/1.0.0/wms\",\r\n params: {\r\n USERNAME: process.env.REACT_APP_DAFUSERNAME,\r\n PASSWORD: process.env.REACT_APP_DAFPASSWORD,\r\n LAYERS: [\r\n \"SKOV\",\r\n \"VEJMIDTE\",\r\n \"JERNBANE\",\r\n \"BYGNING\",\r\n \"AFVANDINGSGROEFT\",\r\n \"BADE_BAADEBRO\",\r\n \"HAVN\",\r\n \"KYST\",\r\n \"SOE\",\r\n \"VAADOMRAADE\",\r\n \"VANDLOEBSMIDTE\",\r\n ],\r\n STYLES: \"\",\r\n VERSION: \"1.3.0\",\r\n TRANSPARENT: \"TRUE\",\r\n FORMAT: \"image/png\",\r\n },\r\n }),\r\n});\r\n\r\nexport const ortofoto = new TileLayer({\r\n properties: { title: \"Ortofoto\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n maxResolution: 1640,\r\n source: new WMTS({\r\n url: `https://services.datafordeler.dk/GeoDanmarkOrto/orto_foraar_wmts/1.0.0/wmts?username=${process.env.REACT_APP_DAFUSERNAME}&password=${process.env.REACT_APP_DAFPASSWORD}`,\r\n tileGrid,\r\n format: \"image/jpeg\",\r\n layer: \"orto_foraar_wmts\",\r\n matrixSet: \"KortforsyningTilingDK\",\r\n style: \"default\",\r\n }),\r\n});\r\n\r\nexport const dhmOverflade = new TileLayer({\r\n properties: { title: \"DHM overflade\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n maxResolution: 1640,\r\n source: new WMTS({\r\n url: `https://services.datafordeler.dk/DHMSkyggekort/dhm_overflade_skyggekort/1.0.0/wmts?username=${process.env.REACT_APP_DAFUSERNAME}&password=${process.env.REACT_APP_DAFPASSWORD}`,\r\n tileGrid,\r\n format: \"image/jpeg\",\r\n layer: \"dhm_overflade_skyggekort\",\r\n matrixSet: \"View1\",\r\n style: \"default\",\r\n }),\r\n});\r\n\r\nexport const dhmTerræn = new TileLayer({\r\n properties: { title: \"DHM terræn\" },\r\n visible: false,\r\n extent,\r\n zIndex: 0,\r\n maxResolution: 1640,\r\n source: new WMTS({\r\n url: `https://services.datafordeler.dk/DHMSkyggekort/dhm_terraen_skyggekort/1.0.0/wmts?username=${process.env.REACT_APP_DAFUSERNAME}&password=${process.env.REACT_APP_DAFPASSWORD}`,\r\n tileGrid,\r\n format: \"image/jpeg\",\r\n layer: \"dhm_terraen_skyggekort\",\r\n matrixSet: \"View1\",\r\n style: \"default\",\r\n }),\r\n});\r\n\r\nexport const updateFipSagWmsParams = (options: {\r\n personId: number;\r\n rolleId: number;\r\n filterId: number;\r\n searchEmne?: string;\r\n searchBeskrivelse?: string;\r\n extent?: number[];\r\n}) => {\r\n const { filterId, personId, rolleId, searchBeskrivelse, searchEmne, extent } =\r\n options;\r\n const filterValues = extent\r\n ? \"\"\r\n : getFilterValues(extent, searchEmne, searchBeskrivelse);\r\n fipSagWmsSource.updateParams({\r\n LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n STYLES: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":fip2prod\",\r\n VIEWPARAMS: `applikationId:1;domaeneTypeIds:;filterId:${\r\n filterId === 6 ? 4 : filterId\r\n };personId:${personId};rolleId:${rolleId};filterValues:${filterValues}`,\r\n });\r\n};\r\nconst fipSagWmsSource = new ImageWMS({\r\n url: `${process.env.REACT_APP_API_BASEURL}proxy.ashx`,\r\n params: {\r\n LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n STYLES: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":fip2prod\",\r\n VIEWPARAMS:\r\n \"applikationId:1;domaeneTypeIds:;filterId:0;personId:0;rolleId:0;filterValues:\",\r\n },\r\n});\r\n\r\nexport const fipSagWMSLayer = new ImageLayer({\r\n properties: { title: \"Indberetninger\" },\r\n source: fipSagWmsSource,\r\n});\r\n\r\nexport const updateStednavnSagWmsParams = (options: {\r\n personId: number;\r\n rolleId: number;\r\n filterId: number;\r\n searchEmne?: string;\r\n searchBeskrivelse?: string;\r\n extent?: number[];\r\n}) => {\r\n const { filterId, personId, rolleId, searchBeskrivelse, searchEmne, extent } =\r\n options;\r\n const filterValues = extent\r\n ? \"\"\r\n : getFilterValues(extent, searchEmne, searchBeskrivelse);\r\n stednavnSagWmsSource.updateParams({\r\n LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n STYLES: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":fip2prod\",\r\n VIEWPARAMS: `applikationId:4;domaeneTypeIds:;filterId:${\r\n filterId === 6 ? 4 : filterId\r\n };personId:${personId};rolleId:${rolleId};filterValues:${filterValues}`,\r\n });\r\n};\r\n\r\nexport const stednavnSagWmsSource = new ImageWMS({\r\n url: `${process.env.REACT_APP_API_BASEURL}proxy.ashx`,\r\n params: {\r\n LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n STYLES: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":fip2prod\",\r\n VIEWPARAMS:\r\n \"applikationId:4;domaeneTypeIds:5;filterId:3;personId:33;rolleId:1;filterValues:\",\r\n },\r\n});\r\nexport const stednavnSagWMSLayer = new ImageLayer({\r\n properties: { title: \"Indberettede stednavne\" },\r\n source: stednavnSagWmsSource,\r\n});\r\n\r\nexport const bygningerWFSSource = new VectorSource({\r\n strategy: bbox,\r\n loader: function (extent, resolution, projection, success, failure) {\r\n getGeoDkVectorFeaturesForExtent(extent, \"Bygning\")\r\n .then(function (features) {\r\n bygningerWFSSource.addFeatures(features);\r\n if (success) {\r\n success(features);\r\n }\r\n })\r\n .catch(function (err) {\r\n if (failure) {\r\n failure();\r\n }\r\n });\r\n },\r\n});\r\nexport const bygningerWFSLayer = new VectorLayer({\r\n properties: { title: \"Bygninger\" },\r\n visible: true,\r\n source: bygningerWFSSource,\r\n maxResolution: 1.5,\r\n style: new Style({\r\n stroke: new Stroke({\r\n color: \"hsla(10, 70%, 70%, 1)\",\r\n width: 2,\r\n }),\r\n fill: new Fill({\r\n color: `hsla(10, 70%, 70%, 0.4)`,\r\n }),\r\n image: new CircleStyle({\r\n stroke: new Stroke({\r\n color: \"hsla(10, 70%, 70%, 1)\",\r\n width: 2,\r\n }),\r\n fill: new Fill({\r\n color: \"hsla(10, 70%, 70%, 0.4)\",\r\n }),\r\n radius: 5,\r\n }),\r\n }),\r\n});\r\n\r\nexport const vejogstimidteWFSSource = new VectorSource({\r\n strategy: bbox,\r\n loader: function (extent, resolution, projection, success, failure) {\r\n getGeoDkVectorFeaturesForExtent(extent, \"Vejmidte\")\r\n .then(function (features) {\r\n vejogstimidteWFSSource.addFeatures(features);\r\n if (success) {\r\n success(features);\r\n }\r\n })\r\n .catch(function (err) {\r\n if (failure) {\r\n failure();\r\n }\r\n });\r\n },\r\n});\r\nexport const vejogstimidteWFSLayer = new VectorLayer({\r\n properties: { title: \"Vej- og stimidter\" },\r\n visible: true,\r\n source: vejogstimidteWFSSource,\r\n maxResolution: 1.5,\r\n style: new Style({\r\n stroke: new Stroke({\r\n color: \"hsla(110, 70%, 70%, 1)\",\r\n width: 3,\r\n }),\r\n }),\r\n});\r\n\r\nexport const vejkantWFSSource = new VectorSource({\r\n strategy: bbox,\r\n loader: function (extent, resolution, projection, success, failure) {\r\n getGeoDkVectorFeaturesForExtent(extent, \"Vejkant\")\r\n .then(function (features) {\r\n vejkantWFSSource.addFeatures(features);\r\n if (success) {\r\n success(features);\r\n }\r\n })\r\n .catch(function (err) {\r\n if (failure) {\r\n failure();\r\n }\r\n });\r\n },\r\n});\r\nexport const vejkantWFSLayer = new VectorLayer({\r\n properties: { title: \"Vejkant\" },\r\n visible: true,\r\n source: vejkantWFSSource,\r\n maxResolution: 1.5,\r\n style: new Style({\r\n stroke: new Stroke({\r\n color: \"hsla(140, 70%, 70%, 1)\",\r\n width: 3,\r\n }),\r\n }),\r\n});\r\n\r\nexport const søWFSSource = new VectorSource({\r\n strategy: bbox,\r\n loader: function (extent, resolution, projection, success, failure) {\r\n getGeoDkVectorFeaturesForExtent(extent, \"Soe\")\r\n .then(function (features) {\r\n søWFSSource.addFeatures(features);\r\n if (success) {\r\n success(features);\r\n }\r\n })\r\n .catch(function (err) {\r\n if (failure) {\r\n failure();\r\n }\r\n });\r\n },\r\n});\r\nexport const søWFSLayer = new VectorLayer({\r\n properties: { title: \"Sø\" },\r\n visible: true,\r\n source: søWFSSource,\r\n maxResolution: 1.5,\r\n style: new Style({\r\n stroke: new Stroke({\r\n color: \"hsla(190, 70%, 70%, 1)\",\r\n width: 2,\r\n }),\r\n fill: new Fill({\r\n color: `hsla(190, 70%, 70%, 0.4)`,\r\n }),\r\n }),\r\n});\r\nexport const vandløbWFSSource = new VectorSource({\r\n strategy: bbox,\r\n loader: function (extent, resolution, projection, success, failure) {\r\n getGeoDkVectorFeaturesForExtent(extent, \"Vandloebsmidte\")\r\n .then(function (features) {\r\n vandløbWFSSource.addFeatures(features);\r\n if (success) {\r\n success(features);\r\n }\r\n })\r\n .catch(function (err) {\r\n if (failure) {\r\n failure();\r\n }\r\n });\r\n },\r\n});\r\nexport const vandløbWFSLayer = new VectorLayer({\r\n properties: { title: \"Vandløb\" },\r\n visible: true,\r\n source: vandløbWFSSource,\r\n maxResolution: 1.5,\r\n style: new Style({\r\n stroke: new Stroke({\r\n color: \"hsla(190, 70%, 70%, 1)\",\r\n width: 2,\r\n }),\r\n fill: new Fill({\r\n color: `hsla(190, 70%, 70%, 0.4)`,\r\n }),\r\n }),\r\n});\r\n\r\nexport const selectableLayers = [\r\n bygningerWFSLayer,\r\n vejogstimidteWFSLayer,\r\n vejkantWFSLayer,\r\n søWFSLayer,\r\n vandløbWFSLayer,\r\n];\r\n\r\nexport const stednavneWFSSource = new VectorSource({\r\n strategy: bbox,\r\n loader: function (extent, resolution, projection, success, failure) {\r\n getStednavnFeaturesForExtent(extent)\r\n .then(function (features) {\r\n stednavneWFSSource.addFeatures(features);\r\n if (success) {\r\n success(features);\r\n }\r\n })\r\n .catch(function (err) {\r\n if (failure) {\r\n failure();\r\n }\r\n });\r\n },\r\n});\r\nexport const stednavneWFSLayer = new VectorLayer({\r\n properties: { title: \"Stednavne WFS\" },\r\n visible: true,\r\n source: stednavneWFSSource,\r\n maxResolution: 3.2,\r\n style: function (feature) {\r\n return new Style({\r\n stroke: new Stroke({\r\n color: \"hsla(216, 89%, 50%, 1)\",\r\n width: 2,\r\n }),\r\n fill: new Fill({\r\n color: `hsla(216, 89%, 50%, 0.2)`,\r\n }),\r\n image: new CircleStyle({\r\n stroke: new Stroke({\r\n color: \"hsla(216, 89%, 50%, 1)\",\r\n width: 2,\r\n }),\r\n fill: new Fill({\r\n color: \"hsla(216, 89%, 50%, 0.4)\",\r\n }),\r\n radius: 4,\r\n }),\r\n text: new Text({\r\n text: feature.get(\"navn_1.skrivemaade\"),\r\n font: \"500 14px sans-serif\",\r\n stroke: new Stroke({ color: \"#FFFFFFAA\", width: 3 }),\r\n overflow: true,\r\n }),\r\n });\r\n },\r\n});\r\n","import { uniqueId } from \"lodash\";\r\nimport { Feature, Map } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport GeometryType from \"ol/geom/GeometryType\";\r\nimport MultiPoint from \"ol/geom/MultiPoint\";\r\nimport MultiPolygon from \"ol/geom/MultiPolygon\";\r\nimport Polygon from \"ol/geom/Polygon\";\r\nimport { Draw, Modify, Select } from \"ol/interaction\";\r\nimport { DrawEvent } from \"ol/interaction/Draw\";\r\nimport VectorLayer from \"ol/layer/Vector\";\r\nimport RenderFeature from \"ol/render/Feature\";\r\nimport VectorSource from \"ol/source/Vector\";\r\nimport { Fill, Stroke, Style, Text } from \"ol/style\";\r\nimport CircleStyle from \"ol/style/Circle\";\r\nimport { addLayerToMap, isValid } from \"util/ol\";\r\nimport { selectableLayers } from \"./layers\";\r\n\r\nconst hoveredImageStyle = new CircleStyle({\r\n radius: 7,\r\n fill: new Fill({ color: \"#3057ed\" }),\r\n stroke: new Stroke({ color: \"white\", width: 2 }),\r\n});\r\nconst hoveredStrokeStyle = new Stroke({\r\n color: \"#3057ed\",\r\n width: 3,\r\n});\r\nconst hoveredFillStyle = new Fill({ color: \"#3057ed48\" });\r\n\r\nconst drawStroke = (feature: Feature | RenderFeature) => {\r\n const source = feature.get(\"mappe\");\r\n const isHovered = feature.get(\"hovered\");\r\n if (isHovered) return hoveredStrokeStyle;\r\n switch (source) {\r\n //indberetning, sagsbehandler, hoeringspart, hoeringsansvarlig\r\n case \"sagsbehandler\":\r\n return new Stroke({ color: \"#ff8d27\", width: 4 });\r\n case \"hoeringspart\":\r\n return new Stroke({ color: \"#9a3dc9\", width: 4 });\r\n case \"hoeringsansvarlig\":\r\n return new Stroke({ color: \"#b35f35\", width: 4 });\r\n }\r\n // indberetning\r\n return new Stroke({ color: \"#2fa369\", width: 4 });\r\n};\r\n\r\nconst drawFill = (feature: Feature | RenderFeature) => {\r\n const source = feature.get(\"mappe\");\r\n const isHovered = feature.get(\"hovered\");\r\n if (isHovered) return hoveredFillStyle;\r\n switch (source) {\r\n //indberetning, sagsbehandler, hoeringspart, hoeringsansvarlig\r\n case \"sagsbehandler\":\r\n return new Fill({ color: \"#ff8d2740\" });\r\n case \"hoeringspart\":\r\n return new Fill({ color: \"#9a3dc940\" });\r\n case \"hoeringsansvarlig\":\r\n return new Fill({ color: \"#b35f3540\" });\r\n }\r\n // indberetning\r\n return new Fill({ color: \"#2fa36940\" });\r\n};\r\n\r\nconst getDrawLayerFeatureText = (feature: Feature | RenderFeature) => {\r\n const source = feature.get(\"mappe\");\r\n const featuretype = feature.get(\"type\");\r\n const type = featuretype ? \" - \" + featuretype : \"\";\r\n\r\n switch (source) {\r\n //indberetning, sagsbehandler, hoeringspart, hoeringsansvarlig\r\n case \"sagsbehandler\":\r\n return `GST${type}`;\r\n case \"hoeringspart\":\r\n return `GST høringspart${type}`;\r\n case \"hoeringsansvarlig\":\r\n return `GST høring${type}`;\r\n case \"indberetning\":\r\n return `Indberetter${type}`;\r\n }\r\n\r\n return `${type}`;\r\n};\r\nexport const drawLayerStyle = (feature: Feature | RenderFeature) => {\r\n return new Style({\r\n stroke: drawStroke(feature),\r\n fill: drawFill(feature),\r\n image: new CircleStyle({\r\n radius: 5,\r\n stroke: drawStroke(feature),\r\n fill: drawFill(feature),\r\n }),\r\n text: new Text({\r\n text: getDrawLayerFeatureText(feature),\r\n overflow: true,\r\n font: \"500 14px sans-serif\",\r\n stroke: new Stroke({ color: \"#FFFFFFAA\", width: 3 }),\r\n offsetY: 15,\r\n }),\r\n });\r\n};\r\n\r\nconst drawInteractionSource = new VectorSource({ wrapX: false });\r\nexport const tempDrawingSource = new VectorSource({ wrapX: false });\r\nexport const tempDrawLayer = new VectorLayer({\r\n properties: { title: \"tempDrawLayer\" },\r\n zIndex: 99,\r\n source: tempDrawingSource,\r\n style: new Style({\r\n stroke: new Stroke({\r\n color: \"#01525aaa\",\r\n width: 2,\r\n lineDash: [5, 5],\r\n }),\r\n image: new CircleStyle({\r\n radius: 4,\r\n stroke: new Stroke({\r\n color: \"#01525aaa\",\r\n width: 2,\r\n }),\r\n }),\r\n }),\r\n});\r\nexport const finishedDrawingSource = new VectorSource({ wrapX: false });\r\nexport const drawLayer = new VectorLayer({\r\n properties: { title: \"drawLayer\" },\r\n zIndex: 100,\r\n source: finishedDrawingSource,\r\n style: function (feature) {\r\n return drawLayerStyle(feature);\r\n },\r\n});\r\nexport const modifySource = new VectorSource({ wrapX: false });\r\nexport const modify = new Modify({\r\n source: modifySource,\r\n style: new Style({\r\n image: new CircleStyle({\r\n fill: new Fill({\r\n color: \"rgba(0,0,100,0.3)\",\r\n }),\r\n radius: 20,\r\n }),\r\n }),\r\n});\r\nconst geometryIsValid = (feature: Feature | RenderFeature) => {\r\n const geom = feature.getGeometry();\r\n const geometryType = geom.getType();\r\n if (geometryType === \"Polygon\") {\r\n const polygon = geom as Polygon;\r\n if (polygon.getLinearRing(0).getCoordinates().length > 3)\r\n return isValid(polygon);\r\n }\r\n if (geometryType === \"MultiPolygon\") {\r\n const mp = geom as MultiPolygon;\r\n if (mp.getPolygon(0).getLinearRing(0).getCoordinates().length > 3) {\r\n return isValid(mp);\r\n }\r\n }\r\n return true;\r\n};\r\nconst modifyLayer = new VectorLayer({\r\n properties: { title: \"modifyLayer\" },\r\n zIndex: 100,\r\n source: modifySource,\r\n style: function (feature) {\r\n const ok = geometryIsValid(feature);\r\n return ok\r\n ? new Style({\r\n image: hoveredImageStyle,\r\n stroke: hoveredStrokeStyle,\r\n fill: hoveredFillStyle,\r\n })\r\n : new Style({\r\n image: imageStyle,\r\n stroke: new Stroke({\r\n color: \"#e25f5f\",\r\n width: 5,\r\n }),\r\n fill: new Fill({ color: \"#e25f5f20\" }),\r\n });\r\n },\r\n});\r\nconst modifyLayerPolygonVertices = new VectorLayer({\r\n properties: { title: \"drawLayerPolygonVertices\" },\r\n source: modifySource,\r\n zIndex: 101,\r\n style: function (feature) {\r\n const valid = geometryIsValid(feature);\r\n return new Style({\r\n image: new CircleStyle({\r\n fill: new Fill({\r\n color: valid ? \"#3057ed\" : \"#e25f5f\",\r\n }),\r\n stroke: new Stroke({\r\n color: \"#fff\",\r\n width: 2,\r\n }),\r\n radius: 7,\r\n }),\r\n geometry: (feature) => {\r\n const geom = feature.getGeometry();\r\n let coordinates = geom.getCoordinates();\r\n if (geom.getType() === \"Polygon\") {\r\n let c = [];\r\n for (let i = 0; i < coordinates.length; i++) {\r\n c = c.concat(coordinates[i]);\r\n }\r\n coordinates = c;\r\n return new MultiPoint(coordinates);\r\n } else if (geom.getType() === \"MultiPolygon\") {\r\n let c = [];\r\n for (let i = 0; i < coordinates.length; i++) {\r\n for (let j = 0; j < coordinates[i].length; j++) {\r\n c = c.concat(coordinates[i][j]);\r\n }\r\n }\r\n coordinates = c;\r\n return new MultiPoint(coordinates);\r\n } else if (geom.getType() === \"LineString\")\r\n return new MultiPoint(coordinates);\r\n return geom;\r\n },\r\n });\r\n },\r\n});\r\n\r\nlet drawingCallback: (drawing: Feature, isValid: boolean) => void;\r\nexport const setDrawingCallback = (\r\n callback: (drawing: Feature, isValid: boolean) => void\r\n) => {\r\n drawingCallback = callback;\r\n};\r\nconst onDrawEnd = (event: DrawEvent) => {\r\n const { feature } = event;\r\n feature.set(\"id\", uniqueId(\"feature\"));\r\n finishedDrawingSource.addFeature(feature);\r\n if (drawingCallback) {\r\n const geom = feature.getGeometry();\r\n const ok =\r\n geom.getType() === \"Polygon\" &&\r\n geom.getLinearRing().getCoordinates().length > 3\r\n ? isValid(geom)\r\n : true;\r\n drawingCallback(feature, ok);\r\n }\r\n};\r\nconst imageStyle = new CircleStyle({\r\n radius: 7,\r\n fill: new Fill({ color: \"#02818F\" }),\r\n stroke: new Stroke({ color: \"white\", width: 2 }),\r\n});\r\nconst strokeStyle = new Stroke({ color: \"#02818F\", width: 2 });\r\nconst fillStyle = new Fill({ color: \"#aaaacc20\" });\r\nconst pointDraw = new Draw({\r\n source: drawInteractionSource,\r\n type: GeometryType.POINT,\r\n stopClick: true,\r\n style: new Style({\r\n image: imageStyle,\r\n }),\r\n});\r\npointDraw.on(\"drawend\", onDrawEnd);\r\n\r\nconst lineDraw = new Draw({\r\n source: drawInteractionSource,\r\n type: GeometryType.LINE_STRING,\r\n stopClick: true,\r\n style: new Style({\r\n image: imageStyle,\r\n stroke: strokeStyle,\r\n }),\r\n});\r\nlineDraw.on(\"drawend\", onDrawEnd);\r\n\r\nconst polygonDraw = new Draw({\r\n source: drawInteractionSource,\r\n type: GeometryType.POLYGON,\r\n stopClick: true,\r\n style: function (f) {\r\n const geom = f.getGeometry();\r\n const ok =\r\n geom.getType() === \"Polygon\" &&\r\n geom.getLinearRing().getCoordinates().length > 3\r\n ? isValid(f.getGeometry())\r\n : true;\r\n if (geom.getType() === \"LineString\") {\r\n return new Style({ stroke: new Stroke({ color: \"transparent\" }) });\r\n }\r\n return new Style({\r\n image: imageStyle,\r\n stroke: ok\r\n ? strokeStyle\r\n : new Stroke({\r\n color: \"#e25f5f\",\r\n width: 3,\r\n }),\r\n fill: ok ? fillStyle : new Fill({ color: \"#e25f5f20\" }),\r\n });\r\n },\r\n});\r\npolygonDraw.on(\"drawend\", onDrawEnd);\r\n\r\nconst selectFeature = new Select({\r\n layers: selectableLayers,\r\n style: drawLayerStyle,\r\n});\r\nselectFeature.on(\"select\", function (e) {\r\n selectFeature.getFeatures().clear();\r\n if (e.selected.length) {\r\n const feature = e.selected[0];\r\n feature.set(\"id\", uniqueId(\"feature\"));\r\n const isBygning = feature.get(\"bygningstype\") ? true : false;\r\n const isVej =\r\n feature.get(\"synligVejkant\") || feature.get(\"vejkategori\") ? true : false;\r\n const isVandløb = feature.get(\"vandloebstype\") ? true : false;\r\n if (isBygning) {\r\n feature.set(\"fipFeatureTypeId\", 2);\r\n } else if (isVej) {\r\n feature.set(\"fipFeatureTypeId\", 3);\r\n } else if (isVandløb) {\r\n feature.set(\"fipFeatureTypeId\", 4);\r\n } else {\r\n feature.set(\"fipFeatureTypeId\", 1);\r\n }\r\n finishedDrawingSource.addFeature(feature);\r\n if (drawingCallback) {\r\n drawingCallback(feature, true);\r\n }\r\n }\r\n});\r\n\r\nexport const addDrawInteractionsToMap = (map: Map) => {\r\n addLayerToMap(map, tempDrawLayer);\r\n addLayerToMap(map, drawLayer);\r\n map.addInteraction(pointDraw);\r\n map.addInteraction(lineDraw);\r\n map.addInteraction(polygonDraw);\r\n map.addInteraction(modify);\r\n modify.setActive(true);\r\n addLayerToMap(map, modifyLayer);\r\n addLayerToMap(map, modifyLayerPolygonVertices);\r\n map.addInteraction(selectFeature);\r\n // Vis at features kan vælges i kortet, lav pointer-cursor på hover\r\n map.on(\"pointermove\", function (e) {\r\n const mapElement = document.getElementById(map.getTarget() as string);\r\n if (mapElement) {\r\n mapElement.style.cursor = \"default\";\r\n var hit = map.forEachFeatureAtPixel(e.pixel, function (feature, layer) {\r\n if (\r\n selectableLayers.indexOf(\r\n layer as VectorLayer>\r\n ) > -1\r\n )\r\n return true;\r\n });\r\n if (selectFeature.getActive() && hit) {\r\n mapElement.style.cursor = \"pointer\";\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const disableAllInteractions = () => {\r\n pointDraw.setActive(false);\r\n lineDraw.setActive(false);\r\n polygonDraw.setActive(false);\r\n selectFeature.setActive(false);\r\n // modify.setActive(false);\r\n};\r\nexport const activatePointDraw = () => {\r\n disableAllInteractions();\r\n pointDraw.setActive(true);\r\n};\r\nexport const activateLineDraw = () => {\r\n disableAllInteractions();\r\n lineDraw.setActive(true);\r\n};\r\nexport const activatePolygonDraw = () => {\r\n disableAllInteractions();\r\n polygonDraw.setActive(true);\r\n};\r\nexport const activateSelectFeature = () => {\r\n disableAllInteractions();\r\n selectFeature.setActive(true);\r\n};\r\n\r\nexport const activateExplore = () => {\r\n disableAllInteractions();\r\n};\r\n","import { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { convertWktToFeature } from \"../util/ol\";\r\nimport { FipLayer } from \"./FipLayer\";\r\n\r\nexport interface IndberetningerState {\r\n indberetninger: Indberetning[];\r\n state: State;\r\n}\r\nexport interface IndberetningState {\r\n indberetning?: Hoeringssag;\r\n features?: Feature[];\r\n state: State;\r\n}\r\n\r\n/**\r\n * Validation object\r\n */\r\nexport interface Validation {\r\n /**\r\n * Did validation succeed?\r\n */\r\n valid: boolean;\r\n /**\r\n * Message to show user in case validation failed\r\n */\r\n message: string;\r\n /**\r\n * Usually, we don't show validation error until after field has been touched\r\n */\r\n touched: boolean;\r\n /**\r\n * Flag used to trigger Voice Over to read message\r\n */\r\n notify: boolean;\r\n}\r\n\r\nexport enum DomaeneTypeIdEnum {\r\n landkort = 1,\r\n søkort = 2,\r\n højdemodal = 3,\r\n ortofotos = 4,\r\n stednavn = 5,\r\n matrikel = 6,\r\n fikspunkt = 7,\r\n postnummer = 8,\r\n sogn = 9,\r\n geoDanmark = 10,\r\n}\r\nexport enum PrioritetIdEnum {\r\n ikkePrioriteret = 0,\r\n lav = 1,\r\n mellem = 2,\r\n hoej = 3,\r\n}\r\n\r\nexport interface IndberetningDTO {\r\n bbox: string;\r\n beskrivelse: string;\r\n domaeneType: string;\r\n domaeneTypeId: DomaeneTypeIdEnum;\r\n emne: string;\r\n fraTs: string;\r\n frist: string;\r\n id: number;\r\n isOwner: boolean;\r\n oprettetTs: string;\r\n prioritet: number;\r\n sagsnummer: any;\r\n statusId: number;\r\n}\r\n\r\nexport interface RedigerIndberetningDTO {\r\n frist: string | null;\r\n domaeneType: string;\r\n domaeneTypeId: DomaeneTypeIdEnum;\r\n prioritet: PrioritetIdEnum;\r\n}\r\nexport interface ExpandedIndberetningDTO extends IndberetningDTO {\r\n esdhJournalId: string;\r\n esdhJournalNummer: string;\r\n hoeringsansvarligmappe: any;\r\n hoeringspartmappe: any;\r\n indberetningsmappe: any;\r\n korrespondance: any;\r\n ressource: Ressource[];\r\n sagsbehandlermappe: any;\r\n}\r\n\r\nexport interface Indberetning {\r\n bbox?: Feature;\r\n beskrivelse: string;\r\n domaeneType: string;\r\n domaeneTypeId: DomaeneTypeIdEnum;\r\n emne: string;\r\n fraTs?: Date;\r\n frist?: Date;\r\n id: number;\r\n isOwner: boolean;\r\n oprettetTs: Date;\r\n prioritet: number;\r\n sagsnummer: any;\r\n statusId: number;\r\n}\r\n\r\nexport const convertIndberetningDTO = (\r\n input: IndberetningDTO\r\n): Indberetning => {\r\n const {\r\n bbox,\r\n beskrivelse,\r\n domaeneType,\r\n domaeneTypeId,\r\n emne,\r\n fraTs,\r\n frist,\r\n id,\r\n isOwner,\r\n oprettetTs,\r\n prioritet,\r\n sagsnummer,\r\n statusId,\r\n } = input;\r\n return {\r\n bbox: bbox ? convertWktToFeature(bbox) : undefined,\r\n beskrivelse,\r\n domaeneType,\r\n domaeneTypeId,\r\n emne,\r\n fraTs: fraTs ? new Date(fraTs) : undefined,\r\n frist: frist ? new Date(frist) : undefined,\r\n id,\r\n isOwner,\r\n oprettetTs: new Date(oprettetTs),\r\n prioritet,\r\n sagsnummer,\r\n statusId,\r\n };\r\n};\r\n\r\nexport interface Hoeringssag {\r\n bbox: string; // \"\"\r\n beskrivelse: string;\r\n domaeneType: string;\r\n domaeneTypeId: DomaeneTypeIdEnum; // 1;\r\n emne: string; // \"noget er galt\";\r\n esdhJournalId: string; // \"\";\r\n esdhJournalNummer: string; // \"\";\r\n fraTs: string | null; // null;\r\n frist: string | null; // null;\r\n id: number; // 0;\r\n indberetningsmappe: Indberetningsmappe[];\r\n korrespondance: Indlaeg[];\r\n oprettetTs: string | null; // ;\r\n prioritet: number; // 0;\r\n ressource: Ressource[];\r\n sagsbehandlermappe: Sagsbehandlermappe[];\r\n sagsid: number; // 0;\r\n sagsnummer: string; // \"\";\r\n statusId: number; // 1;\r\n tilTs: string | null; // null;\r\n hoeringsansvarligmappe?: Hoeringsmappe[];\r\n hoeringspartmappe?: Hoeringsmappe[];\r\n}\r\n\r\nexport const isHoeringssag = (sag: Hoeringssag): sag is Hoeringssag => {\r\n return (\r\n sag.hoeringsansvarligmappe !== undefined &&\r\n sag.hoeringsansvarligmappe.length > 0\r\n );\r\n};\r\n\r\nexport enum statusIdEnum {\r\n modtaget = 1,\r\n afsluttet = 2,\r\n afventerIndberetter = 3,\r\n afventerAndenMyndighed = 4,\r\n underBehandling = 5,\r\n oprettet = 10,\r\n behandlingPD = 11,\r\n iHoering = 12,\r\n behandlingGST = 13,\r\n klarmeldtTilDagiSys = 14,\r\n afsluttetGST = 15,\r\n klarmeldtTilDSSYS = 20,\r\n overførtTilDSSYS = 21,\r\n}\r\n\r\nexport interface Indlaeg {\r\n id: number;\r\n typeId: IndlaegTypeIdEnum;\r\n typeNavn: string;\r\n personId: number;\r\n personNavn: string;\r\n organisationId: number;\r\n organisationNavn: string;\r\n organisationForkortelse: string;\r\n indhold: string;\r\n ts: string;\r\n}\r\n\r\nexport enum IndlaegTypeIdEnum {\r\n intern = 1,\r\n overdragelseskommentar = 2,\r\n tilIndberetter = 3,\r\n fraIndberetter = 4,\r\n afslutningsKommentar = 5,\r\n beskedFraHoeringsAnsvarlig = 6,\r\n beskedTiLHoeringsAnsvarlig = 7,\r\n beskedFraHoeringspart = 8,\r\n beskedTilHoeringspart = 9,\r\n fraSagsbehandler = 10,\r\n tilSagsbehandler = 11,\r\n}\r\n\r\nexport interface Ressource {\r\n id: number;\r\n personId: number;\r\n navn: string;\r\n email: string;\r\n organisationId: number;\r\n organisationsnavn: string;\r\n fraTs: string;\r\n tilTs: string;\r\n rolleId: RessourceRolleIdEnum;\r\n}\r\nexport enum RessourceRolleIdEnum {\r\n gæst = 0,\r\n indberetter = 1,\r\n sagsbehandler = 2,\r\n esdh = 3,\r\n høringspart = 4,\r\n høringsansvarlig = 5,\r\n}\r\n\r\nexport interface Indberetningsmappe {\r\n beskrivelse: string; // \"noget eeeeer galt\";\r\n domaeneType: string; // \"\"\r\n domaeneTypeId: DomaeneTypeIdEnum; // 10\r\n emne: string; // \"fritekst\"\r\n fejlSet: string; // \"\"\r\n fil: Sagsakt[];\r\n geometri: Aendringsforslag[];\r\n id: number; // 0;\r\n korttemaId: number; // 4;\r\n}\r\n\r\nexport interface Sagsbehandlermappe {\r\n fil: Sagsakt[];\r\n geometri: Aendringsforslag[];\r\n id: number; // 0;\r\n}\r\n\r\nexport interface Hoeringsmappe {\r\n id: number;\r\n organisationId: number;\r\n organisationNavn: string;\r\n svar: string;\r\n svarStatusId: number;\r\n svarPersonId: number;\r\n svarPersonNavn: string;\r\n svarFrist: string;\r\n ts: string;\r\n geometri: Aendringsforslag[] | null;\r\n fil: Sagsakt[] | null;\r\n}\r\n\r\nexport interface Sagsakt {\r\n beskrivelse: string;\r\n dato: string;\r\n filId: number;\r\n filreference: string;\r\n geometri: string;\r\n geometriId?: number;\r\n geometriType: string;\r\n id: number;\r\n kortforsyningId: string;\r\n mimetype: string;\r\n nr: number;\r\n openLayersId: string;\r\n originalFilNavn: string;\r\n personId: number;\r\n personNavn: string;\r\n supplInfo: string;\r\n udpeget: boolean;\r\n url: string;\r\n openlayersFeature?: Feature;\r\n}\r\nexport interface Aendringsforslag extends Sagsakt {\r\n aendringType: string;\r\n aendringTypeId: number;\r\n featureType: string;\r\n featureTypeId: number;\r\n}\r\n\r\nexport const isFipLayer = (\r\n input: FipLayerFolder | FipLayer\r\n): input is FipLayer => {\r\n return input[\"layers\"] === undefined;\r\n};\r\nexport interface FipLayerFolder {\r\n title: string;\r\n layers: FipLayer[];\r\n}\r\n\r\nexport interface Tema {\r\n name: string;\r\n id: number;\r\n domainId: number;\r\n baseLayerId: string;\r\n baseLayers: FipLayer[];\r\n layers: (FipLayer | FipLayerFolder)[];\r\n}\r\n\r\nexport interface IFileUploadResponse {\r\n success: boolean;\r\n id: string;\r\n originalFilNavn: string;\r\n errormsg: string;\r\n}\r\nexport type SearchFilter =\r\n | { value: 0; text: \"Aktive\" }\r\n | { value: 1; text: \"Uhåndterede\" }\r\n | { value: 2; text: \"Afsluttede\" }\r\n | { value: 3; text: \"Egne\" }\r\n | { value: 4; text: \"Alle\" }\r\n | { value: 5; text: \"Nye\" }\r\n | { value: 6; text: \"Alle indenfor kortvindue\" }\r\n | { value: 9; text: \"Søgning\" };\r\n\r\nexport const AllSearchFilters: SearchFilter[] = [\r\n { value: 0, text: \"Aktive\" },\r\n { value: 1, text: \"Uhåndterede\" },\r\n { value: 2, text: \"Afsluttede\" },\r\n { value: 3, text: \"Egne\" },\r\n { value: 4, text: \"Alle\" },\r\n { value: 5, text: \"Nye\" },\r\n { value: 6, text: \"Alle indenfor kortvindue\" },\r\n { value: 9, text: \"Søgning\" },\r\n];\r\n\r\nexport function getSearchFilterByValue(value: number) {\r\n const filter = AllSearchFilters.find((f) => f.value === value);\r\n return filter ? filter : AllSearchFilters[0];\r\n}\r\n","import { uniqueId } from \"lodash\";\r\nimport { createContext, useCallback, useReducer } from \"react\";\r\n\r\nexport interface Toast {\r\n content: { header?: string; message: string };\r\n type?: \"default\" | \"danger\";\r\n}\r\ninterface IToast extends Toast {\r\n id: string;\r\n}\r\ninterface ToastState {\r\n toasts: IToast[];\r\n}\r\ntype ToastAction =\r\n | { type: \"ADD_TOAST\"; toast: IToast }\r\n | { type: \"REMOVE_TOAST\"; toast: IToast };\r\nconst initialState: ToastState = {\r\n toasts: [],\r\n};\r\nexport const ToastContext = createContext<(t: Toast) => void>(() => {});\r\nconst ToastProvider = ({ children }) => {\r\n const reducer = (state: ToastState, action: ToastAction): ToastState => {\r\n switch (action.type) {\r\n case \"ADD_TOAST\":\r\n if (\r\n state.toasts.length &&\r\n state.toasts[state.toasts.length - 1].content.message ===\r\n action.toast.content.message\r\n )\r\n return state;\r\n return { ...state, toasts: [...state.toasts, action.toast] };\r\n case \"REMOVE_TOAST\":\r\n return {\r\n ...state,\r\n toasts: state.toasts.filter((t) => t !== action.toast),\r\n };\r\n }\r\n };\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n const toast = useCallback(\r\n function (t: Toast) {\r\n const toast = createToastWithId(t);\r\n dispatch({ type: \"ADD_TOAST\", toast });\r\n setTimeout(() => {\r\n dispatch({ type: \"REMOVE_TOAST\", toast });\r\n }, 10000);\r\n },\r\n [dispatch]\r\n );\r\n return (\r\n \r\n
\r\n {state.toasts.map((toast) => {\r\n return (\r\n dispatch({ type: \"REMOVE_TOAST\", toast })}\r\n />\r\n );\r\n })}\r\n
\r\n {children}\r\n
\r\n );\r\n};\r\nexport default ToastProvider;\r\n\r\nconst ToastComponent = (props: {\r\n toast: IToast;\r\n removeToast: (toast: IToast) => void;\r\n}) => {\r\n const { toast, removeToast } = props;\r\n const { content, type } = toast;\r\n const bgClass = () => {\r\n switch (type) {\r\n case \"danger\":\r\n return \"bg-danger\";\r\n default:\r\n return \"bg-primary\";\r\n }\r\n };\r\n\r\n return (\r\n \r\n
\r\n
\r\n {content.header && (\r\n {content.header}\r\n )}\r\n {content.message}\r\n
\r\n {\r\n removeToast(toast);\r\n }}\r\n >\r\n
\r\n \r\n );\r\n};\r\n\r\nconst createToastWithId = (t: Toast): IToast => {\r\n const toast: IToast = {\r\n content: t.content,\r\n type: t.type,\r\n id: uniqueId(\"toast\"),\r\n };\r\n return toast;\r\n};\r\n","import { useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * Usage:\r\n * const [count, setCount] = useState(0);\r\n * const prevCount = usePrevious(count);\r\n */\r\nexport function usePrevious(value: T) {\r\n const ref = useRef();\r\n useEffect(() => {\r\n ref.current = value;\r\n }, [value]);\r\n return ref.current;\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\n/**\r\n * Helpers for react router in FIP\r\n *\r\n * source for searchQuery: https://reacttraining.com/react-router/web/example/query-parameters\r\n */\r\nexport function useRouter() {\r\n const { search, pathname } = useLocation();\r\n const appRoot = pathname.split(\"/\")[1];\r\n const isFipGenerel = appRoot === \"kort\";\r\n const isStednavn = appRoot === \"stednavn\";\r\n const isPostnr = appRoot === \"postnr\";\r\n const isSogn = appRoot === \"sogn\";\r\n return {\r\n isFipGenerel,\r\n isStednavn,\r\n isPostnr,\r\n isSogn,\r\n appRoot,\r\n searchQuery: useMemo(() => new URLSearchParams(search), [search]),\r\n };\r\n}\r\n","import { RessourceRolleIdEnum } from \"interfaces/IIndberetning\";\r\nimport { createContext, useEffect, useState } from \"react\";\r\nimport authApi from \"api/auth\";\r\nimport { useLocation } from \"react-router-dom\";\r\nexport interface AuthState {\r\n state: \"IDLE\" | \"LOADING\" | \"ERROR\" | \"UNAUTHORIZED\" | \"FORBIDDEN\";\r\n currentUser: Bruger;\r\n}\r\n\r\nexport interface Bruger {\r\n navn: string;\r\n personId: number;\r\n rolleId: RessourceRolleIdEnum;\r\n isAuthenticated?: boolean;\r\n autentifikationId?: any;\r\n email?: string;\r\n organisationId?: number;\r\n organisationNavn?: string;\r\n senesteLogin?: string;\r\n authenticationMode?: any;\r\n loaTooLow?: boolean;\r\n}\r\n\r\nexport const fipDemoUsers: Bruger[] = [\r\n {\r\n personId: 0,\r\n rolleId: 0,\r\n navn: \"Gæst\",\r\n },\r\n {\r\n personId: 0,\r\n rolleId: 1,\r\n navn: \"Bruger ikke oprettet i FIP\",\r\n },\r\n {\r\n personId: 4,\r\n rolleId: 1,\r\n navn: \"Indb. (Peter Sørensen)\",\r\n },\r\n {\r\n personId: 165,\r\n rolleId: 1,\r\n navn: \"Indb. (Bente Svendsen)\",\r\n loaTooLow: false,\r\n },\r\n {\r\n personId: 1,\r\n rolleId: 2,\r\n navn: \"Sagsb. (Hans Peter Hansen)\",\r\n },\r\n {\r\n personId: 2,\r\n rolleId: 2,\r\n navn: \"Sagsb. (Sussi Jensen)\",\r\n },\r\n {\r\n personId: 3,\r\n rolleId: 2,\r\n navn: \"Sagsb. (Knud Børge Kvist)\",\r\n },\r\n {\r\n personId: 45,\r\n rolleId: 4,\r\n navn: \"Hør.part (Ib Skov, Brøndby)\",\r\n },\r\n {\r\n personId: 155,\r\n rolleId: 4,\r\n navn: \"Hør.part (Niels Drewes, Brøndby)\",\r\n },\r\n {\r\n personId: 115,\r\n rolleId: 4,\r\n navn: \"Hør.part (Karina Nielsen, Næstved)\",\r\n },\r\n];\r\nexport const stednavnDemoUsers: Bruger[] = [\r\n {\r\n personId: 0,\r\n rolleId: 0,\r\n navn: \"Gæst\",\r\n },\r\n {\r\n personId: 1,\r\n rolleId: 2,\r\n navn: \"Sagsb. (Hans Peter Hansen)\",\r\n },\r\n {\r\n personId: 2,\r\n rolleId: 2,\r\n navn: \"Sagsb. (Sussi Jensen)\",\r\n },\r\n {\r\n personId: 165,\r\n rolleId: 1,\r\n navn: \"Indb. (Bente Svendsen)\",\r\n },\r\n {\r\n personId: 33,\r\n rolleId: 1,\r\n navn: \"Indb. (Kurt Hansen)\",\r\n },\r\n {\r\n personId: 34,\r\n rolleId: 1,\r\n navn: \"Indb. aut. (Vera Thomsen)\",\r\n },\r\n];\r\n\r\nexport const AuthContext = createContext<{\r\n authState: AuthState;\r\n setAuthState: React.Dispatch>;\r\n setCurrentUserEmail: (email: string) => void;\r\n}>({\r\n authState: {\r\n state: \"LOADING\",\r\n currentUser: fipDemoUsers[0],\r\n },\r\n setAuthState: () => {},\r\n setCurrentUserEmail: () => {},\r\n});\r\n\r\nconst AuthProvider = (props: any) => {\r\n const [authState, setAuthState] = useState({\r\n state: \"LOADING\",\r\n currentUser: fipDemoUsers[0],\r\n });\r\n const setCurrentUserEmail = (email: string) => {\r\n setAuthState({\r\n ...authState,\r\n currentUser: { ...authState.currentUser, email },\r\n });\r\n };\r\n const location = useLocation();\r\n useEffect(() => {\r\n let stillMounted = true;\r\n const fetchData = async () => {\r\n let prefix_path = \"\";\r\n\r\n if (location.pathname.toLowerCase().includes(\"/stednavn\")) {\r\n prefix_path = \"stednavn/\";\r\n }\r\n const bruger = await authApi.getMe(\r\n authState.currentUser.personId,\r\n prefix_path\r\n );\r\n\r\n if (stillMounted) {\r\n setAuthState({\r\n state: \"IDLE\",\r\n currentUser: bruger,\r\n });\r\n }\r\n };\r\n fetchData();\r\n // console.log(\"auth effect\", authState.currentUser);\r\n return () => {\r\n stillMounted = false;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nexport default AuthProvider;\r\n","import { createContext, useContext, useEffect, useReducer } from \"react\";\r\nimport { Feature, Map } from \"ol\";\r\nimport {\r\n activateLineDraw,\r\n activatePointDraw,\r\n activatePolygonDraw,\r\n activateSelectFeature,\r\n disableAllInteractions,\r\n finishedDrawingSource,\r\n modifySource,\r\n tempDrawingSource,\r\n} from \"config/interactions\";\r\nimport { FipLayer } from \"interfaces/FipLayer\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { addFeatureToSource, isValid, zoomToFeature } from \"util/ol\";\r\nimport { FipLayerFolder, isFipLayer, Tema } from \"interfaces/IIndberetning\";\r\nimport { ToastContext } from \"./ToastProvider\";\r\nimport { LayoutContext } from \"./LayoutProvider\";\r\nimport { usePrevious } from \"hooks/usePrevious\";\r\nimport { SessionTimerContext } from \"./SessionTimerProvider\";\r\n\r\nexport type DrawTool = undefined | \"point\" | \"line\" | \"polygon\" | \"udpeg\";\r\n\r\nexport type MapState = {\r\n map?: Map;\r\n baselayers: FipLayer[];\r\n layers: (FipLayer | FipLayerFolder)[];\r\n activeDrawTool: DrawTool;\r\n editGeometryState: {\r\n active: boolean;\r\n originalGeometry: Geometry | undefined;\r\n };\r\n hoveredFeatures: (string | number)[];\r\n viewState: {\r\n center: number[];\r\n extent: number[];\r\n resolution: number;\r\n zoom: number;\r\n };\r\n tema: Tema | undefined;\r\n};\r\nexport type MapAction =\r\n | { type: \"SET_MAP\"; map: Map }\r\n | {\r\n type: \"SET_VIEWSTATE\";\r\n viewState: {\r\n center: number[];\r\n resolution: number;\r\n zoom: number;\r\n extent: number[];\r\n };\r\n }\r\n | {\r\n type: \"SET_LAYERS\";\r\n baselayers: FipLayer[];\r\n layers: (FipLayer | FipLayerFolder)[];\r\n }\r\n | {\r\n type: \"SET_LAYER_LOADING\";\r\n layer: FipLayer;\r\n loading: boolean;\r\n }\r\n | {\r\n type: \"SET_VISIBLE_BASELAYER\";\r\n layer: FipLayer;\r\n }\r\n | {\r\n type: \"SET_LAYER_VISIBILITY\";\r\n layer: FipLayer;\r\n visible: boolean;\r\n }\r\n | {\r\n type: \"SET_DRAWTOOL\";\r\n drawTool: DrawTool;\r\n }\r\n | { type: \"SET_HOVERED_FEATURES\"; hoveredFeatures: (string | number)[] }\r\n | {\r\n type: \"EDIT_GEOMETRY\";\r\n geometryToEdit: Feature;\r\n }\r\n | {\r\n type: \"CANCEL_EDIT_GEOMETRY\";\r\n }\r\n | {\r\n type: \"SAVE_EDIT_GEOMETRY\";\r\n clonedGeometry?: Geometry;\r\n }\r\n | { type: \"SET_TEMA\"; tema: Tema | undefined };\r\n\r\nconst initialState: MapState = {\r\n map: undefined,\r\n layers: [],\r\n baselayers: [],\r\n activeDrawTool: undefined,\r\n hoveredFeatures: [],\r\n editGeometryState: {\r\n active: false,\r\n originalGeometry: undefined,\r\n },\r\n viewState: {\r\n center: [0, 0],\r\n extent: [0, 0, 0, 0],\r\n resolution: 0,\r\n zoom: 0,\r\n },\r\n tema: undefined,\r\n};\r\n\r\nexport const MapContext = createContext<{\r\n mapState: MapState;\r\n dispatchToMap: React.Dispatch;\r\n}>({\r\n mapState: initialState,\r\n dispatchToMap: () => null,\r\n});\r\n\r\nconst MapProvider = ({ children }) => {\r\n const toast = useContext(ToastContext);\r\n const { setPaneToShow } = useContext(LayoutContext);\r\n const { resetSessionTimer } = useContext(SessionTimerContext);\r\n const reducer = (state: MapState, action: MapAction): MapState => {\r\n switch (action.type) {\r\n case \"SET_MAP\":\r\n return { ...state, map: action.map };\r\n case \"SET_VIEWSTATE\":\r\n return { ...state, viewState: action.viewState };\r\n case \"SET_LAYERS\":\r\n return {\r\n ...state,\r\n baselayers: action.baselayers,\r\n layers: action.layers,\r\n };\r\n case \"SET_VISIBLE_BASELAYER\": {\r\n const { layer } = action;\r\n return {\r\n ...state,\r\n baselayers: state.baselayers.map((l) => {\r\n if (l === layer) {\r\n l.maplayer.setVisible(true);\r\n l.visible = true;\r\n } else {\r\n l.maplayer.setVisible(false);\r\n l.visible = false;\r\n }\r\n return l;\r\n }),\r\n };\r\n }\r\n case \"SET_LAYER_VISIBILITY\": {\r\n const { layer, visible } = action;\r\n layer.maplayer.setVisible(visible);\r\n return {\r\n ...state,\r\n layers: state.layers.map((l) => {\r\n if (isFipLayer(l)) {\r\n if (l === layer) {\r\n l.visible = visible;\r\n }\r\n } else {\r\n l.layers = l.layers.map((folderLayer) => {\r\n if (folderLayer === layer) {\r\n folderLayer.visible = visible;\r\n }\r\n return folderLayer;\r\n });\r\n }\r\n\r\n return l;\r\n }),\r\n };\r\n }\r\n case \"SET_LAYER_LOADING\": {\r\n const { layer, loading } = action;\r\n let updated = false;\r\n state.baselayers = [\r\n ...state.baselayers.map((l) => {\r\n if (l.title === layer.title) {\r\n updated = true;\r\n return { ...l, loading };\r\n }\r\n return l;\r\n }),\r\n ];\r\n if (!updated) {\r\n state.layers = [\r\n ...state.layers.map((l) => {\r\n if (isFipLayer(l)) {\r\n if (l.title === layer.title) {\r\n updated = true;\r\n return { ...l, loading };\r\n }\r\n } else {\r\n l.layers = l.layers.map((folderLayer) => {\r\n if (folderLayer.title === layer.title) {\r\n updated = true;\r\n return { ...folderLayer, loading };\r\n }\r\n return folderLayer;\r\n });\r\n }\r\n\r\n return l;\r\n }),\r\n ];\r\n }\r\n return updated ? { ...state } : state;\r\n }\r\n case \"SET_DRAWTOOL\":\r\n switch (action.drawTool) {\r\n case undefined:\r\n disableAllInteractions();\r\n break;\r\n case \"point\":\r\n activatePointDraw();\r\n break;\r\n case \"line\":\r\n activateLineDraw();\r\n break;\r\n case \"polygon\":\r\n activatePolygonDraw();\r\n break;\r\n case \"udpeg\":\r\n activateSelectFeature();\r\n break;\r\n }\r\n return { ...state, activeDrawTool: action.drawTool };\r\n case \"SET_HOVERED_FEATURES\":\r\n const hoverableFeatures = finishedDrawingSource\r\n .getFeatures()\r\n .concat(modifySource.getFeatures());\r\n hoverableFeatures.forEach((feature) => {\r\n feature.set(\r\n \"hovered\",\r\n action.hoveredFeatures.indexOf(feature.get(\"id\")) > -1\r\n ? true\r\n : false\r\n );\r\n });\r\n return { ...state, hoveredFeatures: action.hoveredFeatures };\r\n\r\n case \"EDIT_GEOMETRY\": {\r\n cancelEditGeometrySideEffects(state);\r\n\r\n const { geometryToEdit } = action;\r\n const clonedOriginalGeometry = geometryToEdit.clone();\r\n if (finishedDrawingSource.hasFeature(geometryToEdit)) {\r\n finishedDrawingSource.removeFeature(geometryToEdit);\r\n modifySource.addFeature(geometryToEdit);\r\n addFeatureToSource(clonedOriginalGeometry, tempDrawingSource);\r\n if (state.map) zoomToFeature(state.map, geometryToEdit);\r\n }\r\n return {\r\n ...state,\r\n editGeometryState: {\r\n active: true,\r\n originalGeometry: clonedOriginalGeometry.getGeometry(),\r\n },\r\n };\r\n }\r\n case \"SAVE_EDIT_GEOMETRY\": {\r\n const { clonedGeometry } = action;\r\n const modifyFeatures = modifySource.getFeatures();\r\n const modifyFeature =\r\n modifyFeatures.length > 0 ? modifyFeatures[0] : undefined;\r\n const { originalGeometry } = state.editGeometryState;\r\n if (\r\n modifyFeature &&\r\n clonedGeometry &&\r\n originalGeometry &&\r\n !finishedDrawingSource.hasFeature(modifyFeature)\r\n ) {\r\n if (!isValid(clonedGeometry)) {\r\n modifyFeature.setGeometry(originalGeometry.clone());\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Ugyldig geometri\",\r\n message: `Den angivne geometri er ugyldig, hvilket kan skyldes, at geometrien \"krydser\" sig selv. Tegn venligst en ny geometri.`,\r\n },\r\n });\r\n return state;\r\n }\r\n // modifyFeature.setGeometry(originalGeometry);\r\n finishedDrawingSource.addFeature(modifyFeature);\r\n modifySource.clear();\r\n tempDrawingSource.clear();\r\n if (editFeatureCallback) {\r\n editFeatureCallback(modifyFeature);\r\n }\r\n }\r\n return { ...state, editGeometryState: initialState.editGeometryState };\r\n }\r\n case \"CANCEL_EDIT_GEOMETRY\": {\r\n cancelEditGeometrySideEffects(state);\r\n return { ...state, editGeometryState: initialState.editGeometryState };\r\n }\r\n case \"SET_TEMA\": {\r\n return { ...state, tema: action.tema };\r\n }\r\n }\r\n };\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n const { viewState } = state;\r\n useEffect(() => {\r\n resetSessionTimer();\r\n }, [viewState, resetSessionTimer]);\r\n const { activeDrawTool, editGeometryState } = state;\r\n const prevDrawTool = usePrevious(activeDrawTool);\r\n const prevEditState = usePrevious(editGeometryState);\r\n useEffect(() => {\r\n if (!prevDrawTool && activeDrawTool) {\r\n setPaneToShow(\"right\");\r\n } else if (prevDrawTool && !activeDrawTool) {\r\n setPaneToShow(\"left\");\r\n } else if (!prevEditState?.active && editGeometryState.active) {\r\n setPaneToShow(\"right\");\r\n } else if (prevEditState?.active && !editGeometryState.active) {\r\n setPaneToShow(\"left\");\r\n }\r\n }, [\r\n activeDrawTool,\r\n editGeometryState,\r\n prevDrawTool,\r\n prevEditState,\r\n setPaneToShow,\r\n ]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default MapProvider;\r\nfunction cancelEditGeometrySideEffects(state: MapState) {\r\n const { originalGeometry } = state.editGeometryState;\r\n const modifyFeatures = modifySource.getFeatures();\r\n const modifyFeature =\r\n modifyFeatures.length > 0 ? modifyFeatures[0] : undefined;\r\n if (\r\n modifyFeature &&\r\n originalGeometry &&\r\n !finishedDrawingSource.hasFeature(modifyFeature)\r\n ) {\r\n modifyFeature.setGeometry(originalGeometry);\r\n finishedDrawingSource.addFeature(modifyFeature);\r\n modifySource.clear();\r\n tempDrawingSource.clear();\r\n }\r\n}\r\n\r\nlet editFeatureCallback: (feature: Feature) => void;\r\nexport const setEditFeatureCallback = (\r\n callback: (feature: Feature) => void\r\n) => {\r\n editFeatureCallback = callback;\r\n};\r\n","import { authenticationMode, logoutUrl } from \"api\";\r\nimport { keepsessionalive } from \"api/auth\";\r\nimport FocusTrap from \"focus-trap-react\";\r\nimport { useRouter } from \"hooks/useRouter\";\r\nimport {\r\n useEffect,\r\n createContext,\r\n useReducer,\r\n useRef,\r\n useCallback,\r\n useContext,\r\n} from \"react\";\r\nimport { AuthContext } from \"./AuthProvider\";\r\n\r\nexport const SessionTimerContext = createContext<{\r\n resetSessionTimer: () => void;\r\n}>({\r\n resetSessionTimer: () => {},\r\n});\r\nconst SESSION_TIMEOUT_SEC = process.env.REACT_APP_SESSION_TIMEOUT_SEC\r\n ? parseInt(process.env.REACT_APP_SESSION_TIMEOUT_SEC)\r\n : 1200; // defaults to 20 minutes\r\nconst SESSION_TIMEOUT_WARNING_SEC = process.env\r\n .REACT_APP_SESSION_TIMEOUT_WARNING_SEC\r\n ? parseInt(process.env.REACT_APP_SESSION_TIMEOUT_WARNING_SEC)\r\n : 1080; // defaults to 18 minutes\r\nconst SessionTimerProvider = (props: any) => {\r\n const { authState } = useContext(AuthContext);\r\n const { currentUser } = authState;\r\n const [sessionState, dispatch] = useReducer(\r\n (state: SessionState, action: SessionStateAction): SessionState => {\r\n switch (action.type) {\r\n case \"SET_STATE\": {\r\n if (action.state === \"WARNING\") {\r\n return {\r\n ...state,\r\n state: action.state,\r\n warningTimer: SESSION_TIMEOUT_SEC - SESSION_TIMEOUT_WARNING_SEC,\r\n };\r\n } else {\r\n return { ...state, state: action.state };\r\n }\r\n }\r\n case \"COUNT_DOWN\": {\r\n if (state.state === \"WARNING\")\r\n return { ...state, warningTimer: state.warningTimer - 1 };\r\n return state;\r\n }\r\n case \"RESET_SESSION_TIMER\": {\r\n return { ...state, state: \"IDLE\" };\r\n }\r\n }\r\n },\r\n {\r\n state: \"IDLE\",\r\n }\r\n );\r\n const resetSessionTimer = useCallback(() => {\r\n dispatch({ type: \"RESET_SESSION_TIMER\" });\r\n }, []);\r\n\r\n const sessionTimer = useRef | null>(null);\r\n const countdownTimer = useRef | null>(null);\r\n useEffect(() => {\r\n if (\r\n currentUser.isAuthenticated &&\r\n authenticationMode === 2 &&\r\n sessionState.state === \"IDLE\"\r\n ) {\r\n if (sessionTimer.current) {\r\n clearTimeout(sessionTimer.current);\r\n }\r\n sessionTimer.current = setTimeout(() => {\r\n dispatch({ type: \"SET_STATE\", state: \"WARNING\" });\r\n }, SESSION_TIMEOUT_WARNING_SEC * 1000);\r\n }\r\n return () => {\r\n if (sessionTimer.current) {\r\n clearTimeout(sessionTimer.current);\r\n }\r\n };\r\n }, [currentUser, sessionState]);\r\n\r\n useEffect(() => {\r\n if (sessionState.state === \"WARNING\") {\r\n if (sessionState.warningTimer > -1) {\r\n countdownTimer.current = setTimeout(() => {\r\n dispatch({ type: \"COUNT_DOWN\" });\r\n }, 1000);\r\n } else {\r\n dispatch({ type: \"SET_STATE\", state: \"TIMEOUT\" });\r\n if (countdownTimer.current) {\r\n clearTimeout(countdownTimer.current);\r\n }\r\n }\r\n }\r\n return () => {\r\n if (countdownTimer.current) {\r\n clearTimeout(countdownTimer.current);\r\n }\r\n };\r\n }, [sessionState]);\r\n\r\n return (\r\n \r\n {props.children}\r\n dispatch({ type: \"RESET_SESSION_TIMER\" })}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default SessionTimerProvider;\r\n\r\ntype SessionState =\r\n | {\r\n state: \"WARNING\";\r\n warningTimer: number;\r\n }\r\n | {\r\n state: \"IDLE\" | \"TIMEOUT\";\r\n };\r\ntype SessionStateAction =\r\n | {\r\n type: \"SET_STATE\";\r\n state: \"IDLE\" | \"TIMEOUT\" | \"WARNING\";\r\n }\r\n | { type: \"COUNT_DOWN\" }\r\n | { type: \"RESET_SESSION_TIMER\" };\r\n\r\nconst SessionTimeoutWarning = (props: {\r\n sessionState: SessionState;\r\n resetTimer: () => void;\r\n}) => {\r\n const { sessionState, resetTimer } = props;\r\n const { appRoot } = useRouter();\r\n useEffect(() => {\r\n if (sessionState.state === \"TIMEOUT\") {\r\n setTimeout(() => {\r\n window.location.assign(`${logoutUrl}?returnUrl=/${appRoot}`);\r\n }, 2000);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [sessionState.state]);\r\n if (sessionState.state === \"IDLE\") return null;\r\n const timeString = (seconds: number): string => {\r\n if (seconds > 119) {\r\n return `${Math.round(seconds / 60)} minutter`;\r\n }\r\n if (seconds > 60) {\r\n return \"Lidt over et minut\";\r\n }\r\n if (seconds === 1) return \"1 sekund\";\r\n return `${seconds} sekunder`;\r\n };\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n {sessionState.state === \"WARNING\" && (\r\n

Du er ved at blive logget ud

\r\n )}\r\n {sessionState.state === \"TIMEOUT\" && (\r\n

Du bliver nu logget ud

\r\n )}\r\n
\r\n
\r\n {sessionState.state === \"WARNING\" && (\r\n <>\r\n

\r\n Du har været inaktiv et stykke tid, så du er ved at blive\r\n logget ud. Ønsker du at fortsætte, eller bare logge ud nu?\r\n Ændringer du har lavet vil ikke blive gemt.\r\n

\r\n

\r\n Tid til automatisk logud:{\" \"}\r\n {timeString(sessionState.warningTimer)}\r\n

\r\n \r\n )}\r\n {sessionState.state === \"TIMEOUT\" && (\r\n

På grund af inaktivitet

\r\n )}\r\n \r\n {\r\n const res = async () => {\r\n try {\r\n await keepsessionalive(\r\n appRoot === \"kort\" ? \"\" : `${appRoot}/`\r\n );\r\n resetTimer();\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n };\r\n res();\r\n }}\r\n >\r\n Fortsæt\r\n \r\n \r\n Log ud\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n );\r\n};\r\n","import { format } from \"date-fns\";\r\nimport { da } from \"date-fns/locale\";\r\n\r\nexport function formatDateString(\r\n dateString: string,\r\n dateformat?: string\r\n): string {\r\n return format(\r\n new Date(dateString),\r\n dateformat ? dateformat : \"dd.MM.yyyy HH:mm\",\r\n { locale: da }\r\n );\r\n}\r\n\r\n/**\r\n *\r\n * @param dateString string that can be converted to Date using new Date(dateString)\r\n * @returns dotted datestring on the format dd.MM.yyyy\r\n */\r\nexport function formatDottedDate(dateString: string): string {\r\n return format(new Date(dateString), \"dd.MM.yyyy\", { locale: da });\r\n}\r\n\r\n/**\r\n *\r\n * @param dateString string that can be converted to Date using new Date(dateString)\r\n * @returns dashed datestring on the format dd-MM-yyyy\r\n */\r\nexport function formatDashedDate(dateString: string): string {\r\n return format(new Date(dateString), \"dd-MM-yyyy\", { locale: da });\r\n}\r\n","import { Objekttype, SagsbehandlingApi } from \"api/interfaces\";\r\nimport { getFilterValues, getFilterValueUrlString } from \"api/util\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\nimport { FeatureCollection } from \"geojson\";\r\nimport { formatDateString } from \"util/date\";\r\nimport { del, get, post, put } from \"..\";\r\nimport {\r\n convertIndberetningDTO,\r\n ExpandedIndberetningDTO,\r\n Hoeringssag,\r\n Ressource,\r\n IFileUploadResponse,\r\n Indberetning,\r\n IndberetningDTO,\r\n Indlaeg,\r\n RessourceRolleIdEnum,\r\n statusIdEnum,\r\n Hoeringsmappe,\r\n Sagsakt,\r\n} from \"../../interfaces/IIndberetning\";\r\n\r\nexport const getIndberetninger = async (options: {\r\n personId: number;\r\n rolleId: number;\r\n filterId: number;\r\n searchEmne?: string;\r\n searchBeskrivelse?: string;\r\n extent?: number[];\r\n}): Promise => {\r\n const { filterId, personId, rolleId, searchBeskrivelse, searchEmne, extent } =\r\n options;\r\n try {\r\n const filterValues = getFilterValues(extent, searchEmne, searchBeskrivelse);\r\n const iDTOs = await get({\r\n query: `api/saginfo?filterId=${filterId}&rolleId=${rolleId}&personId=${personId}&domaeneTypes=&filterValues=${filterValues}&page=1&start=0&limit=25`,\r\n });\r\n return iDTOs.map((i) => convertIndberetningDTO(i));\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const getIndberetning = async (\r\n indberetningId: number,\r\n personId: number\r\n): Promise => {\r\n try {\r\n const iDTO = await get({\r\n query: `api/hoeringssager/${indberetningId}?filterId=0&personId=${personId}&id=${indberetningId}`,\r\n });\r\n return iDTO;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const postIndberetning = async (\r\n personId: number,\r\n email: string,\r\n body: Hoeringssag\r\n): Promise => {\r\n try {\r\n //http://fip.cust.septima.dk/api/sager?personId=4&email=xxx%40yyy.dk\r\n const iDTO = await post({\r\n query: `api/sager/?personId=${personId}&email=${email}`,\r\n body,\r\n });\r\n return convertIndberetningDTO(iDTO);\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const uploadFile = async (\r\n formData: FormData\r\n): Promise => {\r\n try {\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: \"upload\",\r\n body: formData,\r\n });\r\n const resp = JSON.parse(\r\n r\r\n .replace(\"success\", '\"success\"')\r\n .replace(\"id\", '\"id\"')\r\n .replace(\"originalFilNavn\", '\"originalFilNavn\"')\r\n .replace(\"errormsg\", '\"errormsg\"')\r\n .replaceAll(\"'\", '\"')\r\n );\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const downloadFiles = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n try {\r\n const download = await get({\r\n query: `download/zip/?sagId=${indberetning.id}&personId=${user.personId}`,\r\n headers: {\r\n responseType: \"arraybuffer\",\r\n headers: {\r\n \"Content-Type\": \"multipart/form-data\",\r\n },\r\n },\r\n });\r\n return download;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const skrivChatBesked = async (\r\n personId: number,\r\n sagId: number,\r\n body: Indlaeg\r\n): Promise => {\r\n try {\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/indlaeg/?personId=${personId}&sagId=${sagId}`,\r\n body: body,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const tagIndberetning = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag,\r\n statusId: statusIdEnum\r\n): Promise => {\r\n try {\r\n let nyRessource: any = {\r\n email: \"\",\r\n fraTs: null,\r\n id: 0,\r\n navn: \"\",\r\n organisationId: 0,\r\n organisationsnavn: \"\",\r\n personId: user.personId,\r\n rolleId: RessourceRolleIdEnum.sagsbehandler,\r\n tilTs: null,\r\n \"fipbase.model.sag_id\": indberetning.id, // TODO: type this?\r\n };\r\n\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/ressourcer/?personId=${user.personId}&sagId=${indberetning.id}&statusId=${statusId}`,\r\n body: nyRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const tagIndberetningFraSagsbehandler = async (\r\n user: Bruger,\r\n ressource: Ressource\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/ressourcer/${ressource.id}?personId=${user.personId}`,\r\n body: ressource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const opretHoeringssag = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/hoeringssager/${indberetning.id}?personId=${user.personId}&updateMode=1`,\r\n body: indberetning,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const tagHoeringssagFraHoeringspart = async (\r\n user: Bruger,\r\n ressource: Ressource\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/ressourcer/${ressource.id}?personId=${user.personId}`,\r\n body: ressource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const afbrydHoering = async (\r\n currentUser: Bruger,\r\n daværendeRessource: Ressource,\r\n indberetning: Hoeringssag,\r\n statusId: statusIdEnum\r\n): Promise => {\r\n try {\r\n const r = await del({\r\n query: `api/ressourcer/${daværendeRessource.id}?personId=${currentUser.personId}&sagId=${indberetning.id}&statusId=${statusId}`,\r\n body: daværendeRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const redigerHoeringspartMappe = async (\r\n user: Bruger,\r\n hoeringspartmappe: Hoeringsmappe\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/hoeringsmappe/${hoeringspartmappe.id}?personId=${user.personId}`,\r\n body: hoeringspartmappe,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const redigerIndberetning = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/hoeringssager/${indberetning.id}?personId=${user.personId}`,\r\n body: indberetning,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const videresendIndberetning = async (\r\n personId: number, // person der skal overtage sagen\r\n currentUser: Ressource // den person der havde sagen før\r\n): Promise => {\r\n try {\r\n // Update the personId\r\n let nyRessource = { ...currentUser, ...{ personId: personId } };\r\n\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/ressourcer/${currentUser.id}?personId=${currentUser.personId}`,\r\n body: nyRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const videresendIndberetningTilHoering = async (\r\n currentUser: Bruger, // person der videresender\r\n personIdHoeringsPart: number, // Høringsparten\r\n indberetning: Hoeringssag,\r\n kommentar: string\r\n): Promise => {\r\n try {\r\n // Update the personId\r\n let nyRessource: any = {\r\n email: \"\",\r\n fraTs: null,\r\n id: 0,\r\n navn: \"\",\r\n organisationId: 0,\r\n organisationsnavn: \"\",\r\n personId: personIdHoeringsPart,\r\n rolleId: RessourceRolleIdEnum.høringspart,\r\n tilTs: null,\r\n \"fipbase.model.sag_id\": indberetning.id,\r\n };\r\n\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/ressourcer?personId=${currentUser.personId}&sagId=${indberetning.sagsnummer}&statusId=${statusIdEnum.iHoering}&indlaeg=${kommentar}`,\r\n body: nyRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const videresendIndberetningTilHoeringInternt = async (\r\n currentUser: Bruger, // person der videresender\r\n ressourceId: number, // id på ressourcen der videresender\r\n personIdHoeringsPart: number, // Høringsparten\r\n indberetning: Hoeringssag,\r\n kommentar: string\r\n): Promise => {\r\n try {\r\n // Update the personId\r\n let nyRessource: any = {\r\n email: \"\",\r\n //fraTs: null,\r\n id: 0,\r\n navn: \"\",\r\n organisationId: 0,\r\n organisationsnavn: \"\",\r\n personId: personIdHoeringsPart,\r\n rolleId: RessourceRolleIdEnum.høringspart,\r\n tilTs: null,\r\n \"fipbase.model.sag_id\": indberetning.id,\r\n };\r\n\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/ressourcer/${ressourceId}?personId=${currentUser.personId}&sagId=${indberetning.sagsnummer}&statusId=${statusIdEnum.iHoering}&indlaeg=${kommentar}`,\r\n body: nyRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const afslutHoeringsbehandling = async (\r\n currentUser: Bruger,\r\n indberetning: Hoeringssag,\r\n høringspart: Ressource\r\n): Promise => {\r\n try {\r\n // Get the current date in the correct format\r\n const r = await del({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/ressourcer/${høringspart.id}?personId=${currentUser.personId}&sagId=${indberetning.id}&statusId=5`,\r\n body: høringspart,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nconst objekttyperCache: any = {};\r\nvar personerCache: Objekttype[] = [];\r\nvar hoeringsPersonerCache: Objekttype[] = [];\r\n\r\nexport const getObjekttyper = async (\r\n domaeneId: number\r\n): Promise => {\r\n try {\r\n if (objekttyperCache[domaeneId.toString()]) {\r\n return objekttyperCache[domaeneId.toString()];\r\n } else {\r\n const objekttyper = await get<{ value: number; text: string }[]>({\r\n query: `api/objekttype?domaeneId=${domaeneId}&page=1&start=0&limit=25`,\r\n });\r\n objekttyperCache[domaeneId.toString()] = objekttyper;\r\n return objekttyper;\r\n }\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const getPersoner = async (\r\n currentUser: Bruger\r\n): Promise => {\r\n try {\r\n // If the cache has data, and the currentuser is NOT in the cache, it's fine\r\n if (\r\n personerCache.length > 0 &&\r\n !personerCache.find((p) => p.value === currentUser.personId)\r\n ) {\r\n return personerCache;\r\n } else {\r\n // Else we need to update the cache\r\n const personer = await get<{ value: number; text: string }[]>({\r\n query: `api/sagsbehandler?personId=${currentUser.personId}`,\r\n });\r\n personerCache = personer;\r\n return personerCache;\r\n }\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const getHoeringsPersoner = async (\r\n currentUser: Bruger,\r\n organisationsId: number | undefined\r\n): Promise => {\r\n try {\r\n // If the cache has data, and the currentuser is NOT in the cache, it's fine\r\n if (\r\n hoeringsPersonerCache.length > 0 &&\r\n !hoeringsPersonerCache.find((p) => p.value === currentUser.personId)\r\n ) {\r\n return hoeringsPersonerCache;\r\n } else {\r\n // Else we need to update the cache\r\n let query;\r\n if (organisationsId) {\r\n query = `api/hoeringspart?personId=${currentUser.personId}&organisationId=${organisationsId}`;\r\n } else {\r\n query = `api/hoeringspart?personId=${currentUser.personId}&domaeneTypeId=10`;\r\n }\r\n const personer = await get<{ value: number; text: string }[]>({\r\n query: query,\r\n });\r\n hoeringsPersonerCache = personer;\r\n return hoeringsPersonerCache;\r\n }\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const redigerSagsakt = async (\r\n currentUser: Bruger,\r\n id: number,\r\n beskrivelse: string,\r\n openLayersId: string\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsakt = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: id,\r\n openLayersId: openLayersId,\r\n };\r\n // Get the current date in the correct format\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/sagsakter/${id}?personId=${currentUser.personId}`,\r\n body: nySagsakt,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const uploadAendringsforslagGeometri = async (\r\n currentUser: Bruger,\r\n aendringTypeId: number,\r\n aendringType: string,\r\n beskrivelse: string,\r\n featureType: string,\r\n featureTypeId: number,\r\n geometri: string,\r\n geometriType: string,\r\n openLayersId: string,\r\n mappeId: number\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nytAendringsforslag = {\r\n aendringType: aendringType,\r\n aendringTypeId: aendringTypeId,\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: 0,\r\n featureType: featureType,\r\n featureTypeId: featureTypeId,\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: openLayersId,\r\n originalFilNavn: \"\",\r\n supplinfo: \"\",\r\n udpeget: false,\r\n url: \"\",\r\n };\r\n // Get the current date in the correct format\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/aendringsforslag?personId=${currentUser.personId}&mappeId=${mappeId}`,\r\n body: nytAendringsforslag,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n/* Ret PUT */\r\nexport const redigerAendringsforslag = async (\r\n currentUser: Bruger,\r\n aendringTypeId: number,\r\n aendringType: string,\r\n id: number,\r\n beskrivelse: string,\r\n featureType: string,\r\n featureTypeId: number,\r\n geometri: string,\r\n geometriType: string,\r\n openLayersId: string\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nytAendringsforslag = {\r\n aendringType: aendringType,\r\n aendringTypeId: aendringTypeId,\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: id,\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n featureType: featureType,\r\n featureTypeId: featureTypeId,\r\n openLayersId: openLayersId,\r\n };\r\n // Get the current date in the correct format\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/aendringsforslag/${id}?personId=${currentUser.personId}`,\r\n body: nytAendringsforslag,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const uploadSagsaktGeometri = async (\r\n currentUser: Bruger,\r\n id: number,\r\n beskrivelse: string,\r\n openLayersId: string,\r\n geometri: string,\r\n geometriType: string,\r\n udpeget: boolean,\r\n mappeId: number\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsakt = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: 0,\r\n filId: 0,\r\n openLayersId: openLayersId,\r\n nr: 0, // TODO: check om dette skal sættes korrekt\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n mimetype: \"\",\r\n originalFilNavn: \"\",\r\n supplInfo: \"\",\r\n udpeget: udpeget,\r\n url: \"\",\r\n };\r\n // Get the current date in the correct format\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/sagsakter?personId=${currentUser.personId}&mappeId=${mappeId}`,\r\n body: nySagsakt,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const redigerSagsaktGeometri = async (\r\n currentUser: Bruger,\r\n id: number,\r\n beskrivelse: string,\r\n geometri: string\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsaktGeometri = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: id,\r\n geometri: geometri,\r\n };\r\n // Get the current date in the correct format\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/sagsakter/${id}?personId=${currentUser.personId}`,\r\n body: nySagsaktGeometri,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const uploadSagsaktFil = async (\r\n currentUser: Bruger,\r\n beskrivelse: string,\r\n filId: number,\r\n geometri: string,\r\n originalFilNavn: string,\r\n openLayersId: string,\r\n geometriType: string,\r\n udpeget: boolean,\r\n mappeId: number\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsakt = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: 0,\r\n filId: filId,\r\n openLayersId: openLayersId,\r\n nr: 0, // TODO: check om dette skal sættes korrekt\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n mimetype: \"\",\r\n originalFilNavn: originalFilNavn,\r\n supplInfo: \"\",\r\n udpeget: udpeget,\r\n url: \"\",\r\n };\r\n // Get the current date in the correct format\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/sagsakter?personId=${currentUser.personId}&mappeId=${mappeId}`,\r\n body: nySagsakt,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const deleteSagsakt = async (\r\n currentUser: Bruger,\r\n id: number\r\n): Promise => {\r\n try {\r\n // Get the current date in the correct format\r\n const r = await del({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/sagsakter/${id}?personId=${currentUser.personId}`,\r\n body: { id: id },\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const deleteAendringsforslag = async (\r\n currentUser: Bruger,\r\n id: number\r\n): Promise => {\r\n try {\r\n // Get the current date in the correct format\r\n const r = await del({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/aendringsforslag/${id}?personId=${currentUser.personId}`,\r\n body: { id: id },\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const afslutIndberetning = async (\r\n kommentar: string,\r\n currentUser: Bruger,\r\n id: number,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n try {\r\n // First post the komment as an indlaeg.\r\n let indlaeg = {\r\n id: 0,\r\n indhold: kommentar,\r\n organisationForkortelse: \"\",\r\n organisationId: 0,\r\n organisationNavn: \"\",\r\n personId: currentUser.personId,\r\n personNavn: \"\",\r\n ts: \"\",\r\n typeId: 5,\r\n typeNavn: \"\",\r\n };\r\n const r1 = skrivChatBesked(currentUser.personId, id, indlaeg);\r\n const resp1 = JSON.parse(JSON.stringify(r1)); // Gets rid of single-quotes\r\n if (resp1.errormsg) Promise.reject(resp1);\r\n\r\n // Get the current date in the correct format\r\n const r = await del({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `api/hoeringssager/${id}?personId=${currentUser.personId}`,\r\n body: indberetning,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const getFipFeatureInfo = async (options: {\r\n personId: number;\r\n rolleId: number;\r\n filterId: number;\r\n searchEmne?: string;\r\n searchBeskrivelse?: string;\r\n extent: number[];\r\n height;\r\n width: number;\r\n x: number;\r\n y: number;\r\n}) => {\r\n const {\r\n filterId,\r\n personId,\r\n rolleId,\r\n searchBeskrivelse,\r\n searchEmne,\r\n extent,\r\n height,\r\n width,\r\n x,\r\n y,\r\n } = options;\r\n try {\r\n const queryParams: any = {\r\n service: \"WMS\",\r\n Version: \"1.1.1\",\r\n request: \"GetFeatureInfo\",\r\n LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n QUERY_LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n FORMAT: \"application/json\",\r\n INFO_FORMAT: \"application/json\",\r\n SRS: \"EPSG:25832\",\r\n BBOX: extent.join(\",\"),\r\n FEATURE_COUNT: 10,\r\n height,\r\n width,\r\n x,\r\n y,\r\n VIEWPARAMS: `applikationId:1;domaeneTypeIds:;filterId:${\r\n filterId === 6 ? 4 : filterId\r\n };personId:${personId};rolleId:${rolleId};filterValues:${getFilterValueUrlString(\r\n searchEmne,\r\n searchBeskrivelse\r\n )}`,\r\n };\r\n const featureCollection = await get({\r\n query: `${process.env.REACT_APP_API_BASEURL}proxy.ashx?${new URLSearchParams(queryParams).toString()}`,\r\n });\r\n return featureCollection;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const sagsbehandlingApi: SagsbehandlingApi = {\r\n afbrydHoering,\r\n afslutIndberetning,\r\n deleteAendringsforslag,\r\n deleteSagsakt,\r\n getIndberetning,\r\n getObjekttyper,\r\n getPersoner,\r\n opretHoeringssag,\r\n redigerAendringsforslag,\r\n redigerIndberetning,\r\n redigerSagsakt,\r\n redigerSagsaktGeometri,\r\n skrivChatBesked,\r\n tagIndberetning,\r\n tagIndberetningFraSagsbehandler,\r\n uploadAendringsforslagGeometri,\r\n uploadFile,\r\n uploadSagsaktFil,\r\n uploadSagsaktGeometri,\r\n videresendIndberetning,\r\n};\r\n","import { Tema } from \"interfaces/IIndberetning\";\r\nimport {\r\n bygningerWFSLayer,\r\n topoSkærmkort,\r\n fipSagWMSLayer,\r\n ortofoto,\r\n geodanmark,\r\n topoSkærmkortGraa,\r\n kommunegrænser,\r\n fireCmHistorisk,\r\n højeMålestoksblade,\r\n laveMålestoksblade,\r\n adresser,\r\n matrikler,\r\n vejogstimidteWFSLayer,\r\n kort25,\r\n kort50,\r\n kort100,\r\n kort200,\r\n dhmOverflade,\r\n dhmTerræn,\r\n udvalgteGeoDKTemaer,\r\n vejkantWFSLayer,\r\n søWFSLayer,\r\n vandløbWFSLayer,\r\n} from \"./layers\";\r\n\r\nconst defaultLayerSet = [\r\n {\r\n loading: false,\r\n maplayer: kommunegrænser,\r\n title: kommunegrænser.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: adresser,\r\n title: adresser.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: matrikler,\r\n title: matrikler.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: vejogstimidteWFSLayer,\r\n title: vejogstimidteWFSLayer.get(\"title\"),\r\n visible: false,\r\n featuresSelectable: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: bygningerWFSLayer,\r\n title: bygningerWFSLayer.get(\"title\"),\r\n visible: false,\r\n featuresSelectable: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: fipSagWMSLayer,\r\n title: fipSagWMSLayer.get(\"title\"),\r\n visible: true,\r\n },\r\n];\r\nexport const tema: Tema[] = [\r\n {\r\n name: \"Oversigt\",\r\n id: 1,\r\n domainId: 0,\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: \"GeoDanmark\",\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: topoSkærmkort,\r\n title: \"Skærmkort\",\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: \"Ortofoto\",\r\n visible: false,\r\n },\r\n ],\r\n layers: [\r\n {\r\n loading: false,\r\n maplayer: kommunegrænser,\r\n title: kommunegrænser.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: fipSagWMSLayer,\r\n title: fipSagWMSLayer.get(\"title\"),\r\n visible: true,\r\n },\r\n ],\r\n baseLayerId: \"baseGeoDanmark\",\r\n },\r\n {\r\n name: \"Skærmkort\",\r\n id: 2,\r\n domainId: 1,\r\n baseLayerId: \"baseGeoDanmark\",\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: \"GeoDanmark\",\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: topoSkærmkort,\r\n title: \"Skærmkort\",\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: topoSkærmkortGraa,\r\n title: \"Skærmkort gråtone\",\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: fireCmHistorisk,\r\n title: fireCmHistorisk.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: højeMålestoksblade,\r\n title: højeMålestoksblade.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: laveMålestoksblade,\r\n title: laveMålestoksblade.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: \"Ortofoto\",\r\n visible: false,\r\n },\r\n ],\r\n layers: defaultLayerSet,\r\n },\r\n {\r\n name: \"Kort25\",\r\n id: 4,\r\n domainId: 1,\r\n baseLayerId: \"baseGeoDanmark\",\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: geodanmark.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: fireCmHistorisk,\r\n title: fireCmHistorisk.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: højeMålestoksblade,\r\n title: højeMålestoksblade.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: laveMålestoksblade,\r\n title: laveMålestoksblade.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: kort25,\r\n title: kort25.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: ortofoto.get(\"title\"),\r\n visible: false,\r\n },\r\n ],\r\n layers: defaultLayerSet,\r\n },\r\n {\r\n name: \"Kort50\",\r\n id: 5,\r\n domainId: 1,\r\n baseLayerId: \"baseGeoDanmark\",\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: geodanmark.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: højeMålestoksblade,\r\n title: højeMålestoksblade.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: laveMålestoksblade,\r\n title: laveMålestoksblade.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: kort25,\r\n title: kort25.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: kort50,\r\n title: kort50.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: ortofoto.get(\"title\"),\r\n visible: false,\r\n },\r\n ],\r\n layers: defaultLayerSet,\r\n },\r\n {\r\n name: \"Kort100\",\r\n id: 6,\r\n domainId: 1,\r\n baseLayerId: \"baseGeoDanmark\",\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: geodanmark.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: kort50,\r\n title: kort50.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: kort100,\r\n title: kort100.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: ortofoto.get(\"title\"),\r\n visible: false,\r\n },\r\n ],\r\n layers: defaultLayerSet,\r\n },\r\n {\r\n name: \"Kort200 - Færdselskort\",\r\n id: 7,\r\n domainId: 1,\r\n baseLayerId: \"baseGeoDanmark\",\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: geodanmark.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: kort100,\r\n title: kort100.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: kort200,\r\n title: kort200.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: ortofoto.get(\"title\"),\r\n visible: false,\r\n },\r\n ],\r\n layers: defaultLayerSet,\r\n },\r\n {\r\n name: \"GeoDanmark\",\r\n id: 8,\r\n domainId: 10,\r\n baseLayerId: \"baseGeoDanmark\",\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: geodanmark.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: topoSkærmkort,\r\n title: \"Skærmkort\",\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: ortofoto.get(\"title\"),\r\n visible: false,\r\n },\r\n ],\r\n layers: [\r\n {\r\n loading: false,\r\n maplayer: adresser,\r\n title: adresser.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: udvalgteGeoDKTemaer,\r\n title: udvalgteGeoDKTemaer.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: bygningerWFSLayer,\r\n title: bygningerWFSLayer.get(\"title\"),\r\n visible: false,\r\n featuresSelectable: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: vejogstimidteWFSLayer,\r\n title: vejogstimidteWFSLayer.get(\"title\"),\r\n visible: false,\r\n featuresSelectable: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: vejkantWFSLayer,\r\n title: vejkantWFSLayer.get(\"title\"),\r\n visible: false,\r\n featuresSelectable: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: søWFSLayer,\r\n title: søWFSLayer.get(\"title\"),\r\n visible: false,\r\n featuresSelectable: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: vandløbWFSLayer,\r\n title: vandløbWFSLayer.get(\"title\"),\r\n visible: false,\r\n featuresSelectable: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: matrikler,\r\n title: matrikler.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: fipSagWMSLayer,\r\n title: fipSagWMSLayer.get(\"title\"),\r\n visible: true,\r\n },\r\n ],\r\n },\r\n {\r\n name: \"Danmarks Højdemodel (DHM)\",\r\n id: 9,\r\n domainId: 3,\r\n baseLayerId: \"baseGeoDanmark\",\r\n baseLayers: [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: geodanmark.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: dhmOverflade,\r\n title: dhmOverflade.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: dhmTerræn,\r\n title: dhmTerræn.get(\"title\"),\r\n visible: false,\r\n },\r\n ],\r\n layers: [\r\n {\r\n loading: false,\r\n maplayer: fipSagWMSLayer,\r\n title: fipSagWMSLayer.get(\"title\"),\r\n visible: true,\r\n },\r\n ],\r\n },\r\n];\r\ntype Kode = { id: number; name: string; className?: string };\r\n\r\nexport const statusStore: Kode[] = [\r\n { id: 1, name: \"Modtaget\", className: \"bg-warning\" },\r\n { id: 2, name: \"Afsluttet\", className: \"bg-danger\" },\r\n { id: 3, name: \"Afventer indberetter\", className: \"bg-warning\" },\r\n { id: 4, name: \"Afventer anden myndighed\", className: \"bg-warning\" },\r\n { id: 5, name: \"Under behandling\", className: \"bg-success\" },\r\n { id: 10, name: \"Oprettet\", className: \"bg-primary\" },\r\n { id: 11, name: \"Behandling PD\", className: \"bg-warning\" },\r\n { id: 12, name: \"I høring\", className: \"bg-horing\" },\r\n { id: 13, name: \"Behandling GST\", className: \"bg-warning\" },\r\n { id: 14, name: \"Klarmeldt til DagiSys\", className: \"bg-warning\" },\r\n { id: 15, name: \"Afsluttet GST\", className: \"bg-danger\" },\r\n { id: 16, name: \"Afsluttet\", className: \"bg-danger\" },\r\n { id: 20, name: \"Klarmeldt til DSSYS\", className: \"bg-warning\" },\r\n { id: 21, name: \"Overført til DSSYS\", className: \"bg-horing\" },\r\n];\r\n\r\nexport const rolleStore: Kode[] = [\r\n { id: 0, name: \"Anonym\" },\r\n { id: 1, name: \"Indberetter\" },\r\n { id: 2, name: \"Sagsbehandler\" },\r\n { id: 3, name: \"Høringsansvarlig\" },\r\n { id: 4, name: \"Høringspart\" },\r\n { id: 5, name: \"Høringsansvarlig\" },\r\n];\r\n\r\nexport const prioritetStore: Kode[] = [\r\n { id: 0, name: \"Ikke prioriteret\" },\r\n { id: 1, name: \"Lav\" },\r\n { id: 2, name: \"Mellem\" },\r\n { id: 3, name: \"Høj\" },\r\n];\r\n\r\nexport type DomeneType =\r\n | { id: -1; name: \"Ukendt domenetype\" }\r\n | { id: 1; name: \"Landkort\" }\r\n | { id: 2; name: \"Søkort\" }\r\n | { id: 3; name: \"Højdemodel\" }\r\n | { id: 4; name: \"Ortofotos\" }\r\n | { id: 5; name: \"Stednavn\" }\r\n | { id: 6; name: \"Matrikel\" }\r\n | { id: 7; name: \"Fikspunkt\" }\r\n | { id: 8; name: \"Postnummer\" }\r\n | { id: 9; name: \"Sogn\" }\r\n | { id: 10; name: \"GeoDanmark\" };\r\n\r\nexport const domeneTyper: DomeneType[] = [\r\n { id: 1, name: \"Landkort\" },\r\n { id: 2, name: \"Søkort\" },\r\n { id: 3, name: \"Højdemodel\" },\r\n { id: 4, name: \"Ortofotos\" },\r\n { id: 5, name: \"Stednavn\" },\r\n { id: 6, name: \"Matrikel\" },\r\n { id: 7, name: \"Fikspunkt\" },\r\n { id: 8, name: \"Postnummer\" },\r\n { id: 9, name: \"Sogn\" },\r\n { id: 10, name: \"GeoDanmark\" },\r\n];\r\nexport function getDomeneTypeById(id: number) {\r\n const dt = domeneTyper.find((f) => f.id === id);\r\n return dt ? dt : { id: -1, name: \"Ukendt domenetype\" };\r\n}\r\n\r\n// todo: remove?\r\nexport const domaeneStore: Kode[] = [\r\n { id: 1, name: \"Landkort\" },\r\n { id: 2, name: \"Søkort\" },\r\n { id: 3, name: \"Højdemodel\" },\r\n { id: 4, name: \"Ortofotos\" },\r\n { id: 5, name: \"Stednavn\" },\r\n { id: 6, name: \"Matrikel\" },\r\n { id: 7, name: \"Fikspunkt\" },\r\n { id: 8, name: \"Postnummer\" },\r\n { id: 9, name: \"Sogn\" },\r\n { id: 10, name: \"GeoDanmark\" },\r\n];\r\n\r\nexport const filtersForRolle: {\r\n rolleId: number;\r\n filterValues: number[];\r\n}[] = [\r\n { rolleId: 0, filterValues: [0, 9] }, // Gæst\r\n { rolleId: 1, filterValues: [0, 3, 4, 6, 9] }, // Indberetter\r\n { rolleId: 2, filterValues: [0, 1, 2, 3, 4, 5, 6, 9] }, // Sagsbehandler\r\n { rolleId: 4, filterValues: [0, 3, 4, 6, 9] }, // Høringspart\r\n];\r\n\r\nexport function getFilterValuesByRolleId(rolleId: number) {\r\n const filter = filtersForRolle.find((f) => f.rolleId === rolleId);\r\n return filter ? filter : filtersForRolle[0];\r\n}\r\n","import { getSearchFilterByValue, SearchFilter } from \"interfaces/IIndberetning\";\r\nimport { createContext, useContext, useEffect, useState } from \"react\";\r\nimport { AuthContext, Bruger } from \"./AuthProvider\";\r\nimport { MapContext } from \"./MapProvider\";\r\n\r\nexport const IndberetningFilterContext = createContext<{\r\n filter: SearchFilter;\r\n setFilter: React.Dispatch>;\r\n filters: SearchFilter[];\r\n setFilters: React.Dispatch>;\r\n search: {\r\n emne: string;\r\n beskrivelse: string;\r\n };\r\n setSearch: React.Dispatch<\r\n React.SetStateAction<{\r\n emne: string;\r\n beskrivelse: string;\r\n }>\r\n >;\r\n searchInputText: {\r\n emne: string;\r\n beskrivelse: string;\r\n };\r\n setSearchInputText: React.Dispatch<\r\n React.SetStateAction<{\r\n emne: string;\r\n beskrivelse: string;\r\n }>\r\n >;\r\n searchExtent: number[];\r\n currentUser: Bruger;\r\n}>({\r\n filter: { value: 0, text: \"Aktive\" },\r\n setFilter: () => {},\r\n filters: [],\r\n setFilters: () => {},\r\n search: { beskrivelse: \"\", emne: \"\" },\r\n setSearch: () => {},\r\n searchInputText: { beskrivelse: \"\", emne: \"\" },\r\n setSearchInputText: () => {},\r\n searchExtent: [0, 0, 0, 0],\r\n currentUser: { navn: \"\", personId: 0, rolleId: 0 },\r\n});\r\n\r\nconst IndberetningFilterProvider = ({ children }) => {\r\n const { authState } = useContext(AuthContext);\r\n const { currentUser } = authState;\r\n const { mapState } = useContext(MapContext);\r\n const { viewState } = mapState;\r\n const { extent } = viewState;\r\n const [filter, setFilter] = useState(getSearchFilterByValue(0));\r\n const [filters, setFilters] = useState([]);\r\n const [search, setSearch] = useState<{\r\n emne: string;\r\n beskrivelse: string;\r\n }>({\r\n emne: \"\",\r\n beskrivelse: \"\",\r\n });\r\n const [searchInputText, setSearchInputText] = useState<{\r\n emne: string;\r\n beskrivelse: string;\r\n }>({\r\n emne: \"\",\r\n beskrivelse: \"\",\r\n });\r\n const [searchExtent, setSearchExtent] = useState(extent);\r\n useEffect(() => {\r\n if (filter.text === \"Alle indenfor kortvindue\") {\r\n setSearchExtent(extent);\r\n }\r\n }, [extent, filter]);\r\n\r\n useEffect(() => {\r\n if (filters.length && filters.indexOf(filter) < 0) {\r\n setFilter(filters[0]);\r\n }\r\n }, [filters, filter, setFilter]);\r\n\r\n // nulstil beskrivelse dersom man skifter til en rolle der\r\n // ikke kan søge i beskrivelse.\r\n useEffect(() => {\r\n if (currentUser.rolleId !== 2) {\r\n setSearchInputText((prev) => {\r\n return { ...prev, beskrivelse: \"\" };\r\n });\r\n }\r\n }, [currentUser.rolleId, setSearchInputText]);\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\nexport default IndberetningFilterProvider;\r\n","export default function ChevronRight(props: {\r\n class?: string;\r\n ariaLabel?: string;\r\n}) {\r\n const { ariaLabel } = props;\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-chevron-right\";\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import { useHistory } from \"react-router\";\r\nimport ChevronRight from \"components/icons/ChevronRight\";\r\nimport { Indberetning } from \"interfaces/IIndberetning\";\r\nimport { getDomeneTypeById, statusStore } from \"config/FipConfig\";\r\nimport { formatDashedDate, formatDottedDate } from \"util/date\";\r\nimport { bboxLayer } from \"config/layers\";\r\nimport { addFeatureToSource } from \"util/ol\";\r\nimport { useEffect } from \"react\";\r\n\r\ninterface IIndberetningListItemProps {\r\n indberetning: Indberetning;\r\n showDomain: boolean;\r\n}\r\nexport default function IndberetningListItem(\r\n props: IIndberetningListItemProps\r\n) {\r\n const { indberetning, showDomain } = props;\r\n const bboxSource = bboxLayer.getSource();\r\n const history = useHistory();\r\n useEffect(() => {\r\n return () => {\r\n bboxSource.clear();\r\n };\r\n }, [bboxSource]);\r\n return (\r\n history.push(`indberetninger/${indberetning.id}`)}\r\n onMouseEnter={() => {\r\n if (indberetning.bbox)\r\n addFeatureToSource(indberetning.bbox, bboxSource);\r\n }}\r\n onMouseLeave={() => {\r\n bboxSource.clear();\r\n }}\r\n >\r\n
\r\n
\r\n {indberetning.emne}\r\n , \r\n
\r\n
\r\n {/* typeGeometri */}\r\n {/* {indberetning.bbox?.getGeometry().getType()}, */}\r\n
\r\n ID: {indberetning.id}\r\n
\r\n \r\n •\r\n \r\n , \r\n {/* Domæne - Vises kun for sagsbehandlere */}\r\n {showDomain && (\r\n <>\r\n \r\n Domæne: \r\n {getDomeneTypeById(indberetning.domaeneTypeId).name}\r\n
\r\n \r\n •\r\n \r\n , \r\n \r\n )}\r\n {/* dato */}\r\n
\r\n Dato: \r\n \r\n {formatDottedDate(indberetning.oprettetTs.toISOString())}\r\n \r\n \r\n {formatDashedDate(indberetning.oprettetTs.toISOString())}\r\n \r\n
\r\n , \r\n
\r\n \r\n
\r\n Status: \r\n s.id === indberetning.statusId)?.className\r\n } me-3`}\r\n >\r\n {statusStore.find((s) => s.id === indberetning.statusId)?.name}\r\n \r\n , \r\n \r\n
\r\n \r\n );\r\n}\r\n","export default function LoadingSpinner() {\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","interface ISectionProps {\r\n children: any;\r\n className?: string;\r\n}\r\nexport default function Section(props: ISectionProps) {\r\n const { children, className } = props;\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n}\r\n","import IndberetningListItem from \"components/common/Indberetning/IndberetningListItem\";\r\nimport LoadingSpinner from \"components/common/LoadingSpinner\";\r\nimport Section from \"components/common/Section\";\r\nimport { IndberetningerState, SearchFilter } from \"interfaces/IIndberetning\";\r\nimport { useLayoutEffect, useRef } from \"react\";\r\n\r\nexport interface FilterSearch {\r\n emne: string;\r\n beskrivelse: string;\r\n}\r\nexport default function IndberetningOversigt(props: {\r\n filter: SearchFilter;\r\n filters: SearchFilter[];\r\n setFilter: (filter: SearchFilter) => void;\r\n searchInputText: FilterSearch;\r\n indberetningerState: IndberetningerState;\r\n hideBecauseEmptySearch: boolean;\r\n setSearchInputText: (t: FilterSearch) => void;\r\n showDomain: boolean;\r\n allowSearchBeskrivelse: boolean;\r\n}) {\r\n const {\r\n filter,\r\n filters,\r\n setFilter,\r\n setSearchInputText,\r\n searchInputText,\r\n indberetningerState,\r\n hideBecauseEmptySearch,\r\n showDomain,\r\n allowSearchBeskrivelse,\r\n } = props;\r\n const { indberetninger } = indberetningerState;\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
\r\n

\r\n Indberetninger\r\n

\r\n

\r\n Her kan du se de indberetninger du selv har foretaget samt øvrige\r\n indberetteres indberetninger.\r\n

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

Indberetninger

\r\n
\r\n
\r\n {\r\n const newfilter = filters.find(\r\n (f) => f.value === parseInt(e.target.value)\r\n );\r\n if (newfilter) setFilter(newfilter);\r\n }}\r\n >\r\n {filters.map((filter) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n
\r\n
\r\n\r\n {/* Kun visuel hvis den står på søgning i filtre */}\r\n {filter.text === \"Søgning\" && (\r\n \r\n \r\n
\r\n {\r\n setSearchInputText({\r\n ...searchInputText,\r\n emne: e.target.value,\r\n });\r\n }}\r\n value={searchInputText.emne}\r\n type=\"search\"\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Filtrér emne\"\r\n aria-label=\"Emne\"\r\n aria-describedby=\"addon-wrapping\"\r\n />\r\n
\r\n
\r\n {allowSearchBeskrivelse && (\r\n
\r\n
\r\n {\r\n setSearchInputText({\r\n ...searchInputText,\r\n beskrivelse: e.target.value,\r\n });\r\n }}\r\n value={searchInputText.beskrivelse}\r\n type=\"search\"\r\n className=\"form-control form-control-sm\"\r\n placeholder=\"Filtrér beskrivelse\"\r\n aria-label=\"Beskrivelse\"\r\n aria-describedby=\"addon-wrapping\"\r\n />\r\n
\r\n
\r\n )}\r\n \r\n )}\r\n\r\n
\r\n
\r\n {indberetningerState.state === \"IDLE\" && (\r\n

\r\n {!hideBecauseEmptySearch && (\r\n \r\n {indberetningerState.indberetninger.length} resultater\r\n \r\n )}\r\n

\r\n )}\r\n
\r\n
\r\n {/* Indberetninger */}\r\n {indberetningerState.state === \"LOADING\" && }\r\n {indberetningerState.state === \"IDLE\" && !hideBecauseEmptySearch && (\r\n
\r\n {indberetninger.length === 0 && (\r\n
\r\n Ingen øvrige indberetninger\r\n
\r\n )}\r\n {indberetninger.length > 0 &&\r\n indberetninger.map((i) => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n )}\r\n \r\n \r\n );\r\n}\r\n","export default function PlusCircleFill(props: { class?: string }) {\r\n const classNames = props.class\r\n ? `${props.class} bi`\r\n : \"bi bi-plus-circle-fill\";\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","export default function Close(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi bi-x-lg` : \"bi bi-x-lg\";\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import Close from \"components/icons/Close\";\r\nimport { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useOnClickOutside } from \"hooks/useOnClickOutside\";\r\nimport {\r\n createContext,\r\n MutableRefObject,\r\n useContext,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport FocusTrap from \"focus-trap-react\";\r\n\r\nexport type ShowModalSignature = (options: {\r\n content: JSX.Element | string;\r\n title: string;\r\n closeModalCallback?: Function;\r\n}) => void;\r\n\r\nconst Modal = () => {\r\n let { closeModal, modal } = useContext(ModalContext);\r\n const ref = useRef();\r\n useOnClickOutside(ref, () => closeModal(true));\r\n const element = document.querySelector(\"#modal-root\");\r\n if (!element) return null;\r\n return createPortal(\r\n \r\n {modal.content && (\r\n \r\n \r\n }\r\n tabIndex={-1}\r\n aria-labelledby={modal.title}\r\n aria-modal=\"true\"\r\n role=\"dialog\"\r\n className={\"c-modal\"}\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n onKeyDown={(e) => {\r\n switch (e.key) {\r\n case \"Escape\":\r\n closeModal(true);\r\n break;\r\n }\r\n }}\r\n >\r\n \r\n
\r\n {modal.title !== \"\" &&

{modal.title}

}\r\n closeModal(true)}\r\n >\r\n \r\n \r\n
\r\n
{modal.content}
\r\n \r\n \r\n
\r\n \r\n )}\r\n
,\r\n element\r\n );\r\n};\r\n\r\ntype ModalState = {\r\n show: boolean;\r\n title: string;\r\n content: JSX.Element | string;\r\n closeModalCallback?: Function;\r\n};\r\nexport const ModalContext = createContext<{\r\n modal: ModalState;\r\n showModal: ShowModalSignature;\r\n closeModal: (withCallback: boolean) => void;\r\n}>({\r\n modal: {\r\n show: false,\r\n title: \"\",\r\n content: \"\",\r\n },\r\n showModal: () => {},\r\n closeModal: () => {},\r\n});\r\nfunction useModal() {\r\n const [modal, setModal] = useState<{\r\n show: boolean;\r\n title: string;\r\n content: JSX.Element | string;\r\n closeModalCallback?: Function;\r\n }>({ show: false, content: \"\", title: \"\" });\r\n\r\n const showModal = (options: {\r\n content: JSX.Element | string;\r\n title: string;\r\n closeModalCallback?: Function;\r\n }) => {\r\n const { content, closeModalCallback, title } = options;\r\n setModal({\r\n show: true,\r\n title: title,\r\n content: content,\r\n closeModalCallback,\r\n });\r\n };\r\n const closeModal = (withCallback: boolean) => {\r\n if (withCallback && modal.closeModalCallback) modal.closeModalCallback();\r\n setModal({ show: true, title: \"\", content: \"\" });\r\n };\r\n\r\n return { modal, showModal, closeModal };\r\n}\r\n\r\nexport const ModalProvider = ({ children }) => {\r\n let { modal, showModal, closeModal } = useModal();\r\n return (\r\n \r\n \r\n {children}\r\n \r\n );\r\n};\r\nexport default Modal;\r\n","// source: https://usehooks.com/useOnClickOutside/\r\nimport { useEffect } from \"react\";\r\n\r\nexport function useOnClickOutside(ref, handler) {\r\n useEffect(\r\n () => {\r\n const listener = (event) => {\r\n // Do nothing if clicking ref's element or descendent elements\r\n if (!ref.current || ref.current.contains(event.target)) {\r\n return;\r\n }\r\n handler(event);\r\n };\r\n\r\n document.addEventListener(\"mousedown\", listener);\r\n document.addEventListener(\"touchstart\", listener);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", listener);\r\n document.removeEventListener(\"touchstart\", listener);\r\n };\r\n },\r\n // Add ref and handler to effect dependencies\r\n // It's worth noting that because passed in handler is a new ...\r\n // ... function on every render that will cause this effect ...\r\n // ... callback/cleanup to run every render. It's not a big deal ...\r\n // ... but to optimize you can wrap handler in useCallback before ...\r\n // ... passing it into this hook.\r\n [ref, handler]\r\n );\r\n}\r\n","import { uniqueId } from \"lodash\";\r\nimport { ForwardedRef, forwardRef } from \"react\";\r\n\r\nconst Select = forwardRef(\r\n (\r\n props: {\r\n labelText: string;\r\n mandatory: boolean;\r\n ariaLabel: string;\r\n className?: string;\r\n name?: string;\r\n value: string;\r\n onChange: React.ChangeEventHandler;\r\n options: {\r\n value: string | number;\r\n label: string;\r\n disabled?: boolean;\r\n }[];\r\n disabled?: boolean;\r\n },\r\n ref: ForwardedRef\r\n ) => {\r\n const {\r\n ariaLabel,\r\n onChange,\r\n options,\r\n value,\r\n className,\r\n labelText,\r\n mandatory,\r\n name,\r\n disabled,\r\n } = props;\r\n const classes = className ? `form-select ${className}` : \"form-select\";\r\n const id = uniqueId();\r\n return (\r\n <>\r\n \r\n \r\n {options.map((option) => {\r\n const { value, label, disabled } = option;\r\n return (\r\n \r\n {label}\r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n }\r\n);\r\n\r\nexport default Select;\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport default function ValidationErrorMessage(props: {\r\n show: boolean;\r\n message: string;\r\n notify: boolean;\r\n resetNotify: () => void;\r\n}) {\r\n const { show, message, notify, resetNotify } = props;\r\n const [activateVoiceOverMessage, setActivateVoiceOverMessage] =\r\n useState(false);\r\n\r\n useEffect(() => {\r\n if (notify) {\r\n setTimeout(() => {\r\n resetNotify();\r\n setActivateVoiceOverMessage(true);\r\n }, 300);\r\n }\r\n }, [notify, resetNotify]);\r\n\r\n if (!show) return null;\r\n return (\r\n
\r\n {message}\r\n {notify && activateVoiceOverMessage && (\r\n {message}\r\n )}\r\n
\r\n );\r\n}\r\n","import { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport PlusCircleFill from \"components/icons/PlusCircleFill\";\r\nimport Select from \"../FormElements/Select\";\r\nimport { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\nimport { Validation } from \"interfaces/IIndberetning\";\r\nimport ValidationErrorMessage from \"../FormElements/ValidationErrorMessage\";\r\n\r\nexport default function AddDrawingModal(props: {\r\n drawing: Feature;\r\n hideObjekttype?: boolean;\r\n hideAendringstype?: boolean;\r\n submit: (\r\n aendringTypeId: number,\r\n aendringType: string,\r\n drawing: Feature,\r\n featureTypeId: number,\r\n featureType: string,\r\n beskrivelse: string\r\n ) => void;\r\n ændringsTyper: { value: number; text: string }[];\r\n objektTyper: { value: number; text: string }[];\r\n mappedObjektType?: number;\r\n}) {\r\n const { closeModal } = useContext(ModalContext);\r\n const {\r\n drawing,\r\n submit,\r\n hideObjekttype,\r\n hideAendringstype,\r\n ændringsTyper,\r\n objektTyper,\r\n mappedObjektType,\r\n } = props;\r\n const objekttypeOptions = [\r\n { value: \"\", label: \"Vælg type af objekt\", disabled: true },\r\n ...objektTyper.map((æt) => {\r\n return { label: æt.text, value: æt.value.toString() };\r\n }),\r\n ];\r\n const defaultObjektType = mappedObjektType\r\n ? objektTyper.find((a) => a.value === mappedObjektType)\r\n : undefined;\r\n const [objekttype, setObjekttype] = useState<\r\n | undefined\r\n | {\r\n value: number;\r\n text: string;\r\n }\r\n >(defaultObjektType ? defaultObjektType : undefined);\r\n const ændringstypeOptions = [\r\n { value: \"\", label: \"Vælg ændringstype\", disabled: true },\r\n ...ændringsTyper.map((æt) => {\r\n return { label: æt.text, value: æt.value.toString() };\r\n }),\r\n ];\r\n const [ændringstype, setÆndringstype] = useState<\r\n | undefined\r\n | {\r\n value: number;\r\n text: string;\r\n }\r\n >(undefined);\r\n const [kommentar, setKommentar] = useState(\"\");\r\n const [validation, setValidation] = useState<{\r\n ændringstype: Validation;\r\n objekttype: Validation;\r\n }>({\r\n objekttype: {\r\n message: \"Objekttype skal være sat\",\r\n touched: false,\r\n valid: false,\r\n notify: false,\r\n },\r\n ændringstype: {\r\n message: \"Ændringstype skal være sat\",\r\n touched: false,\r\n valid: false,\r\n notify: false,\r\n },\r\n });\r\n const resetObjekttypeNotify = () =>\r\n setValidation({\r\n ...validation,\r\n objekttype: { ...validation.objekttype, notify: false },\r\n });\r\n const resetÆndringstypeNotify = () =>\r\n setValidation({\r\n ...validation,\r\n ændringstype: { ...validation.ændringstype, notify: false },\r\n });\r\n const objekttypeRef = useRef(null);\r\n const ændringstypeRef = useRef(null);\r\n const kommentarRef = useRef(null);\r\n const objekttypeDisabled = defaultObjektType ? true : false;\r\n useLayoutEffect(() => {\r\n if (!objekttypeDisabled && !hideObjekttype) {\r\n objekttypeRef.current?.focus();\r\n } else if (!hideAendringstype) {\r\n ændringstypeRef.current?.focus();\r\n } else {\r\n kommentarRef.current?.focus();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n return (\r\n
\r\n {!hideObjekttype && (\r\n
\r\n {\r\n const ot = objektTyper.find(\r\n (o) => o.value.toString() === e.target.value\r\n );\r\n if (ot) {\r\n setValidation({\r\n ...validation,\r\n objekttype: { ...validation.objekttype, valid: true },\r\n });\r\n setObjekttype(ot);\r\n }\r\n }}\r\n options={objekttypeOptions}\r\n />\r\n \r\n
\r\n )}\r\n {!hideAendringstype && (\r\n
\r\n {\r\n const æt = ændringsTyper.find(\r\n (æ) => æ.value.toString() === e.target.value\r\n );\r\n if (æt) {\r\n setValidation({\r\n ...validation,\r\n ændringstype: { ...validation.ændringstype, valid: true },\r\n });\r\n setÆndringstype(æt);\r\n }\r\n }}\r\n options={ændringstypeOptions}\r\n />\r\n \r\n
\r\n )}\r\n \r\n setKommentar(e.target.value)}\r\n >\r\n
\r\n {\r\n if (objekttype && ændringstype) {\r\n submit(\r\n ændringstype.value,\r\n ændringstype.text,\r\n drawing,\r\n objekttype.value,\r\n objekttype.text,\r\n kommentar\r\n );\r\n closeModal(false);\r\n } else if (hideAendringstype && hideObjekttype) {\r\n submit(0, \"\", drawing, 0, \"\", kommentar);\r\n closeModal(false);\r\n } else {\r\n setValidation({\r\n ændringstype: {\r\n ...validation.ændringstype,\r\n valid: ændringstype ? true : false,\r\n touched: true,\r\n notify: true,\r\n },\r\n objekttype: {\r\n ...validation.objekttype,\r\n valid: objekttype ? true : false,\r\n touched: true,\r\n notify: true,\r\n },\r\n });\r\n }\r\n }}\r\n >\r\n \r\n Tilføj\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport Select from \"../FormElements/Select\";\r\nimport { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\nimport { Drawing } from \"routes/Fip/FipIndberet\";\r\n\r\nexport default function EditDrawingModal(props: {\r\n drawing: Drawing;\r\n hideObjekttype?: boolean;\r\n hideAendringstype?: boolean;\r\n submit: (\r\n aendringTypeId: number,\r\n aendringType: string,\r\n drawing: Feature,\r\n featureTypeId: number,\r\n featureType: string,\r\n beskrivelse: string\r\n ) => void;\r\n ændringsTyper: { value: number; text: string }[];\r\n objektTyper: { value: number; text: string }[];\r\n}) {\r\n const { closeModal } = useContext(ModalContext);\r\n const {\r\n drawing,\r\n hideObjekttype,\r\n hideAendringstype,\r\n submit,\r\n ændringsTyper,\r\n objektTyper,\r\n } = props;\r\n const [objekttype, setObjekttype] = useState(\r\n objektTyper.find((o) => o.value === drawing.featureTypeId) ?? objektTyper[0]\r\n );\r\n const [ændringstype, setÆndringstype] = useState(\r\n ændringsTyper.find((æ) => æ.value === drawing.aendringTypeId) ??\r\n ændringsTyper[0]\r\n );\r\n const [kommentar, setKommentar] = useState(drawing.beskrivelse);\r\n const objekttypeRef = useRef(null);\r\n const ændringstypeRef = useRef(null);\r\n const kommentarRef = useRef(null);\r\n // const objekttypeDisabled = defaultObjektType ? true : false;\r\n useLayoutEffect(() => {\r\n if (!hideObjekttype) {\r\n objekttypeRef.current?.focus();\r\n } else if (!hideAendringstype) {\r\n ændringstypeRef.current?.focus();\r\n } else {\r\n if (kommentarRef.current) {\r\n kommentarRef.current.focus();\r\n kommentarRef.current.selectionStart = kommentar.length;\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n return (\r\n
\r\n {!hideObjekttype && (\r\n
\r\n {\r\n const ot = objektTyper.find(\r\n (o) => o.value.toString() === e.target.value\r\n );\r\n if (ot) setObjekttype(ot);\r\n }}\r\n options={objektTyper.map((ot) => {\r\n return { label: ot.text, value: ot.value.toString() };\r\n })}\r\n />\r\n
\r\n )}\r\n {!hideAendringstype && (\r\n
\r\n {\r\n const æt = ændringsTyper.find(\r\n (æ) => æ.value.toString() === e.target.value\r\n );\r\n if (æt) setÆndringstype(æt);\r\n }}\r\n options={ændringsTyper.map((æt) => {\r\n return { label: æt.text, value: æt.value.toString() };\r\n })}\r\n />\r\n
\r\n )}\r\n \r\n setKommentar(e.target.value)}\r\n >\r\n
\r\n {\r\n submit(\r\n ændringstype.value,\r\n ændringstype.text,\r\n drawing.drawing,\r\n objekttype.value,\r\n objekttype.text,\r\n kommentar\r\n );\r\n closeModal(false);\r\n }}\r\n >\r\n Gem\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import { Hoeringssag, Tema } from \"interfaces/IIndberetning\";\r\nimport { Feature } from \"ol\";\r\nimport { convertFeatureToWkt, convertWktToFeature } from \"util/ol\";\r\nimport { NyIndberetningState } from \"./FipIndberet\";\r\n\r\nexport interface NyIndberetningFormValidation {\r\n form: boolean;\r\n fields: {\r\n tema: { message: string; notify: boolean };\r\n emne: { message: string; notify: boolean };\r\n beskrivelse: { message: string; notify: boolean };\r\n vilkårAccepteret: { message: string; notify: boolean };\r\n filEllerGeometri: { message: string; notify: boolean };\r\n email: { message: string; notify: boolean };\r\n };\r\n}\r\n\r\n/**\r\n *\r\n * @param indberetning\r\n * @returns Empty string if valid,\r\n */\r\nexport function validateNyIndberetningForm(\r\n indberetning: NyIndberetningState\r\n): NyIndberetningFormValidation {\r\n const { beskrivelse, emne, fil, geometri, vilkårAccepteret, tema, email } =\r\n indberetning;\r\n const validation: NyIndberetningFormValidation = {\r\n form: true,\r\n fields: {\r\n tema: { message: \"\", notify: false },\r\n emne: { message: \"\", notify: false },\r\n beskrivelse: { message: \"\", notify: false },\r\n vilkårAccepteret: { message: \"\", notify: false },\r\n filEllerGeometri: { message: \"\", notify: false },\r\n email: { message: \"\", notify: false },\r\n },\r\n };\r\n if (!tema.value) {\r\n validation.form = false;\r\n validation.fields.tema.message = \"Tema skal udfyldes\";\r\n validation.fields.tema.notify = true;\r\n }\r\n if (!emne.value) {\r\n validation.form = false;\r\n validation.fields.emne.message = \"Emne skal udfyldes\";\r\n validation.fields.emne.notify = true;\r\n }\r\n if (!beskrivelse.value) {\r\n validation.form = false;\r\n validation.fields.beskrivelse.message = \"Beskrivelse skal udfyldes\";\r\n validation.fields.beskrivelse.notify = true;\r\n }\r\n if (fil.value.length === 0 && geometri.value.length === 0) {\r\n validation.form = false;\r\n validation.fields.filEllerGeometri.message =\r\n \"Indberetning skal indeholde mindst én fil eller geometri\";\r\n validation.fields.filEllerGeometri.notify = true;\r\n }\r\n\r\n if (!vilkårAccepteret.value) {\r\n validation.form = false;\r\n validation.fields.vilkårAccepteret.message =\r\n \"Betingelserne skal være accepteret\";\r\n validation.fields.vilkårAccepteret.notify = true;\r\n }\r\n if (!email.value) {\r\n validation.form = false;\r\n validation.fields.email.message = \"Email skal være udfyldt\";\r\n validation.fields.email.notify = true;\r\n }\r\n return validation;\r\n}\r\n\r\nexport function prepareSag(\r\n indberetning: NyIndberetningState,\r\n tema: Tema\r\n): Hoeringssag {\r\n const { beskrivelse, emne, fil, geometri } = indberetning;\r\n const { domainId, id: temaId } = tema;\r\n const requestDTO: Hoeringssag = {\r\n bbox: \"\",\r\n beskrivelse: beskrivelse.value,\r\n domaeneType: \"\",\r\n domaeneTypeId: domainId,\r\n emne: emne.value,\r\n esdhJournalId: \"\",\r\n esdhJournalNummer: \"\",\r\n fraTs: null,\r\n frist: null,\r\n id: 0,\r\n indberetningsmappe: [\r\n {\r\n beskrivelse: beskrivelse.value,\r\n domaeneType: \"\",\r\n domaeneTypeId: domainId,\r\n emne: emne.value,\r\n fejlSet: \"\",\r\n fil: fil.value.map((f, i) => {\r\n return {\r\n beskrivelse: f.beskrivelse,\r\n dato: f.dato,\r\n filId: f.filId,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(f.geometri),\r\n geometriType: f.geometri.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: i + 1,\r\n openLayersId: \"\",\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n };\r\n }),\r\n geometri: geometri.value.map((g, i) => {\r\n return {\r\n aendringType: g.aendringType,\r\n aendringTypeId: g.aendringTypeId,\r\n beskrivelse: g.beskrivelse,\r\n dato: g.dato,\r\n featureType: g.featureType,\r\n featureTypeId: g.featureTypeId,\r\n filId: 0,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(g.drawing),\r\n geometriType: g.drawing.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: i + 1,\r\n openLayersId: \"\", // g.drawing.getId().toString(),\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n };\r\n }),\r\n id: 0,\r\n korttemaId: temaId,\r\n },\r\n ],\r\n korrespondance: [],\r\n oprettetTs: null,\r\n prioritet: 0,\r\n ressource: [],\r\n sagsbehandlermappe: [],\r\n sagsid: 0,\r\n sagsnummer: \"\",\r\n statusId: 1,\r\n tilTs: null,\r\n };\r\n return requestDTO;\r\n}\r\n\r\n/**\r\n *\r\n * @param sag\r\n * @returns\r\n */\r\nexport const getSagsaktFeaturesFromHoeringssag = (\r\n sag: Hoeringssag\r\n): Feature[] => {\r\n let features: Feature[] = [];\r\n const {\r\n indberetningsmappe,\r\n hoeringsansvarligmappe,\r\n hoeringspartmappe,\r\n sagsbehandlermappe,\r\n } = sag;\r\n if (indberetningsmappe && indberetningsmappe.length) {\r\n indberetningsmappe.forEach((mappe) => {\r\n const { geometri, fil } = mappe;\r\n if (geometri && fil) {\r\n features = [\r\n ...features,\r\n ...geometri.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"indberetning\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Geometri\");\r\n return feature;\r\n }),\r\n ];\r\n features = [\r\n ...features,\r\n ...fil.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"indberetning\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Fil\");\r\n return feature;\r\n }),\r\n ];\r\n } else {\r\n features = [...features];\r\n }\r\n });\r\n }\r\n if (hoeringsansvarligmappe && hoeringsansvarligmappe.length) {\r\n hoeringsansvarligmappe.forEach((mappe) => {\r\n const { geometri, fil } = mappe;\r\n if (geometri) {\r\n features = [\r\n ...features,\r\n ...geometri.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"hoeringsansvarlig\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Geometri\");\r\n return feature;\r\n }),\r\n ];\r\n }\r\n if (fil) {\r\n features = [\r\n ...features,\r\n ...fil.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"hoeringsansvarlig\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Fil\");\r\n return feature;\r\n }),\r\n ];\r\n }\r\n });\r\n }\r\n if (hoeringspartmappe && hoeringspartmappe.length) {\r\n hoeringspartmappe.forEach((mappe) => {\r\n const { geometri, fil } = mappe;\r\n if (geometri) {\r\n features = [\r\n ...features,\r\n ...geometri.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"hoeringspart\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Geometri\");\r\n return feature;\r\n }),\r\n ];\r\n }\r\n if (fil) {\r\n features = [\r\n ...features,\r\n ...fil.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"hoeringspart\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Fil\");\r\n return feature;\r\n }),\r\n ];\r\n }\r\n });\r\n }\r\n if (sagsbehandlermappe && sagsbehandlermappe.length) {\r\n sagsbehandlermappe.forEach((mappe) => {\r\n const { geometri, fil } = mappe;\r\n features = [\r\n ...features,\r\n ...geometri.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"sagsbehandler\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Geometri\");\r\n return feature;\r\n }),\r\n ];\r\n features = [\r\n ...features,\r\n ...fil.map((g) => {\r\n const feature = convertWktToFeature(g.geometri);\r\n feature.set(\"mappe\", \"sagsbehandler\");\r\n feature.set(\"id\", g.id);\r\n feature.set(\"geometriId\", g.geometriId);\r\n feature.set(\"beskrivelse\", g.beskrivelse);\r\n feature.set(\"type\", \"Fil\");\r\n return feature;\r\n }),\r\n ];\r\n });\r\n }\r\n\r\n /* return features.map((f) => {\r\n f.set(\"id\", f.get(\"geometriId\"));\r\n return f;\r\n }); */\r\n return features;\r\n};\r\n\r\n/**\r\n *\r\n * @param sag\r\n * @returns\r\n */\r\n\r\nexport const getDownloadGeometryLink = (\r\n indberetningId: number,\r\n sagsaktId: number\r\n) => {\r\n let VIEWPARAMS = `viewparams=sagId:${indberetningId}&sagsaktId:${sagsaktId}`;\r\n let url = `${process.env.REACT_APP_API_BASEURL}proxy.ashx?service=WFS&version=1.1.0&request=GetFeature&typeName=${process.env.REACT_APP_GEOSERVER_WORKSPACE}:SagDownload&maxFeatures=100&outputFormat=SHAPE-ZIP&${VIEWPARAMS}`;\r\n\r\n return url;\r\n};\r\n","import { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport PlusCircleFill from \"components/icons/PlusCircleFill\";\r\nimport { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\n\r\nexport const AddFileModal = (props: {\r\n geometri: Feature;\r\n filId: number;\r\n originalFilNavn: string;\r\n addFile: (\r\n beskrivelse: string,\r\n filId: number,\r\n geometri: Feature,\r\n originalFilNavn: string\r\n ) => void;\r\n}) => {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const { geometri, addFile, filId, originalFilNavn } = props;\r\n const [beskrivelse, setBeskrivelse] = useState(\"\");\r\n return (\r\n
\r\n \r\n setBeskrivelse(e.target.value)}\r\n >\r\n
\r\n {\r\n addFile(beskrivelse, filId, geometri, originalFilNavn);\r\n closeModal(false);\r\n }}\r\n >\r\n \r\n Tilføj\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
\r\n
\r\n );\r\n};\r\n","export default function DrawPolygon(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-draw-polygon\";\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}\r\n","export default function ThreeDotsVertical(props: { class?: string }) {\r\n const classNames = props.class\r\n ? `${props.class} bi`\r\n : \"bi bi-three-dots-vertical\";\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","export default function Trash(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-trash\";\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","export default function Close(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi bi-download` : \"bi bi-download\";\r\n return (\r\n\r\n\r\n\r\n\r\n\r\n\r\n );\r\n}\r\n","export default function ModalConfirmDelete(props: {\r\n type: \"opdatering\" | \"fil\";\r\n closeModal: (withCallback: boolean) => void;\r\n confirm: () => void;\r\n}) {\r\n const { type, closeModal, confirm } = props;\r\n return (\r\n
\r\n

\r\n Er du sikker på at du vil slette{\" \"}\r\n {type === \"fil\" ? \"filen\" : \"opdateringen\"}.\r\n

\r\n
\r\n {\r\n confirm();\r\n closeModal(false);\r\n }}\r\n >\r\n Slet\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
\r\n
\r\n );\r\n}\r\n","export default function DrawLine(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-draw-line\";\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","export default function DrawPoint(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-draw-point\";\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import DrawLine from \"components/icons/DrawLine\";\r\nimport DrawPoint from \"components/icons/DrawPoint\";\r\nimport DrawPolygon from \"components/icons/DrawPolygon\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { wktFormat } from \"util/ol\";\r\n\r\nexport default function GeometryAvatar(props: {\r\n feature: Feature | string;\r\n}) {\r\n let { feature } = props;\r\n let geom: Geometry;\r\n if (typeof feature === \"string\") {\r\n geom = wktFormat.readFeature(feature).getGeometry();\r\n } else {\r\n geom = feature.getGeometry();\r\n }\r\n switch (geom.getType()) {\r\n case \"Point\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"LineString\":\r\n return (\r\n \r\n \r\n \r\n );\r\n\r\n default:\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import { Sagsakt } from \"interfaces/IIndberetning\";\r\nimport { Fil } from \"routes/Fip/FipIndberet\";\r\nimport IconDrawPolygon from \"components/icons/DrawPolygon\";\r\nimport ThreeDotsVertical from \"components/icons/ThreeDotsVertical\";\r\nimport Trash from \"components/icons/Trash\";\r\nimport Download from \"components/icons/Download\";\r\nimport { formatDashedDate, formatDateString } from \"util/date\";\r\nimport { ShowModalSignature } from \"../Modal/Modal\";\r\nimport ModalConfirmDelete from \"../Indberet/ModalConfirmDelete\";\r\nimport GeometryAvatar from \"../GeometryAvatar\";\r\nimport { translateGeometryType, wktFormat } from \"util/ol\";\r\nimport { uniqueId } from \"lodash\";\r\n\r\nexport default function FilListItem(props: {\r\n type: \"compressed\" | \"normal\";\r\n index?: number;\r\n id: number;\r\n fil: Sagsakt | Fil;\r\n hoveredFeatures: (string | number)[];\r\n hideDeleteOption?: boolean;\r\n hideEditOptions?: boolean;\r\n hideOptions?: boolean;\r\n downloadFileLink?: string;\r\n downloadGeometryLink?: string;\r\n onMouseEnter: () => void;\r\n onMouseLeave: () => void;\r\n onClick: (f) => void;\r\n removeFil: () => void;\r\n onEditGeometryClick: () => void;\r\n onEditClick: () => void;\r\n showModal: ShowModalSignature;\r\n closeModal: (withCallback: boolean) => void;\r\n}) {\r\n const {\r\n id,\r\n index,\r\n fil,\r\n hideDeleteOption,\r\n hideEditOptions,\r\n hideOptions,\r\n downloadFileLink,\r\n downloadGeometryLink,\r\n hoveredFeatures,\r\n onClick,\r\n onMouseEnter,\r\n onMouseLeave,\r\n removeFil,\r\n onEditClick,\r\n onEditGeometryClick,\r\n showModal,\r\n closeModal,\r\n type,\r\n } = props;\r\n let geometrytype =\r\n typeof fil.geometri === \"string\"\r\n ? wktFormat.readFeature(fil.geometri).getGeometry().getType()\r\n : fil.geometri.getGeometry().getType();\r\n geometrytype = geometrytype ? translateGeometryType(geometrytype) : \"\";\r\n const dropdownMenuButtonId = uniqueId(\"dropdownMenuButton\");\r\n return (\r\n <>\r\n {type === \"compressed\" && (\r\n

\r\n {fil.beskrivelse.split(\"\\n\").map((item, i) => {\r\n // beskrivelser kommer fra textarea, så kan have linjeskift\r\n return (\r\n \r\n {item}\r\n
\r\n
\r\n );\r\n })}\r\n

\r\n )}\r\n -1}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n >\r\n -1 ? \"hover\" : \"\"\r\n }`}\r\n aria-label=\"Vis i kort\"\r\n title=\"\"\r\n onClick={onClick}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n onClick(fil.geometri);\r\n }\r\n }}\r\n >\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n {index !== undefined && #{index + 1}}\r\n {type === \"compressed\" ? geometrytype : fil.originalFilNavn}\r\n \r\n\r\n {index !== undefined && (\r\n

\r\n {formatDateString(fil.dato)}\r\n \r\n {formatDashedDate(fil.dato)}\r\n \r\n

\r\n )}\r\n {fil.beskrivelse && type === \"normal\" && (\r\n

\r\n {fil.beskrivelse.split(\"\\n\").map((item, i) => {\r\n // beskrivelser kommer fra textarea, så kan have linjeskift\r\n return (\r\n \r\n {item}\r\n
\r\n
\r\n );\r\n })}\r\n

\r\n )}\r\n {type === \"compressed\" &&\r\n downloadFileLink !== undefined &&\r\n !hideOptions && (\r\n

\r\n \r\n {fil.originalFilNavn} (hent)\r\n \r\n

\r\n )}\r\n
\r\n
\r\n {!hideOptions && (\r\n
\r\n e.stopPropagation()}\r\n >\r\n \r\n \r\n \r\n {!hideEditOptions && (\r\n <>\r\n
  • \r\n \r\n \r\n \r\n \r\n Ret oplysninger\r\n \r\n
  • \r\n
  • \r\n \r\n \r\n Ret geometri\r\n \r\n
  • \r\n \r\n )}\r\n {!hideDeleteOption && (\r\n
  • \r\n {\r\n e.stopPropagation();\r\n showModal({\r\n title: \"Slet fil\",\r\n content: (\r\n {\r\n removeFil();\r\n }}\r\n closeModal={closeModal}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n \r\n Slet\r\n \r\n
  • \r\n )}\r\n\r\n {downloadGeometryLink !== undefined && (\r\n
  • \r\n \r\n \r\n Gem geometri\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\nconst Wrapper = (props: {\r\n children: any;\r\n type: \"li\" | \"div\";\r\n hovered: boolean;\r\n onMouseEnter: () => void;\r\n onMouseLeave: () => void;\r\n}) => {\r\n const { type, children, hovered, onMouseEnter, onMouseLeave } = props;\r\n const classNames = `list-group-item list-group-item--card p-3 ${\r\n hovered ? \"hover\" : \"\"\r\n }`;\r\n if (type === \"li\") {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import Select from \"components/common/FormElements/Select\";\r\nimport { Tema } from \"interfaces/IIndberetning\";\r\nimport { ForwardedRef, forwardRef } from \"react\";\r\nconst TemaSelect = forwardRef(\r\n (\r\n props: {\r\n isInvalid: boolean;\r\n tema: Tema | undefined;\r\n setTema: (id: string) => void;\r\n options: {\r\n value: string | number;\r\n label: string;\r\n disabled?: boolean | undefined;\r\n }[];\r\n },\r\n ref: ForwardedRef\r\n ) => {\r\n const { isInvalid, tema, setTema, options } = props;\r\n return (\r\n {\r\n setTema(e.target.value);\r\n }}\r\n value={tema?.id.toString() ?? \"\"}\r\n options={options}\r\n />\r\n );\r\n }\r\n);\r\nexport default TemaSelect;\r\n","import ValidationErrorMessage from \"../FormElements/ValidationErrorMessage\";\r\nimport { ShowModalSignature } from \"../Modal/Modal\";\r\n\r\nexport default function AccepterVilkår(props: {\r\n disabled: boolean;\r\n showValidationWarning: boolean;\r\n validationWarningMessage: string;\r\n checked: boolean;\r\n setChecked: (checked: boolean) => void;\r\n showModal: ShowModalSignature;\r\n closeModal: (withCallback: boolean) => void;\r\n notify: boolean;\r\n resetNotify: () => void;\r\n}) {\r\n const {\r\n checked,\r\n setChecked,\r\n disabled,\r\n showValidationWarning,\r\n validationWarningMessage,\r\n // showModal,\r\n // closeModal,\r\n notify,\r\n resetNotify,\r\n } = props;\r\n return (\r\n
    \r\n
    \r\n setChecked(e.target.checked)}\r\n />\r\n \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { Drawing } from \"routes/Fip/FipIndberet\";\r\nimport IconDrawPolygon from \"components/icons/DrawPolygon\";\r\nimport Trash from \"components/icons/Trash\";\r\nimport ThreeDotsVertical from \"components/icons/ThreeDotsVertical\";\r\nimport { formatDashedDate, formatDateString } from \"util/date\";\r\nimport Download from \"components/icons/Download\";\r\nimport GeometryAvatar from \"../GeometryAvatar\";\r\nimport { translateGeometryType } from \"util/ol\";\r\nimport { uniqueId } from \"lodash\";\r\n\r\nexport default function DrawingListItem(props: {\r\n type: \"compressed\" | \"normal\";\r\n index?: number;\r\n hovered: boolean;\r\n geometri: Drawing;\r\n hideDeleteOption?: boolean;\r\n hideEditOptions?: boolean;\r\n hideOptions?: boolean;\r\n downloadLink?: string;\r\n setHoveredFeatures: (ids: string[]) => void;\r\n zoomToDrawing: (drawing: Feature) => void;\r\n onEditGeometryClick: () => void;\r\n onEditClick: () => void;\r\n onDeleteClick: () => void;\r\n}) {\r\n const {\r\n hovered,\r\n geometri,\r\n hideDeleteOption,\r\n hideEditOptions,\r\n hideOptions,\r\n downloadLink,\r\n setHoveredFeatures,\r\n zoomToDrawing,\r\n onEditClick,\r\n onDeleteClick,\r\n onEditGeometryClick,\r\n index,\r\n type,\r\n } = props;\r\n const id = geometri.drawing.get(\"id\");\r\n const geometrytype = translateGeometryType(\r\n geometri.drawing.getGeometry().getType()\r\n );\r\n const dropdownMenuButtonId = uniqueId(\"dropdownMenuButton\");\r\n\r\n const renderTexts = () => {\r\n if (type === \"normal\") {\r\n return (\r\n <>\r\n \r\n {index !== undefined && (\r\n <>\r\n \r\n #{index + 1}\r\n {\" \"}\r\n \r\n )}\r\n {geometri.featureType ? geometri.featureType : \"\"}\r\n {geometri.aendringType && (\r\n \r\n {\" \"}\r\n – {geometri.aendringType}\r\n \r\n )}\r\n \r\n

    \r\n {formatDateString(geometri.dato)}\r\n \r\n {formatDashedDate(geometri.dato)}\r\n \r\n

    \r\n\r\n

    \r\n {geometri.beskrivelse.split(\"\\n\").map((item, i) => {\r\n // beskrivelser kommer fra textarea, så kan have linjeskift\r\n return (\r\n \r\n {item}\r\n
    \r\n
    \r\n );\r\n })}\r\n

    \r\n \r\n );\r\n }\r\n return (\r\n <>\r\n {geometrytype}\r\n {geometri.featureType && geometri.aendringType && (\r\n
    \r\n

    \r\n {geometri.featureType}\r\n \r\n {geometri.aendringType}\r\n

    \r\n
    \r\n )}\r\n \r\n );\r\n };\r\n return (\r\n <>\r\n {geometri.beskrivelse && type === \"compressed\" && (\r\n

    \r\n {geometri.beskrivelse.split(\"\\n\").map((item, i) => {\r\n // beskrivelser kommer fra textarea, så kan have linjeskift\r\n return (\r\n \r\n {item}\r\n
    \r\n
    \r\n );\r\n })}\r\n

    \r\n )}\r\n setHoveredFeatures([id])}\r\n onMouseLeave={() => setHoveredFeatures([])}\r\n >\r\n {\r\n zoomToDrawing(geometri.drawing);\r\n }}\r\n >\r\n
    \r\n
    \r\n \r\n
    \r\n
    {renderTexts()}
    \r\n
    \r\n {!hideOptions && (\r\n
    \r\n \r\n \r\n \r\n \r\n {!hideEditOptions && (\r\n <>\r\n
  • \r\n \r\n \r\n \r\n \r\n Ret oplysninger\r\n \r\n
  • \r\n
  • \r\n \r\n \r\n Ret geometri\r\n \r\n
  • \r\n \r\n )}\r\n {!hideDeleteOption && (\r\n
  • \r\n {\r\n e.stopPropagation();\r\n onDeleteClick();\r\n }}\r\n >\r\n \r\n Slet\r\n \r\n
  • \r\n )}\r\n {downloadLink !== undefined && (\r\n
  • \r\n \r\n \r\n Gem geometri\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\nconst Wrapper = (props: {\r\n children: any;\r\n type: \"li\" | \"div\";\r\n hovered: boolean;\r\n onMouseEnter: () => void;\r\n onMouseLeave: () => void;\r\n}) => {\r\n const { type, children, hovered, onMouseEnter, onMouseLeave } = props;\r\n const classNames = `list-group-item list-group-item--card p-3 ${\r\n hovered ? \"hover\" : \"\"\r\n }`;\r\n if (type === \"li\") {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { DrawTool } from \"context/MapProvider\";\r\n\r\nexport default function DrawInstructions(props: { activeDrawTool: DrawTool }) {\r\n const { activeDrawTool } = props;\r\n switch (activeDrawTool) {\r\n case \"point\":\r\n return (\r\n
    \r\n Sæt ét punkt i kortet.\r\n
    \r\n );\r\n case \"line\":\r\n return (\r\n
    \r\n Sæt min. 2 punkter i kortet. Dobbeltklik for\r\n at afslutte din linje.\r\n
    \r\n );\r\n case \"polygon\":\r\n return (\r\n
    \r\n Sæt min. 3 punkter i kortet. Dobbeltklik for\r\n at afslutte din polygon.\r\n
    \r\n );\r\n case \"udpeg\":\r\n return (\r\n
    \r\n Vælg et objekt ved at klikke på det i kortet.\r\n
    \r\n );\r\n }\r\n return null;\r\n}\r\n","import { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\n\r\nexport default function EditFileModal(props: {\r\n currentBeskrivelse: string;\r\n updateFile: (beskrivelse: string) => void;\r\n}) {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const { currentBeskrivelse, updateFile } = props;\r\n const [beskrivelse, setBeskrivelse] = useState(currentBeskrivelse);\r\n return (\r\n
    \r\n \r\n setBeskrivelse(e.target.value)}\r\n >\r\n
    \r\n {\r\n updateFile(beskrivelse);\r\n closeModal(false);\r\n }}\r\n >\r\n Gem\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import { ForwardedRef, forwardRef } from \"react\";\r\nimport ValidationErrorMessage from \"../FormElements/ValidationErrorMessage\";\r\nconst EmailInput = forwardRef(\r\n (\r\n props: {\r\n email: string;\r\n setEmail: (email: string) => void;\r\n disableForm: boolean;\r\n showValidationWarning: boolean;\r\n validationWarningMessage: string;\r\n notifyValidationWarning: boolean;\r\n resetNotifyValidationWarning: () => void;\r\n },\r\n ref: ForwardedRef\r\n ) => {\r\n const {\r\n disableForm,\r\n email,\r\n setEmail,\r\n showValidationWarning,\r\n validationWarningMessage,\r\n notifyValidationWarning,\r\n resetNotifyValidationWarning,\r\n } = props;\r\n return (\r\n
    \r\n \r\n setEmail(e.target.value)}\r\n autoComplete=\"email\"\r\n />\r\n \r\n
    \r\n );\r\n }\r\n);\r\n\r\nexport default EmailInput;\r\n","import PlusCircleFill from \"components/icons/PlusCircleFill\";\r\nimport { ForwardedRef, forwardRef, useRef } from \"react\";\r\n\r\nconst FileInput = forwardRef(\r\n (\r\n props: {\r\n disabled?: boolean;\r\n onChange: React.ChangeEventHandler;\r\n marginBottom?: number;\r\n },\r\n ref: ForwardedRef\r\n ) => {\r\n const { disabled, onChange, marginBottom } = props;\r\n const inputRef = useRef(null);\r\n return (\r\n
    \r\n {\r\n switch (e.key) {\r\n case \" \":\r\n case \"Enter\": {\r\n e.preventDefault();\r\n if (inputRef.current) {\r\n inputRef.current.click();\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }}\r\n >\r\n \r\n Upload fil (Max. 10 MB)\r\n \r\n \r\n
    \r\n );\r\n }\r\n);\r\n\r\nexport default FileInput;\r\n","import {\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useReducer,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport PlusCircleFill from \"../../components/icons/PlusCircleFill\";\r\nimport { useContext } from \"react\";\r\nimport {\r\n finishedDrawingSource,\r\n modifySource,\r\n setDrawingCallback,\r\n} from \"config/interactions\";\r\nimport { ModalContext } from \"components/common/Modal/Modal\";\r\nimport AddDrawingModal from \"components/common/Indberet/AddDrawingModal\";\r\nimport EditDrawingModal from \"components/common/Indberet/EditDrawingModal\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport {\r\n validateNyIndberetningForm,\r\n prepareSag,\r\n NyIndberetningFormValidation,\r\n} from \"./fipUtil\";\r\nimport { getObjekttyper, postIndberetning, uploadFile } from \"api/fip\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { useHistory } from \"react-router\";\r\nimport { routes } from \"routes/routesConfig\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport LoadingSpinner from \"components/common/LoadingSpinner\";\r\nimport { AddFileModal } from \"components/common/Indberet/AddFileModal\";\r\nimport FilListItem from \"components/common/Indberetning/FilListItem\";\r\nimport { Tema } from \"interfaces/IIndberetning\";\r\nimport { tema } from \"config/FipConfig\";\r\nimport TemaSelect from \"components/common/Indberet/TemaSelect\";\r\nimport AccepterVilkår from \"components/common/Indberet/AccepterVilkår\";\r\nimport DrawingListItem from \"components/common/Indberetning/DrawingListItem\";\r\nimport { removeFeatureFromSource, zoomToFeature } from \"util/ol\";\r\nimport DrawInstructions from \"components/common/Indberet/DrawInstructions\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport EditFileModal from \"components/common/Indberet/EditFileModal\";\r\nimport EmailInput from \"components/common/Indberet/EmailInput\";\r\nimport { uniqueId } from \"lodash\";\r\nimport FileInput from \"components/common/FormElements/FileInput\";\r\nimport ModalConfirmDelete from \"components/common/Indberet/ModalConfirmDelete\";\r\nimport ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\n\r\n//TODO: Unhardcode plz\r\nconst ændringsTyper = [\r\n { value: 1, text: \"Mangler i kortet (Ny)\" },\r\n { value: 2, text: \"Har ændret sig (Rettes)\" },\r\n { value: 3, text: \"Er for meget i kortet (Slettes)\" },\r\n];\r\n\r\nexport interface Drawing {\r\n aendringTypeId: number;\r\n aendringType: string;\r\n drawing: Feature;\r\n featureTypeId: number;\r\n featureType: string;\r\n beskrivelse: string;\r\n dato: string;\r\n}\r\nexport interface Fil {\r\n beskrivelse: string;\r\n dato: string;\r\n filId: number;\r\n geometri: Feature;\r\n originalFilNavn: string;\r\n}\r\nexport interface NyIndberetningState {\r\n vilkårAccepteret: { touched: boolean; value: boolean };\r\n beskrivelse: { touched: boolean; value: string };\r\n emne: { touched: boolean; value: string };\r\n geometri: { touched: boolean; value: Drawing[] };\r\n fil: { touched: boolean; value: Fil[] };\r\n tema: { touched: boolean; value: Tema | undefined };\r\n email: { touched: boolean; value: string };\r\n}\r\nexport interface NewFileState {\r\n state: \"IDLE\" | \"UPLOADING\" | \"UPLOADED\" | \"ERROR\";\r\n file: undefined | { id: string; originalFilNavn: string };\r\n error?: undefined | string;\r\n}\r\nexport default function FipIndberet() {\r\n const { authState, setCurrentUserEmail } = useContext(AuthContext);\r\n const { showModal, closeModal } = useContext(ModalContext);\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n const toast = useContext(ToastContext);\r\n const { activeDrawTool } = mapState;\r\n const history = useHistory();\r\n const [newFile, setNewFile] = useState({\r\n state: \"IDLE\",\r\n file: undefined,\r\n });\r\n const temaSelectRef = useRef(null);\r\n const fileInputRef = useRef(null);\r\n const emneSectionRef = useRef(null);\r\n const filSectionRef = useRef(null);\r\n const sendSectionRef = useRef(null);\r\n const emailRef = useRef(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n };\r\n }, [dispatchToMap]);\r\n const [objekttyper, setObjekttyper] = useState<\r\n { value: number; text: string }[]\r\n >([]);\r\n const [indberetningValidation, setIndberetningValidation] =\r\n useState({\r\n form: false,\r\n fields: {\r\n tema: { message: \"Tema skal udfyldes\", notify: false },\r\n beskrivelse: { message: \"Beskrivelse skal udfyldes\", notify: false },\r\n emne: { message: \"Emne skal udfyldes\", notify: false },\r\n filEllerGeometri: {\r\n message: \"Indberetning skal indeholde mindst én fil eller geometri\",\r\n notify: false,\r\n },\r\n vilkårAccepteret: {\r\n message: \"Betingelserne skal være accepteret\",\r\n notify: false,\r\n },\r\n email: { message: \"Email skal udfyldes\", notify: false },\r\n },\r\n });\r\n const resetValidationNotifies = () => {\r\n setIndberetningValidation({\r\n ...indberetningValidation,\r\n fields: {\r\n ...indberetningValidation.fields,\r\n beskrivelse: {\r\n ...indberetningValidation.fields.beskrivelse,\r\n notify: false,\r\n },\r\n email: {\r\n ...indberetningValidation.fields.email,\r\n notify: false,\r\n },\r\n emne: {\r\n ...indberetningValidation.fields.emne,\r\n notify: false,\r\n },\r\n filEllerGeometri: {\r\n ...indberetningValidation.fields.filEllerGeometri,\r\n notify: false,\r\n },\r\n tema: {\r\n ...indberetningValidation.fields.tema,\r\n notify: false,\r\n },\r\n vilkårAccepteret: {\r\n ...indberetningValidation.fields.vilkårAccepteret,\r\n notify: false,\r\n },\r\n },\r\n });\r\n };\r\n const indberetningReducer = (\r\n state: NyIndberetningState,\r\n action:\r\n | { type: \"SET_ALL_TOUCHED\" }\r\n | { type: \"SET_VILKAAR_ACCEPTERET\"; vilkårAccepteret: boolean }\r\n | { type: \"SET_BESKRIVELSE\"; beskrivelse: string }\r\n | { type: \"SET_EMNE\"; emne: string }\r\n | { type: \"SET_EMAIL\"; email: string }\r\n | { type: \"SET_TEMA\"; tema: Tema }\r\n | {\r\n type: \"ADD_FILE\";\r\n fileInfo: {\r\n beskrivelse: string;\r\n filId: number;\r\n geometri: Feature;\r\n originalFilNavn: string;\r\n };\r\n }\r\n | { type: \"UPDATE_FILE\"; index: number; beskrivelse: string }\r\n | { type: \"REMOVE_FILE\"; fileIndex: number }\r\n | {\r\n type: \"ADD_DRAWING\";\r\n drawingInfo: {\r\n aendringTypeId: number;\r\n aendringType: string;\r\n drawing: Feature;\r\n featureTypeId: number;\r\n featureType: string;\r\n beskrivelse: string;\r\n };\r\n }\r\n | {\r\n type: \"UPDATE_DRAWING\";\r\n index: number;\r\n drawingInfo: {\r\n aendringTypeId: number;\r\n aendringType: string;\r\n drawing: Feature;\r\n featureTypeId: number;\r\n featureType: string;\r\n beskrivelse: string;\r\n };\r\n }\r\n | { type: \"REMOVE_DRAWING\"; drawingIndex: number }\r\n ): NyIndberetningState => {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n switch (action.type) {\r\n case \"SET_ALL_TOUCHED\":\r\n return {\r\n geometri: { ...state.geometri, touched: true },\r\n fil: { ...state.fil, touched: true },\r\n emne: { ...state.emne, touched: true },\r\n vilkårAccepteret: { ...state.vilkårAccepteret, touched: true },\r\n beskrivelse: { ...state.beskrivelse, touched: true },\r\n tema: { ...state.tema, touched: true },\r\n email: { ...state.email, touched: true },\r\n };\r\n case \"SET_VILKAAR_ACCEPTERET\": {\r\n const i = {\r\n ...state,\r\n vilkårAccepteret: {\r\n ...state.vilkårAccepteret,\r\n value: action.vilkårAccepteret,\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n case \"SET_BESKRIVELSE\": {\r\n const i = {\r\n ...state,\r\n beskrivelse: {\r\n ...state.beskrivelse,\r\n value: action.beskrivelse,\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n case \"SET_EMNE\": {\r\n const i = {\r\n ...state,\r\n emne: {\r\n ...state.emne,\r\n value: action.emne,\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n case \"SET_TEMA\": {\r\n const i = {\r\n ...state,\r\n tema: {\r\n ...state.tema,\r\n value: action.tema,\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n case \"ADD_FILE\": {\r\n const { beskrivelse, filId, geometri, originalFilNavn } =\r\n action.fileInfo;\r\n const i = {\r\n ...state,\r\n fil: {\r\n ...state.fil,\r\n value: [\r\n ...state.fil.value,\r\n {\r\n beskrivelse,\r\n dato: new Date().toISOString(),\r\n filId,\r\n geometri,\r\n originalFilNavn,\r\n },\r\n ],\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n return i;\r\n }\r\n case \"UPDATE_FILE\": {\r\n const { beskrivelse, index } = action;\r\n const files = state.fil.value;\r\n const currentFile = files[index];\r\n if (currentFile) {\r\n const updatedFile = {\r\n ...currentFile,\r\n beskrivelse,\r\n };\r\n files[index] = updatedFile;\r\n }\r\n return state;\r\n }\r\n case \"REMOVE_FILE\": {\r\n const newFilArray = [...state.fil.value];\r\n newFilArray.splice(action.fileIndex, 1);\r\n const i = {\r\n ...state,\r\n fil: {\r\n ...state.fil,\r\n value: newFilArray,\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n case \"ADD_DRAWING\": {\r\n const {\r\n aendringType,\r\n aendringTypeId,\r\n beskrivelse,\r\n drawing,\r\n featureType,\r\n featureTypeId,\r\n } = action.drawingInfo;\r\n const i = {\r\n ...state,\r\n geometri: {\r\n ...state.fil,\r\n value: [\r\n ...state.geometri.value,\r\n {\r\n aendringTypeId,\r\n aendringType,\r\n drawing,\r\n featureTypeId,\r\n featureType,\r\n beskrivelse,\r\n dato: new Date().toISOString(),\r\n },\r\n ],\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n case \"UPDATE_DRAWING\": {\r\n const {\r\n aendringType,\r\n aendringTypeId,\r\n beskrivelse,\r\n drawing,\r\n featureType,\r\n featureTypeId,\r\n } = action.drawingInfo;\r\n const drawings = state.geometri.value;\r\n if (drawings[action.index]) {\r\n const updatedDrawing = {\r\n aendringTypeId,\r\n aendringType,\r\n drawing,\r\n featureTypeId,\r\n featureType,\r\n beskrivelse,\r\n dato: new Date().toISOString(),\r\n };\r\n drawings[action.index] = updatedDrawing;\r\n }\r\n return state;\r\n }\r\n case \"REMOVE_DRAWING\": {\r\n const newGeometriArray = [...state.geometri.value];\r\n newGeometriArray.splice(action.drawingIndex, 1);\r\n const i = {\r\n ...state,\r\n geometri: {\r\n ...state.geometri,\r\n value: newGeometriArray,\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n\r\n case \"SET_EMAIL\": {\r\n const i = {\r\n ...state,\r\n email: {\r\n ...state.email,\r\n value: action.email,\r\n },\r\n };\r\n setIndberetningValidation(validateNyIndberetningForm(i));\r\n return i;\r\n }\r\n }\r\n };\r\n const addDrawing = useCallback(\r\n (drawingInfo: {\r\n aendringTypeId: number;\r\n aendringType: string;\r\n drawing: Feature;\r\n featureTypeId: number;\r\n featureType: string;\r\n beskrivelse: string;\r\n }) => {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n setIndberetning({\r\n type: \"ADD_DRAWING\",\r\n drawingInfo,\r\n });\r\n },\r\n [dispatchToMap]\r\n );\r\n const updateDrawing = useCallback(\r\n (\r\n i: number,\r\n drawingInfo: {\r\n aendringTypeId: number;\r\n aendringType: string;\r\n drawing: Feature;\r\n featureTypeId: number;\r\n featureType: string;\r\n beskrivelse: string;\r\n }\r\n ) => {\r\n setIndberetning({\r\n type: \"UPDATE_DRAWING\",\r\n index: i,\r\n drawingInfo,\r\n });\r\n },\r\n []\r\n );\r\n const removeDrawing = (index: number) => {\r\n const geometri = indberetning.geometri.value[index];\r\n removeFeatureFromSource(geometri.drawing, finishedDrawingSource);\r\n removeFeatureFromSource(geometri.drawing, modifySource);\r\n setIndberetning({ type: \"REMOVE_DRAWING\", drawingIndex: index });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n };\r\n const updateFile = useCallback((i: number, beskrivelse: string) => {\r\n setIndberetning({\r\n type: \"UPDATE_FILE\",\r\n index: i,\r\n beskrivelse,\r\n });\r\n }, []);\r\n\r\n const removeFil = (index: number) => {\r\n const fil = indberetning.fil.value[index];\r\n removeFeatureFromSource(fil.geometri, finishedDrawingSource);\r\n removeFeatureFromSource(fil.geometri, modifySource);\r\n setIndberetning({ type: \"REMOVE_FILE\", fileIndex: index });\r\n };\r\n const [indberetning, setIndberetning] = useReducer(indberetningReducer, {\r\n vilkårAccepteret: { touched: false, value: false },\r\n beskrivelse: { touched: false, value: \"\" },\r\n emne: { touched: false, value: \"\" },\r\n geometri: { touched: false, value: [] },\r\n fil: { touched: false, value: [] },\r\n tema: { touched: false, value: undefined },\r\n email: {\r\n touched: false,\r\n value: \"\",\r\n },\r\n });\r\n\r\n // Set email when authstate is ready\r\n useEffect(() => {\r\n const userEmail = authState.currentUser.email;\r\n if (userEmail && userEmail !== indberetning.email.value) {\r\n setIndberetning({ type: \"SET_EMAIL\", email: userEmail });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [authState]);\r\n useEffect(() => {\r\n const getObjekttyperForTema = async () => {\r\n if (indberetning.tema.value) {\r\n const ot = await getObjekttyper(indberetning.tema.value.domainId);\r\n setObjekttyper(ot);\r\n }\r\n };\r\n getObjekttyperForTema();\r\n }, [indberetning.tema.value]);\r\n\r\n useEffect(() => {\r\n setDrawingCallback((drawing, isValid) => {\r\n if (!isValid) {\r\n finishedDrawingSource.removeFeature(drawing);\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Ugyldig geometri\",\r\n message: `Den angivne geometri er ugyldig, hvilket kan skyldes, at geometrien \"krydser\" sig selv.\\n\\nTegn venligst en ny geometri.`,\r\n },\r\n });\r\n } else {\r\n if (newFile.state === \"UPLOADED\" && newFile.file) {\r\n showModal({\r\n title: \"Beskriv filindhold\",\r\n content: (\r\n ,\r\n originalFilNavn: string\r\n ) => {\r\n setIndberetning({\r\n type: \"ADD_FILE\",\r\n fileInfo: { beskrivelse, filId, geometri, originalFilNavn },\r\n });\r\n\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n }}\r\n />\r\n ),\r\n closeModalCallback: () => {\r\n finishedDrawingSource.removeFeature(drawing);\r\n },\r\n });\r\n } else {\r\n showModal({\r\n title: \"Beskriv indtegning\",\r\n content: (\r\n ,\r\n featureTypeId: number,\r\n featureType: string,\r\n beskrivelse: string\r\n ) => {\r\n addDrawing({\r\n aendringTypeId,\r\n aendringType,\r\n drawing,\r\n featureTypeId,\r\n featureType,\r\n beskrivelse,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n />\r\n ),\r\n closeModalCallback: () => {\r\n finishedDrawingSource.removeFeature(drawing);\r\n },\r\n });\r\n }\r\n }\r\n });\r\n }, [\r\n dispatchToMap,\r\n indberetning,\r\n newFile.file,\r\n newFile.state,\r\n objekttyper,\r\n showModal,\r\n addDrawing,\r\n toast,\r\n ]);\r\n\r\n const disableForm = indberetning.tema.value === undefined;\r\n const temaOptions = [\r\n { value: \"\", label: \"Vælg tema\", disabled: true },\r\n ...tema.map((t) => {\r\n return { value: t.id.toString(), label: t.name };\r\n }),\r\n ];\r\n const cancelFileUploadAndDrawing = () => {\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n };\r\n const emneId = uniqueId(\"emne-input\");\r\n const beskrivelseId = uniqueId(\"beskrivelse-input\");\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n

    \r\n Opdateringer i kort\r\n

    \r\n

    Udfyld din indberetning

    \r\n\r\n {/* section */}\r\n
    \r\n {/* section head */}\r\n

    Hvor har du set noget der skal opdateres?

    \r\n {/* section content - component select */}\r\n
    \r\n {\r\n const t = tema.find((t) => t.id.toString() === temaId);\r\n if (t) {\r\n dispatchToMap({\r\n type: \"SET_LAYERS\",\r\n baselayers: t.baseLayers,\r\n layers: t.layers,\r\n });\r\n setIndberetning({ type: \"SET_TEMA\", tema: t });\r\n dispatchToMap({ type: \"SET_TEMA\", tema: t });\r\n }\r\n }}\r\n options={temaOptions.filter((t) => t.value !== \"1\")}\r\n />\r\n Det valgte kort vises til højre\r\n
    \r\n
    \r\n\r\n \r\n {/* section head */}\r\n

    Beskriv indberetning

    \r\n {/* section content - component input, component description */}\r\n
    \r\n \r\n {\r\n setIndberetning({ type: \"SET_EMNE\", emne: e.target.value });\r\n }}\r\n />\r\n \r\n
    \r\n
    \r\n \r\n {\r\n setIndberetning({\r\n type: \"SET_BESKRIVELSE\",\r\n beskrivelse: e.target.value,\r\n });\r\n }}\r\n >\r\n \r\n
    \r\n \r\n \r\n \r\n

    Indtegn din opdatering i kortet

    \r\n

    \r\n I kortet til højre skal du lokalisere stedet, som din indberetning\r\n omhandler. Du kan indtegne det med et punkt, en linje eller en\r\n polygon. Du kan også vælge at udpege det, som din indberetning\r\n drejer sig om fx en vej eller en bygning. Du har mulighed for at\r\n indtegne flere opdateringer, hvis der er behov for det.\r\n

    \r\n
    \r\n {indberetning.geometri.value.length === 0 && (\r\n \r\n Du har ingen opdateringer i kortet.\r\n \r\n )}\r\n {indberetning.geometri.value.length > 0 && (\r\n <>\r\n \r\n Tegnede opdateringer i kortet\r\n \r\n \r\n {indberetning.geometri.value.map((geometri, i) => {\r\n const id = geometri.drawing.get(\"id\");\r\n\r\n return (\r\n -1}\r\n geometri={geometri}\r\n setHoveredFeatures={(ids) => {\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: ids,\r\n });\r\n }}\r\n zoomToDrawing={() => {\r\n if (mapState.map) {\r\n zoomToFeature(mapState.map, geometri.drawing);\r\n }\r\n }}\r\n onEditGeometryClick={() => {\r\n cancelFileUploadAndDrawing();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: geometri.drawing,\r\n });\r\n }}\r\n onEditClick={() => {\r\n cancelFileUploadAndDrawing();\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n showModal({\r\n title: \"Rediger indtegning\",\r\n content: (\r\n ,\r\n featureTypeId: number,\r\n featureType: string,\r\n beskrivelse: string\r\n ) => {\r\n updateDrawing(i, {\r\n aendringTypeId,\r\n aendringType,\r\n drawing,\r\n featureTypeId,\r\n featureType,\r\n beskrivelse,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n />\r\n ),\r\n closeModalCallback: () => {},\r\n });\r\n }}\r\n onDeleteClick={() => {\r\n cancelFileUploadAndDrawing();\r\n showModal({\r\n title: \"Slet opdatering\",\r\n content: (\r\n {\r\n removeDrawing(i);\r\n }}\r\n closeModal={closeModal}\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 if (!activeDrawTool || newFile.file) {\r\n // Aktiver tegning\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: \"polygon\",\r\n });\r\n } else {\r\n // Fortryd tegning\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n }\r\n }}\r\n >\r\n {(!activeDrawTool || newFile.file) && (\r\n <>\r\n \r\n Tegn opdatering\r\n \r\n )}\r\n {activeDrawTool && !newFile.file && (\r\n <>\r\n \r\n Fortryd tegning\r\n \r\n )}\r\n \r\n
    \r\n {activeDrawTool && !newFile.file && (\r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n {indberetning.tema.value === undefined && (\r\n
    \r\n Vælg et korttema inden du tegner i kortet.\r\n
    \r\n )}\r\n \r\n\r\n {/* section */}\r\n \r\n {/* section head */}\r\n

    Upload fil

    \r\n

    \r\n Det er frivilligt om du vil tilføje filer til din opdatering, fx\r\n billeder af stedet, gis-filer eller en pdf, der viser dit\r\n ændringsforslag.\r\n

    \r\n {indberetning.fil.value.length === 0 && (\r\n \r\n Du har ikke vedlagt nogle filer\r\n \r\n )}\r\n {indberetning.fil.value.length > 0 && (\r\n <>\r\n Vedlagte filer\r\n
      \r\n {indberetning.fil.value.map((fil, i) => {\r\n const id = fil.geometri.get(\"id\");\r\n return (\r\n {\r\n if (mapState.map) {\r\n zoomToFeature(mapState.map, fil.geometri);\r\n }\r\n }}\r\n onMouseEnter={() =>\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: [id],\r\n })\r\n }\r\n onMouseLeave={() => {\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: [],\r\n });\r\n }}\r\n removeFil={() => removeFil(i)}\r\n onEditGeometryClick={() => {\r\n cancelFileUploadAndDrawing();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: fil.geometri,\r\n });\r\n }}\r\n onEditClick={() => {\r\n showModal({\r\n title: \"Rediger filindhold\",\r\n content: (\r\n {\r\n updateFile(i, beskrivelse);\r\n }}\r\n />\r\n ),\r\n closeModalCallback: () => {},\r\n });\r\n }}\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n );\r\n })}\r\n
    \r\n \r\n )}\r\n {/* section content - component draw */}\r\n\r\n {(newFile.state === \"IDLE\" || newFile.state === \"ERROR\") && (\r\n <>\r\n {newFile.state === \"ERROR\" && (\r\n \r\n \r\n \r\n \r\n
    {newFile.error}
    \r\n
    \r\n )}\r\n\r\n {\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n setNewFile({ state: \"UPLOADING\", file: undefined });\r\n const { files } = e.target;\r\n if (files && files.length) {\r\n const file = files[0];\r\n let formData = new FormData();\r\n formData.append(\"file\", file);\r\n uploadFile(formData)\r\n .then((resp) => {\r\n setNewFile({\r\n state: \"UPLOADED\",\r\n file: {\r\n id: resp.id,\r\n originalFilNavn: resp.originalFilNavn,\r\n },\r\n });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: \"polygon\",\r\n });\r\n })\r\n .catch((e) => {\r\n let errorMsg = \"Der skete en fejl\";\r\n if (e.isAxiosError && e.response?.status === 413) {\r\n errorMsg = \"Filen er for stor.. (max 10MB)\";\r\n }\r\n setNewFile({\r\n state: \"ERROR\",\r\n file: undefined,\r\n error: errorMsg,\r\n });\r\n });\r\n }\r\n }}\r\n />\r\n \r\n )}\r\n\r\n {newFile.state === \"UPLOADING\" && }\r\n {newFile.state === \"UPLOADED\" && newFile.file && (\r\n <>\r\n \r\n

    \r\n Afslut upload: Placer filen i kortet\r\n

    \r\n

    \r\n Filen {newFile.file.originalFilNavn} skal\r\n tilknyttes en placering i kortet før din upload er afsluttet.\r\n

    \r\n
    \r\n cancelFileUploadAndDrawing()}\r\n >\r\n \r\n Fortryd upload\r\n \r\n \r\n
    \r\n \r\n \r\n )}\r\n \r\n \r\n {\r\n resetValidationNotifies();\r\n }}\r\n show={\r\n indberetning.fil.touched &&\r\n indberetning.geometri.touched &&\r\n indberetningValidation.fields.filEllerGeometri.message !== \"\"\r\n }\r\n />\r\n {/* section */}\r\n \r\n {/* section head */}\r\n

    Send indberetning

    \r\n

    \r\n Vi har brug for din e-mailadresse for at kunne give dig besked om\r\n behandlingen af din indberetning og for at kunne kontakte dig, hvis vi\r\n eventuelt har spørgsmål til din indberetning eller har brug for flere\r\n oplysninger. Hvis du tidligere har indberettet, vil din e-mail\r\n allerede være udfyldt. Du kan rette din e-mailadresse i det udfyldte\r\n felt, hvis der er brug for det.\r\n

    \r\n {/* section content - component draw */}\r\n
    \r\n {\r\n setIndberetning({\r\n type: \"SET_EMAIL\",\r\n email,\r\n });\r\n }}\r\n showValidationWarning={\r\n indberetningValidation.fields.email.message !== \"\"\r\n }\r\n validationWarningMessage={\r\n indberetningValidation.fields.email.message\r\n }\r\n ref={emailRef}\r\n />\r\n {\r\n setIndberetning({\r\n type: \"SET_VILKAAR_ACCEPTERET\",\r\n vilkårAccepteret: checked,\r\n });\r\n }}\r\n disabled={disableForm}\r\n showValidationWarning={\r\n indberetning.vilkårAccepteret.touched &&\r\n indberetningValidation.fields.vilkårAccepteret.message !== \"\"\r\n }\r\n validationWarningMessage={\r\n (indberetningValidation.fields.vilkårAccepteret.message = \"\")\r\n }\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n
    \r\n {\r\n async function post() {\r\n try {\r\n if (!indberetning.tema.value)\r\n throw new Error(\"tema ikke sat\");\r\n const i = await postIndberetning(\r\n authState.currentUser.personId,\r\n indberetning.email.value,\r\n prepareSag(indberetning, indberetning.tema.value)\r\n );\r\n if (i.id) {\r\n if (\r\n authState.currentUser.email !== indberetning.email.value\r\n )\r\n setCurrentUserEmail(indberetning.email.value);\r\n toast({\r\n content: {\r\n message:\r\n \"Tak for din indberetning, her kan du se en opsummering af din indberetning\",\r\n },\r\n });\r\n history.push(\r\n routes.kortIndberetning.path.replace(\r\n \":id\",\r\n i.id.toString()\r\n )\r\n );\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n if (mapState.activeDrawTool) {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Tegner opdatering\",\r\n message:\r\n \"Gør færdig opdateringen i kortet inden du sender indberetningen ind.\",\r\n },\r\n });\r\n } else if (mapState.editGeometryState.active) {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Redigerer opdatering\",\r\n message:\r\n \"Gør færdig redigeringen i kortet inden du sender indberetningen ind.\",\r\n },\r\n });\r\n } else if (!indberetningValidation.form) {\r\n setIndberetning({ type: \"SET_ALL_TOUCHED\" });\r\n const {\r\n tema,\r\n emne,\r\n beskrivelse,\r\n filEllerGeometri,\r\n vilkårAccepteret,\r\n email,\r\n } = indberetningValidation.fields;\r\n if (tema.message && temaSelectRef.current) {\r\n temaSelectRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (\r\n (emne.message || beskrivelse.message) &&\r\n emneSectionRef.current\r\n ) {\r\n emneSectionRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (\r\n filEllerGeometri.message &&\r\n filSectionRef.current\r\n ) {\r\n filSectionRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (email.message && emailRef.current) {\r\n emailRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (\r\n vilkårAccepteret.message &&\r\n sendSectionRef.current\r\n ) {\r\n sendSectionRef.current.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n }\r\n setIndberetningValidation(\r\n validateNyIndberetningForm(indberetning)\r\n );\r\n } else {\r\n post();\r\n }\r\n }}\r\n type=\"button\"\r\n className=\"btn btn-lg btn-primary mt-4\"\r\n >\r\n Indsend indberetning\r\n \r\n
    \r\n
    \r\n \r\n \r\n );\r\n}\r\n","export default function ChevronLeftSmall(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-chevron-left\";\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import { AuthContext } from \"context/AuthProvider\";\r\nimport { Hoeringssag, RessourceRolleIdEnum } from \"interfaces/IIndberetning\";\r\nimport { useContext } from \"react\";\r\n\r\ninterface IIndberetningNavProps {\r\n indberetning: Hoeringssag;\r\n setActivePaneState: Function;\r\n activePaneState: \"sagsdetaljer\" | \"sagsbehandling\" | \"hoeringssag\";\r\n}\r\nexport default function IndberetningNav(props: IIndberetningNavProps) {\r\n const { authState } = useContext(AuthContext);\r\n const { indberetning, setActivePaneState, activePaneState } = props;\r\n const { currentUser } = authState;\r\n const {\r\n hoeringsansvarligmappe: hoeringsansvarligmappeListe,\r\n indberetningsmappe: indberetningsmappeListe,\r\n sagsbehandlermappe: sagsbehandlermappeListe,\r\n } = indberetning;\r\n\r\n const showSagsbehandlingButton =\r\n ((sagsbehandlermappeListe && sagsbehandlermappeListe.length > 0) ||\r\n (indberetningsmappeListe && indberetningsmappeListe.length > 0)) &&\r\n currentUser.rolleId !== RessourceRolleIdEnum.gæst;\r\n const showHøringssagButton =\r\n currentUser.rolleId !== RessourceRolleIdEnum.indberetter &&\r\n hoeringsansvarligmappeListe &&\r\n hoeringsansvarligmappeListe.length > 0 &&\r\n ![RessourceRolleIdEnum.indberetter, RessourceRolleIdEnum.gæst].includes(\r\n currentUser.rolleId\r\n );\r\n const showSagsdetaljerButton =\r\n indberetningsmappeListe &&\r\n indberetningsmappeListe.length > 0 &&\r\n showSagsbehandlingButton;\r\n if (!showSagsdetaljerButton) return null;\r\n return (\r\n \r\n );\r\n}\r\n","import { baseUrl } from \"api\";\r\nimport { useContext, useState } from \"react\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\n\r\nexport default function PrintModal(props: { sagId: number; personId: number }) {\r\n const { personId, sagId } = props;\r\n const { closeModal } = useContext(ModalContext);\r\n const [sagsbeskrivelse, setSagsbeskrivelse] = useState(true);\r\n const [kort, setKort] = useState(true);\r\n const [korrespondance, setKorrespondance] = useState(true);\r\n const [kommentarer, setKommentarer] = useState(true);\r\n const [geometrier, setGeometrier] = useState(true);\r\n const [filer, setFiler] = useState(true);\r\n\r\n return (\r\n
    \r\n

    \r\n Vælg hvilke dele af indberetningen, du ønsker at udskrive:\r\n

    \r\n\r\n {\r\n closeModal(true);\r\n }}\r\n target=\"_blank\"\r\n >\r\n \r\n \r\n
    \r\n \r\n setSagsbeskrivelse(e.target.checked)}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n setKort(e.target.checked)}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n setKorrespondance(e.target.checked)}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n setKommentarer(e.target.checked)}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n setGeometrier(e.target.checked)}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n setFiler(e.target.checked)}\r\n />\r\n
    \r\n\r\n {/* modal footer */}\r\n
    \r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n","import { useContext } from \"react\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\n\r\nexport enum BeskedType {\r\n besked = 0,\r\n note = 1,\r\n}\r\nexport default function PromptModal(props: {\r\n acceptPrompt: () => void;\r\n message: string;\r\n}) {\r\n const { closeModal } = useContext(ModalContext);\r\n const { message, acceptPrompt } = props;\r\n return (\r\n
    \r\n \r\n

    {message}

    \r\n
    \r\n
    \r\n {\r\n acceptPrompt();\r\n closeModal(false);\r\n }}\r\n >\r\n OK\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import {\r\n Hoeringssag,\r\n Ressource,\r\n RessourceRolleIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport { prioritetStore, statusStore, tema } from \"config/FipConfig\";\r\nimport Section from \"../Section\";\r\nimport { formatDateString, formatDottedDate } from \"util/date\";\r\nimport { Fragment, useContext } from \"react\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\nimport PrintModal from \"./PrintModal\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport useClipboard from \"react-use-clipboard\";\r\nimport { useRouter } from \"hooks/useRouter\";\r\n\r\ninterface IDetaljevisningProps {\r\n indberetning: Hoeringssag;\r\n indberetter: Ressource | undefined;\r\n sagsbehandler: Ressource | undefined;\r\n zoomToIndberetning: () => void;\r\n}\r\nexport default function Detaljevisning(props: IDetaljevisningProps) {\r\n const { indberetning, indberetter, sagsbehandler, zoomToIndberetning } =\r\n props;\r\n\r\n const { authState } = useContext(AuthContext);\r\n const { showModal } = useContext(ModalContext);\r\n const { isStednavn } = useRouter();\r\n const toast = useContext(ToastContext);\r\n const { currentUser } = authState;\r\n const { indberetningsmappe: indberetningsmappeListe } = indberetning;\r\n const [, setCopied] = useClipboard(window.location.href, {\r\n successDuration: 1000,\r\n });\r\n const aktivHøringspart = indberetning.ressource?.find(\r\n (x) => x.rolleId === RessourceRolleIdEnum.høringspart\r\n );\r\n const aktivIndberetter = indberetning.ressource?.find(\r\n (x) => x.rolleId === RessourceRolleIdEnum.indberetter\r\n );\r\n const isHøringsSag =\r\n indberetning.hoeringsansvarligmappe &&\r\n indberetning.hoeringsansvarligmappe.length > 0;\r\n return (\r\n \r\n
    \r\n

    Detaljevisning

    \r\n

    Sagsoplysninger.

    \r\n
    \r\n
    FIP ID:
    \r\n
    \r\n

    {indberetning.id}

    \r\n
    \r\n\r\n
    Emne:
    \r\n
    \r\n

    {indberetning.emne}

    \r\n
    \r\n {![RessourceRolleIdEnum.høringspart].includes(currentUser.rolleId) &&\r\n indberetter && (\r\n <>\r\n
    Indberetter:
    \r\n
    \r\n

    \r\n {indberetter.navn}{\" \"}\r\n {indberetter.organisationsnavn\r\n ? `(${indberetter.organisationsnavn})`\r\n : \"\"}\r\n

    \r\n
    \r\n \r\n )}\r\n {isStednavn &&\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n indberetter && (\r\n <>\r\n
    Indberetter email:
    \r\n
    \r\n

    {indberetter.email}

    \r\n
    \r\n \r\n )}\r\n {![\r\n RessourceRolleIdEnum.indberetter,\r\n RessourceRolleIdEnum.høringspart,\r\n RessourceRolleIdEnum.gæst,\r\n ].includes(currentUser.rolleId) && (\r\n <>\r\n
    Sagsbehandler:
    \r\n
    \r\n {sagsbehandler &&

    {sagsbehandler.navn}

    }\r\n {!sagsbehandler &&

    Ingen sagsbehandler tilknyttet

    }\r\n
    \r\n \r\n )}\r\n {indberetning.oprettetTs && (\r\n <>\r\n
    Oprettet:
    \r\n
    \r\n

    \r\n \r\n {formatDateString(indberetning.oprettetTs)}\r\n \r\n \r\n \r\n {formatDateString(indberetning.oprettetTs, \"dd-MM-yyyy\")}\r\n {\" \"}\r\n klokken {formatDateString(indberetning.oprettetTs, \"HH:mm\")}\r\n \r\n

    \r\n
    \r\n \r\n )}\r\n {indberetning.tilTs && (\r\n <>\r\n
    Afsluttet:
    \r\n
    \r\n

    \r\n \r\n {indberetning.tilTs !== \"9999-12-31T00:00:00\" // TODO, this seems like a sketchy check, probably safer to use the status of the indberetning\r\n ? formatDateString(indberetning.tilTs)\r\n : \"-\"}\r\n \r\n \r\n {indberetning.tilTs !== \"9999-12-31T00:00:00\" ? (\r\n <>\r\n \r\n {formatDateString(indberetning.tilTs, \"dd-MM-yyyy\")}\r\n {\" \"}\r\n klokken {formatDateString(indberetning.tilTs, \"HH:mm\")}\r\n \r\n ) : (\r\n \"Ikke afsluttet\"\r\n )}\r\n \r\n

    \r\n
    \r\n \r\n )}\r\n\r\n {currentUser.rolleId !== RessourceRolleIdEnum.indberetter && (\r\n \r\n {!isStednavn &&\r\n indberetning.domaeneType &&\r\n ![RessourceRolleIdEnum.høringspart].includes(\r\n currentUser.rolleId\r\n ) && (\r\n <>\r\n
    Domæne:
    \r\n
    \r\n

    {indberetning.domaeneType}

    \r\n
    \r\n \r\n )}\r\n {indberetning.statusId > 0 &&\r\n ![RessourceRolleIdEnum.høringspart].includes(\r\n currentUser.rolleId\r\n ) && (\r\n <>\r\n
    Status:
    \r\n
    \r\n

    \r\n {\r\n statusStore.find(\r\n (s) => s.id === indberetning.statusId\r\n )?.name\r\n }\r\n

    \r\n
    \r\n \r\n )}\r\n {isHøringsSag && (\r\n <>\r\n
    Aktiv høringspart:
    \r\n
    \r\n

    \r\n {aktivHøringspart\r\n ? `${aktivHøringspart.navn} (${aktivHøringspart.organisationsnavn})`\r\n : \"Ingen\"}\r\n

    \r\n
    \r\n
    Høringssvar:
    \r\n
    \r\n {indberetning.hoeringspartmappe &&\r\n indberetning.hoeringspartmappe.map((e) => {\r\n return (\r\n

    \r\n {e.organisationNavn}:{\" \"}\r\n {e.svar ? e.svar : ` IKKE AFGIVET`}\r\n

    \r\n );\r\n })}\r\n
    \r\n
    Høringsfrist:
    \r\n
    \r\n {indberetning.hoeringspartmappe &&\r\n indberetning.hoeringspartmappe.map((e) => {\r\n return (\r\n

    \r\n {e.organisationNavn}:{\" \"}\r\n {e.svarFrist ? formatDottedDate(e.svarFrist) : \"\"}\r\n

    \r\n );\r\n })}\r\n
    \r\n \r\n )}\r\n {!isStednavn &&\r\n ![\r\n RessourceRolleIdEnum.høringspart,\r\n RessourceRolleIdEnum.gæst,\r\n ].includes(currentUser.rolleId) && (\r\n <>\r\n
    Frist:
    \r\n
    \r\n

    \r\n {indberetning.frist\r\n ? formatDottedDate(indberetning.frist)\r\n : \"\"}\r\n

    \r\n
    \r\n \r\n )}\r\n {![\r\n RessourceRolleIdEnum.høringspart,\r\n RessourceRolleIdEnum.gæst,\r\n ].includes(currentUser.rolleId) && (\r\n <>\r\n {!isStednavn && (\r\n <>\r\n {\" \"}\r\n
    Prioriteret:
    \r\n
    \r\n

    \r\n {\r\n prioritetStore.find(\r\n (p) => p.id === indberetning.prioritet\r\n )?.name\r\n }\r\n

    \r\n
    \r\n \r\n )}\r\n\r\n
    ESDH Journal:
    \r\n
    \r\n {!indberetning.esdhJournalNummer && (\r\n

    Ingen ESDH-journal

    \r\n )}\r\n {indberetning.esdhJournalNummer && (\r\n \r\n Gå til ESDH-journal ({indberetning.esdhJournalNummer})\r\n \r\n )}\r\n
    \r\n \r\n )}\r\n
    \r\n )}\r\n {![\r\n RessourceRolleIdEnum.indberetter,\r\n RessourceRolleIdEnum.høringspart,\r\n ].includes(currentUser.rolleId) &&\r\n indberetningsmappeListe.map((indberetningsmappe, index) => {\r\n const {\r\n korttemaId,\r\n // geometri,\r\n // fil\r\n } = indberetningsmappe;\r\n const korttema = tema.find((t) => t.id === korttemaId)?.name;\r\n return (\r\n \r\n {/* korttema */}\r\n {!isStednavn && korttema && (\r\n <>\r\n
    Korttema:
    \r\n
    \r\n

    {korttema}

    \r\n
    \r\n \r\n )}\r\n
    \r\n );\r\n })}\r\n {/*
    */}\r\n {!(\r\n [RessourceRolleIdEnum.gæst].includes(currentUser.rolleId) ||\r\n (currentUser.rolleId === RessourceRolleIdEnum.indberetter &&\r\n aktivIndberetter?.personId !== currentUser.personId)\r\n ) && (\r\n <>\r\n
    Beskrivelse:
    \r\n
    \r\n

    {indberetning.beskrivelse}

    \r\n
    \r\n \r\n )}\r\n {/*
    */}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {currentUser.rolleId !== RessourceRolleIdEnum.indberetter && (\r\n {\r\n setCopied();\r\n toast({\r\n type: \"default\",\r\n content: { message: \"URL kopieret til udklipsholder\" },\r\n });\r\n }}\r\n >\r\n Kopier url\r\n \r\n )}\r\n {\r\n showModal({\r\n content: (\r\n \r\n ),\r\n title: \"Print\",\r\n });\r\n }}\r\n >\r\n Print\r\n \r\n \r\n Zoom til indberetning\r\n \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n","import { prioritetStore, domaeneStore } from \"config/FipConfig\";\r\nimport { AuthContext, Bruger } from \"context/AuthProvider\";\r\nimport { format } from \"date-fns\";\r\nimport {\r\n Hoeringssag,\r\n RedigerIndberetningDTO,\r\n Ressource,\r\n} from \"interfaces/IIndberetning\";\r\nimport { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\nimport Select from \"../../FormElements/Select\";\r\n\r\nexport default function RedigerIndberetningModal(props: {\r\n message: string;\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n redigerIndberetning: (\r\n user: Bruger,\r\n indberetning: Hoeringssag\r\n ) => Promise;\r\n}) {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const { authState } = useContext(AuthContext);\r\n const { currentUser } = authState;\r\n const { indberetning, setIndberetning, redigerIndberetning } = props;\r\n const [values, setValues] = useState({\r\n frist: indberetning.frist\r\n ? format(new Date(indberetning.frist), \"yyyy-MM-dd\")\r\n : \"\",\r\n prioritet: indberetning.prioritet,\r\n domaene: indberetning.domaeneTypeId,\r\n });\r\n\r\n function handleChange(e) {\r\n let value;\r\n switch (e.target.name) {\r\n case \"frist\":\r\n value = e.target.value;\r\n break;\r\n default:\r\n value = parseInt(e.target.value);\r\n }\r\n setValues({\r\n ...values,\r\n [e.target.name]: value,\r\n });\r\n }\r\n const acceptPrompt = () => {\r\n // Do stuff that makes you take the indberetning\r\n\r\n const domaeneType = domaeneStore.find((x) => x.id === values.domaene)?.name;\r\n\r\n const frist = values.frist\r\n ? format(new Date(values.frist), \"yyyy-MM-dd'T00:00:00'\") // TODO: Is this correct?\r\n : null;\r\n if (domaeneType !== undefined) {\r\n let dto: RedigerIndberetningDTO = {\r\n domaeneTypeId: values.domaene,\r\n domaeneType: domaeneType,\r\n prioritet: prioritetStore[values.prioritet].id,\r\n frist: frist,\r\n };\r\n let nyIndberetning = { ...indberetning, ...dto };\r\n\r\n redigerIndberetning(currentUser, nyIndberetning).then((e) => {\r\n setIndberetning(e);\r\n });\r\n } else {\r\n console.error(\"fejl i rediger indberetning\");\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 return { label: e.name, value: e.id.toString() };\r\n })}\r\n />\r\n
    \r\n
    \r\n {\r\n return { label: e.name, value: e.id.toString() };\r\n })}\r\n />\r\n
    \r\n
    \r\n
    \r\n {\r\n acceptPrompt();\r\n closeModal(false);\r\n }}\r\n >\r\n OK\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import { AuthContext } from \"context/AuthProvider\";\r\nimport {\r\n Hoeringssag,\r\n Indlaeg,\r\n IndlaegTypeIdEnum,\r\n Ressource,\r\n RessourceRolleIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\n\r\nimport {\r\n useContext,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\nimport Select from \"../../FormElements/Select\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport ValidationErrorMessage from \"../../FormElements/ValidationErrorMessage\";\r\nimport { Objekttype, SagsbehandlingApi } from \"api/interfaces\";\r\n\r\nexport default function VideresendIndberetningModal(props: {\r\n message: string;\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n sagsbehandlingApi: SagsbehandlingApi;\r\n}) {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const toast = useContext(ToastContext);\r\n const { authState } = useContext(AuthContext);\r\n const { currentUser } = authState;\r\n const { indberetning, setIndberetning, sagsbehandlingApi } = props;\r\n const { getPersoner, skrivChatBesked, videresendIndberetning } =\r\n sagsbehandlingApi;\r\n const [values, setValues] = useState({\r\n person: -1,\r\n kommentar: \"\",\r\n });\r\n const [personer, setPersoner] = useState([]);\r\n const [didPressSend, setDidPressSend] = useState(false);\r\n const [notify, setNotify] = useState({\r\n person: false,\r\n kommentar: false,\r\n });\r\n const resetNotifyPerson = () => setNotify({ ...notify, person: false });\r\n const resetNotifyKommentar = () => setNotify({ ...notify, kommentar: false });\r\n\r\n useEffect(() => {\r\n const getPersonerAsync = async () => {\r\n const ot = await getPersoner(currentUser);\r\n setPersoner(ot);\r\n };\r\n getPersonerAsync();\r\n }, [currentUser, getPersoner]);\r\n\r\n function handleChange(e) {\r\n let value;\r\n switch (e.target.name) {\r\n case \"person\":\r\n value = parseInt(e.target.value);\r\n break;\r\n default:\r\n value = e.target.value;\r\n }\r\n\r\n setValues({\r\n ...values,\r\n [e.target.name]: value,\r\n });\r\n }\r\n const acceptPrompt = () => {\r\n // Find den nuværende sagsbehandler indberetning:\r\n let nuvaerendeRessource = indberetning.ressource.find(\r\n (x) => x.rolleId === RessourceRolleIdEnum.sagsbehandler\r\n );\r\n if (nuvaerendeRessource) {\r\n videresendIndberetning(values.person, nuvaerendeRessource).then(\r\n (nyRessource: Ressource) => {\r\n // Ny sagsbehandler\r\n const index = indberetning.ressource.findIndex(\r\n (x) => x.rolleId === RessourceRolleIdEnum.sagsbehandler\r\n );\r\n let nyIndberetning = indberetning;\r\n nyIndberetning.ressource[index] = nyRessource;\r\n toast({\r\n content: {\r\n message: `Din sag blev vidersendt til sagsbehandler ${nyRessource.navn}.`,\r\n },\r\n type: \"default\",\r\n });\r\n setIndberetning(nyIndberetning);\r\n }\r\n );\r\n let indlaeg: Indlaeg = {\r\n id: 0,\r\n indhold: values.kommentar,\r\n organisationNavn: \"\",\r\n personId: currentUser.personId,\r\n personNavn: currentUser.navn,\r\n typeId: IndlaegTypeIdEnum.overdragelseskommentar,\r\n typeNavn: \"\",\r\n organisationId: 0,\r\n organisationForkortelse: \"\",\r\n ts: \"\",\r\n };\r\n skrivChatBesked(currentUser.personId, indberetning.id, indlaeg).then(\r\n (nytIndlaeg) => {\r\n // TODO check if this is the same as fetching the indberetning again\r\n // If it's not it's easier to just pass a flag that the indberetning should be fetched again\r\n // But it will create a much larger rerender i think.\r\n let nyIndberetning = indberetning;\r\n nyIndberetning.korrespondance.push(nytIndlaeg);\r\n setIndberetning(nyIndberetning);\r\n }\r\n );\r\n }\r\n };\r\n return (\r\n
    \r\n
    \r\n
    \r\n {\r\n return { label: e.text, value: e.value.toString() };\r\n }),\r\n ]}\r\n />\r\n resetNotifyPerson()}\r\n />\r\n
    \r\n
    \r\n \r\n \r\n resetNotifyKommentar()}\r\n />\r\n
    \r\n
    \r\n
    \r\n {\r\n if (values.kommentar && values.person !== -1) {\r\n acceptPrompt();\r\n closeModal(false);\r\n } else {\r\n setNotify({ person: true, kommentar: true });\r\n setDidPressSend(true);\r\n }\r\n }}\r\n >\r\n OK\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import {\r\n getHoeringsPersoner,\r\n getIndberetning,\r\n skrivChatBesked,\r\n videresendIndberetningTilHoering,\r\n videresendIndberetningTilHoeringInternt,\r\n} from \"api/fip\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\nimport {\r\n Hoeringssag,\r\n Indlaeg,\r\n IndlaegTypeIdEnum,\r\n Ressource,\r\n RessourceRolleIdEnum,\r\n // statusIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport {\r\n useContext,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\nimport Select from \"../../FormElements/Select\";\r\nimport ValidationErrorMessage from \"../../FormElements/ValidationErrorMessage\";\r\nimport LoadingSpinner from \"../../LoadingSpinner\";\r\nimport { Objekttype } from \"api/interfaces\";\r\n\r\nexport default function VideresendIndberetningTilHoeringModal(props: {\r\n currentUser: Bruger;\r\n message: string;\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n}) {\r\n const { closeModal } = useContext(ModalContext);\r\n const { indberetning, setIndberetning, currentUser } = props;\r\n const [values, setValues] = useState({\r\n person: -1,\r\n kommentar: \"\",\r\n });\r\n const [state, setState] = useState(\"LOADING\");\r\n const [personer, setPersoner] = useState([]);\r\n\r\n const [notify, setNotify] = useState({\r\n person: false,\r\n kommentar: false,\r\n });\r\n const resetNotifyPerson = () => setNotify({ ...notify, person: false });\r\n const resetNotifyKommentar = () => setNotify({ ...notify, kommentar: false });\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n if (personer.length) {\r\n setTimeout(() => {\r\n // settimeout pga conditional render\r\n firstFocusRef.current?.focus();\r\n }, 0);\r\n }\r\n }, [personer]);\r\n const [didPressSend, setDidPressSend] = useState(false);\r\n\r\n useEffect(() => {\r\n const getPersonerAsync = async () => {\r\n const ot = await getHoeringsPersoner(\r\n currentUser,\r\n currentUser.rolleId === RessourceRolleIdEnum.høringspart\r\n ? currentUser.organisationId\r\n : undefined\r\n );\r\n setPersoner(ot.filter((p) => p.value !== currentUser.personId));\r\n setState(\"IDLE\");\r\n };\r\n setState(\"LOADING\");\r\n getPersonerAsync();\r\n }, [currentUser]);\r\n\r\n function handleChange(e) {\r\n let value;\r\n switch (e.target.name) {\r\n case \"person\":\r\n value = parseInt(e.target.value);\r\n break;\r\n default:\r\n value = e.target.value;\r\n }\r\n\r\n setValues({\r\n ...values,\r\n [e.target.name]: value,\r\n });\r\n }\r\n const acceptPrompt = () => {\r\n // Find den nuværende høringspart:\r\n let nuvaerendeRessource = indberetning.ressource.find(\r\n (x) => x.rolleId === RessourceRolleIdEnum.høringspart\r\n );\r\n let indlaeg: Indlaeg = {\r\n id: 0,\r\n indhold: values.kommentar,\r\n organisationNavn: \"\",\r\n personId: currentUser.personId,\r\n personNavn: currentUser.navn,\r\n typeId: IndlaegTypeIdEnum.overdragelseskommentar,\r\n typeNavn: \"\",\r\n organisationId: 0,\r\n organisationForkortelse: \"\",\r\n ts: \"\",\r\n };\r\n // Hvis der er en høringspart, skal den sendes internt\r\n if (nuvaerendeRessource) {\r\n // First we need to post the indlaeg\r\n\r\n videresendIndberetningTilHoeringInternt(\r\n currentUser,\r\n nuvaerendeRessource.id,\r\n values.person,\r\n indberetning,\r\n values.kommentar\r\n )\r\n .then((nyRessource: Ressource) => {\r\n skrivChatBesked(currentUser.personId, indberetning.id, indlaeg)\r\n .then((e) => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n }\r\n );\r\n })\r\n .catch((e) => {\r\n throw new Error(\"Kunne ikke sende overdragelseskommentar - FEJL\");\r\n });\r\n })\r\n .catch((e) => {\r\n throw new Error(\"Kunne ikke overdrage høringssagen - FEJL\");\r\n });\r\n // Hvis der ikke er en høringspart, skal den ikke sendes internt, men oprettes i systemet.\r\n } else {\r\n videresendIndberetningTilHoering(\r\n currentUser,\r\n values.person,\r\n indberetning,\r\n values.kommentar\r\n )\r\n .then((nyRessource: Ressource) => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n }\r\n );\r\n })\r\n .catch((e) => {\r\n throw new Error(\"Kunne ikke overdrage høringssagen - FEJL\");\r\n });\r\n }\r\n };\r\n if (state === \"LOADING\") {\r\n return ;\r\n }\r\n return (\r\n
    \r\n {personer.length === 0 && (\r\n <>\r\n
    \r\n Du den eneste registrerede sagsbehandler i din organisation.\r\n
    \r\n
    \r\n closeModal(false)}\r\n >\r\n OK\r\n \r\n
    \r\n \r\n )}\r\n {personer.length > 0 && (\r\n <>\r\n
    \r\n
    \r\n {\r\n return { label: e.text, value: e.value.toString() };\r\n }),\r\n ]}\r\n />\r\n resetNotifyPerson()}\r\n />\r\n
    \r\n
    \r\n \r\n {\" \"}\r\n resetNotifyKommentar()}\r\n />\r\n
    \r\n
    \r\n
    \r\n {\r\n if (!values.kommentar || values.person < 0) {\r\n setDidPressSend(true);\r\n } else {\r\n acceptPrompt();\r\n closeModal(false);\r\n }\r\n }}\r\n >\r\n OK\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n \r\n )}\r\n
    \r\n );\r\n}\r\n","import { getIndberetning, redigerHoeringspartMappe } from \"api/fip\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { format } from \"date-fns\";\r\nimport { Hoeringsmappe, Hoeringssag } from \"interfaces/IIndberetning\";\r\nimport { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\n\r\nexport default function RedigerHoeringsFristModal(props: {\r\n message: string;\r\n indberetning: Hoeringssag;\r\n hoeringspartmappe: Hoeringsmappe;\r\n setIndberetning: Function;\r\n}) {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const { authState } = useContext(AuthContext);\r\n const { currentUser } = authState;\r\n const { indberetning, setIndberetning, hoeringspartmappe } = props;\r\n\r\n const [values, setValues] = useState({\r\n frist: hoeringspartmappe.svarFrist\r\n ? format(new Date(hoeringspartmappe.svarFrist), \"yyyy-MM-dd\")\r\n : \"\",\r\n });\r\n\r\n function handleChange(e) {\r\n let value = e.target.value;\r\n\r\n setValues({\r\n ...values,\r\n [e.target.name]: value,\r\n });\r\n }\r\n const acceptPrompt = () => {\r\n // Do stuff when accepted\r\n\r\n const frist = values.frist\r\n ? format(new Date(values.frist), \"yyyy-MM-dd'T00:00:00'\") // TODO: Is this correct?\r\n : \"\";\r\n if (hoeringspartmappe !== undefined) {\r\n let nyHoeringspartmappe = {\r\n ...hoeringspartmappe,\r\n ...{ svarFrist: frist },\r\n };\r\n\r\n redigerHoeringspartMappe(currentUser, nyHoeringspartmappe).then((e) => {\r\n getIndberetning(indberetning.id, currentUser.personId).then((e) => {\r\n setIndberetning(e);\r\n });\r\n });\r\n } else {\r\n console.error(\"fejl i rediger indberetning\");\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 acceptPrompt();\r\n closeModal(false);\r\n }}\r\n >\r\n OK\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport ValidationErrorMessage from \"../FormElements/ValidationErrorMessage\";\r\nimport { ModalContext } from \"../Modal/Modal\";\r\n\r\nexport default function AfslutIndberetningModal(props: {\r\n afslutIndberetning: (kommentar: string) => void;\r\n}) {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const { afslutIndberetning } = props;\r\n const [kommentar, setKommentar] = useState(\"\");\r\n const [notify, setNotify] = useState(false);\r\n const [didPressSend, setDidPressSend] = useState(false);\r\n return (\r\n
    \r\n \r\n setKommentar(e.target.value)}\r\n >\r\n {\r\n setNotify(false);\r\n }}\r\n />\r\n
    \r\n {\r\n if (!kommentar) {\r\n setDidPressSend(true);\r\n setNotify(true);\r\n } else {\r\n afslutIndberetning(kommentar);\r\n closeModal(false);\r\n }\r\n }}\r\n >\r\n Ok\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import {\r\n DomaeneTypeIdEnum,\r\n Hoeringsmappe,\r\n Hoeringssag,\r\n isHoeringssag,\r\n Ressource,\r\n RessourceRolleIdEnum,\r\n statusIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport Section from \"../../Section\";\r\nimport { Fragment, useContext } from \"react\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\nimport { isIndberetningMine } from \"routes/Fip/FipIndberetning\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\nimport PromptModal from \"../PromptModal\";\r\nimport RedigerIndberetningModal from \"./RedigerIndberetningModal\";\r\nimport VideresendIndberetningModal from \"./VideresendIndberetningModal\";\r\nimport VideresendIndberetningTilHoeringModal from \"./VideresendIndberetningTilHoeringModal\";\r\nimport RedigerHoeringsFristModal from \"./RedigerHoeringsFristModal\";\r\nimport { baseUrl } from \"api\";\r\nimport { getDownloadGeometryLink } from \"routes/Fip/fipUtil\";\r\n// import AfslutIndberetning from \"./AfslutIndberetningModal\";\r\nimport AfslutIndberetningModal from \"../AfslutIndberetningModal\";\r\nimport { SagsbehandlingApi } from \"api/interfaces\";\r\n\r\ninterface ISagsbehandlerfunktionerProps {\r\n currentUser: Bruger;\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n cancelDrawingAndUploadFile: () => void;\r\n sagsbehandlingApi: SagsbehandlingApi;\r\n}\r\n\r\nexport default function Sagsbehandlerfunktioner(\r\n props: ISagsbehandlerfunktionerProps\r\n) {\r\n const {\r\n currentUser,\r\n indberetning,\r\n setIndberetning,\r\n cancelDrawingAndUploadFile,\r\n sagsbehandlingApi,\r\n } = props;\r\n const { showModal } = useContext(ModalContext);\r\n const { statusId } = indberetning;\r\n const {\r\n afbrydHoering,\r\n afslutIndberetning,\r\n getIndberetning,\r\n opretHoeringssag,\r\n redigerIndberetning,\r\n tagIndberetning,\r\n tagIndberetningFraSagsbehandler,\r\n } = sagsbehandlingApi;\r\n const indberetningIsAfsluttet =\r\n statusId === statusIdEnum.afsluttet ? true : false;\r\n //const indberetningIsHoeringssag =\r\n // statusId === statusIdEnum.iHoering ? true : false;\r\n return (\r\n
    \r\n
    \r\n
    \r\n Sagsbehandlerfunktioner\r\n

    Foretag ændringer eller tilføjelser til indberetningen.

    \r\n
      \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Tag indberetning\",\r\n content: (\r\n {\r\n // Do stuff that makes you take the indberetning\r\n\r\n const daværendeRessource =\r\n indberetning.ressource?.find(\r\n (x) =>\r\n x.rolleId === RessourceRolleIdEnum.sagsbehandler\r\n );\r\n if (daværendeRessource) {\r\n daværendeRessource.personId = currentUser.personId;\r\n // Prøv kun at sende personId som payload\r\n tagIndberetningFraSagsbehandler(\r\n currentUser,\r\n daværendeRessource\r\n ).then((nyRessource: Ressource) => {\r\n // Ny sagsbehandler\r\n const index = indberetning.ressource.findIndex(\r\n (x) =>\r\n x.rolleId ===\r\n RessourceRolleIdEnum.sagsbehandler\r\n );\r\n let nyIndberetning = indberetning;\r\n nyIndberetning.ressource[index] = nyRessource;\r\n setIndberetning(nyIndberetning);\r\n });\r\n } else {\r\n tagIndberetning(\r\n currentUser,\r\n indberetning,\r\n statusIdEnum.underBehandling\r\n ).then((nyRessource: Ressource) => {\r\n // update state with new indberetning\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n });\r\n });\r\n }\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Tag indberetning\r\n \r\n
    • \r\n
    • \r\n {\r\n //TODO: Fix modal callback\r\n }\r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Rediger sagsoplysninger\",\r\n content: (\r\n \r\n ),\r\n });\r\n }}\r\n >\r\n Rediger indberetning\r\n \r\n
    • \r\n
    • \r\n {\r\n //TODO: Fix modal callback\r\n }\r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Videresend sag\",\r\n content: (\r\n \r\n ),\r\n });\r\n }}\r\n >\r\n Videresend indberetning\r\n \r\n
    • \r\n\r\n {/* Only if sag is a hoeringssag (a geodanmark case) */}\r\n {/* Also check that the sag is not already a hoeringssag */}\r\n {indberetning.domaeneTypeId === DomaeneTypeIdEnum.geoDanmark && (\r\n \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Opret høringssag\",\r\n content: (\r\n {\r\n opretHoeringssag(currentUser, indberetning).then(\r\n (nyIndberetning: Hoeringssag) => {\r\n setIndberetning(nyIndberetning);\r\n }\r\n );\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Opret høringssag\r\n \r\n
    • \r\n {indberetning.statusId === statusIdEnum.iHoering && (\r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Afbryd høring\",\r\n content: (\r\n {\r\n // Do stuff when you press accept\r\n const daværendeRessource =\r\n indberetning.ressource.find(\r\n (x) =>\r\n x.rolleId ===\r\n RessourceRolleIdEnum.høringspart\r\n );\r\n if (daværendeRessource) {\r\n // Prøv kun at sende personId som payload\r\n afbrydHoering(\r\n currentUser,\r\n daværendeRessource,\r\n indberetning,\r\n statusIdEnum.underBehandling\r\n ).then(() => {\r\n // Ny indberetning fordi side-effects er svære at regne ud her..\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n });\r\n });\r\n }\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Afbryd høring\r\n \r\n
    • \r\n )}\r\n {indberetning.statusId !== statusIdEnum.iHoering && (\r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Videresend sag til høringspart\",\r\n content: (\r\n \r\n ),\r\n });\r\n }}\r\n >\r\n Videresend sag til høringspart\r\n \r\n
    • \r\n )}\r\n {indberetning.domaeneTypeId ===\r\n DomaeneTypeIdEnum.geoDanmark && (\r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Rediger høringsoplysninger\",\r\n content: (\r\n \r\n ),\r\n });\r\n }}\r\n >\r\n Opret/Rediger høringsfrist\r\n \r\n
    • \r\n )}\r\n
      \r\n )}\r\n\r\n
    • \r\n \r\n Download geometrier\r\n \r\n \r\n \r\n \r\n \r\n
    • \r\n\r\n {/*\r\n {\r\n downloadFiles(currentUser, indberetning).then((data) => {\r\n const downloadUrl = window.URL.createObjectURL(\r\n new Blob([data])\r\n );\r\n const link = document.createElement(\"a\");\r\n link.href = downloadUrl;\r\n link.setAttribute(\"download\", \"FIP.zip\"); //any other extension\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n });\r\n }}\r\n >\r\n Download filer\r\n */}\r\n
    • \r\n \r\n Download filer\r\n \r\n \r\n \r\n \r\n \r\n
    • \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Afslut indberetning\",\r\n content: (\r\n {\r\n afslutIndberetning(\r\n kommentar,\r\n currentUser,\r\n indberetning.id,\r\n indberetning\r\n ).then(() => {\r\n // After vi afslutter indberetningen, er det nemmere at hente den ned igen.\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n });\r\n });\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Afslut indberetning\r\n \r\n
    • \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n","import { getIndberetning, redigerHoeringspartMappe } from \"api/fip\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { Hoeringsmappe, Hoeringssag } from \"interfaces/IIndberetning\";\r\nimport { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\n\r\nexport default function RedigerHoeringsSvarModal(props: {\r\n message: string;\r\n indberetning: Hoeringssag;\r\n hoeringspartmappe: Hoeringsmappe;\r\n setIndberetning: Function;\r\n}) {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const { authState } = useContext(AuthContext);\r\n const { currentUser } = authState;\r\n const { indberetning, setIndberetning, hoeringspartmappe } = props;\r\n\r\n const [values, setValues] = useState({\r\n hoeringssvar: hoeringspartmappe.svar ? hoeringspartmappe.svar : \"\",\r\n });\r\n\r\n function handleChange(e) {\r\n let value = e.target.value;\r\n\r\n setValues({\r\n ...values,\r\n [e.target.name]: value,\r\n });\r\n }\r\n const acceptPrompt = () => {\r\n // Do stuff when accepted\r\n\r\n const hoeringssvar = values.hoeringssvar;\r\n if (hoeringspartmappe !== undefined) {\r\n let nyHoeringspartmappe = {\r\n ...hoeringspartmappe,\r\n ...{ svar: hoeringssvar },\r\n };\r\n\r\n redigerHoeringspartMappe(currentUser, nyHoeringspartmappe).then((e) => {\r\n getIndberetning(indberetning.id, currentUser.personId).then((e) => {\r\n setIndberetning(e);\r\n });\r\n });\r\n } else {\r\n throw new Error(\"Fejl i redigering af høringssvar\");\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 acceptPrompt();\r\n closeModal(false);\r\n }}\r\n >\r\n OK\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import {\r\n Hoeringssag,\r\n Ressource,\r\n RessourceRolleIdEnum,\r\n statusIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport Section from \"../../Section\";\r\nimport { useContext } from \"react\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\nimport { isIndberetningMine } from \"routes/Fip/FipIndberetning\";\r\nimport VideresendIndberetningTilHoeringModal from \"./VideresendIndberetningTilHoeringModal\";\r\nimport PromptModal from \"../PromptModal\";\r\nimport {\r\n afslutHoeringsbehandling,\r\n getIndberetning,\r\n tagHoeringssagFraHoeringspart,\r\n} from \"api/fip\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport RedigerHoeringsSvarModal from \"./RedigerHoeringsSvarModal\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\n\r\ninterface IHoeringspartfunktionerProps {\r\n currentUser: Bruger;\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n cancelDrawingAndUploadFile: () => void;\r\n}\r\n\r\nexport default function Hoeringspartfunktioner(\r\n props: IHoeringspartfunktionerProps\r\n) {\r\n /* eslint-disable @typescript-eslint/no-unused-vars */\r\n const {\r\n currentUser,\r\n indberetning,\r\n setIndberetning,\r\n cancelDrawingAndUploadFile,\r\n } = props;\r\n const { showModal, closeModal } = useContext(ModalContext);\r\n const toast = useContext(ToastContext);\r\n const { statusId } = indberetning;\r\n const indberetningIsAfsluttet =\r\n statusId === statusIdEnum.afsluttet ? true : false;\r\n const hoeringspartmappe =\r\n indberetning.hoeringspartmappe &&\r\n indberetning.hoeringspartmappe.find(\r\n (m) => m.organisationId === currentUser.organisationId\r\n );\r\n\r\n const isOwner = isIndberetningMine(currentUser, indberetning, true);\r\n const aktivHøringspart = indberetning.ressource.find(\r\n (x) => x.rolleId === RessourceRolleIdEnum.høringspart\r\n );\r\n const isHoeringActive = aktivHøringspart !== undefined;\r\n const isOrganisationAktivHoeringspart =\r\n aktivHøringspart &&\r\n aktivHøringspart.organisationId === currentUser.organisationId;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n Høringspartfunktioner\r\n

    Foretag ændringer eller tilføjelser til indberetningen.

    \r\n
      \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Behandl høringssag\",\r\n content: (\r\n {\r\n // Do stuff that makes you take the indberetning\r\n\r\n const daværendeRessource =\r\n indberetning.ressource.find(\r\n (x) =>\r\n x.rolleId === RessourceRolleIdEnum.høringspart\r\n );\r\n if (daværendeRessource) {\r\n daværendeRessource.personId = currentUser.personId;\r\n\r\n tagHoeringssagFraHoeringspart(\r\n currentUser,\r\n daværendeRessource\r\n ).then((nyRessource: Ressource) => {\r\n // Ny Høringspart\r\n const index = indberetning.ressource.findIndex(\r\n (x) =>\r\n x.rolleId === RessourceRolleIdEnum.høringspart\r\n );\r\n let nyIndberetning = indberetning;\r\n nyIndberetning.ressource[index] = nyRessource;\r\n toast({\r\n type: \"default\",\r\n content: {\r\n message: `Du har nu overtaget behandlingen af sagen fra ${daværendeRessource.navn}`,\r\n },\r\n });\r\n setIndberetning(nyIndberetning);\r\n });\r\n } else {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n message: `Sagen er ikke i høring, du kan ikke behandle sagen før den er sendt i høring`,\r\n },\r\n });\r\n closeModal(false);\r\n throw new Error(\r\n \"Der findes ikke nogen høringspart i forvejen, dette er en fejl. - FEJL\"\r\n );\r\n // TODO: se om der skal kaldes til opretHoeringssag i stedet\r\n }\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Behandl høringssag\r\n \r\n
    • \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Videresend sag\",\r\n content: (\r\n \r\n ),\r\n });\r\n }}\r\n >\r\n Videresend høringssag internt\r\n \r\n
    • \r\n
    • \r\n {\r\n if (hoeringspartmappe) {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Rediger høringssvar\",\r\n content: (\r\n \r\n ),\r\n });\r\n }\r\n }}\r\n >\r\n Opret/Rediger høringssvar\r\n \r\n
    • \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Afslut høringsbehandling\",\r\n content:\r\n hoeringspartmappe && hoeringspartmappe.svar ? (\r\n {\r\n // Afslut høringsbehandling\r\n\r\n const daværendeRessource =\r\n indberetning.ressource.find(\r\n (x) =>\r\n x.rolleId === RessourceRolleIdEnum.høringspart\r\n );\r\n if (daværendeRessource) {\r\n daværendeRessource.personId =\r\n currentUser.personId;\r\n\r\n afslutHoeringsbehandling(\r\n currentUser,\r\n indberetning,\r\n daværendeRessource\r\n )\r\n .then(() => {\r\n // Ny Høringspart\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n toast({\r\n type: \"default\",\r\n content: {\r\n message: `Du har nu afsluttet høringsbehandlingen af sagen`,\r\n },\r\n });\r\n setIndberetning(nyIndberetning);\r\n });\r\n })\r\n .catch((e) => {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n message: `Det lykkedes ikke at afslutte høringsbehandlingen af sagen - FEJL`,\r\n },\r\n });\r\n throw new Error(\r\n \"Det lykkedes ikke at afslutte høringsbehandlingen af sagen - FEJL\"\r\n );\r\n });\r\n } else {\r\n throw new Error(\r\n \"Der findes ikke nogen høringspart i forvejen, dette er en fejl og høringen kunne ikke afsluttes. - FEJL\"\r\n );\r\n // TODO: se om der skal kaldes til opretHoeringssag i stedet\r\n }\r\n }}\r\n />\r\n ) : (\r\n
      \r\n Du har ikke oprettet et høringssvar, og kan følgelig\r\n ikke afslutte høringsbehandlingen.\r\n
      \r\n {\r\n closeModal(false);\r\n }}\r\n >\r\n OK\r\n \r\n
      \r\n
      \r\n ),\r\n });\r\n }}\r\n >\r\n Afslut høringsbehandling\r\n \r\n
    • \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n","import ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\nimport { IndlaegTypeIdEnum } from \"interfaces/IIndberetning\";\r\nimport { useContext, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\n\r\nconst beskedTypeMap = (type: IndlaegTypeIdEnum) => {\r\n let map = {\r\n [IndlaegTypeIdEnum.intern]: \"intern note\",\r\n [IndlaegTypeIdEnum.overdragelseskommentar]: \"overdragelseskommentar\",\r\n [IndlaegTypeIdEnum.tilIndberetter]: \"Til sagsbehandler\", // Denne her er mærkelig men rigtig\r\n [IndlaegTypeIdEnum.fraIndberetter]: \"\",\r\n [IndlaegTypeIdEnum.afslutningsKommentar]: \"afslutningskommentar\",\r\n [IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig]: \"Besked til høringspart\",\r\n [IndlaegTypeIdEnum.beskedTiLHoeringsAnsvarlig]:\r\n \"Besked til høringsansvarlig\",\r\n [IndlaegTypeIdEnum.beskedFraHoeringspart]: \"Besked til høringsansvarlig\",\r\n [IndlaegTypeIdEnum.beskedTilHoeringspart]: \"Besked til høringspart\",\r\n [IndlaegTypeIdEnum.fraSagsbehandler]: \"Til indberetter\",\r\n [IndlaegTypeIdEnum.tilSagsbehandler]: \"Besked til sagsbehandler\",\r\n };\r\n return map[type];\r\n};\r\n\r\nexport default function SkrivBeskedModal(props: {\r\n skrivBesked: (beskrivelse: string, type: IndlaegTypeIdEnum) => void;\r\n type: IndlaegTypeIdEnum;\r\n}) {\r\n const firstFocusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n firstFocusRef.current?.focus();\r\n }, []);\r\n const { closeModal } = useContext(ModalContext);\r\n const { type, skrivBesked } = props;\r\n const [besked, setBesked] = useState({\r\n touched: false,\r\n value: \"\",\r\n });\r\n const [notifyBesked, setNotifyBesked] = useState(false);\r\n const showValidationError = besked.touched && besked.value === \"\";\r\n return (\r\n
    \r\n {/*

    Skriv {type === BeskedType.besked ? \"besked\" : \"intern note\"}

    */}\r\n \r\n setBesked({ ...besked, value: e.target.value })}\r\n >\r\n setNotifyBesked(false)}\r\n />\r\n
    \r\n {\r\n if (besked.value) {\r\n skrivBesked(besked.value, type);\r\n closeModal(false);\r\n } else {\r\n setBesked({ ...besked, touched: true });\r\n setNotifyBesked(true);\r\n }\r\n }}\r\n >\r\n Gem\r\n \r\n {\r\n closeModal(true);\r\n }}\r\n >\r\n Fortryd\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n","import { Indlaeg, IndlaegTypeIdEnum } from \"interfaces/IIndberetning\";\r\nimport { formatDateString } from \"util/date\";\r\n\r\nexport default function ChatMessage(props: {\r\n indlaeg: Indlaeg;\r\n type: \"Høringssag\" | \"Sagsbehandling\" | \"Stednavn\";\r\n}) {\r\n const { indlaeg, type } = props;\r\n let left = true;\r\n if (type === \"Sagsbehandling\") {\r\n if (\r\n [\r\n IndlaegTypeIdEnum.fraIndberetter,\r\n IndlaegTypeIdEnum.tilIndberetter,\r\n ].includes(indlaeg.typeId)\r\n ) {\r\n left = true;\r\n } else {\r\n left = false;\r\n }\r\n } else if (type === \"Høringssag\") {\r\n if (\r\n [\r\n IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig,\r\n IndlaegTypeIdEnum.beskedTilHoeringspart,\r\n IndlaegTypeIdEnum.overdragelseskommentar,\r\n ].includes(indlaeg.typeId)\r\n ) {\r\n left = true;\r\n } else {\r\n left = false;\r\n }\r\n } else {\r\n if ([4, 10].includes(indlaeg.typeId)) {\r\n left = false;\r\n } else {\r\n left = true;\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n
    \r\n \r\n \r\n {indlaeg.personNavn}\r\n {\" \" + convertTypeidToType(indlaeg.typeId, type)}\r\n \r\n
    \r\n \r\n {formatDateString(indlaeg.ts)}\r\n \r\n \r\n {formatDateString(indlaeg.ts, \"dd-MM-yyyy\")} klokken{\" \"}\r\n {formatDateString(indlaeg.ts, \"HH:mm\")}\r\n \r\n \r\n
    \r\n

    {indlaeg.indhold}

    \r\n
    \r\n {[IndlaegTypeIdEnum.intern].includes(indlaeg.typeId) && (\r\n
    \r\n \r\n Intern besked – Vises kun for sagsbehandlere\r\n \r\n
    \r\n )}\r\n \r\n );\r\n}\r\nconst convertTypeidToClass = (\r\n typeId: IndlaegTypeIdEnum,\r\n type: \"Høringssag\" | \"Sagsbehandling\" | \"Stednavn\"\r\n) => {\r\n let classname = \"\";\r\n\r\n if (typeId === IndlaegTypeIdEnum.fraIndberetter) {\r\n classname = \"c-journal__message--indberetter\";\r\n }\r\n if (typeId === IndlaegTypeIdEnum.tilIndberetter) {\r\n // Det her giver ingen mening, men det er rigtigt\r\n classname = \"c-journal__message--indberetter\";\r\n }\r\n if (typeId === IndlaegTypeIdEnum.fraSagsbehandler) {\r\n classname = \"c-journal__message--sagsbehandler\";\r\n }\r\n\r\n if (typeId === IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig) {\r\n classname = \"c-journal__message--horingsansvarlig\";\r\n }\r\n if (typeId === IndlaegTypeIdEnum.beskedTilHoeringspart) {\r\n classname = \"c-journal__message--horingsansvarlig\";\r\n }\r\n if (typeId === IndlaegTypeIdEnum.beskedFraHoeringspart) {\r\n classname = \"c-journal__message--horingspart\";\r\n }\r\n if (typeId === IndlaegTypeIdEnum.intern) {\r\n classname = \"c-journal__message--intern-note\";\r\n }\r\n\r\n if (typeId === IndlaegTypeIdEnum.overdragelseskommentar) {\r\n classname = \"c-journal__message--overdragelseskommentar\";\r\n }\r\n\r\n if (typeId === IndlaegTypeIdEnum.afslutningsKommentar) {\r\n classname = \"c-journal__message--afslutningskommentar\";\r\n }\r\n if (type === \"Stednavn\") {\r\n if (typeId === 3) {\r\n classname = \"c-journal__message--indberetter\";\r\n }\r\n if (typeId === 4 || typeId === 10) {\r\n classname = \"c-journal__message--sagsbehandler\";\r\n }\r\n }\r\n if (classname !== \"\") {\r\n return classname;\r\n } else {\r\n return \"c-journal__message--corrupt\";\r\n }\r\n};\r\nconst convertTypeidToType = (\r\n typeId: IndlaegTypeIdEnum,\r\n type: \"Høringssag\" | \"Sagsbehandling\" | \"Stednavn\"\r\n) => {\r\n if (type === \"Stednavn\") {\r\n switch (typeId) {\r\n case 3:\r\n return \"Indberetter\";\r\n case 4:\r\n return \"Sagsbehandler\";\r\n case 10:\r\n return \"Sagsbehandler\";\r\n }\r\n }\r\n switch (typeId) {\r\n case IndlaegTypeIdEnum.fraIndberetter:\r\n return \"Indberetter\";\r\n case IndlaegTypeIdEnum.tilIndberetter:\r\n return \"Indberetter\";\r\n case IndlaegTypeIdEnum.intern:\r\n return \"Intern Note\";\r\n case IndlaegTypeIdEnum.fraSagsbehandler:\r\n return \"Sagsbehandler\";\r\n case IndlaegTypeIdEnum.tilSagsbehandler:\r\n return \"Sagsbehandler\";\r\n case IndlaegTypeIdEnum.overdragelseskommentar:\r\n return \"Har videresendt sagen\";\r\n case IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig:\r\n return \"Høringsansvarlig\";\r\n case IndlaegTypeIdEnum.beskedFraHoeringspart:\r\n return \"Høringspart\";\r\n case IndlaegTypeIdEnum.beskedTiLHoeringsAnsvarlig:\r\n return \"Høringspart\"; // De her to er weird\r\n case IndlaegTypeIdEnum.beskedTilHoeringspart:\r\n return \"Høringsansvarlig\"; // De her to er weird\r\n case IndlaegTypeIdEnum.afslutningsKommentar:\r\n return \"har afsluttet sagen\";\r\n default:\r\n return \"FIX ENUM\";\r\n }\r\n};\r\n","import { baseUrl } from \"api\";\r\nimport { SagsbehandlingApi } from \"api/interfaces\";\r\nimport EditDrawingModal from \"components/common/Indberet/EditDrawingModal\";\r\nimport ModalConfirmDelete from \"components/common/Indberet/ModalConfirmDelete\";\r\nimport { ModalContext } from \"components/common/Modal/Modal\";\r\nimport { finishedDrawingSource, modifySource } from \"config/interactions\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport {\r\n Aendringsforslag,\r\n Hoeringssag,\r\n RessourceRolleIdEnum,\r\n statusIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { useContext } from \"react\";\r\nimport { isIndberetningAfsluttet } from \"routes/Fip/FipIndberetning\";\r\nimport { getDownloadGeometryLink } from \"routes/Fip/fipUtil\";\r\nimport { formatDateString } from \"util/date\";\r\nimport { convertFeatureToWkt, zoomToFeature } from \"util/ol\";\r\nimport DrawingListItem from \"../DrawingListItem\";\r\nimport FilListItem from \"../FilListItem\";\r\n\r\nexport default function Sagsagt(props: {\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n indlaeg: Aendringsforslag;\r\n isMe: boolean;\r\n fromBehandler: boolean;\r\n isHoeringssagChat: boolean;\r\n isStednavn: boolean;\r\n currentUser: Bruger;\r\n setChatState: React.Dispatch>;\r\n cancelDrawingAndUploadFile: () => void;\r\n onEditGeometry: (feature: Feature) => void;\r\n objektTyper: {\r\n value: number;\r\n text: string;\r\n }[];\r\n ændringsTyper: {\r\n value: number;\r\n text: string;\r\n }[];\r\n sagsbehandlingApi: SagsbehandlingApi;\r\n}) {\r\n const {\r\n indlaeg,\r\n isMe,\r\n fromBehandler,\r\n isHoeringssagChat,\r\n isStednavn,\r\n indberetning,\r\n currentUser,\r\n setChatState,\r\n cancelDrawingAndUploadFile,\r\n setIndberetning,\r\n onEditGeometry,\r\n objektTyper,\r\n ændringsTyper,\r\n sagsbehandlingApi,\r\n } = props;\r\n\r\n const {\r\n deleteAendringsforslag,\r\n deleteSagsakt,\r\n getIndberetning,\r\n redigerAendringsforslag,\r\n redigerSagsakt,\r\n } = sagsbehandlingApi;\r\n const { showModal, closeModal } = useContext(ModalContext);\r\n const { mapState, dispatchToMap } = useContext(MapContext);\r\n const setHoveredFeatures = (ids) =>\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: ids,\r\n });\r\n const { map, hoveredFeatures } = mapState;\r\n const sagsAktType = indlaeg.originalFilNavn === \"\" ? \"Geometri\" : \"Fil\";\r\n const features = finishedDrawingSource.getFeatures() as any; // TODO: Hack because i can't get values otherwise\r\n\r\n const currentFeature = features.find(\r\n (e) => e.get(\"geometriId\") === indlaeg.geometriId\r\n );\r\n const modifyFeature = (modifySource.getFeatures() as any).find(\r\n (e) => e.get(\"geometriId\") === indlaeg.geometriId\r\n );\r\n\r\n if (!(currentFeature || modifyFeature)) {\r\n return null;\r\n }\r\n const geometri = {\r\n aendringTypeId: indlaeg.aendringTypeId,\r\n aendringType: indlaeg.aendringType,\r\n drawing: currentFeature ? currentFeature : modifyFeature,\r\n featureTypeId: indlaeg.featureTypeId,\r\n featureType: indlaeg.featureType,\r\n beskrivelse: indlaeg.beskrivelse,\r\n dato: indlaeg.dato,\r\n };\r\n let name;\r\n if (isHoeringssagChat) {\r\n if (fromBehandler) {\r\n name = \"Høringspart\";\r\n } else {\r\n name = \"Høringsansvarlig\";\r\n }\r\n } else {\r\n if (fromBehandler) {\r\n name = \"Sagsbehandler\";\r\n } else {\r\n name = \"Indberetter\";\r\n }\r\n }\r\n // if the sag is not in høring it cant be edited\r\n let hideEdit = false;\r\n if (isHoeringssagChat && indberetning.statusId !== statusIdEnum.iHoering) {\r\n hideEdit = true;\r\n } else if (!isHoeringssagChat) {\r\n const currentSagsbehandler = indberetning.ressource?.find(\r\n (x) => x.rolleId === RessourceRolleIdEnum.sagsbehandler\r\n );\r\n if (\r\n (currentUser.personId !== currentSagsbehandler?.personId &&\r\n fromBehandler) ||\r\n isIndberetningAfsluttet(indberetning)\r\n ) {\r\n hideEdit = true;\r\n }\r\n }\r\n // The three ... menu on geometry and file must be hidden if:\r\n\r\n let hideOptions = false;\r\n // currentUser is not the owner and is an indberetter or gæst\r\n if (\r\n [RessourceRolleIdEnum.indberetter, RessourceRolleIdEnum.gæst].includes(\r\n currentUser.rolleId\r\n ) &&\r\n !isMe\r\n ) {\r\n hideOptions = true;\r\n }\r\n\r\n return (\r\n //
    \r\n \r\n \r\n
    \r\n \r\n \r\n {indlaeg.personNavn && (\r\n {`${indlaeg.personNavn} - `}\r\n )}\r\n {name}\r\n \r\n
    \r\n \r\n {formatDateString(indlaeg?.dato)}\r\n \r\n \r\n \r\n {formatDateString(new Date(indlaeg?.dato).toString(), \"dd-MM-yyyy\")}\r\n {\" \"}\r\n klokken{\" \"}\r\n {formatDateString(new Date(indlaeg?.dato).toString(), \"HH:mm\")}\r\n \r\n
    \r\n\r\n
    \r\n {indlaeg.geometriId && geometri.drawing && sagsAktType === \"Geometri\" && (\r\n -1}\r\n geometri={geometri}\r\n hideEditOptions={!isMe || hideEdit}\r\n hideDeleteOption={\r\n !isMe ||\r\n hideEdit ||\r\n (isStednavn &&\r\n currentUser.rolleId === RessourceRolleIdEnum.indberetter)\r\n }\r\n hideOptions={hideOptions}\r\n downloadLink={getDownloadGeometryLink(indberetning.id, indlaeg.id)}\r\n setHoveredFeatures={setHoveredFeatures}\r\n zoomToDrawing={() => {\r\n if (map) {\r\n zoomToFeature(map, geometri.drawing);\r\n }\r\n }}\r\n onEditGeometryClick={() => onEditGeometry(currentFeature)}\r\n onEditClick={() => {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Rediger indtegning\",\r\n content: (\r\n ,\r\n featureTypeId: number,\r\n featureType: string,\r\n beskrivelse: string\r\n ) => {\r\n if (fromBehandler) {\r\n redigerSagsakt(\r\n currentUser,\r\n indlaeg.id,\r\n beskrivelse,\r\n \"\"\r\n ).then((e) => {\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n });\r\n });\r\n } else {\r\n redigerAendringsforslag(\r\n currentUser,\r\n aendringTypeId,\r\n aendringType,\r\n indlaeg.id,\r\n beskrivelse,\r\n featureType,\r\n featureTypeId,\r\n convertFeatureToWkt(drawing),\r\n `Openlayers.Geometry.${drawing\r\n .getGeometry()\r\n .getType()}`,\r\n \"\"\r\n ).then((e) => {\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n });\r\n });\r\n }\r\n }}\r\n objektTyper={objektTyper}\r\n ændringsTyper={ændringsTyper}\r\n />\r\n ),\r\n closeModalCallback: () => {\r\n setChatState(\"IDLE\");\r\n },\r\n });\r\n }}\r\n onDeleteClick={() => {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Slet opdatering\",\r\n content: (\r\n {\r\n setChatState(\"LOADING\");\r\n if (fromBehandler) {\r\n deleteSagsakt(currentUser, indlaeg.id).then(() => {\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n });\r\n });\r\n } else {\r\n deleteAendringsforslag(currentUser, indlaeg.id).then(\r\n () => {\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n });\r\n }\r\n );\r\n }\r\n }}\r\n closeModal={closeModal}\r\n />\r\n ),\r\n });\r\n }}\r\n />\r\n )}\r\n {indlaeg.filId !== undefined &&\r\n geometri.drawing &&\r\n sagsAktType === \"Fil\" && (\r\n {\r\n if (map) {\r\n zoomToFeature(map, currentFeature);\r\n }\r\n }}\r\n onMouseEnter={() => {\r\n if (indlaeg.id) {\r\n setHoveredFeatures([indlaeg.id]);\r\n }\r\n }}\r\n onMouseLeave={() => {\r\n setHoveredFeatures([]);\r\n }}\r\n removeFil={() => {\r\n setChatState(\"LOADING\");\r\n deleteSagsakt(currentUser, indlaeg.id).then(() => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n }\r\n );\r\n });\r\n }}\r\n onEditGeometryClick={() => onEditGeometry(currentFeature)}\r\n onEditClick={() => {\r\n console.log(\"not implemented\");\r\n }}\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n )}\r\n
    \r\n \r\n );\r\n}\r\n","import {\r\n Hoeringsmappe,\r\n Hoeringssag,\r\n Indberetningsmappe,\r\n Indlaeg,\r\n IndlaegTypeIdEnum,\r\n RessourceRolleIdEnum,\r\n Sagsbehandlermappe,\r\n} from \"interfaces/IIndberetning\";\r\nimport Section from \"components/common/Section\";\r\nimport {\r\n Fragment,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport { ModalContext } from \"components/common/Modal/Modal\";\r\nimport SkrivBeskedModal from \"./SkrivBeskedModal\";\r\nimport {\r\n isIndberetningAfsluttet,\r\n isIndberetningMine,\r\n} from \"routes/Fip/FipIndberetning\";\r\nimport { MapContext, setEditFeatureCallback } from \"context/MapProvider\";\r\nimport { finishedDrawingSource, setDrawingCallback } from \"config/interactions\";\r\nimport { convertFeatureToWkt } from \"util/ol\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport PlusCircleFill from \"components/icons/PlusCircleFill\";\r\nimport { AddFileModal } from \"components/common/Indberet/AddFileModal\";\r\nimport AddDrawingModal from \"components/common/Indberet/AddDrawingModal\";\r\nimport FileInput from \"components/common/FormElements/FileInput\";\r\nimport { NewFileState } from \"routes/Fip/FipIndberet\";\r\nimport ChatMessage from \"./ChatMessage\";\r\nimport Sagsagt from \"./Sagsagt\";\r\nimport { SagsbehandlingApi } from \"api/interfaces\";\r\nimport { usePrevious } from \"hooks/usePrevious\";\r\nimport { formatDateString } from \"util/date\";\r\nimport LoadingSpinner from \"components/common/LoadingSpinner\";\r\n\r\ninterface ViewElement {\r\n date: number;\r\n component: JSX.Element;\r\n}\r\ninterface IChatProps {\r\n currentUser: Bruger;\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n isHoeringssagChat: boolean;\r\n isStednavn: boolean;\r\n newFile: NewFileState;\r\n setNewFile: React.Dispatch>;\r\n cancelDrawingAndUploadFile: () => void;\r\n scrollPos: number | undefined;\r\n setScrollPos: React.Dispatch>;\r\n sagsbehandlingApi: SagsbehandlingApi;\r\n}\r\n// Chooses what messages to show to who\r\nconst whitelistSagsbehandling = [\r\n IndlaegTypeIdEnum.afslutningsKommentar,\r\n IndlaegTypeIdEnum.fraIndberetter,\r\n IndlaegTypeIdEnum.tilIndberetter,\r\n IndlaegTypeIdEnum.fraSagsbehandler,\r\n IndlaegTypeIdEnum.tilSagsbehandler,\r\n IndlaegTypeIdEnum.intern,\r\n IndlaegTypeIdEnum.overdragelseskommentar,\r\n IndlaegTypeIdEnum.afslutningsKommentar,\r\n];\r\n\r\nconst whitelistHoeringssag = [\r\n IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig,\r\n IndlaegTypeIdEnum.beskedFraHoeringspart,\r\n IndlaegTypeIdEnum.beskedTiLHoeringsAnsvarlig,\r\n IndlaegTypeIdEnum.beskedTilHoeringspart,\r\n IndlaegTypeIdEnum.overdragelseskommentar,\r\n IndlaegTypeIdEnum.afslutningsKommentar,\r\n];\r\n\r\nconst rolleTypeToIndlaegType = (\r\n rolleId: RessourceRolleIdEnum,\r\n context: \"sagsbehandling\" | \"horingssag\",\r\n isStednavn: boolean\r\n) => {\r\n // #281\r\n if (isStednavn) {\r\n switch (rolleId) {\r\n case RessourceRolleIdEnum.indberetter:\r\n return 3;\r\n case RessourceRolleIdEnum.sagsbehandler:\r\n return 4;\r\n default:\r\n return 4;\r\n }\r\n }\r\n //\r\n if (context === \"sagsbehandling\") {\r\n switch (rolleId) {\r\n case RessourceRolleIdEnum.indberetter:\r\n return IndlaegTypeIdEnum.fraIndberetter;\r\n case RessourceRolleIdEnum.sagsbehandler:\r\n return IndlaegTypeIdEnum.fraSagsbehandler;\r\n default:\r\n return IndlaegTypeIdEnum.fraSagsbehandler;\r\n }\r\n } else if (context === \"horingssag\") {\r\n switch (rolleId) {\r\n case RessourceRolleIdEnum.sagsbehandler:\r\n return IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig;\r\n case RessourceRolleIdEnum.høringsansvarlig:\r\n return IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig;\r\n case RessourceRolleIdEnum.høringspart:\r\n return IndlaegTypeIdEnum.beskedFraHoeringspart;\r\n default:\r\n return IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig;\r\n }\r\n } else {\r\n return IndlaegTypeIdEnum.intern;\r\n }\r\n};\r\n\r\n//TODO: Unhardcode plz\r\nconst ændringsTyper = [\r\n { value: 1, text: \"Mangler i kortet (Ny)\" },\r\n { value: 2, text: \"Har ændret sig (Rettes)\" },\r\n { value: 3, text: \"Er for meget i kortet (Slettes)\" },\r\n];\r\n\r\nexport default function Chat(props: IChatProps) {\r\n const [chatState, setChatState] = useState(\"IDLE\");\r\n const {\r\n currentUser,\r\n indberetning,\r\n setIndberetning,\r\n isHoeringssagChat,\r\n isStednavn,\r\n newFile,\r\n setNewFile,\r\n cancelDrawingAndUploadFile,\r\n scrollPos,\r\n setScrollPos,\r\n sagsbehandlingApi,\r\n } = props;\r\n const {\r\n getIndberetning,\r\n getObjekttyper,\r\n redigerAendringsforslag,\r\n redigerSagsaktGeometri,\r\n skrivChatBesked,\r\n uploadAendringsforslagGeometri,\r\n uploadFile,\r\n uploadSagsaktFil,\r\n uploadSagsaktGeometri,\r\n } = sagsbehandlingApi;\r\n const context = isHoeringssagChat ? \"horingssag\" : \"sagsbehandling\";\r\n\r\n const { showModal } = useContext(ModalContext);\r\n const toast = useContext(ToastContext);\r\n const chatRef = useRef(null);\r\n const bottomOfChat = useRef(null);\r\n const scrollToBottom = () => {\r\n chatRef.current?.scrollTo({ top: bottomOfChat.current?.offsetTop });\r\n };\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n const cancelEditGeometry = useCallback(() => {\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n }, [dispatchToMap]);\r\n\r\n const { activeDrawTool, editGeometryState } = mapState;\r\n const [messages, setMessages] = useState();\r\n const [objekttyper, setObjekttyper] = useState<\r\n { value: number; text: string }[]\r\n >([]);\r\n const fileInputRef = useRef(null);\r\n\r\n const addFile = (fileInfo: {\r\n beskrivelse: string;\r\n filId: number;\r\n geometri: Feature;\r\n originalFilNavn: string;\r\n }) => {\r\n setChatState(\"IDLE\");\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n let mappeid;\r\n\r\n if (!isHoeringssagChat) {\r\n if (currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler) {\r\n mappeid = indberetning.sagsbehandlermappe[0].id;\r\n } else if (currentUser.rolleId === RessourceRolleIdEnum.indberetter) {\r\n mappeid = indberetning.indberetningsmappe[0].id;\r\n } else {\r\n console.error(\r\n \"Non-supported role trying to add a drawing in sagsbehandling!\"\r\n );\r\n }\r\n } else {\r\n if (\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n indberetning.hoeringsansvarligmappe\r\n ) {\r\n mappeid = indberetning.hoeringsansvarligmappe[0].id;\r\n } else if (\r\n currentUser.rolleId === RessourceRolleIdEnum.høringspart &&\r\n indberetning.hoeringspartmappe\r\n ) {\r\n mappeid = indberetning.hoeringspartmappe[0].id;\r\n } else {\r\n console.error(\r\n \"Non-supported role trying to add a drawing in sagsbehandling!\"\r\n );\r\n }\r\n }\r\n\r\n uploadSagsaktFil(\r\n currentUser,\r\n fileInfo.beskrivelse,\r\n fileInfo.filId,\r\n convertFeatureToWkt(fileInfo.geometri),\r\n fileInfo.originalFilNavn,\r\n fileInfo.geometri.get(\"id\"),\r\n `Openlayers.Geometry.${fileInfo.geometri.getGeometry().getType()}`,\r\n false,\r\n mappeid\r\n ).then(() => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n }\r\n );\r\n });\r\n };\r\n const addDrawing = useCallback(\r\n (drawingInfo: {\r\n aendringTypeId: number;\r\n aendringType: string;\r\n drawing: Feature;\r\n featureTypeId: number;\r\n featureType: string;\r\n beskrivelse: string;\r\n }) => {\r\n setChatState(\"IDLE\");\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n let mappeid;\r\n\r\n if (!isHoeringssagChat) {\r\n if (currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler) {\r\n mappeid = indberetning.sagsbehandlermappe[0].id;\r\n } else if (currentUser.rolleId === RessourceRolleIdEnum.indberetter) {\r\n mappeid = indberetning.indberetningsmappe[0].id;\r\n } else {\r\n console.error(\r\n \"Non-supported role trying to add a drawing in sagsbehandling!\"\r\n );\r\n }\r\n } else {\r\n if (\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n indberetning.hoeringsansvarligmappe\r\n ) {\r\n mappeid = indberetning.hoeringsansvarligmappe[0].id;\r\n } else if (\r\n currentUser.rolleId === RessourceRolleIdEnum.høringspart &&\r\n indberetning.hoeringspartmappe\r\n ) {\r\n mappeid = indberetning.hoeringspartmappe[0].id;\r\n } else {\r\n console.error(\r\n \"Non-supported role trying to add a drawing in sagsbehandling!\"\r\n );\r\n }\r\n }\r\n\r\n if (\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n !isHoeringssagChat\r\n ) {\r\n uploadSagsaktGeometri(\r\n currentUser,\r\n 0,\r\n drawingInfo.beskrivelse,\r\n drawingInfo.drawing.get(\"id\"),\r\n convertFeatureToWkt(drawingInfo.drawing),\r\n `Openlayers.Geometry.${drawingInfo.drawing.getGeometry().getType()}`,\r\n false,\r\n mappeid\r\n ).then(() => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n }\r\n );\r\n });\r\n } else {\r\n uploadAendringsforslagGeometri(\r\n currentUser,\r\n drawingInfo.aendringTypeId,\r\n drawingInfo.aendringType,\r\n drawingInfo.beskrivelse,\r\n drawingInfo.featureType,\r\n drawingInfo.featureTypeId,\r\n convertFeatureToWkt(drawingInfo.drawing),\r\n `Openlayers.Geometry.${drawingInfo.drawing.getGeometry().getType()}`,\r\n drawingInfo.drawing.get(\"id\"),\r\n mappeid\r\n ).then(() => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n }\r\n );\r\n });\r\n }\r\n\r\n //setIndberetning({\r\n // type: \"ADD_DRAWING\",\r\n // drawingInfo,\r\n //});\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [dispatchToMap]\r\n );\r\n // TODO: dette er det fuldstændig samme der sker i FipIndberet, så måske det skal laves mere generel (måske ikke)\r\n useEffect(() => {\r\n setDrawingCallback((drawing, isValid) => {\r\n if (!isValid) {\r\n finishedDrawingSource.removeFeature(drawing);\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Ugyldig geometri\",\r\n message: `Den angivne geometri er ugyldig, hvilket kan skyldes, at geometrien \"krydser\" sig selv.\\n\\nTegn venligst en ny geometri.`,\r\n },\r\n });\r\n } else {\r\n if (newFile.state === \"UPLOADED\" && newFile.file) {\r\n showModal({\r\n title: \"Beskriv filindhold\",\r\n content: (\r\n ,\r\n originalFilNavn: string\r\n ) => {\r\n addFile({\r\n beskrivelse,\r\n filId,\r\n geometri,\r\n originalFilNavn,\r\n });\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n }}\r\n />\r\n ),\r\n closeModalCallback: () => {\r\n finishedDrawingSource.removeFeature(drawing);\r\n },\r\n });\r\n } else {\r\n showModal({\r\n title: \"Beskriv indtegning\",\r\n content: (\r\n ,\r\n featureTypeId: number,\r\n featureType: string,\r\n beskrivelse: string\r\n ) => {\r\n addDrawing({\r\n aendringTypeId,\r\n aendringType,\r\n drawing,\r\n featureTypeId,\r\n featureType,\r\n beskrivelse,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n />\r\n ),\r\n closeModalCallback: () => {\r\n finishedDrawingSource.removeFeature(drawing);\r\n },\r\n });\r\n }\r\n }\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n dispatchToMap,\r\n indberetning,\r\n newFile.file,\r\n newFile.state,\r\n objekttyper,\r\n isHoeringssagChat,\r\n showModal,\r\n addDrawing,\r\n toast,\r\n ]);\r\n\r\n const editFeatureCallback = useCallback((feature: Feature) => {\r\n // Handle errors (toast maybe)\r\n\r\n // find the sagsakt in the correct \"folder\"\r\n if (feature.get(\"type\").toLowerCase() === \"geometri\") {\r\n if (\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n !isHoeringssagChat\r\n ) {\r\n redigerSagsaktGeometri(\r\n currentUser,\r\n feature.get(\"id\"),\r\n feature.get(\"beskrivelse\"),\r\n convertFeatureToWkt(feature)\r\n ).then(() => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n }\r\n );\r\n });\r\n } else {\r\n redigerAendringsforslag(\r\n currentUser,\r\n feature.get(\"aendringTypeId\"),\r\n feature.get(\"aendringType\"),\r\n feature.get(\"id\"),\r\n feature.get(\"beskrivelse\"),\r\n feature.get(\"featureType\"),\r\n feature.get(\"featureTypeId\"),\r\n convertFeatureToWkt(feature),\r\n feature.getGeometry().getType(),\r\n `Openlayers.Geometry.${feature.getGeometry().getType()}`\r\n ).then(() => {\r\n getIndberetning(indberetning.id, currentUser.personId).then(\r\n (nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n setChatState(\"IDLE\");\r\n }\r\n );\r\n });\r\n }\r\n } else {\r\n console.error(\"Feature type not recognized\");\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n useEffect(() => {\r\n setEditFeatureCallback(editFeatureCallback);\r\n }, [editFeatureCallback]);\r\n\r\n useEffect(() => {\r\n setMessages(renderMessages(indberetning, currentUser));\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [indberetning, currentUser, objekttyper]);\r\n\r\n useEffect(() => {\r\n if (editGeometryState.active || activeDrawTool) {\r\n setChatState(\"LOADING\");\r\n } else if (!editGeometryState.active && !activeDrawTool) {\r\n setChatState(\"IDLE\");\r\n cancelDrawingAndUploadFile();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [editGeometryState.active, activeDrawTool]);\r\n\r\n const prevNumMessages = usePrevious(messages)?.length ?? 0;\r\n useLayoutEffect(() => {\r\n const currNumMessages = messages?.length ?? 0;\r\n if (currNumMessages - prevNumMessages === 1 || !scrollPos) {\r\n scrollToBottom();\r\n } else {\r\n chatRef.current?.scrollTo({ top: scrollPos });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [messages]);\r\n useEffect(() => {\r\n const getObjekttyperForTema = async () => {\r\n const ot = await getObjekttyper(indberetning.domaeneTypeId);\r\n setObjekttyper(ot);\r\n };\r\n getObjekttyperForTema();\r\n }, [indberetning.domaeneTypeId, getObjekttyper]);\r\n\r\n const renderMessages = (\r\n indberetning: Hoeringssag,\r\n currentUser: Bruger\r\n ): ViewElement[] => {\r\n let viewElements: ViewElement[] = [];\r\n if (indberetning.korrespondance) {\r\n indberetning.korrespondance.forEach((k: Indlaeg) => {\r\n const { typeId } = k;\r\n const whitelist = isHoeringssagChat\r\n ? whitelistHoeringssag\r\n : whitelistSagsbehandling;\r\n if (whitelist.includes(typeId)) {\r\n viewElements.push({\r\n date: Date.parse(k.ts),\r\n component: (\r\n \r\n ),\r\n });\r\n }\r\n });\r\n }\r\n if (isHoeringssagChat) {\r\n if (indberetning.hoeringsansvarligmappe) {\r\n indberetning.hoeringsansvarligmappe.forEach((k: Hoeringsmappe) => {\r\n const isMe =\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n indberetning.ressource !== null; // If the ressource is null, it's not supposed to be viewed\r\n // const isMeToo = isIndberetningMine(\r\n // currentUser,\r\n // indberetning,\r\n // isHoeringssagChat\r\n // );\r\n if (k.geometri) {\r\n k.geometri.forEach((g) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n }\r\n if (k.fil) {\r\n k.fil.forEach((g: any) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Høringspartmappen\r\n if (indberetning.hoeringspartmappe) {\r\n indberetning.hoeringspartmappe.forEach((k: Hoeringsmappe) => {\r\n const isMe =\r\n currentUser.rolleId === RessourceRolleIdEnum.høringspart &&\r\n indberetning.ressource !== null; // If the ressource is null, it's not supposed to be viewed\r\n if (k.geometri) {\r\n k.geometri.forEach((g) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n }\r\n if (k.fil) {\r\n k.fil.forEach((g: any) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n // Løb igennem indberetningsmappen\r\n if (indberetning.indberetningsmappe) {\r\n indberetning.indberetningsmappe.forEach((k: Indberetningsmappe) => {\r\n const isMe =\r\n currentUser.rolleId === RessourceRolleIdEnum.indberetter &&\r\n indberetning.ressource !== null; // If ressource is null, the indberetter is not the owner\r\n if (k.geometri) {\r\n k.geometri.forEach((g) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n // TODO: #280: Disable delete for indberetter geometri stednavn\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n }\r\n if (k.fil) {\r\n k.fil.forEach((g: any) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n }\r\n });\r\n }\r\n // Løb igennem sagsbehandlermappen\r\n if (indberetning.sagsbehandlermappe) {\r\n indberetning.sagsbehandlermappe.forEach((k: Sagsbehandlermappe) => {\r\n const isMe =\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n indberetning.ressource !== null; // If ressource is null, the indberetter is not the owner;\r\n k.geometri.forEach((g) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n k.fil.forEach((g: any) => {\r\n viewElements.push({\r\n date: Date.parse(g.dato),\r\n component: (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: feature,\r\n });\r\n }}\r\n objektTyper={objekttyper}\r\n ændringsTyper={ændringsTyper}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n ),\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n // Sorter listen\r\n viewElements.sort(function (a, b) {\r\n return a.date - b.date;\r\n });\r\n return viewElements;\r\n };\r\n\r\n useEffect(() => {\r\n return () => {\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n };\r\n }, [dispatchToMap]);\r\n const skrivBesked = (\r\n currentUser: Bruger,\r\n besked: string,\r\n typeId: IndlaegTypeIdEnum,\r\n sagsId: number\r\n ) => {\r\n let indlaeg: Indlaeg = {\r\n id: 0,\r\n indhold: besked,\r\n organisationNavn: \"\",\r\n personId: currentUser.personId,\r\n personNavn: currentUser.navn,\r\n typeId: typeId,\r\n typeNavn: \"\",\r\n organisationId: 0,\r\n organisationForkortelse: \"\",\r\n ts: \"\",\r\n };\r\n\r\n const nytIndlaeg = skrivChatBesked(currentUser.personId, sagsId, indlaeg);\r\n\r\n return nytIndlaeg;\r\n };\r\n const senestOpdateret =\r\n messages && messages.length > 0\r\n ? formatDateString(\r\n new Date(messages[messages.length - 1].date).toString()\r\n )\r\n : \"\";\r\n const senestOpdateretVoiceOver =\r\n messages && messages.length > 0 ? (\r\n \r\n Senest opdateret:{\" \"}\r\n \r\n {formatDateString(\r\n new Date(messages[messages.length - 1].date).toString(),\r\n \"dd-MM-yyyy\"\r\n )}\r\n {\" \"}\r\n klokken{\" \"}\r\n {formatDateString(\r\n new Date(messages[messages.length - 1].date).toString(),\r\n \"HH:mm\"\r\n )}\r\n \r\n ) : (\r\n \"\"\r\n );\r\n\r\n // #296, #274, #324 (hvornår skal knapper under chat vises)\r\n const showButtons =\r\n isIndberetningMine(currentUser, indberetning, isHoeringssagChat) &&\r\n !isIndberetningAfsluttet(indberetning) &&\r\n !(\r\n !isHoeringssagChat &&\r\n currentUser.rolleId === RessourceRolleIdEnum.høringspart\r\n );\r\n return (\r\n \r\n
    \r\n {/* {isHoeringssagChat && (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n Høringssag ses kun af sagsbehandler og høringsparter\r\n \r\n\r\n

    \r\n Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed\r\n diam nonumy eirmod tempor invidunt ut labore et dolore magna\r\n aliquyam erat.\r\n

    \r\n

    \r\n Ønsker du mere information\r\n

    \r\n

    \r\n Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed\r\n diam nonumy eirmod tempor invidunt ut labore et dolore magna\r\n aliquyam erat.Lorem ipsum dolor sit amet, consetetur sadipscing\r\n elitr, sed diam nonumy eirmod tempor invidunt ut labore et\r\n dolore magna aliquyam erat.\r\n

    \r\n
    \r\n
    \r\n )} */}\r\n {isHoeringssagChat && (\r\n <>\r\n

    Høringssag

    \r\n

    Oversigt over høringssag.

    \r\n \r\n )}\r\n {!isHoeringssagChat && (\r\n <>\r\n

    Sagsbehandlingsjournal

    \r\n

    Oversigt over sagsbehandlingen.

    \r\n \r\n )}\r\n {\r\n // If there is an error on the newFile state\r\n newFile.error && (\r\n \r\n )\r\n }\r\n\r\n {(indberetning.korrespondance ||\r\n indberetning.indberetningsmappe ||\r\n indberetning.sagsbehandlermappe) && (\r\n \r\n
    \r\n {chatState === \"LOADING\" && (\r\n \r\n \r\n Opdaterer journal\r\n \r\n \r\n \r\n )}\r\n {messages && messages.length > 0 && chatState === \"IDLE\" && (\r\n <>\r\n \r\n \r\n Senest opdateret:\r\n \r\n {senestOpdateret}\r\n \r\n {senestOpdateretVoiceOver}\r\n \r\n )}\r\n {messages && messages.length === 0 && (\r\n
    \r\n \r\n Ingen beskeder endnu\r\n \r\n

    Her vises journalisering for sagen

    \r\n
    \r\n )}\r\n
    \r\n {newFile.state === \"UPLOADING\" && (\r\n \r\n \r\n Fil uploades ...\r\n \r\n

    \r\n \r\n )}\r\n
    \r\n {\r\n setScrollPos((e.target as any).scrollTop);\r\n }}\r\n >\r\n
    \r\n\r\n {messages\r\n ?.slice()\r\n .reverse()\r\n .map((m, i) => {\r\n return {m.component};\r\n })}\r\n
    \r\n \r\n\r\n {showButtons && (\r\n
    \r\n {\r\n let type;\r\n if (isHoeringssagChat) {\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler // This is a høringssanvarlig apparently\r\n ? (type = IndlaegTypeIdEnum.beskedFraHoeringsAnsvarlig)\r\n : (type = IndlaegTypeIdEnum.beskedFraHoeringspart);\r\n } else {\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler\r\n ? (type = IndlaegTypeIdEnum.fraSagsbehandler)\r\n : (type = IndlaegTypeIdEnum.tilIndberetter);\r\n }\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n content: (\r\n {\r\n skrivBesked(\r\n currentUser,\r\n besked,\r\n rolleTypeToIndlaegType(\r\n currentUser.rolleId,\r\n context,\r\n isStednavn\r\n ),\r\n indberetning.id\r\n ).then((nytIndlaeg) => {\r\n setIndberetning({\r\n ...indberetning,\r\n korrespondance: [\r\n ...indberetning.korrespondance,\r\n nytIndlaeg,\r\n ],\r\n });\r\n setChatState(\"IDLE\");\r\n });\r\n }}\r\n />\r\n ),\r\n title: \"Ny besked\",\r\n closeModalCallback: () => {\r\n setChatState(\"IDLE\");\r\n },\r\n });\r\n }}\r\n >\r\n Skriv besked\r\n \r\n {currentUser.rolleId !== RessourceRolleIdEnum.indberetter &&\r\n !isHoeringssagChat && (\r\n {\r\n setChatState(\"LOADING\");\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Intern note\",\r\n content: (\r\n {\r\n skrivBesked(\r\n currentUser,\r\n besked,\r\n IndlaegTypeIdEnum.intern,\r\n indberetning.id\r\n ).then((nytIndlaeg) => {\r\n setIndberetning({\r\n ...indberetning,\r\n korrespondance: [\r\n ...indberetning.korrespondance,\r\n nytIndlaeg,\r\n ],\r\n });\r\n setChatState(\"IDLE\");\r\n });\r\n }}\r\n />\r\n ),\r\n closeModalCallback: () => {\r\n setChatState(\"IDLE\");\r\n },\r\n });\r\n }}\r\n >\r\n Intern note\r\n \r\n )}\r\n {!(\r\n isStednavn &&\r\n currentUser.rolleId === RessourceRolleIdEnum.sagsbehandler\r\n ) && (\r\n
    \r\n {newFile.state !== \"UPLOADED\" && (\r\n {\r\n cancelEditGeometry();\r\n setNewFile({ state: \"UPLOADING\", file: undefined });\r\n const { files } = e.target;\r\n if (files && files.length) {\r\n const file = files[0];\r\n let formData = new FormData();\r\n formData.append(\"file\", file);\r\n uploadFile(formData)\r\n .then((resp) => {\r\n setNewFile({\r\n state: \"UPLOADED\",\r\n file: {\r\n id: resp.id,\r\n originalFilNavn: resp.originalFilNavn,\r\n },\r\n });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: \"point\",\r\n });\r\n })\r\n .catch((e) => {\r\n let errorMsg = \"Der skete en fejl\";\r\n if (\r\n e.isAxiosError &&\r\n e.response?.status === 413\r\n ) {\r\n errorMsg = \"Filen er for stor.. (max 10MB)\";\r\n } else if (e.success === false) {\r\n errorMsg = e.errormsg;\r\n }\r\n setNewFile({\r\n state: \"ERROR\",\r\n file: undefined,\r\n error: errorMsg,\r\n });\r\n });\r\n } else {\r\n // Fortryd tegning\r\n cancelDrawingAndUploadFile();\r\n }\r\n }}\r\n />\r\n )}\r\n {newFile.state === \"UPLOADED\" && (\r\n {\r\n cancelDrawingAndUploadFile();\r\n }}\r\n >\r\n \r\n Fortryd upload\r\n \r\n )}\r\n
    \r\n )}\r\n\r\n {!(\r\n isStednavn &&\r\n currentUser.rolleId === RessourceRolleIdEnum.indberetter\r\n ) && (\r\n {\r\n if (!activeDrawTool || newFile.state === \"UPLOADED\") {\r\n // Aktiver tegning\r\n setChatState(\"LOADING\");\r\n cancelEditGeometry();\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: \"point\",\r\n });\r\n } else {\r\n // Fortryd tegning\r\n cancelDrawingAndUploadFile();\r\n }\r\n }}\r\n >\r\n {(!activeDrawTool || newFile.file) && (\r\n <>\r\n \r\n Tegn opdatering\r\n \r\n )}\r\n {activeDrawTool && !newFile.file && (\r\n <>\r\n \r\n Fortryd tegning\r\n \r\n )}\r\n \r\n )}\r\n
    \r\n )}\r\n \r\n )}\r\n
    \r\n \r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n}\r\n","import {\r\n useContext,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { getIndberetning, sagsbehandlingApi } from \"api/fip\";\r\nimport {\r\n Hoeringssag,\r\n IndberetningState,\r\n RessourceRolleIdEnum,\r\n statusIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport ChevronLeft from \"components/icons/ChevronLeftSmall\";\r\nimport Section from \"components/common/Section\";\r\nimport { Link, useParams } from \"react-router-dom\";\r\nimport { AuthContext, Bruger } from \"context/AuthProvider\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport { paths } from \"routes/routesConfig\";\r\nimport { convertWktToFeature, zoomToFeature } from \"util/ol\";\r\nimport { statusStore, tema } from \"config/FipConfig\";\r\nimport { finishedDrawingSource } from \"config/interactions\";\r\nimport { getSagsaktFeaturesFromHoeringssag } from \"./fipUtil\";\r\nimport IndberetningNav from \"components/common/Indberetning/IndberetningNav\";\r\nimport Detaljevisning from \"components/common/Indberetning/Detaljevisning\";\r\nimport Sagsbehandlerfunktioner from \"components/common/Indberetning/Fip/Sagsbehandlerfunktioner\";\r\nimport Hoeringspartfunktioner from \"components/common/Indberetning/Fip/Hoeringspartfunktioner\";\r\nimport { useErrorHandler } from \"react-error-boundary\";\r\nimport Chat from \"components/common/Indberetning/Chat/Chat\";\r\nimport { NewFileState } from \"./FipIndberet\";\r\nimport { SessionTimerContext } from \"context/SessionTimerProvider\";\r\n\r\nexport const isIndberetningMine = (\r\n bruger: Bruger,\r\n indberetning: Hoeringssag,\r\n isHoeringssag: boolean\r\n) => {\r\n let isMine = false;\r\n const ressource = indberetning.ressource;\r\n if (ressource) {\r\n ressource.forEach((r) => {\r\n if (\r\n r.rolleId === RessourceRolleIdEnum.sagsbehandler &&\r\n r.personId === bruger.personId\r\n ) {\r\n isMine = true;\r\n } else if (\r\n bruger.rolleId === RessourceRolleIdEnum.indberetter &&\r\n r.rolleId === RessourceRolleIdEnum.indberetter\r\n ) {\r\n isMine = true;\r\n } else if (\r\n bruger.rolleId === RessourceRolleIdEnum.høringspart &&\r\n r.rolleId === RessourceRolleIdEnum.høringspart &&\r\n r.personId === bruger.personId\r\n ) {\r\n isMine = true;\r\n }\r\n });\r\n }\r\n if (!isHoeringssag && bruger.rolleId === RessourceRolleIdEnum.høringspart) {\r\n isMine = false;\r\n }\r\n\r\n return isMine;\r\n};\r\n\r\nexport const isIndberetningAfsluttet = (indberetning: Hoeringssag) => {\r\n return (\r\n [statusIdEnum.afsluttet, statusIdEnum.afsluttetGST].indexOf(\r\n indberetning.statusId\r\n ) > -1\r\n );\r\n};\r\n\r\nexport type PaneState = \"sagsdetaljer\" | \"sagsbehandling\" | \"hoeringssag\";\r\n\r\nexport default function FipIndberetning() {\r\n let { id } = useParams();\r\n const { authState } = useContext(AuthContext);\r\n const { resetSessionTimer } = useContext(SessionTimerContext);\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n const { map } = mapState;\r\n const handleError = useErrorHandler();\r\n const { currentUser } = authState;\r\n const [indberetningState, setIndberetningState] = useState(\r\n {\r\n state: \"LOADING\",\r\n indberetning: undefined,\r\n }\r\n );\r\n const [newFile, setNewFile] = useState({\r\n state: \"IDLE\",\r\n file: undefined,\r\n });\r\n const cancelDrawingAndUploadFile = () => {\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n };\r\n const indberetningStateHandler = (indberetning: Hoeringssag) => {\r\n setIndberetningState({\r\n ...indberetningState,\r\n indberetning: indberetning,\r\n });\r\n };\r\n\r\n const hash = window.location.hash.replace(\"#\", \"\");\r\n const [activePaneState, setActivePaneState] = useState<\r\n \"sagsdetaljer\" | \"sagsbehandling\" | \"hoeringssag\"\r\n >(\r\n hash === \"sagsbehandling\" || hash === \"hoeringssag\" ? hash : \"sagsdetaljer\"\r\n );\r\n\r\n useLayoutEffect(() => {\r\n window.location.hash = activePaneState;\r\n }, [activePaneState]);\r\n\r\n const [sagsbehandlingChatScrollPos, setSagsbehandlingChatScrollPos] =\r\n useState(undefined);\r\n const [høringsChatScrollPos, setHøringsChatScrollPos] = useState<\r\n number | undefined\r\n >(undefined);\r\n useEffect(() => {\r\n setIndberetningState({ indberetning: undefined, state: \"LOADING\" });\r\n const hentIndberetning = async () => {\r\n getIndberetning(id, currentUser.personId)\r\n .then((response) => {\r\n const features = getSagsaktFeaturesFromHoeringssag(response);\r\n\r\n features.forEach((feature) => {\r\n finishedDrawingSource.addFeature(feature);\r\n });\r\n\r\n setIndberetningState({\r\n indberetning: response,\r\n state: \"IDLE\",\r\n });\r\n resetSessionTimer();\r\n })\r\n .catch((e) => {\r\n e.response.status = 404;\r\n e.message = \"Kunne ikke finde indberetning\";\r\n handleError(e);\r\n });\r\n };\r\n hentIndberetning();\r\n }, [setIndberetningState, id, currentUser, handleError, resetSessionTimer]);\r\n\r\n const didZoomAlready = useRef(false);\r\n useEffect(() => {\r\n const { indberetning } = indberetningState;\r\n if (map && indberetning && indberetning.bbox && !didZoomAlready.current) {\r\n zoomToFeature(map, convertWktToFeature(indberetning.bbox));\r\n didZoomAlready.current = true;\r\n }\r\n }, [indberetningState, map, activePaneState]);\r\n useEffect(() => {\r\n const { indberetning } = indberetningState;\r\n\r\n if (map && indberetningState.state === \"IDLE\" && indberetning) {\r\n const indberetningsmappe = indberetning.indberetningsmappe.length\r\n ? indberetning.indberetningsmappe[0]\r\n : undefined;\r\n if (indberetningsmappe) {\r\n const indberetningTema = tema.find(\r\n (t) => t.id === indberetningsmappe.korttemaId\r\n );\r\n if (indberetningTema) {\r\n dispatchToMap({ type: \"SET_TEMA\", tema: indberetningTema });\r\n dispatchToMap({\r\n type: \"SET_LAYERS\",\r\n baselayers: indberetningTema.baseLayers,\r\n layers: indberetningTema.layers,\r\n });\r\n }\r\n }\r\n\r\n finishedDrawingSource.clear();\r\n const features = getSagsaktFeaturesFromHoeringssag(indberetning);\r\n features.forEach((feature) => {\r\n finishedDrawingSource.addFeature(feature);\r\n });\r\n }\r\n return () => {\r\n finishedDrawingSource.clear();\r\n dispatchToMap({ type: \"SET_TEMA\", tema: undefined });\r\n };\r\n }, [map, indberetningState, dispatchToMap]);\r\n const titelRef = useRef(null);\r\n const loadingRef = useRef(null);\r\n useLayoutEffect(() => {\r\n if (indberetningState.state === \"IDLE\") titelRef.current?.focus();\r\n if (indberetningState.state === \"LOADING\") loadingRef.current?.focus();\r\n }, [indberetningState.state]);\r\n if (indberetningState.state === \"LOADING\")\r\n return (\r\n
    \r\n
    \r\n \r\n {/* Loading... */}\r\n
    \r\n
    \r\n

    \r\n Henter sag ...\r\n

    \r\n \r\n );\r\n if (indberetningState.state === \"IDLE\" && indberetningState.indberetning) {\r\n const { indberetning } = indberetningState;\r\n const {\r\n ressource,\r\n hoeringsansvarligmappe: hoeringsansvarligmappeListe,\r\n hoeringspartmappe: hoeringspartmappeListe,\r\n indberetningsmappe: indberetningsmappeListe,\r\n sagsbehandlermappe: sagsbehandlermappeListe,\r\n } = indberetning;\r\n\r\n const indberettere = ressource?.filter((r) => r.rolleId === 1);\r\n const indberetter = indberettere?.length > 0 ? indberettere[0] : undefined;\r\n\r\n const sagsbehandlere = ressource?.filter((r) => r.rolleId === 2);\r\n const sagsbehandler =\r\n sagsbehandlere?.length > 0 ? sagsbehandlere[0] : undefined;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n Tilbage til indberetninger\r\n \r\n

    \r\n {indberetning.emne}\r\n

    \r\n
    \r\n Status: \r\n {isIndberetningMine(currentUser, indberetning, false) && (\r\n \r\n {currentUser.rolleId === RessourceRolleIdEnum.indberetter\r\n ? \"Indberettet af dig\"\r\n : \"Din indberetning\"}\r\n , \r\n \r\n )}\r\n s.id === indberetning.statusId)\r\n ?.className\r\n }`}\r\n >\r\n {statusStore.find((s) => s.id === indberetning.statusId)?.name}\r\n \r\n {/*I høring\r\n Afventer sagsbehandling */}\r\n
    \r\n
    \r\n {/* Fane Nav */}\r\n \r\n {/* Fane indhold */}\r\n
    \r\n {/* Detaljevisning */}\r\n {activePaneState === \"sagsdetaljer\" &&\r\n indberetningsmappeListe &&\r\n indberetningsmappeListe.length > 0 && (\r\n {\r\n if (map) {\r\n zoomToFeature(map, convertWktToFeature(indberetning.bbox));\r\n }\r\n }}\r\n />\r\n )}\r\n {/* Sagsbehandling / Chat mellem sagsbehandler og indberetter */}\r\n {activePaneState === \"sagsbehandling\" &&\r\n ((sagsbehandlermappeListe && sagsbehandlermappeListe.length > 0) ||\r\n (indberetningsmappeListe &&\r\n indberetningsmappeListe.length > 0)) && (\r\n \r\n )}\r\n {activePaneState === \"hoeringssag\" &&\r\n hoeringsansvarligmappeListe &&\r\n hoeringsansvarligmappeListe.length > 0 &&\r\n ![\r\n RessourceRolleIdEnum.indberetter,\r\n RessourceRolleIdEnum.gæst,\r\n ].includes(currentUser.rolleId) && (\r\n /**/\r\n\r\n \r\n )}\r\n {hoeringspartmappeListe && hoeringspartmappeListe.length > 0 && (\r\n \r\n
    \r\n

    Høringspartmappe

    \r\n

    asd

    \r\n
    \r\n
    \r\n )}\r\n {/* {sagsbehandler && ( */}\r\n {/* Skal KUN ses af sagsbehandler */}\r\n {/* <> */}\r\n {sagsbehandlermappeListe &&\r\n sagsbehandlermappeListe.length > 0 &&\r\n ![\r\n RessourceRolleIdEnum.indberetter,\r\n RessourceRolleIdEnum.høringspart,\r\n ].includes(currentUser.rolleId) && (\r\n \r\n )}\r\n\r\n {/* Skal KUN ses af Høringspart */}\r\n {/* <> */}\r\n {hoeringspartmappeListe &&\r\n hoeringspartmappeListe.length > 0 &&\r\n currentUser.rolleId === RessourceRolleIdEnum.høringspart && (\r\n \r\n )}\r\n {/* */}\r\n {/* )} */}\r\n
    \r\n \r\n );\r\n }\r\n return (\r\n
    \r\n

    Noget gik galt ...

    \r\n
    \r\n );\r\n}\r\n","import { del, get, post, put } from \"api\";\r\nimport { Objekttype, SagsbehandlingApi } from \"api/interfaces\";\r\nimport { getFilterValues, getFilterValueUrlString } from \"api/util\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\nimport { FeatureCollection } from \"geojson\";\r\nimport {\r\n convertIndberetningDTO,\r\n ExpandedIndberetningDTO,\r\n Hoeringssag,\r\n IFileUploadResponse,\r\n Indberetning,\r\n IndberetningDTO,\r\n Indlaeg,\r\n Ressource,\r\n RessourceRolleIdEnum,\r\n Sagsakt,\r\n statusIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport { formatDateString } from \"util/date\";\r\n\r\nexport const getIndberetninger = async (options: {\r\n personId: number;\r\n rolleId: number;\r\n filterId: number;\r\n searchEmne?: string;\r\n searchBeskrivelse?: string;\r\n extent?: number[];\r\n}): Promise => {\r\n const { filterId, personId, rolleId, searchBeskrivelse, searchEmne, extent } =\r\n options;\r\n const filterValues = getFilterValues(extent, searchEmne, searchBeskrivelse);\r\n try {\r\n const iDTOs = await get({\r\n query: `stednavn/api/saginfo?filterId=${filterId}&rolleId=${rolleId}&personId=${personId}&domaeneTypes=&filterValues=${filterValues}&page=1&start=0&limit=25&sort=%5B%7B%22property%22%3A%22id%22%2C%22direction%22%3A%22DESC%22%7D%5D`,\r\n });\r\n return iDTOs.map((i) => convertIndberetningDTO(i));\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const getIndberetning = async (\r\n indberetningId: number,\r\n personId: number\r\n): Promise => {\r\n try {\r\n const iDTO = await get({\r\n query: `stednavn/api/sager/${indberetningId}?filterId=0&personId=${personId}&id=${indberetningId}`,\r\n });\r\n return iDTO;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const postIndberetning = async (\r\n personId: number,\r\n email: string,\r\n body: Hoeringssag\r\n): Promise => {\r\n try {\r\n //http://fip.cust.septima.dk/api/sager?personId=4&email=xxx%40yyy.dk\r\n const iDTO = await post({\r\n query: `stednavn/api/sager/?personId=${personId}&email=${email}`,\r\n body,\r\n });\r\n return convertIndberetningDTO(iDTO);\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const putIndberetningDSSYS = async (\r\n personId: number,\r\n statusId: statusIdEnum,\r\n body: Hoeringssag\r\n): Promise => {\r\n body.statusId = statusId;\r\n try {\r\n //http://fip.cust.septima.dk/api/sager?personId=4&email=xxx%40yyy.dk\r\n const sag = await put({\r\n query: `stednavn/api/sager/${body.id}?personId=${personId}`,\r\n body,\r\n });\r\n return sag;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const getStednavnFeatureInfo = async (options: {\r\n personId: number;\r\n rolleId: number;\r\n filterId: number;\r\n searchEmne?: string;\r\n searchBeskrivelse?: string;\r\n extent: number[];\r\n height;\r\n width: number;\r\n x: number;\r\n y: number;\r\n}) => {\r\n const {\r\n filterId,\r\n personId,\r\n rolleId,\r\n searchBeskrivelse,\r\n searchEmne,\r\n extent,\r\n height,\r\n width,\r\n x,\r\n y,\r\n } = options;\r\n try {\r\n const queryParams: any = {\r\n service: \"WMS\",\r\n Version: \"1.1.1\",\r\n request: \"GetFeatureInfo\",\r\n LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n QUERY_LAYERS: process.env.REACT_APP_GEOSERVER_WORKSPACE + \":Sag2\",\r\n FORMAT: \"application/json\",\r\n INFO_FORMAT: \"application/json\",\r\n SRS: \"EPSG:25832\",\r\n BBOX: extent.join(\",\"),\r\n FEATURE_COUNT: 10,\r\n height,\r\n width,\r\n x,\r\n y,\r\n VIEWPARAMS: `applikationId:4;domaeneTypeIds:;filterId:${\r\n filterId === 6 ? 4 : filterId\r\n };personId:${personId};rolleId:${rolleId};filterValues:${getFilterValueUrlString(\r\n searchEmne,\r\n searchBeskrivelse\r\n )}`,\r\n };\r\n const featureCollection = await get({\r\n query: `${process.env.REACT_APP_API_BASEURL}proxy.ashx?${new URLSearchParams(queryParams).toString()}`,\r\n });\r\n return featureCollection;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const afbrydHoering = async (\r\n currentUser: Bruger,\r\n daværendeRessource: Ressource,\r\n indberetning: Hoeringssag,\r\n statusId: statusIdEnum\r\n): Promise => {\r\n try {\r\n const r = await del({\r\n query: `stednavn/api/ressourcer/${daværendeRessource.id}?personId=${currentUser.personId}&sagId=${indberetning.id}&statusId=${statusId}`,\r\n body: daværendeRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nconst skrivChatBesked = async (\r\n personId: number,\r\n sagId: number,\r\n body: Indlaeg\r\n): Promise => {\r\n try {\r\n const r = await post({\r\n query: `stednavn/api/indlaeg/?personId=${personId}&sagId=${sagId}`,\r\n body: body,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const afslutIndberetning = async (\r\n kommentar: string,\r\n currentUser: Bruger,\r\n id: number,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n try {\r\n // First post the komment as an indlaeg.\r\n let indlaeg = {\r\n id: 0,\r\n indhold: kommentar,\r\n organisationForkortelse: \"\",\r\n organisationId: 0,\r\n organisationNavn: \"\",\r\n personId: currentUser.personId,\r\n personNavn: \"\",\r\n ts: \"\",\r\n typeId: 5,\r\n typeNavn: \"\",\r\n };\r\n const r1 = skrivChatBesked(currentUser.personId, id, indlaeg);\r\n const resp1 = JSON.parse(JSON.stringify(r1)); // Gets rid of single-quotes\r\n if (resp1.errormsg) Promise.reject(resp1);\r\n\r\n // Get the current date in the correct format\r\n const r = await del({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/Sager/${id}?personId=${currentUser.personId}`,\r\n body: indberetning,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const opretSag = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/hoeringssager/${indberetning.id}?personId=${user.personId}&updateMode=1`,\r\n body: indberetning,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const tagIndberetning = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag,\r\n statusId: statusIdEnum\r\n): Promise => {\r\n try {\r\n let nyRessource: any = {\r\n email: \"\",\r\n fraTs: null,\r\n id: 0,\r\n navn: \"\",\r\n organisationId: 0,\r\n organisationsnavn: \"\",\r\n personId: user.personId,\r\n rolleId: RessourceRolleIdEnum.sagsbehandler,\r\n tilTs: null,\r\n \"fipbase.model.sag_id\": indberetning.id, // TODO: type this?\r\n };\r\n\r\n const r = await post({\r\n query: `stednavn/api/ressourcer/?personId=${user.personId}&sagId=${indberetning.id}&statusId=${statusId}`,\r\n body: nyRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const tagIndberetningFraSagsbehandler = async (\r\n user: Bruger,\r\n ressource: Ressource\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/ressourcer/${ressource.id}?personId=${user.personId}`,\r\n body: ressource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const redigerIndberetning = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n try {\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/hoeringssager/${indberetning.id}?personId=${user.personId}`,\r\n body: indberetning,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nconst objekttyperCache: any = {};\r\nexport const getObjekttyper = async (\r\n domaeneId: number\r\n): Promise => {\r\n try {\r\n if (objekttyperCache[domaeneId.toString()]) {\r\n return objekttyperCache[domaeneId.toString()];\r\n } else {\r\n const objekttyper = await get<{ value: number; text: string }[]>({\r\n query: `stednavn/api/objekttype?domaeneId=${domaeneId}&page=1&start=0&limit=25`,\r\n });\r\n objekttyperCache[domaeneId.toString()] = objekttyper;\r\n return objekttyper;\r\n }\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const redigerAendringsforslag = async (\r\n currentUser: Bruger,\r\n aendringTypeId: number,\r\n aendringType: string,\r\n id: number,\r\n beskrivelse: string,\r\n featureType: string,\r\n featureTypeId: number,\r\n geometri: string,\r\n geometriType: string,\r\n openLayersId: string\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nytAendringsforslag = {\r\n aendringType: aendringType,\r\n aendringTypeId: aendringTypeId,\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: id,\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n featureType: featureType,\r\n featureTypeId: featureTypeId,\r\n openLayersId: openLayersId,\r\n };\r\n // Get the current date in the correct format\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/aendringsforslag/${id}?personId=${currentUser.personId}`,\r\n body: nytAendringsforslag,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const uploadAendringsforslagGeometri = async (\r\n currentUser: Bruger,\r\n aendringTypeId: number,\r\n aendringType: string,\r\n beskrivelse: string,\r\n featureType: string,\r\n featureTypeId: number,\r\n geometri: string,\r\n geometriType: string,\r\n openLayersId: string,\r\n mappeId: number\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nytAendringsforslag = {\r\n aendringType: aendringType,\r\n aendringTypeId: aendringTypeId,\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: 0,\r\n featureType: featureType,\r\n featureTypeId: featureTypeId,\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: openLayersId,\r\n originalFilNavn: \"\",\r\n supplinfo: \"\",\r\n udpeget: false,\r\n url: \"\",\r\n };\r\n // Get the current date in the correct format\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/aendringsforslag?personId=${currentUser.personId}&mappeId=${mappeId}`,\r\n body: nytAendringsforslag,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const redigerSagsaktGeometri = async (\r\n currentUser: Bruger,\r\n id: number,\r\n beskrivelse: string,\r\n geometri: string\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsaktGeometri = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: id,\r\n geometri: geometri,\r\n };\r\n // Get the current date in the correct format\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/sagsakter/${id}?personId=${currentUser.personId}`,\r\n body: nySagsaktGeometri,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const uploadSagsaktGeometri = async (\r\n currentUser: Bruger,\r\n id: number,\r\n beskrivelse: string,\r\n openLayersId: string,\r\n geometri: string,\r\n geometriType: string,\r\n udpeget: boolean,\r\n mappeId: number\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsakt = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: 0,\r\n filId: 0,\r\n openLayersId: openLayersId,\r\n nr: 0, // TODO: check om dette skal sættes korrekt\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n mimetype: \"\",\r\n originalFilNavn: \"\",\r\n supplInfo: \"\",\r\n udpeget: udpeget,\r\n url: \"\",\r\n };\r\n // Get the current date in the correct format\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/sagsakter?personId=${currentUser.personId}&mappeId=${mappeId}`,\r\n body: nySagsakt,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\nexport const uploadFile = async (\r\n formData: FormData\r\n): Promise => {\r\n try {\r\n const r = await post({\r\n query: \"upload\",\r\n body: formData,\r\n });\r\n const resp = JSON.parse(\r\n r\r\n .replace(\"success\", '\"success\"')\r\n .replace(\"id\", '\"id\"')\r\n .replace(\"originalFilNavn\", '\"originalFilNavn\"')\r\n .replace(\"errormsg\", '\"errormsg\"')\r\n .replaceAll(\"'\", '\"')\r\n );\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const uploadSagsaktFil = async (\r\n currentUser: Bruger,\r\n beskrivelse: string,\r\n filId: number,\r\n geometri: string,\r\n originalFilNavn: string,\r\n openLayersId: string,\r\n geometriType: string,\r\n udpeget: boolean,\r\n mappeId: number\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsakt = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: 0,\r\n filId: filId,\r\n openLayersId: openLayersId,\r\n nr: 0, // TODO: check om dette skal sættes korrekt\r\n geometri: geometri,\r\n geometriType: geometriType,\r\n mimetype: \"\",\r\n originalFilNavn: originalFilNavn,\r\n supplInfo: \"\",\r\n udpeget: udpeget,\r\n url: \"\",\r\n };\r\n // Get the current date in the correct format\r\n const r = await post({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/sagsakter?personId=${currentUser.personId}&mappeId=${mappeId}`,\r\n body: nySagsakt,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nvar personerCache: Objekttype[] = [];\r\nexport const getPersoner = async (\r\n currentUser: Bruger\r\n): Promise => {\r\n try {\r\n // If the cache has data, and the currentuser is NOT in the cache, it's fine\r\n if (\r\n personerCache.length > 0 &&\r\n !personerCache.find((p) => p.value === currentUser.personId)\r\n ) {\r\n return personerCache;\r\n } else {\r\n // Else we need to update the cache\r\n const personer = await get<{ value: number; text: string }[]>({\r\n query: `stednavn/api/sagsbehandler?personId=${currentUser.personId}`,\r\n });\r\n personerCache = personer;\r\n return personerCache;\r\n }\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const videresendIndberetning = async (\r\n personId: number, // person der skal overtage sagen\r\n currentUser: Ressource // den person der havde sagen før\r\n): Promise => {\r\n try {\r\n // Update the personId\r\n let nyRessource = { ...currentUser, ...{ personId: personId } };\r\n\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/ressourcer/${currentUser.id}?personId=${currentUser.personId}`,\r\n body: nyRessource,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const deleteAendringsforslag = async (\r\n currentUser: Bruger,\r\n id: number\r\n): Promise => {\r\n try {\r\n // Get the current date in the correct format\r\n const r = await del({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/aendringsforslag/${id}?personId=${currentUser.personId}`,\r\n body: { id: id },\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const deleteSagsakt = async (\r\n currentUser: Bruger,\r\n id: number\r\n): Promise => {\r\n try {\r\n // Get the current date in the correct format\r\n const r = await del({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/sagsakter/${id}?personId=${currentUser.personId}`,\r\n body: { id: id },\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\nexport const redigerSagsakt = async (\r\n currentUser: Bruger,\r\n id: number,\r\n beskrivelse: string,\r\n openLayersId: string\r\n): Promise => {\r\n try {\r\n const dato: string = formatDateString(\r\n new Date().toISOString(),\r\n \"yyyy-MM-dd'T'HH:mm:ss\"\r\n );\r\n const nySagsakt = {\r\n beskrivelse: beskrivelse,\r\n dato: dato,\r\n id: id,\r\n openLayersId: openLayersId,\r\n };\r\n // Get the current date in the correct format\r\n const r = await put({\r\n // apiPrefix: \"https://fip.cust.septima.dk/\",\r\n query: `stednavn/api/sagsakter/${id}?personId=${currentUser.personId}`,\r\n body: nySagsakt,\r\n });\r\n const resp = JSON.parse(JSON.stringify(r)); // Gets rid of single-quotes\r\n\r\n if (resp.errormsg) {\r\n return Promise.reject(resp);\r\n }\r\n return resp;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n\r\n/* Is never used in stednavn but satisfies API impl. */\r\nexport const opretHoeringssag = async (\r\n user: Bruger,\r\n indberetning: Hoeringssag\r\n): Promise => {\r\n return indberetning;\r\n};\r\nexport const sagsbehandlingApi: SagsbehandlingApi = {\r\n afbrydHoering,\r\n afslutIndberetning,\r\n deleteAendringsforslag,\r\n deleteSagsakt,\r\n getIndberetning,\r\n getObjekttyper,\r\n getPersoner,\r\n opretHoeringssag,\r\n redigerAendringsforslag,\r\n redigerIndberetning,\r\n redigerSagsakt,\r\n redigerSagsaktGeometri,\r\n skrivChatBesked,\r\n tagIndberetning,\r\n tagIndberetningFraSagsbehandler,\r\n uploadAendringsforslagGeometri,\r\n uploadFile,\r\n uploadSagsaktFil,\r\n uploadSagsaktGeometri,\r\n videresendIndberetning,\r\n};\r\n","import { FipLayer } from \"interfaces/FipLayer\";\r\nimport {\r\n topoSkærmkort,\r\n stednavnSagWMSLayer,\r\n geodanmark,\r\n ortofoto,\r\n kommunegrænser,\r\n adresser,\r\n matrikler,\r\n stednavneWMS,\r\n stednavneWFSLayer,\r\n} from \"./layers\";\r\n\r\nexport const baselayers: FipLayer[] = [\r\n {\r\n loading: false,\r\n maplayer: geodanmark,\r\n title: geodanmark.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: topoSkærmkort,\r\n title: topoSkærmkort.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: ortofoto,\r\n title: ortofoto.get(\"title\"),\r\n visible: false,\r\n },\r\n];\r\nexport const layers: FipLayer[] = [\r\n {\r\n loading: false,\r\n maplayer: kommunegrænser,\r\n title: kommunegrænser.get(\"title\"),\r\n visible: false,\r\n },\r\n // postdistrikter,\r\n // sogne,\r\n {\r\n loading: false,\r\n maplayer: adresser,\r\n title: adresser.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: matrikler,\r\n title: matrikler.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: stednavneWMS,\r\n title: stednavneWMS.get(\"title\"),\r\n visible: true,\r\n },\r\n {\r\n loading: false,\r\n maplayer: stednavneWFSLayer,\r\n title: stednavneWFSLayer.get(\"title\"),\r\n visible: false,\r\n },\r\n {\r\n loading: false,\r\n maplayer: stednavnSagWMSLayer,\r\n title: stednavnSagWMSLayer.get(\"title\"),\r\n visible: true,\r\n },\r\n];\r\n\r\nconst FipConfig = { baselayers, layers };\r\nexport default FipConfig;\r\n\r\ntype Kode = { id: number; name: string; className?: string };\r\n\r\nexport const statusStore: Kode[] = [\r\n { id: 1, name: \"Modtaget\", className: \"bg-success\" },\r\n { id: 2, name: \"Afsluttet\", className: \"bg-danger\" },\r\n { id: 3, name: \"Afventer indberetter\", className: \"bg-warning\" },\r\n { id: 4, name: \"Afventer anden myndighed\", className: \"bg-warning\" },\r\n { id: 5, name: \"Under behandling\", className: \"bg-success\" },\r\n { id: 10, name: \"Oprettet\", className: \"bg-primary\" },\r\n { id: 11, name: \"Behandling PD\", className: \"bg-warning\" },\r\n { id: 12, name: \"I høring\", className: \"bg-horing\" },\r\n { id: 13, name: \"Behandling GST\", className: \"bg-warning\" },\r\n { id: 14, name: \"Klarmeldt til DagiSys\", className: \"bg-warning\" },\r\n { id: 15, name: \"Afsluttet GST\", className: \"bg-danger\" },\r\n { id: 16, name: \"Afsluttet\", className: \"bg-danger\" },\r\n { id: 20, name: \"Klarmeldt til DSSYS\", className: \"bg-warning\" },\r\n { id: 21, name: \"Overført til DSSYS\", className: \"bg-horing\" },\r\n];\r\n\r\nexport const rolleStore: Kode[] = [\r\n { id: 0, name: \"Anonym\" },\r\n { id: 1, name: \"Indberetter\" },\r\n { id: 2, name: \"Sagsbehandler\" },\r\n { id: 3, name: \"Høringsansvarlig\" },\r\n { id: 4, name: \"Høringspart\" },\r\n { id: 5, name: \"Høringsansvarlig\" },\r\n];\r\n\r\nexport const prioritetStore: Kode[] = [\r\n { id: -1, name: \"Ikke prioriteret\" },\r\n { id: 0, name: \"Ikke prioriteret\" },\r\n { id: 1, name: \"Lav\" },\r\n { id: 2, name: \"Mellem\" },\r\n { id: 3, name: \"Høj\" },\r\n];\r\n\r\n/**\r\n * StednavneIPs interne nummerering og tekster, der benyttes i dropdown i UI\r\n */\r\nexport const Kategori = [\r\n { value: 3100, label: \"Bebyggelse\" },\r\n //{ value: 6323, text: \"Begravelsesplads\" },\r\n { value: 4000, label: \"Bygning\" },\r\n { value: 5400, label: \"Fortidsminde\" },\r\n //{ value: 5520, text: \"Friluftsbad\" },\r\n //{ value: 2459, text: \"Færgerute\" },\r\n { value: 5510, label: \"Idrætsanlæg\" },\r\n { value: 6200, label: \"Landskabsform\" },\r\n //{ value: 2500, text: \"Lufthavn\" },\r\n { value: 6100, label: \"Naturareal\" },\r\n //{ value: 2460, text: \"Navigationsanlæg\" },\r\n //{ value: 7100, text: \"Farvand\" },\r\n { value: 7219, label: \"Sø\" },\r\n { value: 7310, label: \"Vandløb\" },\r\n { value: 9999, label: \"Andet\" },\r\n];\r\n\r\n/**\r\n * mapning mellem tekster fra Geosearh og StednavneIPs interne nummerering\r\n */\r\nexport const KategoriServiceMapning = [\r\n { value: 3100, label: \"bebyggelser\" },\r\n //{ value: 6323, text: \"begravelsesplads\" },\r\n { value: 4000, label: \"bygning\" },\r\n { value: 5400, label: \"fortidsminde\" },\r\n //{ value: 5520, text: \"friluftsbad\" },\r\n //{ value: 2459, text: \"faergerute\" },\r\n { value: 5510, label: \"idraetsanlæg\" },\r\n { value: 6200, label: \"landskabsform\" },\r\n //{ value: 2500, text: \"lufthavn\" },\r\n { value: 6100, label: \"naturareal\" },\r\n //{ value: 2460, text: \"navigationsanlæg\" },\r\n //{ value: 7100, text: \"farvand\" },\r\n { value: 7219, label: \"soe\" },\r\n { value: 7310, label: \"vandloeb\" },\r\n];\r\n\r\nexport const filtersForRolle: {\r\n rolleId: number;\r\n filterValues: number[];\r\n}[] = [\r\n { rolleId: 0, filterValues: [0, 9] }, // Gæst\r\n { rolleId: 1, filterValues: [0, 3, 4, 6, 9] }, // Indberetter\r\n { rolleId: 2, filterValues: [0, 2, 3, 4, 5, 6, 9] }, // Sagsbehandler\r\n];\r\n\r\nexport function getFilterValuesByRolleId(rolleId: number) {\r\n const filter = filtersForRolle.find((f) => f.rolleId === rolleId);\r\n return filter ? filter : filtersForRolle[0];\r\n}\r\n","export default function ChevronLeft(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-chevron-left\";\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n","import {\r\n Hoeringssag,\r\n Ressource,\r\n RessourceRolleIdEnum,\r\n statusIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport Section from \"../../Section\";\r\nimport { useContext } from \"react\";\r\nimport { Bruger } from \"context/AuthProvider\";\r\nimport { isIndberetningMine } from \"routes/Fip/FipIndberetning\";\r\nimport { ModalContext } from \"../../Modal/Modal\";\r\nimport PromptModal from \"../PromptModal\";\r\nimport { baseUrl } from \"api\";\r\nimport { getDownloadGeometryLink } from \"routes/Fip/fipUtil\";\r\n// import AfslutIndberetning from \"./AfslutIndberetningModal\";\r\nimport AfslutIndberetningModal from \"../AfslutIndberetningModal\";\r\nimport { SagsbehandlingApi } from \"api/interfaces\";\r\nimport { putIndberetningDSSYS } from \"api/stednavn\";\r\nimport VideresendIndberetningModal from \"../Fip/VideresendIndberetningModal\";\r\n\r\ninterface IStednavnSagsbehandlerfunktionerProps {\r\n currentUser: Bruger;\r\n indberetning: Hoeringssag;\r\n setIndberetning: Function;\r\n cancelDrawingAndUploadFile: () => void;\r\n sagsbehandlingApi: SagsbehandlingApi;\r\n}\r\n\r\nexport default function StednavnSagsbehandlerfunktioner(\r\n props: IStednavnSagsbehandlerfunktionerProps\r\n) {\r\n const {\r\n currentUser,\r\n indberetning,\r\n setIndberetning,\r\n cancelDrawingAndUploadFile,\r\n sagsbehandlingApi,\r\n } = props;\r\n const { showModal } = useContext(ModalContext);\r\n const { statusId } = indberetning;\r\n const {\r\n afslutIndberetning,\r\n getIndberetning,\r\n tagIndberetning,\r\n tagIndberetningFraSagsbehandler,\r\n } = sagsbehandlingApi;\r\n const indberetningIsAfsluttet =\r\n statusId === statusIdEnum.afsluttet ? true : false;\r\n //const indberetningIsHoeringssag =\r\n // statusId === statusIdEnum.iHoering ? true : false;\r\n return (\r\n
    \r\n
    \r\n
    \r\n Sagsbehandlerfunktioner\r\n

    Foretag ændringer eller tilføjelser til indberetningen.

    \r\n
      \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Tag indberetning\",\r\n content: (\r\n {\r\n // Do stuff that makes you take the indberetning\r\n\r\n const daværendeRessource =\r\n indberetning.ressource?.find(\r\n (x) =>\r\n x.rolleId === RessourceRolleIdEnum.sagsbehandler\r\n );\r\n if (daværendeRessource) {\r\n daværendeRessource.personId = currentUser.personId;\r\n // Prøv kun at sende personId som payload\r\n tagIndberetningFraSagsbehandler(\r\n currentUser,\r\n daværendeRessource\r\n ).then((nyRessource: Ressource) => {\r\n // Ny sagsbehandler\r\n const index = indberetning.ressource.findIndex(\r\n (x) =>\r\n x.rolleId ===\r\n RessourceRolleIdEnum.sagsbehandler\r\n );\r\n let nyIndberetning = indberetning;\r\n nyIndberetning.ressource[index] = nyRessource;\r\n setIndberetning(nyIndberetning);\r\n });\r\n } else {\r\n tagIndberetning(\r\n currentUser,\r\n indberetning,\r\n statusIdEnum.underBehandling\r\n ).then((nyRessource: Ressource) => {\r\n // Ny sagsbehandler\r\n let nyIndberetning = indberetning;\r\n nyIndberetning.ressource.push(nyRessource);\r\n setIndberetning(nyIndberetning);\r\n });\r\n }\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Tag indberetning\r\n \r\n
    • \r\n {/* Overfør til DSSYS */}\r\n {indberetning.statusId === 10 && (\r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Aktiver sag i DSSYS\",\r\n content: (\r\n {\r\n putIndberetningDSSYS(\r\n currentUser.personId,\r\n statusIdEnum.klarmeldtTilDSSYS,\r\n indberetning\r\n ).then((nyIndberetning: Hoeringssag) => {\r\n setIndberetning(nyIndberetning);\r\n });\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Synliggør sag overfor DSSYS\r\n \r\n
    • \r\n )}\r\n {/* Annuler DSSYS */}\r\n {indberetning.statusId === 20 && (\r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Aktiver sag i Stednavne Indberetningsportal\",\r\n content: (\r\n {\r\n putIndberetningDSSYS(\r\n currentUser.personId,\r\n statusIdEnum.oprettet,\r\n indberetning\r\n ).then((nyIndberetning: Hoeringssag) => {\r\n setIndberetning(nyIndberetning);\r\n });\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Usynliggør sag overfor DSSYS\r\n \r\n
    • \r\n )}\r\n {/* Er allerede overført til DSSYS */}\r\n {indberetning.statusId === 21 && (\r\n
    • \r\n {}}\r\n >\r\n Synliggør sag overfor DSSYS (ER OVERFØRT)\r\n \r\n
    • \r\n )}\r\n
    • \r\n {\r\n //TODO: Fix modal callback\r\n }\r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Videresend sag\",\r\n content: (\r\n \r\n ),\r\n });\r\n }}\r\n >\r\n Videresend indberetning\r\n \r\n
    • \r\n
    • \r\n \r\n Download geometrier\r\n \r\n
    • \r\n\r\n {/*\r\n {\r\n downloadFiles(currentUser, indberetning).then((data) => {\r\n const downloadUrl = window.URL.createObjectURL(\r\n new Blob([data])\r\n );\r\n const link = document.createElement(\"a\");\r\n link.href = downloadUrl;\r\n link.setAttribute(\"download\", \"FIP.zip\"); //any other extension\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n });\r\n }}\r\n >\r\n Download filer\r\n */}\r\n
    • \r\n \r\n Download filer\r\n \r\n
    • \r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Afslut indberetning\",\r\n content: (\r\n {\r\n afslutIndberetning(\r\n kommentar,\r\n currentUser,\r\n indberetning.id,\r\n indberetning\r\n ).then(() => {\r\n // After vi afslutter indberetningen, er det nemmere at hente den ned igen.\r\n getIndberetning(\r\n indberetning.id,\r\n currentUser.personId\r\n ).then((nyIndberetning) => {\r\n setIndberetning(nyIndberetning);\r\n });\r\n });\r\n }}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n Afslut indberetning\r\n \r\n
    • \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n","import { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport IconDrawPolygon from \"components/icons/DrawPolygon\";\r\nimport Trash from \"components/icons/Trash\";\r\nimport ThreeDotsVertical from \"components/icons/ThreeDotsVertical\";\r\nimport { ShowModalSignature } from \"../Modal/Modal\";\r\nimport ModalConfirmDelete from \"../Indberet/ModalConfirmDelete\";\r\nimport GeometryAvatar from \"../GeometryAvatar\";\r\nimport { uniqueId } from \"lodash\";\r\n\r\nexport default function FeatureItem(props: {\r\n onDeleteClick: Function;\r\n kategori: string;\r\n feature: Feature;\r\n hovered: boolean;\r\n setHoveredFeatures: (ids: string[]) => void;\r\n zoomToDrawing: (drawing: Feature) => void;\r\n onEditGeometryClick: () => void;\r\n showModal: ShowModalSignature;\r\n closeModal: (withCallback: boolean) => void;\r\n}) {\r\n const {\r\n feature,\r\n hovered,\r\n setHoveredFeatures,\r\n zoomToDrawing,\r\n kategori,\r\n onDeleteClick,\r\n onEditGeometryClick,\r\n showModal,\r\n closeModal,\r\n } = props;\r\n const id = feature.get(\"id\");\r\n const dropdownMenuButtonId = uniqueId(\"dropdownMenuButton\");\r\n return (\r\n setHoveredFeatures([id])}\r\n onMouseLeave={() => setHoveredFeatures([])}\r\n >\r\n {\r\n zoomToDrawing(feature);\r\n }}\r\n >\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {kategori}\r\n
    \r\n
    \r\n
    \r\n e.stopPropagation()}\r\n >\r\n \r\n \r\n \r\n
  • \r\n \r\n \r\n Ret geometri\r\n \r\n
  • \r\n
  • \r\n {\r\n e.stopPropagation();\r\n showModal({\r\n title: \"Slet opdatering\",\r\n content: (\r\n {\r\n onDeleteClick();\r\n }}\r\n closeModal={closeModal}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n \r\n Slet\r\n \r\n
  • \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n","import FeatureItem from \"components/common/Indberetning/FeatureItem\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { NewFileState } from \"routes/Fip/FipIndberet\";\r\nimport PlusCircleFill from \"components/icons/PlusCircleFill\";\r\nimport { DrawTool } from \"context/MapProvider\";\r\nimport DrawInstructions from \"components/common/Indberet/DrawInstructions\";\r\nimport { ShowModalSignature } from \"components/common/Modal/Modal\";\r\n\r\nexport default function Drawing(props: {\r\n type: \"create\" | \"update\";\r\n setDrawTool: (drawTool: DrawTool) => void;\r\n activeDrawTool: DrawTool;\r\n newFile: NewFileState;\r\n onDeleteClick: Function;\r\n kategori: string;\r\n geometri: Feature | undefined;\r\n hoveredFeatures: (string | number)[];\r\n setHoveredFeatures: (featureIds: (string | number)[]) => void;\r\n zoomToDrawing: (drawing: Feature) => void;\r\n onEditGeometryClick: () => void;\r\n showModal: ShowModalSignature;\r\n closeModal: (withCallback: boolean) => void;\r\n}) {\r\n const {\r\n type,\r\n geometri,\r\n onDeleteClick,\r\n hoveredFeatures,\r\n setHoveredFeatures,\r\n zoomToDrawing,\r\n kategori,\r\n newFile,\r\n activeDrawTool,\r\n setDrawTool,\r\n onEditGeometryClick,\r\n showModal,\r\n closeModal,\r\n } = props;\r\n\r\n return (\r\n
    \r\n

    \r\n {type === \"create\" && \"Indtegn stedet som dit stednavn er tilknyttet\"}\r\n {type === \"update\" && \"Ændre stednavnet i kortet\"}\r\n

    \r\n

    \r\n {type === \"create\" &&\r\n \"I kortet til højre skal du lokalisere stedet, som din indberetning omhandler. Du kan indtegne det med et punkt, en linje eller en polygon.\"}\r\n {type === \"update\" &&\r\n \"Du kan her ændre udstrækningen eller placeringen af stednavnet ved at trykke på de tre menuprikker. Du skal slette geometrien for at få lov til at tegne en ny geometri.\"}\r\n

    \r\n
    \r\n {geometri === undefined && (\r\n <>\r\n \r\n Du har endnu ikke tegnet en geometri.\r\n \r\n {!newFile.file && (\r\n
    \r\n {!activeDrawTool && (\r\n {\r\n setDrawTool(\"polygon\");\r\n }}\r\n >\r\n \r\n Indtegn sted\r\n \r\n )}\r\n {activeDrawTool && (\r\n {\r\n setDrawTool(undefined);\r\n }}\r\n >\r\n \r\n Fortryd tegning\r\n \r\n )}\r\n
    \r\n {activeDrawTool && (\r\n \r\n )}\r\n
    \r\n
    \r\n )}\r\n \r\n )}\r\n {geometri && (\r\n -1}\r\n setHoveredFeatures={(ids) => {\r\n setHoveredFeatures(ids);\r\n }}\r\n zoomToDrawing={zoomToDrawing}\r\n onEditGeometryClick={onEditGeometryClick}\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n )}\r\n
    \r\n
    \r\n );\r\n}\r\n","import DrawInstructions from \"components/common/Indberet/DrawInstructions\";\r\nimport LoadingSpinner from \"components/common/LoadingSpinner\";\r\nimport PlusCircleFill from \"components/icons/PlusCircleFill\";\r\nimport { DrawTool } from \"context/MapProvider\";\r\nimport { Fil, NewFileState } from \"routes/Fip/FipIndberet\";\r\nimport IconDrawPolygon from \"components/icons/DrawPolygon\";\r\nimport ThreeDotsVertical from \"components/icons/ThreeDotsVertical\";\r\nimport Trash from \"components/icons/Trash\";\r\nimport { formatDashedDate, formatDateString } from \"util/date\";\r\nimport { useRef } from \"react\";\r\nimport ModalConfirmDelete from \"components/common/Indberet/ModalConfirmDelete\";\r\nimport { ShowModalSignature } from \"components/common/Modal/Modal\";\r\nimport FileInput from \"components/common/FormElements/FileInput\";\r\nimport GeometryAvatar from \"components/common/GeometryAvatar\";\r\nimport { SagsbehandlingApi } from \"api/interfaces\";\r\nimport { uniqueId } from \"lodash\";\r\n\r\nexport default function File(props: {\r\n setDrawTool: (drawTool: DrawTool) => void;\r\n fil: Fil | undefined;\r\n newFile: NewFileState;\r\n setNewFile: (newFile: NewFileState) => void;\r\n activeDrawTool: DrawTool;\r\n hoveredFeatures: (string | number)[];\r\n setHoveredFeatures: (hoveredFeatureIds: (string | number)[]) => void;\r\n onClick: (f) => void;\r\n removeFil: () => void;\r\n onEditGeometryClick: () => void;\r\n showModal: ShowModalSignature;\r\n closeModal: (withCallback: boolean) => void;\r\n sagsbehandlingApi: SagsbehandlingApi;\r\n}) {\r\n const {\r\n fil,\r\n newFile,\r\n setNewFile,\r\n activeDrawTool,\r\n setDrawTool,\r\n hoveredFeatures,\r\n setHoveredFeatures,\r\n onClick,\r\n removeFil,\r\n onEditGeometryClick,\r\n showModal,\r\n closeModal,\r\n sagsbehandlingApi,\r\n } = props;\r\n const { uploadFile } = sagsbehandlingApi;\r\n const fileInputRef = useRef(null);\r\n const id = fil?.geometri.get(\"id\");\r\n const dropdownMenuButtonId = uniqueId(\"dropdownMenuButton\");\r\n return (\r\n
    \r\n {/* section head */}\r\n

    Upload fil

    \r\n

    Det er frivilligt om du vil tilføje filer til din indberetning.

    \r\n {!fil && (\r\n \r\n Du har ikke vedlagt en fil\r\n \r\n )}\r\n {fil && (\r\n <>\r\n Vedlagt fil\r\n {/* FilListItem */}\r\n -1 ? \"hover\" : \"\"\r\n }`}\r\n tabIndex={0}\r\n onMouseEnter={() => setHoveredFeatures([id])}\r\n onMouseLeave={() => setHoveredFeatures([])}\r\n onClick={onClick}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n onClick(fil.geometri);\r\n }\r\n }}\r\n >\r\n -1 ? \"hover\" : \"\"\r\n }`}\r\n aria-label=\"Vis i kort\"\r\n title=\"\"\r\n >\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    \r\n {fil.originalFilNavn}\r\n

    \r\n

    \r\n {formatDateString(fil.dato)}\r\n

    \r\n

    {formatDashedDate(fil.dato)}

    \r\n

    {fil.beskrivelse}

    \r\n
    \r\n
    \r\n
    \r\n e.stopPropagation()}\r\n >\r\n \r\n \r\n \r\n
  • \r\n \r\n \r\n Ret geometri\r\n \r\n
  • \r\n
  • \r\n {\r\n e.stopPropagation();\r\n showModal({\r\n title: \"Slet fil\",\r\n content: (\r\n {\r\n removeFil();\r\n }}\r\n closeModal={closeModal}\r\n />\r\n ),\r\n });\r\n }}\r\n >\r\n \r\n Slet\r\n \r\n
  • \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n )}\r\n {/* section content - component draw */}\r\n
    \r\n {(newFile.state === \"IDLE\" || newFile.state === \"ERROR\") && !fil && (\r\n <>\r\n {newFile.state === \"ERROR\" && (\r\n \r\n \r\n \r\n \r\n {newFile.error && (\r\n
    \r\n )}\r\n \r\n )}\r\n {\r\n setNewFile({ state: \"UPLOADING\", file: undefined });\r\n const { files } = e.target;\r\n if (files && files.length) {\r\n const file = files[0];\r\n let formData = new FormData();\r\n formData.append(\"file\", file);\r\n uploadFile(formData)\r\n .then((resp) => {\r\n setNewFile({\r\n state: \"UPLOADED\",\r\n file: {\r\n id: resp.id,\r\n originalFilNavn: resp.originalFilNavn,\r\n },\r\n });\r\n setDrawTool(\"polygon\");\r\n })\r\n .catch((e) => {\r\n let errorMsg = \"Der skete en fejl\";\r\n if (e.isAxiosError && e.response?.status === 413) {\r\n errorMsg = \"Filen er for stor.. (max 10MB)\";\r\n } else if (e.success === false) {\r\n errorMsg = e.errormsg;\r\n }\r\n setNewFile({\r\n state: \"ERROR\",\r\n file: undefined,\r\n error: errorMsg,\r\n });\r\n });\r\n }\r\n }}\r\n />\r\n \r\n )}\r\n {newFile.state === \"UPLOADING\" && }\r\n {newFile.state === \"UPLOADED\" && newFile.file && (\r\n <>\r\n \r\n

    \r\n Afslut upload: Placer filen i kortet\r\n

    \r\n

    \r\n Filen {newFile.file.originalFilNavn} skal\r\n tilknyttes en placering i kortet før din upload er afsluttet.\r\n

    \r\n
    \r\n {\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n setDrawTool(undefined);\r\n }}\r\n >\r\n \r\n Fortryd upload\r\n \r\n \r\n
    \r\n \r\n \r\n )}\r\n \r\n
    \r\n );\r\n}\r\n","import Select from \"components/common/FormElements/Select\";\r\nimport ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\nimport { ForwardedRef, forwardRef } from \"react\";\r\n\r\nconst KategoriSelect = forwardRef(\r\n (\r\n props: {\r\n isInvalid: boolean;\r\n currentKategori?: { value: number; label: string };\r\n setCurrentKategori: (value: string) => void;\r\n kategorier: { value: number; label: string }[];\r\n notify: boolean;\r\n resetNotify: () => void;\r\n },\r\n ref: ForwardedRef\r\n ) => {\r\n const {\r\n currentKategori,\r\n setCurrentKategori,\r\n kategorier,\r\n isInvalid,\r\n notify,\r\n resetNotify,\r\n } = props;\r\n return (\r\n <>\r\n setCurrentKategori(e.target.value)}\r\n value={currentKategori ? currentKategori.value.toString() : \"\"}\r\n options={[\r\n { label: \"Vælg kategori\", value: \"\", disabled: true },\r\n ...kategorier,\r\n ]}\r\n />\r\n \r\n \r\n );\r\n }\r\n);\r\n\r\nexport default KategoriSelect;\r\n","import ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\nimport { uniqueId } from \"lodash\";\r\n\r\nexport default function Kommentar(props: {\r\n showValidationWarning: boolean;\r\n validationMessage: string;\r\n kommentar: string;\r\n setKommentar: (string) => void;\r\n notify: boolean;\r\n resetNotify: () => void;\r\n}) {\r\n const {\r\n showValidationWarning,\r\n validationMessage,\r\n kommentar,\r\n setKommentar,\r\n notify,\r\n resetNotify,\r\n } = props;\r\n const id = uniqueId(\"kommentar-input\");\r\n return (\r\n
    \r\n \r\n {\r\n setKommentar(e.target.value);\r\n }}\r\n >\r\n \r\n
    \r\n );\r\n}\r\n","import ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\n\r\nexport default function StednavnInput(props: {\r\n ændringstype: \"opret\" | \"ændre\";\r\n showValidationWarning: boolean;\r\n validationWarningMessage: string;\r\n stednavn: string;\r\n setStednavn: (string) => void;\r\n notify: boolean;\r\n resetNotify: () => void;\r\n}) {\r\n const {\r\n ændringstype,\r\n showValidationWarning,\r\n validationWarningMessage,\r\n stednavn,\r\n setStednavn,\r\n notify,\r\n resetNotify,\r\n } = props;\r\n return (\r\n
    \r\n \r\n {\r\n setStednavn(e.target.value);\r\n }}\r\n />\r\n \r\n
    \r\n );\r\n}\r\n","import { Link } from \"react-router-dom\";\r\nimport ChevronLeft from \"components/icons/ChevronLeftSmall\";\r\nimport { routes } from \"routes/routesConfig\";\r\nexport default function Tilbage() {\r\n return (\r\n
    \r\n \r\n \r\n Tilbage til type indberetning\r\n \r\n
    \r\n );\r\n}\r\n","import { Kategori, KategoriServiceMapning } from \"config/StednavnConfig\";\r\nimport { Hoeringssag } from \"interfaces/IIndberetning\";\r\nimport { convertFeatureToWkt } from \"util/ol\";\r\nimport { NyIndberetningState } from \"./StednavnIndberet\";\r\nimport { CreateStednavnState } from \"./StednavnIndberet/CreateStednavn\";\r\nimport { UpdateStednavnState } from \"./StednavnIndberet/UpdateStednavn\";\r\n\r\nexport const mapKategori = (type: string) => {\r\n const mappedType = KategoriServiceMapning.find((k) => k.label === type);\r\n const mappedKategori = mappedType\r\n ? Kategori.find((k) => k.value === mappedType.value)\r\n : undefined;\r\n const newKategori = mappedKategori\r\n ? mappedKategori\r\n : Kategori[Kategori.length - 1];\r\n return newKategori;\r\n};\r\n\r\nexport function prepareCreateStednavnSag(\r\n indberetning: CreateStednavnState\r\n): Hoeringssag {\r\n const { beskrivelse, emne, fil, geometri, kategori } = indberetning;\r\n const requestDTO: Hoeringssag = {\r\n bbox: \"\",\r\n beskrivelse: beskrivelse,\r\n domaeneType: \"\",\r\n domaeneTypeId: 5,\r\n emne: emne,\r\n esdhJournalId: \"\",\r\n esdhJournalNummer: \"\",\r\n fraTs: null,\r\n frist: null,\r\n id: 0,\r\n indberetningsmappe: [\r\n {\r\n beskrivelse: \"\",\r\n domaeneType: \"\",\r\n domaeneTypeId: 5,\r\n emne: \"\",\r\n fejlSet: \"\",\r\n fil: fil\r\n ? [\r\n {\r\n beskrivelse: fil.beskrivelse,\r\n dato: fil.dato,\r\n filId: fil.filId,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(fil.geometri),\r\n geometriType: fil.geometri.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: \"\",\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n },\r\n ]\r\n : [],\r\n geometri: geometri\r\n ? [\r\n {\r\n aendringType: \"Oprettet\",\r\n aendringTypeId: 1,\r\n beskrivelse: \"Stednavn Geometri\",\r\n dato: new Date().toISOString(),\r\n featureType: kategori?.label ?? \"\",\r\n featureTypeId: kategori?.value ?? 0,\r\n filId: 0,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(geometri),\r\n geometriType: geometri.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: \"\", // g.drawing.getId().toString(),\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n },\r\n ]\r\n : [],\r\n id: 0,\r\n korttemaId: 1,\r\n },\r\n ],\r\n korrespondance: [],\r\n oprettetTs: null,\r\n prioritet: 0,\r\n ressource: [],\r\n sagsbehandlermappe: [],\r\n sagsid: 0,\r\n sagsnummer: \"\",\r\n statusId: 10,\r\n tilTs: null,\r\n };\r\n return requestDTO;\r\n}\r\nexport function prepareUpdateStednavnSag(\r\n indberetning: UpdateStednavnState\r\n): Hoeringssag {\r\n const { beskrivelse, emne, fil, geometri, kategori } = indberetning;\r\n const requestDTO: Hoeringssag = {\r\n bbox: \"\",\r\n beskrivelse,\r\n domaeneType: \"\",\r\n domaeneTypeId: 5,\r\n emne,\r\n esdhJournalId: \"\",\r\n esdhJournalNummer: \"\",\r\n fraTs: null,\r\n frist: null,\r\n id: 0,\r\n indberetningsmappe: [\r\n {\r\n beskrivelse: \"\",\r\n domaeneType: \"\",\r\n domaeneTypeId: 5,\r\n emne: \"\",\r\n fejlSet: \"\",\r\n fil: fil\r\n ? [\r\n {\r\n beskrivelse: fil.beskrivelse,\r\n dato: fil.dato,\r\n filId: fil.filId,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(fil.geometri),\r\n geometriType: fil.geometri.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: \"\",\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n },\r\n ]\r\n : [],\r\n geometri: geometri\r\n ? [\r\n {\r\n aendringType: \"Ændret\",\r\n aendringTypeId: 2,\r\n beskrivelse: \"Stednavn Geometri\",\r\n dato: new Date().toISOString(),\r\n featureType: kategori?.label ?? \"\",\r\n featureTypeId: kategori?.value ?? 0,\r\n filId: 0,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(geometri),\r\n geometriType: geometri.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: \"\", // g.drawing.getId().toString(),\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n },\r\n ]\r\n : [],\r\n id: 0,\r\n korttemaId: 1,\r\n },\r\n ],\r\n korrespondance: [],\r\n oprettetTs: null,\r\n prioritet: 0,\r\n ressource: [],\r\n sagsbehandlermappe: [],\r\n sagsid: 0,\r\n sagsnummer: \"\",\r\n statusId: 10,\r\n tilTs: null,\r\n };\r\n return requestDTO;\r\n}\r\nexport function prepareDeleteStednavnSag(\r\n indberetning: NyIndberetningState\r\n): Hoeringssag {\r\n const { beskrivelse, emne, fil, geometri } = indberetning;\r\n\r\n const type = geometri?.get(\"type\");\r\n const kategori = mapKategori(type);\r\n const requestDTO: Hoeringssag = {\r\n bbox: \"\",\r\n beskrivelse: beskrivelse,\r\n domaeneType: \"\",\r\n domaeneTypeId: 5,\r\n emne: emne,\r\n esdhJournalId: \"\",\r\n esdhJournalNummer: \"\",\r\n fraTs: null,\r\n frist: null,\r\n id: 0,\r\n indberetningsmappe: [\r\n {\r\n beskrivelse: \"\",\r\n domaeneType: \"\",\r\n domaeneTypeId: 5,\r\n emne: \"\",\r\n fejlSet: \"\",\r\n fil: fil\r\n ? [\r\n {\r\n beskrivelse: fil.beskrivelse,\r\n dato: fil.dato,\r\n filId: fil.filId,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(fil.geometri),\r\n geometriType: fil.geometri.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: \"\",\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n },\r\n ]\r\n : [],\r\n geometri: geometri\r\n ? [\r\n {\r\n aendringType: \"Slettet\",\r\n aendringTypeId: 3,\r\n beskrivelse: \"Stednavn Geometri\",\r\n dato: new Date().toISOString(),\r\n featureType: kategori.label,\r\n featureTypeId: kategori.value,\r\n filId: 0,\r\n filreference: \"\",\r\n geometri: convertFeatureToWkt(geometri),\r\n geometriType: geometri.getGeometry().getType(),\r\n personId: 0,\r\n personNavn: \"\",\r\n id: 0,\r\n kortforsyningId: \"\",\r\n mimetype: \"\",\r\n nr: 1,\r\n openLayersId: \"\", // g.drawing.getId().toString(),\r\n originalFilNavn: \"\",\r\n supplInfo: \"{}\",\r\n udpeget: false,\r\n url: \"\",\r\n },\r\n ]\r\n : [],\r\n id: 0,\r\n korttemaId: 1,\r\n },\r\n ],\r\n korrespondance: [],\r\n oprettetTs: null,\r\n prioritet: 0,\r\n ressource: [],\r\n sagsbehandlermappe: [],\r\n sagsid: 0,\r\n sagsnummer: \"\",\r\n statusId: 10,\r\n tilTs: null,\r\n };\r\n return requestDTO;\r\n}\r\n","import { get } from \"api\";\r\nimport { SearchResult, SearchResultResponse } from \"interfaces/IGeoSearch\";\r\n\r\nexport type ResourceType =\r\n | \"adresser\"\r\n | \"matrikelnumre\"\r\n | \"stednavne_v3\"\r\n | \"kommuner\"\r\n | \"opstillingskredse\"\r\n | \"politikredse\"\r\n | \"postdistrikter\"\r\n | \"regioner\"\r\n | \"retskredse\"\r\n | \"sogne\";\r\nexport const allResources =\r\n \"adresser,matrikelnumre,stednavne_v3,kommuner,opstillingskredse,politikredse,postdistrikter,regioner,retskredse,sogne\";\r\nexport const getSearchResult = async (\r\n query: string,\r\n resources?: ResourceType[]\r\n): Promise => {\r\n try {\r\n const resourcesString =\r\n resources && resources.length > 0 ? resources.join(\",\") : allResources;\r\n const result = await get({\r\n query: `Geosearch?service=GEO&search=${query}&ticket=54d9561a836b02cc6997484ce31e8ba3&resources=${resourcesString}&limit=100`,\r\n apiPrefix: \"https://kortforsyningen.kms.dk/\",\r\n });\r\n if (result.status !== \"OK\") return Promise.reject(result.message);\r\n return result.data;\r\n } catch (error) {\r\n return Promise.reject(error);\r\n }\r\n};\r\n","import { getSearchResult, ResourceType } from \"api/geosearch\";\r\nimport { CSSProperties, useEffect, useRef, useState } from \"react\";\r\nimport Downshift from \"downshift\";\r\nimport { SearchResult } from \"interfaces/IGeoSearch\";\r\nimport { Map } from \"ol\";\r\nimport { convertWktToFeature, zoomToFeature } from \"util/ol\";\r\n\r\ninterface ISearchProps {\r\n map: Map;\r\n resources: ResourceType[];\r\n placeholder?: string;\r\n onResult?: (searchResult: SearchResult) => any;\r\n containerClassName?: string;\r\n containerStyle?: CSSProperties;\r\n inputClassName?: string;\r\n inputStyle?: CSSProperties;\r\n listStyle?: CSSProperties;\r\n listItemStyle?: CSSProperties;\r\n extSearchString?: string;\r\n extSetSearchString?: React.Dispatch>;\r\n inputId?: string;\r\n}\r\nexport default function Search(props: ISearchProps) {\r\n const {\r\n map,\r\n resources,\r\n placeholder,\r\n onResult,\r\n containerClassName,\r\n containerStyle,\r\n inputClassName,\r\n inputStyle,\r\n listStyle,\r\n listItemStyle,\r\n extSearchString,\r\n extSetSearchString,\r\n inputId,\r\n } = props;\r\n const [intSearchString, intSetSearchString] = useState(\"\");\r\n const [searchString, setSearchString] =\r\n extSearchString !== undefined && extSetSearchString\r\n ? [extSearchString, extSetSearchString]\r\n : [intSearchString, intSetSearchString];\r\n const [searchResult, setSearchResult] = useState([]);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const inputRef = useRef(null);\r\n const cache = useRef({});\r\n useEffect(() => {\r\n const search = async () => {\r\n if (searchString) {\r\n const res = cache.current[searchString]\r\n ? cache.current[searchString]\r\n : await getSearchResult(searchString, resources);\r\n cache.current[searchString] = res;\r\n if (res) setSearchResult(res);\r\n else setSearchResult([]);\r\n } else {\r\n setSearchResult([]);\r\n }\r\n };\r\n search();\r\n }, [searchString, resources]);\r\n const itemToString = (item: SearchResult | null) => {\r\n return item?.presentationString ?? \"\";\r\n };\r\n const menuClassname =\r\n isOpen && searchResult.length\r\n ? \"dropdown-menu d-block py-0\"\r\n : \"dropdown-menu py-0\";\r\n return (\r\n setIsOpen(false)}\r\n onSelect={(i) => {\r\n if (i) {\r\n setSearchString(i.presentationString);\r\n zoomToFeature(map, convertWktToFeature(i.geometryWkt));\r\n if (onResult) onResult(i);\r\n }\r\n setIsOpen(false);\r\n inputRef.current?.blur();\r\n }}\r\n >\r\n {({\r\n isOpen,\r\n highlightedIndex,\r\n selectItem,\r\n getItemProps,\r\n getMenuProps,\r\n getInputProps,\r\n }) => (\r\n \r\n setSearchString(e.target.value),\r\n onKeyDown: (e) => {\r\n if (e.key === \"Escape\") {\r\n setSearchString(\"\");\r\n }\r\n },\r\n onFocus: () => setIsOpen(true),\r\n })}\r\n className={\r\n inputClassName\r\n ? inputClassName\r\n : \"form-control border-0 px-3 py-2\"\r\n }\r\n style={{ ...{ minWidth: \"370px\" }, ...inputStyle }}\r\n type=\"search\"\r\n placeholder={\r\n placeholder ? placeholder : \"Søg adresse, stednavn, mm.\"\r\n }\r\n value={searchString}\r\n >\r\n \r\n \r\n \r\n \r\n {isOpen &&\r\n searchResult.map((item, index) => {\r\n return (\r\n selectItem(item)}\r\n style={{\r\n ...{\r\n cursor: \"pointer\",\r\n width: 368,\r\n overflowX: \"hidden\",\r\n whiteSpace: \"nowrap\",\r\n textOverflow: \"ellipsis\",\r\n backgroundColor:\r\n highlightedIndex === index ? \"#e9ecef\" : undefined,\r\n },\r\n ...listItemStyle,\r\n }}\r\n >\r\n {item.presentationString}\r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n","import Search from \"components/common/Map/Search\";\r\nimport { SearchResult } from \"interfaces/IGeoSearch\";\r\nimport { Map } from \"ol\";\r\n\r\nexport default function FindStednavn(props: {\r\n map: Map | undefined;\r\n searchResult: SearchResult | undefined;\r\n setSearchResult: React.Dispatch<\r\n React.SetStateAction\r\n >;\r\n ændringstype: \"ændre\" | \"nedlæg\";\r\n}) {\r\n const { searchResult, setSearchResult, ændringstype, map } = props;\r\n if (!map) return null;\r\n return (\r\n
    \r\n {/* section head */}\r\n

    Find stednavn

    \r\n

    \r\n Søg herunder for at vælge stednavn der skal{\" \"}\r\n {ændringstype === \"ændre\" && \"ændres. \"}\r\n {ændringstype === \"nedlæg\" && \"nedlægges. \"}\r\n Hvis stednavnet består af flere ord, skrives de uden mellemrum.\r\n

    \r\n\r\n {/* section body */}\r\n
    \r\n {!searchResult && (\r\n
    \r\n \r\n {\r\n setSearchResult(result);\r\n }}\r\n containerClassName={\"c-search\"}\r\n inputClassName={\"form-control\"}\r\n inputStyle={{ marginBottom: 4 }}\r\n containerStyle={{\r\n boxShadow: \"unset\",\r\n position: \"relative\",\r\n }}\r\n listItemStyle={{ width: \"100%\" }}\r\n listStyle={{\r\n right: 2,\r\n left: 2,\r\n }}\r\n />\r\n \r\n Fremsøg stednavn der skal{\" \"}\r\n {ændringstype === \"nedlæg\" ? \"nedlægges\" : \"ændres\"}\r\n \r\n
    \r\n )}\r\n {searchResult && (\r\n
    \r\n
    \r\n \r\n

    \r\n \r\n Stednavn der ønskes{\" \"}\r\n {ændringstype === \"nedlæg\" ? \"nedlagt\" : \"ændret\"}:\r\n \r\n

    \r\n

    {searchResult?.presentationString}

    \r\n {/* */}\r\n setSearchResult(undefined)}\r\n type=\"button\"\r\n className=\"btn btn-primary text-white mt-4\"\r\n >\r\n \r\n \r\n \r\n Vælg andet stednavn\r\n \r\n
    \r\n
    \r\n
    \r\n )}\r\n \r\n
    \r\n );\r\n}\r\n","import { useLayoutEffect, useRef } from \"react\";\r\n\r\nexport default function LoggetUd() {\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n

    \r\n Du er nu logget ud af FIP\r\n

    \r\n \r\n

    \r\n Hvis andre har adgang til denne computer, smartphone eller tablet,\r\n skal du:\r\n

    \r\n

    \r\n Lukke internetbrowseren helt ned - ikke kun fanebladet, eller slette\r\n internetbrowserens midlertidige filer.\r\n

    \r\n
    \r\n
    \r\n );\r\n}\r\n","import LoggetUd from \"routes/LoggetUd\";\r\n\r\nexport default function FipLoggetUd() {\r\n return ;\r\n}\r\n","import { useLayoutEffect, useRef } from \"react\";\r\nimport { loginUrl } from \"api\";\r\n\r\nexport default function LoaTooLow(props: LoaTooLowProps) {\r\n const loginA = document.createElement(\"a\");\r\n const titelRef = useRef(null);\r\n const { path } = props;\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n

    \r\n Dit login opfylder ikke det nødvendige sikringsniveau.\r\n

    \r\n \r\n

    \r\n {\r\n loginA.setAttribute(\r\n \"href\",\r\n loginUrl + \"?forceAuthn=true&returnUrl=\" + path\r\n );\r\n loginA.click();\r\n }}\r\n aria-label=\"Log Ind\"\r\n title=\"Log Ind\"\r\n >\r\n Login med et højere sikringsniveau\r\n \r\n
    \r\n
    \r\n );\r\n}\r\nexport function FipLoaTooLow() {\r\n return ;\r\n}\r\nexport function StednavnLoaTooLow() {\r\n return ;\r\n}\r\ninterface LoaTooLowProps {\r\n path: string;\r\n}\r\n","import Fip from \"routes/Fip/Fip\";\r\nimport Stednavn from \"routes/Stednavn/Stednavn\";\r\nimport FipOversigt from \"routes/Fip/FipOversigt\";\r\nimport FipIndberet from \"routes/Fip/FipIndberet\";\r\nimport FipIndberetning from \"routes/Fip/FipIndberetning\";\r\nimport StednavnIndberet from \"routes/Stednavn/StednavnIndberet\";\r\nimport StednavnIndberetninger from \"routes/Stednavn/StednavnIndberetninger\";\r\nimport StednavnIndberetning from \"routes/Stednavn/StednavnIndberetning\";\r\nimport Postnr from \"./Postnr/Postnr\";\r\nimport PostnrIndberet from \"./Postnr/PostnrIndberet\";\r\nimport PostnrIndberetning from \"./Postnr/PostnrIndberetning\";\r\nimport PostnrIndberetninger from \"./Postnr/PostnrIndberetninger\";\r\nimport Sogn from \"./Sogn/Sogn\";\r\nimport SognIndberet from \"./Sogn/SognIndberet\";\r\nimport SognIndberetninger from \"./Sogn/SognIndberetninger\";\r\nimport SognIndberetning from \"./Sogn/SognIndberetning\";\r\nimport CreateStednavn from \"./Stednavn/StednavnIndberet/CreateStednavn\";\r\nimport UpdateStednavn from \"./Stednavn/StednavnIndberet/UpdateStednavn\";\r\nimport DeleteStednavn from \"./Stednavn/StednavnIndberet/DeleteStednavn\";\r\nimport FipLoggetUd from \"./Fip/FipLoggetUd\";\r\nimport { FipLoaTooLow, StednavnLoaTooLow } from \"./LoaTooLow\";\r\n\r\nexport const routes = {\r\n kort: {\r\n path: \"/kort\",\r\n isPublic: true,\r\n name: \"Opdateringer i kort\",\r\n Component: Fip,\r\n },\r\n kortIndberet: {\r\n path: \"/kort/indberet\",\r\n name: \"Indberet\",\r\n isPublic: false,\r\n Component: FipIndberet,\r\n },\r\n kortIndberetninger: {\r\n path: \"/kort/indberetninger\",\r\n name: \"Indberetninger\",\r\n isPublic: true,\r\n Component: FipOversigt,\r\n },\r\n kortIndberetning: {\r\n path: \"/kort/indberetninger/:id\",\r\n name: \"Indberetning\",\r\n isPublic: true,\r\n Component: FipIndberetning,\r\n },\r\n kortLoggetUd: {\r\n path: \"/kort/loggetud\",\r\n name: \"Du er nu logget ud af FIP\",\r\n isPublic: true,\r\n Component: FipLoggetUd,\r\n },\r\n kortLoaTooLow: {\r\n path: \"/kort/forlavloa\",\r\n name: \"Utilstrækkeligt sikringsniveau\",\r\n isPublic: true,\r\n Component: FipLoaTooLow,\r\n },\r\n stednavn: {\r\n path: \"/stednavn\",\r\n name: \"Stednavn\",\r\n isPublic: true,\r\n Component: Stednavn,\r\n },\r\n stednavnIndberet: {\r\n path: \"/stednavn/indberet\",\r\n name: \"Indberet\",\r\n isPublic: false,\r\n Component: StednavnIndberet,\r\n },\r\n stednavnIndberetCreate: {\r\n path: \"/stednavn/indberet/create\",\r\n name: \"Opret stednavn\",\r\n isPublic: false,\r\n Component: CreateStednavn,\r\n },\r\n stednavnIndberetUpdate: {\r\n path: \"/stednavn/indberet/update\",\r\n name: \"Ændring af stednavn\",\r\n isPublic: false,\r\n Component: UpdateStednavn,\r\n },\r\n stednavnIndberetDelete: {\r\n path: \"/stednavn/indberet/delete\",\r\n name: \"Nedlæg stednavn\",\r\n isPublic: false,\r\n Component: DeleteStednavn,\r\n },\r\n stednavnIndberetninger: {\r\n path: \"/stednavn/indberetninger\",\r\n name: \"Indberetninger\",\r\n isPublic: false,\r\n Component: StednavnIndberetninger,\r\n },\r\n stednavnIndberetning: {\r\n path: \"/stednavn/indberetninger/:id\",\r\n name: \"Indberetning\",\r\n isPublic: false,\r\n Component: StednavnIndberetning,\r\n },\r\n stednavnLoggetUd: {\r\n path: \"/stednavn/loggetud\",\r\n name: \"Du er nu logget ud af FIP\",\r\n isPublic: true,\r\n Component: FipLoggetUd,\r\n },\r\n stednavnLoaTooLow: {\r\n path: \"/stednavn/forlavloa\",\r\n name: \"Utilstrækkeligt sikringsniveau\",\r\n isPublic: true,\r\n Component: StednavnLoaTooLow,\r\n },\r\n postnr: {\r\n path: \"/postnr\",\r\n name: \"Postnummer\",\r\n isPublic: false,\r\n Component: Postnr,\r\n },\r\n postnrIndberet: {\r\n path: \"/postnr/indberet\",\r\n name: \"Indberet\",\r\n isPublic: false,\r\n Component: PostnrIndberet,\r\n },\r\n postnrIndberetninger: {\r\n path: \"/postnr/indberetninger\",\r\n name: \"Indberetninger\",\r\n isPublic: false,\r\n Component: PostnrIndberetninger,\r\n },\r\n postnrIndberetning: {\r\n path: \"/postnr/indberetninger/:id\",\r\n name: \"Indberetning\",\r\n isPublic: false,\r\n Component: PostnrIndberetning,\r\n },\r\n sogn: { path: \"/sogn\", name: \"Sogne\", isPublic: false, Component: Sogn },\r\n sognIndberet: {\r\n path: \"/sogn/indberet\",\r\n name: \"Indberet\",\r\n isPublic: false,\r\n Component: SognIndberet,\r\n },\r\n sognIndberetninger: {\r\n path: \"/sogn/indberetninger\",\r\n name: \"Indberetninger\",\r\n isPublic: false,\r\n Component: SognIndberetninger,\r\n },\r\n sognIndberetning: {\r\n path: \"/sogn/indberetninger/:id\",\r\n name: \"Indberetning\",\r\n isPublic: false,\r\n Component: SognIndberetning,\r\n },\r\n};\r\nexport const routesArray: {\r\n path: string;\r\n name: string;\r\n isPublic: boolean;\r\n Component: React.ComponentType;\r\n key: string;\r\n}[] = Object.keys(routes).map((key) => {\r\n return { ...routes[key], key };\r\n});\r\n\r\nexport const paths: any = routesArray.reduce((prev, curr) => {\r\n prev[curr.key] = curr.path;\r\n return prev;\r\n}, {});\r\n","import { useLayoutEffect, useRef } from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { paths } from \"routes/routesConfig\";\r\nexport default function Fip() {\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n

    \r\n Indberet opdateringer i kort\r\n

    \r\n

    \r\n Fortæl os om opdateringer til kort og data\r\n

    \r\n

    \r\n Her kan du give os besked om fejl, mangler og ændringsforslag til et af\r\n Styrelsen for Dataforsyning og Infrastrukturs (SDFI) kort.\r\n

    \r\n
    \r\n
    \r\n Mulige handlinger\r\n
    \r\n \r\n Indberet\r\n \r\n \r\n Se oversigt over indberetninger\r\n \r\n
    \r\n
    \r\n
    \r\n

    For at indberette har vi brug for NemID og email

    \r\n

    \r\n For at indberette skal du logge ind med dit NemID og du blive bedt om\r\n din e-mailadresse.\r\n

    \r\n

    \r\n Vi beder om din e-mailadresse for at kunne give dig besked om\r\n behandlingen af din indberetning og for at kunne kontakte dig, hvis vi\r\n eventuelt har spørgsmål til din indberetning eller har brug for flere\r\n oplysninger.\r\n

    \r\n

    \r\n Du kan læse om behandling af dine personoplysninger i vores \r\n \r\n privatlivspolitik\r\n \r\n .\r\n

    \r\n

    Hvad kan en indberetning indeholde?

    \r\n

    \r\n Med en indberetning kan du fortælle os om fejl, mangler eller ændringer\r\n til SDFIs kort og data f.eks. nye bygninger/tilbygning, vindmøller, veje\r\n eller navne, der findes i den fysiske verden men ikke i kortet.\r\n

    \r\n

    \r\n Det er muligt at rapportere indenfor:\r\n

    \r\n
      \r\n
    • Landkort (topografiske kort)
    • \r\n
    • Danmarks Højdemodel
    • \r\n
    • GeoDanmark
    • \r\n
    \r\n
    \r\n );\r\n}\r\n","import { useContext, useEffect, useState } from \"react\";\r\nimport { getIndberetninger } from \"../../api/fip\";\r\nimport {\r\n getSearchFilterByValue,\r\n IndberetningerState,\r\n} from \"../../interfaces/IIndberetning\";\r\nimport { getFilterValuesByRolleId } from \"config/FipConfig\";\r\nimport { updateFipSagWmsParams } from \"config/layers\";\r\nimport { IndberetningFilterContext } from \"context/IndberetningFilterProvider\";\r\nimport IndberetningOversigt from \"components/common/IndberetningOversigt/IndberetningOversigt\";\r\nimport { SessionTimerContext } from \"context/SessionTimerProvider\";\r\n\r\nexport default function FipOversigt() {\r\n const {\r\n filter,\r\n filters,\r\n search,\r\n searchExtent,\r\n setFilter,\r\n setFilters,\r\n setSearch,\r\n searchInputText,\r\n setSearchInputText,\r\n currentUser,\r\n } = useContext(IndberetningFilterContext);\r\n const { resetSessionTimer } = useContext(SessionTimerContext);\r\n const [indberetningerState, setIndberetningerState] =\r\n useState({\r\n state: \"LOADING\",\r\n indberetninger: [],\r\n });\r\n useEffect(() => {\r\n setIndberetningerState((i) => {\r\n return { ...i, state: \"LOADING\" };\r\n });\r\n const timer = setTimeout(() => {\r\n setSearch(searchInputText);\r\n }, 1000);\r\n return () => clearTimeout(timer);\r\n }, [searchInputText, setSearch]);\r\n\r\n useEffect(() => {\r\n const filtersForUser = getFilterValuesByRolleId(\r\n currentUser.rolleId\r\n ).filterValues.map((value) => {\r\n return getSearchFilterByValue(value);\r\n });\r\n setFilters(filtersForUser);\r\n }, [currentUser, setFilters]);\r\n\r\n useEffect(() => {\r\n let stillMounted = true;\r\n if (filter.text === \"Alle indenfor kortvindue\" && searchExtent[0] === 0)\r\n return;\r\n setIndberetningerState({\r\n indberetninger: [],\r\n state: \"LOADING\",\r\n });\r\n const getFilteredIndberetningerForUser = async () => {\r\n const options = {\r\n personId: currentUser.personId,\r\n rolleId: currentUser.rolleId,\r\n filterId: filter.value,\r\n searchEmne: filter.text === \"Søgning\" ? search.emne : \"\",\r\n searchBeskrivelse: filter.text === \"Søgning\" ? search.beskrivelse : \"\",\r\n extent:\r\n filter.text === \"Alle indenfor kortvindue\" ? searchExtent : undefined,\r\n };\r\n updateFipSagWmsParams(options);\r\n const response = await getIndberetninger(options);\r\n resetSessionTimer();\r\n const indberetninger = response.reverse();\r\n if (stillMounted)\r\n setIndberetningerState({\r\n indberetninger,\r\n state: \"IDLE\",\r\n });\r\n };\r\n getFilteredIndberetningerForUser();\r\n return () => {\r\n stillMounted = false;\r\n };\r\n }, [\r\n currentUser.personId,\r\n currentUser.rolleId,\r\n filter.text,\r\n filter.value,\r\n search.emne,\r\n search.beskrivelse,\r\n searchExtent,\r\n resetSessionTimer,\r\n ]);\r\n\r\n const hideBecauseEmptySearch =\r\n filter.text === \"Søgning\" && !search.beskrivelse && !search.emne;\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import { useLayoutEffect, useRef } from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { paths } from \"routes/routesConfig\";\r\n// import { baselayers } from \"config/FipConfig\";\r\n\r\nexport default function Stednavn() {\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n {/* Gå til FIP */}\r\n

    \r\n Indberet til Danske Stednavne\r\n

    \r\n

    \r\n Her kan du indberette nye stednavne og komme med ændringer til\r\n eksisterende.\r\n

    \r\n

    \r\n Registret Danske Stednavne er oprettet for at indeholde alle stednavne,\r\n der kan gavne den offentlige og private administration og kommunikation.\r\n Danske Stednavne indeholder både navne, der kan ses på et kort, og\r\n navne, der kun anvendes ved søgning f.eks. ved ruteberegning.\r\n

    \r\n

    Vigtigt inden du indberetter

    \r\n
      \r\n
    • \r\n Du skal logge på med NemID for at sikre, at registrerede danske\r\n stednavne forbliver troværdige.\r\n
    • \r\n
    • \r\n Vi beder om din email i forbindelse med at du indsender din\r\n indberetning for at kunne kontakte dig med eventuelle spørgsmål.\r\n
    • \r\n
    • \r\n Inden du indberetter et nyt stednavn, bør du først undersøge, om\r\n stednavnet allerede findes. Det kan du gøre ved at søge på stednavnet\r\n i feltet \"Søg\".\r\n
    • \r\n
    • \r\n Når du har indberettet et stednavn, vil det hurtigst muligt blive\r\n registreret og udstillet. For kommuner og andre offentlige styrelser,\r\n som anvender NemID med medarbejdersignatur, vil stednavnet blive\r\n udstillet umiddelbart som ubehandlet stednavn.\r\n
    • \r\n
    \r\n
    \r\n
    \r\n Mulige handlinger\r\n
    \r\n \r\n Indberet\r\n \r\n \r\n Se oversigt over indberetninger\r\n \r\n
    \r\n
    \r\n
    \r\n

    Vedligeholdelse af Danske Stednavne

    \r\n

    \r\n Danske Stednavne vedligeholdes af Styrelsen for Dataforsyning og\r\n Infrastruktur. Danske Stednavne kan kontaktes på{\" \"}\r\n danskestednavne@sdfi.dk.\r\n

    \r\n
    \r\n );\r\n}\r\n","import ChevronRight from \"components/icons/ChevronRight\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { Fil } from \"routes/Fip/FipIndberet\";\r\nimport { routes } from \"routes/routesConfig\";\r\nimport { Validation } from \"interfaces/IIndberetning\";\r\nimport { useLayoutEffect, useRef } from \"react\";\r\n\r\ntype ÆndringsType = \"opret\" | \"ændre\" | \"nedlæg\" | undefined;\r\nexport interface NyIndberetningState {\r\n ændringstype: ÆndringsType;\r\n vilkårAccepteret: boolean;\r\n nytStednavn: string;\r\n beskrivelse: string;\r\n emne: string;\r\n geometri?: Feature;\r\n fil?: Fil;\r\n email: string;\r\n validation: {\r\n ændringstype: Validation;\r\n nytStednavn: Validation;\r\n vilkårAccepteret: Validation;\r\n beskrivelse: Validation;\r\n filEllerGeometri: Validation;\r\n email: Validation;\r\n emne: Validation;\r\n };\r\n}\r\nexport default function StednavnIndberet() {\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n
    \r\n

    \r\n Danske Stednavne\r\n

    \r\n

    Type af indberetning

    \r\n

    \r\n Har du ønsker om at oprette et nyt stednavn, ændre et eksisterende\r\n stednavn, eller nedlægge et eksisterende stednavn? Vælg herunder.\r\n

    \r\n {/* section */}\r\n
    \r\n {/* section head */}\r\n

    Vælg indberetningstype

    \r\n {/* section content - component select */}\r\n
    \r\n \r\n
    \r\n
    Nyt stednavn
    \r\n Foreslå et ikke-registreret stednavn i kortet.\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    Ændring af stednavn
    \r\n Foreslå ændring af et eksisterende stednavn.\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    Nedlæggelse af stednavn
    \r\n Foreslå nedlæggelse af et eksisterende stednavn\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 { postIndberetning, sagsbehandlingApi } from \"api/stednavn\";\r\nimport ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\nimport AccepterVilkår from \"components/common/Indberet/AccepterVilkår\";\r\nimport EmailInput from \"components/common/Indberet/EmailInput\";\r\nimport { ModalContext } from \"components/common/Modal/Modal\";\r\nimport { finishedDrawingSource, setDrawingCallback } from \"config/interactions\";\r\nimport { Kategori } from \"config/StednavnConfig\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { DrawTool, MapContext } from \"context/MapProvider\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport { Validation } from \"interfaces/IIndberetning\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { useContext, useEffect, useReducer, useRef, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { NewFileState } from \"routes/Fip/FipIndberet\";\r\nimport { routes } from \"routes/routesConfig\";\r\nimport { zoomToFeature } from \"util/ol\";\r\nimport Drawing from \"../components/Drawing\";\r\nimport File from \"../components/File\";\r\nimport KategoriSelect from \"../components/KategoriSelect\";\r\nimport Kommentar from \"../components/Kommentar\";\r\nimport StednavnInput from \"../components/StednavnInput\";\r\nimport Tilbage from \"../components/Tilbage\";\r\nimport { NyIndberetningState } from \"../StednavnIndberet\";\r\nimport { prepareCreateStednavnSag } from \"../util\";\r\n\r\nexport interface CreateStednavnState extends NyIndberetningState {\r\n kategori?: { value: number; label: string };\r\n validation: {\r\n ændringstype: Validation;\r\n nytStednavn: Validation;\r\n vilkårAccepteret: Validation;\r\n beskrivelse: Validation;\r\n filEllerGeometri: Validation;\r\n email: Validation;\r\n emne: Validation;\r\n kategori: Validation;\r\n };\r\n}\r\n\r\nexport default function CreateStednavn() {\r\n const history = useHistory();\r\n const { authState, setCurrentUserEmail } = useContext(AuthContext);\r\n const toast = useContext(ToastContext);\r\n const { showModal, closeModal } = useContext(ModalContext);\r\n useEffect(() => {\r\n return () => {\r\n finishedDrawingSource.clear();\r\n };\r\n }, []);\r\n const kategoriRef = useRef(null);\r\n const stednavnInputRef = useRef(null);\r\n const tegningInputRef = useRef(null);\r\n const kommentarRef = useRef(null);\r\n const emailRef = useRef(null);\r\n\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n useEffect(() => {\r\n return () => {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n };\r\n }, [dispatchToMap]);\r\n const { map, activeDrawTool, hoveredFeatures } = mapState;\r\n const [newFile, setNewFile] = useState({\r\n state: \"IDLE\",\r\n file: undefined,\r\n });\r\n const indberetningReducer = (\r\n state: CreateStednavnState,\r\n action:\r\n | { type: \"SET_KATEGORI\"; value: number }\r\n | { type: \"SET_ALL_TOUCHED\" }\r\n | { type: \"SET_NYTSTEDNAVN\"; navn: string }\r\n | { type: \"SET_VILKAAR_ACCEPTERET\"; vilkårAccepteret: boolean }\r\n | { type: \"SET_BESKRIVELSE\"; beskrivelse: string }\r\n | { type: \"SET_EMAIL\"; email: string }\r\n | {\r\n type: \"ADD_FILE\";\r\n fileInfo: {\r\n filId: number;\r\n geometri: Feature;\r\n originalFilNavn: string;\r\n };\r\n }\r\n | { type: \"REMOVE_FILE\" }\r\n | {\r\n type: \"ADD_DRAWING\";\r\n drawing: Feature;\r\n }\r\n | { type: \"REMOVE_DRAWING\" }\r\n | { type: \"RESET_NOTIFY_BESKRIVELSE\" }\r\n | { type: \"RESET_NOTIFY_EMAIL\" }\r\n | { type: \"RESET_NOTIFY_EMNE\" }\r\n | { type: \"RESET_NOTIFY_FILELLERGEOMETRI\" }\r\n | { type: \"RESET_NOTIFY_KATEGORI\" }\r\n | { type: \"RESET_NOTIFY_NYTSTEDNAVN\" }\r\n | { type: \"RESET_NOTIFY_VILKAAR_ACCEPTERET\" }\r\n | { type: \"RESET_NOTIFY_ÆNDRINGSTYPE\" }\r\n ): CreateStednavnState => {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n switch (action.type) {\r\n case \"SET_ALL_TOUCHED\": {\r\n const validation = { ...state.validation };\r\n Object.entries(validation).forEach(([key, v]) => {\r\n v.touched = true;\r\n });\r\n return { ...state, validation };\r\n }\r\n case \"SET_VILKAAR_ACCEPTERET\": {\r\n return {\r\n ...state,\r\n vilkårAccepteret: action.vilkårAccepteret,\r\n validation: {\r\n ...state.validation,\r\n vilkårAccepteret: {\r\n ...state.validation.vilkårAccepteret,\r\n valid: action.vilkårAccepteret,\r\n touched: true,\r\n },\r\n },\r\n };\r\n }\r\n case \"SET_BESKRIVELSE\": {\r\n const i: CreateStednavnState = {\r\n ...state,\r\n beskrivelse: action.beskrivelse,\r\n validation: {\r\n ...state.validation,\r\n beskrivelse: {\r\n ...state.validation.beskrivelse,\r\n valid: action.beskrivelse ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_EMAIL\": {\r\n const i: CreateStednavnState = {\r\n ...state,\r\n email: action.email,\r\n validation: {\r\n ...state.validation,\r\n email: {\r\n ...state.validation.email,\r\n valid: action.email ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_NYTSTEDNAVN\": {\r\n const i: CreateStednavnState = {\r\n ...state,\r\n nytStednavn: action.navn,\r\n emne: `Nyt stednavn - ${action.navn}`,\r\n validation: {\r\n ...state.validation,\r\n nytStednavn: {\r\n ...state.validation.nytStednavn,\r\n valid: action.navn ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"ADD_FILE\": {\r\n finishedDrawingSource.clear();\r\n finishedDrawingSource.addFeature(action.fileInfo.geometri);\r\n if (state.geometri) {\r\n finishedDrawingSource.addFeature(state.geometri);\r\n }\r\n const i: CreateStednavnState = {\r\n ...state,\r\n fil: {\r\n ...action.fileInfo,\r\n beskrivelse: \"\",\r\n dato: new Date().toISOString(),\r\n },\r\n };\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n return i;\r\n }\r\n case \"REMOVE_FILE\": {\r\n const i: CreateStednavnState = {\r\n ...state,\r\n fil: undefined,\r\n };\r\n finishedDrawingSource.clear();\r\n if (state.geometri) {\r\n finishedDrawingSource.addFeature(state.geometri);\r\n }\r\n return i;\r\n }\r\n case \"ADD_DRAWING\": {\r\n finishedDrawingSource.clear();\r\n finishedDrawingSource.addFeature(action.drawing);\r\n if (state.fil) {\r\n finishedDrawingSource.addFeature(state.fil.geometri);\r\n }\r\n const i: CreateStednavnState = {\r\n ...state,\r\n geometri: action.drawing,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n valid: true,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"REMOVE_DRAWING\": {\r\n finishedDrawingSource.clear();\r\n if (state.fil) {\r\n finishedDrawingSource.addFeature(state.fil.geometri);\r\n }\r\n const i: CreateStednavnState = {\r\n ...state,\r\n geometri: undefined,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n valid: false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_KATEGORI\": {\r\n const kategori =\r\n Kategori.find((k) => k.value === action.value) ??\r\n Kategori[Kategori.length - 1];\r\n if (!kategori) return state;\r\n const i: CreateStednavnState = {\r\n ...state,\r\n kategori,\r\n validation: {\r\n ...state.validation,\r\n kategori: {\r\n ...state.validation.kategori,\r\n valid: true,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"RESET_NOTIFY_BESKRIVELSE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n beskrivelse: { ...state.validation.beskrivelse, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_EMAIL\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n email: { ...state.validation.email, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_EMNE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n emne: { ...state.validation.emne, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_FILELLERGEOMETRI\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n notify: false,\r\n },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_KATEGORI\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n kategori: { ...state.validation.kategori, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_NYTSTEDNAVN\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n nytStednavn: { ...state.validation.nytStednavn, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_VILKAAR_ACCEPTERET\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n vilkårAccepteret: {\r\n ...state.validation.vilkårAccepteret,\r\n notify: false,\r\n },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_ÆNDRINGSTYPE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n ændringstype: { ...state.validation.ændringstype, notify: false },\r\n },\r\n };\r\n }\r\n }\r\n };\r\n\r\n const initialState: CreateStednavnState = {\r\n kategori: undefined,\r\n ændringstype: \"opret\",\r\n vilkårAccepteret: false,\r\n nytStednavn: \"\",\r\n beskrivelse: \"\",\r\n emne: \"\",\r\n geometri: undefined,\r\n fil: undefined,\r\n email: \"\",\r\n validation: {\r\n ændringstype: {\r\n valid: false,\r\n message: \"\",\r\n touched: false,\r\n notify: false,\r\n },\r\n nytStednavn: {\r\n valid: false,\r\n message: \"Stednavn skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n vilkårAccepteret: {\r\n valid: false,\r\n message: \"Betingelserne skal være accepteret\",\r\n touched: false,\r\n notify: false,\r\n },\r\n beskrivelse: {\r\n valid: false,\r\n message: \"Beskrivelse skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n emne: {\r\n valid: false,\r\n message: \"Vælg et eksisterende stednavn ved at søge\",\r\n touched: false,\r\n notify: false,\r\n },\r\n filEllerGeometri: {\r\n valid: false,\r\n message: \"Indberetningen skal indeholde en opdatering i kortet\",\r\n touched: false,\r\n notify: false,\r\n },\r\n email: {\r\n valid: false,\r\n message: \"Email skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n kategori: {\r\n valid: false,\r\n message: \"Vælg en kategori\",\r\n touched: false,\r\n notify: false,\r\n },\r\n },\r\n };\r\n const [indberetning, setIndberetning] = useReducer(\r\n indberetningReducer,\r\n initialState\r\n );\r\n\r\n // Set email when authstate is ready\r\n useEffect(() => {\r\n const userEmail = authState.currentUser.email;\r\n if (userEmail && userEmail !== indberetning.email) {\r\n setIndberetning({ type: \"SET_EMAIL\", email: userEmail });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [authState]);\r\n\r\n useEffect(() => {\r\n setDrawingCallback((drawing, isValid) => {\r\n if (!isValid) {\r\n finishedDrawingSource.removeFeature(drawing);\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Ugyldig geometri\",\r\n message: `Den angivne geometri er ugyldig, hvilket kan skyldes, at geometrien \"krydser\" sig selv.\\n\\nTegn venligst en ny geometri.`,\r\n },\r\n });\r\n } else {\r\n if (newFile.state === \"UPLOADED\" && newFile.file) {\r\n setIndberetning({\r\n type: \"ADD_FILE\",\r\n fileInfo: {\r\n filId: 1,\r\n geometri: drawing,\r\n originalFilNavn: newFile.file.originalFilNavn,\r\n },\r\n });\r\n } else {\r\n setIndberetning({\r\n type: \"ADD_DRAWING\",\r\n drawing,\r\n });\r\n }\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n }\r\n });\r\n }, [\r\n map,\r\n setIndberetning,\r\n indberetning,\r\n newFile.file,\r\n newFile.state,\r\n dispatchToMap,\r\n toast,\r\n ]);\r\n return (\r\n
    \r\n
    \r\n {/*

    Danske Stednavne

    */}\r\n \r\n

    Nyt stednavn

    \r\n

    \r\n Foreslå et ikke-registreret stednavn i kortet.\r\n

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

    Beskriv nyt stednavn

    \r\n

    \r\n Angiv navnet på det stednavn som du ønsker oprettet og vælg den\r\n kategori, der passer bedst til.{\" \"}\r\n

    \r\n \r\n setIndberetning({ type: \"RESET_NOTIFY_NYTSTEDNAVN\" })\r\n }\r\n ændringstype={\"opret\"}\r\n showValidationWarning={\r\n indberetning.validation.nytStednavn.touched &&\r\n !indberetning.validation.nytStednavn.valid\r\n }\r\n setStednavn={(navn) =>\r\n setIndberetning({\r\n type: \"SET_NYTSTEDNAVN\",\r\n navn: navn,\r\n })\r\n }\r\n stednavn={indberetning.nytStednavn}\r\n validationWarningMessage={\r\n indberetning.validation.nytStednavn.message\r\n }\r\n />\r\n {\r\n const value = parseInt(id);\r\n setIndberetning({ type: \"SET_KATEGORI\", value });\r\n }}\r\n notify={indberetning.validation.kategori.notify}\r\n resetNotify={() =>\r\n setIndberetning({ type: \"RESET_NOTIFY_KATEGORI\" })\r\n }\r\n />\r\n
    \r\n\r\n \r\n {\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool,\r\n });\r\n }}\r\n activeDrawTool={activeDrawTool}\r\n newFile={newFile}\r\n onDeleteClick={() => {\r\n setIndberetning({ type: \"REMOVE_DRAWING\" });\r\n }}\r\n kategori={indberetning.kategori?.label ?? \"\"}\r\n geometri={indberetning.geometri}\r\n hoveredFeatures={mapState.hoveredFeatures}\r\n setHoveredFeatures={(ids) =>\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: ids,\r\n })\r\n }\r\n zoomToDrawing={() => {\r\n if (map && indberetning.geometri) {\r\n zoomToFeature(map, indberetning.geometri);\r\n }\r\n }}\r\n onEditGeometryClick={() => {\r\n if (newFile.file) {\r\n setNewFile({ file: undefined, state: \"IDLE\" });\r\n }\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n if (indberetning.geometri) {\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: indberetning.geometri,\r\n });\r\n }\r\n }}\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n
    \r\n \r\n setIndberetning({ type: \"RESET_NOTIFY_FILELLERGEOMETRI\" })\r\n }\r\n />\r\n\r\n
    \r\n {\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool,\r\n });\r\n }}\r\n fil={indberetning.fil}\r\n newFile={newFile}\r\n setNewFile={setNewFile}\r\n activeDrawTool={activeDrawTool}\r\n onClick={() => {\r\n if (mapState.map && indberetning.fil) {\r\n zoomToFeature(mapState.map, indberetning.fil.geometri);\r\n }\r\n }}\r\n hoveredFeatures={hoveredFeatures}\r\n setHoveredFeatures={(ids) =>\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: ids,\r\n })\r\n }\r\n removeFil={() => setIndberetning({ type: \"REMOVE_FILE\" })}\r\n onEditGeometryClick={() => {\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n if (indberetning.fil) {\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: indberetning.fil.geometri,\r\n });\r\n }\r\n }}\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n
    \r\n
    \r\n

    Kommentar til oprettelse af stednavn

    \r\n

    \r\n Giv en kort beskrivelse af stednavnet og evt. af stedets anvendelse.{\" \"}\r\n

    \r\n \r\n setIndberetning({\r\n type: \"RESET_NOTIFY_BESKRIVELSE\",\r\n })\r\n }\r\n kommentar={indberetning.beskrivelse}\r\n setKommentar={(k) =>\r\n setIndberetning({ type: \"SET_BESKRIVELSE\", beskrivelse: k })\r\n }\r\n showValidationWarning={\r\n indberetning.validation.beskrivelse.touched &&\r\n !indberetning.validation.beskrivelse.valid\r\n }\r\n validationMessage={indberetning.validation.beskrivelse.message}\r\n />\r\n
    \r\n
    \r\n

    Send indberetning

    \r\n

    \r\n Vi har brug for din e-mailadresse for at kunne give dig besked om\r\n behandlingen af din indberetning og for at kunne kontakte dig, hvis\r\n vi eventuelt har spørgsmål til din indberetning eller har brug for\r\n flere oplysninger. Hvis du tidligere har indberettet, vil din e-mail\r\n allerede være udfyldt. Du kan rette din e-mailadresse i det udfyldte\r\n felt, hvis der er brug for det.\r\n

    \r\n
    \r\n \r\n setIndberetning({ type: \"RESET_NOTIFY_EMAIL\" })\r\n }\r\n setEmail={(email) => {\r\n setIndberetning({ type: \"SET_EMAIL\", email });\r\n }}\r\n disableForm={false}\r\n showValidationWarning={\r\n indberetning.validation.email.touched &&\r\n !indberetning.validation.email.valid\r\n }\r\n validationWarningMessage={indberetning.validation.email.message}\r\n />\r\n \r\n setIndberetning({\r\n type: \"RESET_NOTIFY_VILKAAR_ACCEPTERET\",\r\n })\r\n }\r\n disabled={false}\r\n checked={indberetning.vilkårAccepteret}\r\n setChecked={(checked) => {\r\n setIndberetning({\r\n type: \"SET_VILKAAR_ACCEPTERET\",\r\n vilkårAccepteret: checked,\r\n });\r\n }}\r\n showValidationWarning={\r\n indberetning.validation.vilkårAccepteret.touched &&\r\n !indberetning.validation.vilkårAccepteret.valid\r\n }\r\n validationWarningMessage={\r\n indberetning.validation.vilkårAccepteret.message\r\n }\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n
    \r\n {\r\n async function post() {\r\n try {\r\n const i = await postIndberetning(\r\n authState.currentUser.personId,\r\n indberetning.email,\r\n prepareCreateStednavnSag(indberetning)\r\n );\r\n if (i.id) {\r\n if (authState.currentUser.email !== indberetning.email)\r\n setCurrentUserEmail(indberetning.email);\r\n toast({\r\n content: {\r\n message:\r\n \"Tak for din indberetning, her kan du se en opsummering af din indberetning\",\r\n },\r\n });\r\n history.push(\r\n routes.stednavnIndberetning.path.replace(\r\n \":id\",\r\n i.id.toString()\r\n )\r\n );\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n setIndberetning({ type: \"SET_ALL_TOUCHED\" });\r\n if (mapState.activeDrawTool) {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Tegner opdatering\",\r\n message:\r\n \"Gør færdig opdateringen i kortet inden du sender indberetningen ind.\",\r\n },\r\n });\r\n } else if (mapState.editGeometryState.active) {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Redigerer opdatering\",\r\n message:\r\n \"Gør færdig redigeringen i kortet inden du sender indberetningen ind.\",\r\n },\r\n });\r\n } else if (!indberetning.validation.nytStednavn.valid) {\r\n stednavnInputRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.kategori.valid) {\r\n kategoriRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.filEllerGeometri.valid) {\r\n tegningInputRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.beskrivelse.valid) {\r\n kommentarRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.email.valid) {\r\n emailRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.vilkårAccepteret.valid) {\r\n emailRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else {\r\n post();\r\n }\r\n }}\r\n type=\"button\"\r\n className=\"btn btn-lg btn-primary mt-4\"\r\n >\r\n Indsend indberetning\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n","import { postIndberetning, sagsbehandlingApi } from \"api/stednavn\";\r\nimport ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\nimport AccepterVilkår from \"components/common/Indberet/AccepterVilkår\";\r\nimport EmailInput from \"components/common/Indberet/EmailInput\";\r\nimport { ModalContext } from \"components/common/Modal/Modal\";\r\nimport {\r\n finishedDrawingSource,\r\n setDrawingCallback,\r\n tempDrawingSource,\r\n} from \"config/interactions\";\r\nimport { Kategori } from \"config/StednavnConfig\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { DrawTool, MapContext } from \"context/MapProvider\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport { SearchResult } from \"interfaces/IGeoSearch\";\r\nimport { Validation } from \"interfaces/IIndberetning\";\r\nimport { Feature } from \"ol\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { useContext, useEffect, useReducer, useRef, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { NewFileState } from \"routes/Fip/FipIndberet\";\r\nimport { routes } from \"routes/routesConfig\";\r\nimport { wktFormat, zoomToFeature } from \"util/ol\";\r\nimport Drawing from \"../components/Drawing\";\r\nimport File from \"../components/File\";\r\nimport FindStednavn from \"../components/FindStednavn\";\r\nimport KategoriSelect from \"../components/KategoriSelect\";\r\nimport Kommentar from \"../components/Kommentar\";\r\nimport StednavnInput from \"../components/StednavnInput\";\r\nimport Tilbage from \"../components/Tilbage\";\r\nimport { NyIndberetningState } from \"../StednavnIndberet\";\r\nimport { mapKategori, prepareUpdateStednavnSag } from \"../util\";\r\n\r\nexport interface UpdateStednavnState extends NyIndberetningState {\r\n kategori?: { value: number; label: string };\r\n searchResult: SearchResult | undefined;\r\n validation: {\r\n searchResult: Validation;\r\n ændringstype: Validation;\r\n nytStednavn: Validation;\r\n vilkårAccepteret: Validation;\r\n beskrivelse: Validation;\r\n filEllerGeometri: Validation;\r\n email: Validation;\r\n emne: Validation;\r\n kategori: Validation;\r\n };\r\n}\r\n\r\nexport default function UpdateStednavn() {\r\n const history = useHistory();\r\n\r\n const { authState, setCurrentUserEmail } = useContext(AuthContext);\r\n const toast = useContext(ToastContext);\r\n const { showModal, closeModal } = useContext(ModalContext);\r\n\r\n const searchRef = useRef(null);\r\n const stednavnInputRef = useRef(null);\r\n const tegningInputRef = useRef(null);\r\n const kommentarRef = useRef(null);\r\n const kategoriRef = useRef(null);\r\n const emailRef = useRef(null);\r\n\r\n useEffect(() => {\r\n return () => {\r\n finishedDrawingSource.clear();\r\n tempDrawingSource.clear();\r\n };\r\n }, []);\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n useEffect(() => {\r\n return () => {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n };\r\n }, [dispatchToMap]);\r\n const { map, activeDrawTool, hoveredFeatures } = mapState;\r\n const [newFile, setNewFile] = useState({\r\n state: \"IDLE\",\r\n file: undefined,\r\n });\r\n const indberetningReducer = (\r\n state: UpdateStednavnState,\r\n action:\r\n | { type: \"SET_SEARCHRESULT\"; searchResult: SearchResult | undefined }\r\n | { type: \"SET_KATEGORI\"; value: number }\r\n | { type: \"SET_ALL_TOUCHED\" }\r\n | { type: \"SET_NYTSTEDNAVN\"; navn: string }\r\n | { type: \"SET_VILKAAR_ACCEPTERET\"; vilkårAccepteret: boolean }\r\n | { type: \"SET_BESKRIVELSE\"; beskrivelse: string }\r\n | { type: \"SET_EMAIL\"; email: string }\r\n | {\r\n type: \"ADD_FILE\";\r\n fileInfo: {\r\n filId: number;\r\n geometri: Feature;\r\n originalFilNavn: string;\r\n };\r\n }\r\n | { type: \"REMOVE_FILE\" }\r\n | {\r\n type: \"ADD_DRAWING\";\r\n drawing: Feature;\r\n }\r\n | { type: \"REMOVE_DRAWING\" }\r\n | { type: \"RESET_NOTIFY_BESKRIVELSE\" }\r\n | { type: \"RESET_NOTIFY_EMAIL\" }\r\n | { type: \"RESET_NOTIFY_EMNE\" }\r\n | { type: \"RESET_NOTIFY_FILELLERGEOMETRI\" }\r\n | { type: \"RESET_NOTIFY_KATEGORI\" }\r\n | { type: \"RESET_NOTIFY_NYTSTEDNAVN\" }\r\n | { type: \"RESET_NOTIFY_VILKAAR_ACCEPTERET\" }\r\n | { type: \"RESET_NOTIFY_ÆNDRINGSTYPE\" }\r\n | { type: \"RESET_NOTIFY_SEARCHRESULT\" }\r\n ): UpdateStednavnState => {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n switch (action.type) {\r\n case \"SET_SEARCHRESULT\": {\r\n const { searchResult } = action;\r\n if (searchResult) {\r\n const feature = wktFormat.readFeature(searchResult.geometryWkt);\r\n feature.set(\"presentationString\", searchResult.presentationString);\r\n feature.set(\"type\", searchResult.type);\r\n finishedDrawingSource.clear();\r\n finishedDrawingSource.addFeature(feature);\r\n tempDrawingSource.clear();\r\n tempDrawingSource.addFeature(feature);\r\n const type = feature.get(\"type\");\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n searchResult,\r\n geometri: feature,\r\n kategori: mapKategori(type),\r\n nytStednavn: searchResult.presentationString,\r\n emne: `Ændret stednavn - ${searchResult.presentationString}`,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n valid: true,\r\n touched: true,\r\n },\r\n searchResult: {\r\n ...state.validation.searchResult,\r\n valid: true,\r\n touched: true,\r\n },\r\n kategori: {\r\n ...state.validation.kategori,\r\n valid: true,\r\n touched: true,\r\n },\r\n nytStednavn: {\r\n ...state.validation.nytStednavn,\r\n valid: true,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n } else {\r\n // \"remove drawing\"\r\n finishedDrawingSource.clear();\r\n tempDrawingSource.clear();\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n searchResult,\r\n geometri: undefined,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n valid: state.fil ? true : false,\r\n touched: true,\r\n },\r\n searchResult: {\r\n ...state.validation.searchResult,\r\n valid: false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n }\r\n case \"SET_ALL_TOUCHED\": {\r\n const validation = { ...state.validation };\r\n Object.entries(validation).forEach(([key, v]) => {\r\n v.touched = true;\r\n });\r\n return { ...state, validation };\r\n }\r\n case \"SET_VILKAAR_ACCEPTERET\": {\r\n return {\r\n ...state,\r\n vilkårAccepteret: action.vilkårAccepteret,\r\n validation: {\r\n ...state.validation,\r\n vilkårAccepteret: {\r\n ...state.validation.vilkårAccepteret,\r\n valid: action.vilkårAccepteret,\r\n touched: true,\r\n },\r\n },\r\n };\r\n }\r\n case \"SET_BESKRIVELSE\": {\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n beskrivelse: action.beskrivelse,\r\n validation: {\r\n ...state.validation,\r\n beskrivelse: {\r\n ...state.validation.beskrivelse,\r\n valid: action.beskrivelse ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_EMAIL\": {\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n email: action.email,\r\n validation: {\r\n ...state.validation,\r\n email: {\r\n ...state.validation.email,\r\n valid: action.email ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_NYTSTEDNAVN\": {\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n nytStednavn: action.navn,\r\n emne: `Ændret stednavn - ${action.navn}`,\r\n validation: {\r\n ...state.validation,\r\n nytStednavn: {\r\n ...state.validation.nytStednavn,\r\n valid: action.navn ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"ADD_FILE\": {\r\n finishedDrawingSource.clear();\r\n finishedDrawingSource.addFeature(action.fileInfo.geometri);\r\n if (state.geometri) {\r\n finishedDrawingSource.addFeature(state.geometri);\r\n }\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n fil: {\r\n ...action.fileInfo,\r\n beskrivelse: \"\",\r\n dato: new Date().toISOString(),\r\n },\r\n };\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n return i;\r\n }\r\n case \"REMOVE_FILE\": {\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n fil: undefined,\r\n };\r\n finishedDrawingSource.clear();\r\n if (state.geometri) {\r\n finishedDrawingSource.addFeature(state.geometri);\r\n }\r\n return i;\r\n }\r\n case \"ADD_DRAWING\": {\r\n finishedDrawingSource.clear();\r\n finishedDrawingSource.addFeature(action.drawing);\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n geometri: action.drawing,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n valid: true,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"REMOVE_DRAWING\": {\r\n finishedDrawingSource.clear();\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n geometri: undefined,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n valid: false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_KATEGORI\": {\r\n const kategori = Kategori.find((k) => k.value === action.value);\r\n if (!kategori) return state;\r\n const i: UpdateStednavnState = {\r\n ...state,\r\n kategori,\r\n validation: {\r\n ...state.validation,\r\n kategori: {\r\n ...state.validation.kategori,\r\n valid: true,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"RESET_NOTIFY_BESKRIVELSE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n beskrivelse: { ...state.validation.beskrivelse, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_EMAIL\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n email: { ...state.validation.email, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_EMNE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n emne: { ...state.validation.emne, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_FILELLERGEOMETRI\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n notify: false,\r\n },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_KATEGORI\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n kategori: { ...state.validation.kategori, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_NYTSTEDNAVN\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n nytStednavn: { ...state.validation.nytStednavn, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_VILKAAR_ACCEPTERET\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n vilkårAccepteret: {\r\n ...state.validation.vilkårAccepteret,\r\n notify: false,\r\n },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_ÆNDRINGSTYPE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n ændringstype: { ...state.validation.ændringstype, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_SEARCHRESULT\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n searchResult: { ...state.validation.searchResult, notify: false },\r\n },\r\n };\r\n }\r\n }\r\n };\r\n\r\n const initialState: UpdateStednavnState = {\r\n kategori: undefined,\r\n searchResult: undefined,\r\n ændringstype: \"opret\",\r\n vilkårAccepteret: false,\r\n nytStednavn: \"\",\r\n beskrivelse: \"\",\r\n geometri: undefined,\r\n fil: undefined,\r\n email: \"\",\r\n emne: \"\",\r\n validation: {\r\n searchResult: {\r\n valid: false,\r\n message: \"Fremsøg stednavnet, der skal ændres\",\r\n touched: false,\r\n notify: false,\r\n },\r\n ændringstype: {\r\n valid: false,\r\n message: \"\",\r\n touched: false,\r\n notify: false,\r\n },\r\n nytStednavn: {\r\n valid: false,\r\n message: \"Stednavn skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n vilkårAccepteret: {\r\n valid: false,\r\n message: \"Betingelserne skal være accepteret\",\r\n touched: false,\r\n notify: false,\r\n },\r\n beskrivelse: {\r\n valid: false,\r\n message: \"Beskrivelse skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n emne: {\r\n valid: false,\r\n message: \"Vælg et eksisterende stednavn ved at søge\",\r\n touched: false,\r\n notify: false,\r\n },\r\n filEllerGeometri: {\r\n valid: false,\r\n message: \"Indberetningen skal indeholde en opdatering i kortet\",\r\n touched: false,\r\n notify: false,\r\n },\r\n email: {\r\n valid: false,\r\n message: \"Email skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n kategori: {\r\n valid: false,\r\n message: \"Vælg kategori\",\r\n touched: false,\r\n notify: false,\r\n },\r\n },\r\n };\r\n const [indberetning, setIndberetning] = useReducer(\r\n indberetningReducer,\r\n initialState\r\n );\r\n\r\n // Set email when authstate is ready\r\n useEffect(() => {\r\n const userEmail = authState.currentUser.email;\r\n if (userEmail && userEmail !== indberetning.email) {\r\n setIndberetning({ type: \"SET_EMAIL\", email: userEmail });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [authState]);\r\n\r\n useEffect(() => {\r\n setDrawingCallback((drawing, isValid) => {\r\n if (!isValid) {\r\n finishedDrawingSource.removeFeature(drawing);\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Ugyldig geometri\",\r\n message: `Den angivne geometri er ugyldig, hvilket kan skyldes, at geometrien \"krydser\" sig selv.\\n\\nTegn venligst en ny geometri.`,\r\n },\r\n });\r\n } else {\r\n if (newFile.state === \"UPLOADED\" && newFile.file) {\r\n setIndberetning({\r\n type: \"ADD_FILE\",\r\n fileInfo: {\r\n filId: 1,\r\n geometri: drawing,\r\n originalFilNavn: newFile.file.originalFilNavn,\r\n },\r\n });\r\n } else {\r\n setIndberetning({\r\n type: \"ADD_DRAWING\",\r\n drawing,\r\n });\r\n }\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n }\r\n });\r\n }, [\r\n map,\r\n setIndberetning,\r\n indberetning,\r\n newFile.file,\r\n newFile.state,\r\n dispatchToMap,\r\n toast,\r\n ]);\r\n const setSearchResult = (searchResult) =>\r\n setIndberetning({ type: \"SET_SEARCHRESULT\", searchResult });\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n

    Ændring af stednavn

    \r\n

    \r\n Foreslå ændring af et eksisterende stednavn.\r\n

    \r\n\r\n \r\n \r\n
    \r\n \r\n setIndberetning({ type: \"RESET_NOTIFY_SEARCHRESULT\" })\r\n }\r\n />\r\n\r\n
    \r\n

    Ændre stednavn

    \r\n

    \r\n Herunder kan du ændre i navnet på stedet eller stednavnets kategori.\r\n

    \r\n \r\n setIndberetning({ type: \"RESET_NOTIFY_NYTSTEDNAVN\" })\r\n }\r\n ændringstype={\"opret\"}\r\n showValidationWarning={\r\n indberetning.validation.nytStednavn.touched &&\r\n !indberetning.validation.nytStednavn.valid\r\n }\r\n setStednavn={(navn) =>\r\n setIndberetning({\r\n type: \"SET_NYTSTEDNAVN\",\r\n navn: navn,\r\n })\r\n }\r\n stednavn={indberetning.nytStednavn}\r\n validationWarningMessage={\r\n indberetning.validation.nytStednavn.message\r\n }\r\n />\r\n {\r\n const value = parseInt(id);\r\n setIndberetning({ type: \"SET_KATEGORI\", value });\r\n }}\r\n notify={indberetning.validation.kategori.notify}\r\n resetNotify={() =>\r\n setIndberetning({ type: \"RESET_NOTIFY_KATEGORI\" })\r\n }\r\n />\r\n
    \r\n \r\n {\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool,\r\n });\r\n }}\r\n activeDrawTool={activeDrawTool}\r\n newFile={newFile}\r\n onDeleteClick={() => {\r\n setIndberetning({ type: \"REMOVE_DRAWING\" });\r\n }}\r\n kategori={indberetning.kategori?.label ?? \"\"}\r\n geometri={indberetning.geometri}\r\n hoveredFeatures={mapState.hoveredFeatures}\r\n setHoveredFeatures={(ids) =>\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: ids,\r\n })\r\n }\r\n zoomToDrawing={() => {\r\n if (map && indberetning.geometri) {\r\n zoomToFeature(map, indberetning.geometri);\r\n }\r\n }}\r\n onEditGeometryClick={() => {\r\n if (newFile.file) {\r\n setNewFile({ file: undefined, state: \"IDLE\" });\r\n }\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n if (indberetning.geometri) {\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: indberetning.geometri,\r\n });\r\n }\r\n }}\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n
    \r\n \r\n setIndberetning({ type: \"RESET_NOTIFY_FILELLERGEOMETRI\" })\r\n }\r\n />\r\n
    \r\n {\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool,\r\n });\r\n }}\r\n fil={indberetning.fil}\r\n newFile={newFile}\r\n setNewFile={setNewFile}\r\n activeDrawTool={activeDrawTool}\r\n onClick={() => {\r\n if (mapState.map && indberetning.fil) {\r\n zoomToFeature(mapState.map, indberetning.fil.geometri);\r\n }\r\n }}\r\n hoveredFeatures={hoveredFeatures}\r\n setHoveredFeatures={(ids) =>\r\n dispatchToMap({\r\n type: \"SET_HOVERED_FEATURES\",\r\n hoveredFeatures: ids,\r\n })\r\n }\r\n removeFil={() => setIndberetning({ type: \"REMOVE_FILE\" })}\r\n onEditGeometryClick={() => {\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n if (indberetning.fil) {\r\n dispatchToMap({\r\n type: \"EDIT_GEOMETRY\",\r\n geometryToEdit: indberetning.fil.geometri,\r\n });\r\n }\r\n }}\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n sagsbehandlingApi={sagsbehandlingApi}\r\n />\r\n
    \r\n\r\n
    \r\n

    Kommentar til ændring af stednavn

    \r\n

    \r\n Giv en beskrivelse af ændringen af stednavnet og begrundelsen for\r\n dette.{\" \"}\r\n

    \r\n \r\n setIndberetning({\r\n type: \"RESET_NOTIFY_BESKRIVELSE\",\r\n })\r\n }\r\n kommentar={indberetning.beskrivelse}\r\n setKommentar={(k) =>\r\n setIndberetning({ type: \"SET_BESKRIVELSE\", beskrivelse: k })\r\n }\r\n showValidationWarning={\r\n indberetning.validation.beskrivelse.touched &&\r\n !indberetning.validation.beskrivelse.valid\r\n }\r\n validationMessage={indberetning.validation.beskrivelse.message}\r\n />\r\n
    \r\n
    \r\n

    Send indberetning

    \r\n

    \r\n Vi har brug for din e-mailadresse for at kunne give dig besked om\r\n behandlingen af din indberetning og for at kunne kontakte dig, hvis\r\n vi eventuelt har spørgsmål til din indberetning eller har brug for\r\n flere oplysninger. Hvis du tidligere har indberettet, vil din e-mail\r\n allerede være udfyldt. Du kan rette din e-mailadresse i det udfyldte\r\n felt, hvis der er brug for det.\r\n

    \r\n
    \r\n {\r\n setIndberetning({ type: \"SET_EMAIL\", email });\r\n }}\r\n notifyValidationWarning={indberetning.validation.email.notify}\r\n resetNotifyValidationWarning={() =>\r\n setIndberetning({ type: \"RESET_NOTIFY_EMAIL\" })\r\n }\r\n disableForm={false}\r\n showValidationWarning={\r\n indberetning.validation.email.touched &&\r\n !indberetning.validation.email.valid\r\n }\r\n validationWarningMessage={indberetning.validation.email.message}\r\n />\r\n \r\n setIndberetning({\r\n type: \"RESET_NOTIFY_VILKAAR_ACCEPTERET\",\r\n })\r\n }\r\n disabled={false}\r\n checked={indberetning.vilkårAccepteret}\r\n setChecked={(checked) => {\r\n setIndberetning({\r\n type: \"SET_VILKAAR_ACCEPTERET\",\r\n vilkårAccepteret: checked,\r\n });\r\n }}\r\n showValidationWarning={\r\n indberetning.validation.vilkårAccepteret.touched &&\r\n !indberetning.validation.vilkårAccepteret.valid\r\n }\r\n validationWarningMessage={\r\n indberetning.validation.vilkårAccepteret.message\r\n }\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n
    \r\n {\r\n async function post() {\r\n try {\r\n const i = await postIndberetning(\r\n authState.currentUser.personId,\r\n indberetning.email,\r\n prepareUpdateStednavnSag(indberetning)\r\n );\r\n if (i.id) {\r\n if (authState.currentUser.email !== indberetning.email)\r\n setCurrentUserEmail(indberetning.email);\r\n toast({\r\n content: {\r\n message:\r\n \"Tak for din indberetning, her kan du se en opsummering af din indberetning\",\r\n },\r\n });\r\n history.push(\r\n routes.stednavnIndberetning.path.replace(\r\n \":id\",\r\n i.id.toString()\r\n )\r\n );\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n setIndberetning({ type: \"SET_ALL_TOUCHED\" });\r\n if (mapState.activeDrawTool) {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Tegner opdatering\",\r\n message:\r\n \"Gør færdig opdateringen i kortet inden du sender indberetningen ind.\",\r\n },\r\n });\r\n } else if (mapState.editGeometryState.active) {\r\n toast({\r\n type: \"danger\",\r\n content: {\r\n header: \"Redigerer opdatering\",\r\n message:\r\n \"Gør færdig redigeringen i kortet inden du sender indberetningen ind.\",\r\n },\r\n });\r\n } else if (!indberetning.validation.searchResult.valid) {\r\n searchRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.nytStednavn.valid) {\r\n stednavnInputRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.kategori.valid) {\r\n kategoriRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.filEllerGeometri.valid) {\r\n tegningInputRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.beskrivelse.valid) {\r\n kommentarRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.email.valid) {\r\n emailRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.vilkårAccepteret.valid) {\r\n emailRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else {\r\n post();\r\n }\r\n }}\r\n type=\"button\"\r\n className=\"btn btn-lg btn-primary mt-4\"\r\n >\r\n Indsend indberetning\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n );\r\n}\r\n","import { postIndberetning } from \"api/stednavn\";\r\nimport ValidationErrorMessage from \"components/common/FormElements/ValidationErrorMessage\";\r\nimport AccepterVilkår from \"components/common/Indberet/AccepterVilkår\";\r\nimport EmailInput from \"components/common/Indberet/EmailInput\";\r\nimport { ModalContext } from \"components/common/Modal/Modal\";\r\nimport { finishedDrawingSource } from \"config/interactions\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport { ToastContext } from \"context/ToastProvider\";\r\nimport { SearchResult } from \"interfaces/IGeoSearch\";\r\nimport { useContext, useEffect, useReducer, useRef, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { routes } from \"routes/routesConfig\";\r\nimport { wktFormat } from \"util/ol\";\r\nimport FindStednavn from \"../components/FindStednavn\";\r\nimport Kommentar from \"../components/Kommentar\";\r\nimport Tilbage from \"../components/Tilbage\";\r\nimport { NyIndberetningState } from \"../StednavnIndberet\";\r\nimport { prepareDeleteStednavnSag } from \"../util\";\r\n\r\nexport default function DeleteStednavn() {\r\n const history = useHistory();\r\n const { authState, setCurrentUserEmail } = useContext(AuthContext);\r\n const { showModal, closeModal } = useContext(ModalContext);\r\n const toast = useContext(ToastContext);\r\n const findStednavnRef = useRef(null);\r\n const kommentarRef = useRef(null);\r\n const emailRef = useRef(null);\r\n useEffect(() => {\r\n return () => {\r\n finishedDrawingSource.clear();\r\n };\r\n }, []);\r\n const {\r\n // dispatchToMap,\r\n mapState,\r\n } = useContext(MapContext);\r\n const { map } = mapState;\r\n const [searchResult, setSearchResult] = useState(\r\n undefined\r\n );\r\n const indberetningReducer = (\r\n state: NyIndberetningState,\r\n action:\r\n | { type: \"SET_ALL_TOUCHED\" }\r\n | { type: \"SET_NYTSTEDNAVN\"; navn: string }\r\n | { type: \"SET_VILKAAR_ACCEPTERET\"; vilkårAccepteret: boolean }\r\n | { type: \"SET_BESKRIVELSE\"; beskrivelse: string }\r\n | { type: \"SET_EMAIL\"; email: string }\r\n | { type: \"SET_SEARCHRESULT\"; searchResult: SearchResult | undefined }\r\n | { type: \"RESET_NOTIFY_BESKRIVELSE\" }\r\n | { type: \"RESET_NOTIFY_EMAIL\" }\r\n | { type: \"RESET_NOTIFY_EMNE\" }\r\n | { type: \"RESET_NOTIFY_FILELLERGEOMETRI\" }\r\n | { type: \"RESET_NOTIFY_NYTSTEDNAVN\" }\r\n | { type: \"RESET_NOTIFY_VILKAAR_ACCEPTERET\" }\r\n | { type: \"RESET_NOTIFY_ÆNDRINGSTYPE\" }\r\n ): NyIndberetningState => {\r\n switch (action.type) {\r\n case \"SET_ALL_TOUCHED\": {\r\n const validation = { ...state.validation };\r\n Object.entries(validation).forEach(([key, v]) => {\r\n v.touched = true;\r\n });\r\n return { ...state, validation };\r\n }\r\n case \"SET_VILKAAR_ACCEPTERET\": {\r\n return {\r\n ...state,\r\n vilkårAccepteret: action.vilkårAccepteret,\r\n validation: {\r\n ...state.validation,\r\n vilkårAccepteret: {\r\n ...state.validation.vilkårAccepteret,\r\n valid: action.vilkårAccepteret,\r\n touched: true,\r\n },\r\n },\r\n };\r\n }\r\n case \"SET_BESKRIVELSE\": {\r\n const i: NyIndberetningState = {\r\n ...state,\r\n beskrivelse: action.beskrivelse,\r\n validation: {\r\n ...state.validation,\r\n beskrivelse: {\r\n ...state.validation.beskrivelse,\r\n valid: action.beskrivelse ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_EMAIL\": {\r\n const i: NyIndberetningState = {\r\n ...state,\r\n email: action.email,\r\n validation: {\r\n ...state.validation,\r\n email: {\r\n ...state.validation.email,\r\n valid: action.email ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_NYTSTEDNAVN\": {\r\n const i: NyIndberetningState = {\r\n ...state,\r\n nytStednavn: action.navn,\r\n validation: {\r\n ...state.validation,\r\n nytStednavn: {\r\n ...state.validation.nytStednavn,\r\n valid: action.navn ? true : false,\r\n touched: true,\r\n },\r\n },\r\n };\r\n return i;\r\n }\r\n case \"SET_SEARCHRESULT\": {\r\n const { searchResult } = action;\r\n if (searchResult) {\r\n const feature = wktFormat.readFeature(searchResult.geometryWkt);\r\n feature.set(\"presentationString\", searchResult.presentationString);\r\n feature.set(\"type\", searchResult.type);\r\n finishedDrawingSource.clear();\r\n finishedDrawingSource.addFeature(feature);\r\n const i: NyIndberetningState = {\r\n ...state,\r\n geometri: feature,\r\n emne: `Udgået stednavn - ${searchResult.presentationString}`,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.nytStednavn,\r\n valid: true,\r\n touched: true,\r\n },\r\n emne: { ...state.validation.emne, touched: true, valid: true },\r\n },\r\n };\r\n return i;\r\n } else {\r\n finishedDrawingSource.clear();\r\n const i: NyIndberetningState = {\r\n ...state,\r\n geometri: undefined,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.nytStednavn,\r\n valid: state.fil ? true : false,\r\n },\r\n emne: { ...state.validation.emne, valid: false },\r\n },\r\n };\r\n return i;\r\n }\r\n }\r\n case \"RESET_NOTIFY_BESKRIVELSE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n beskrivelse: { ...state.validation.beskrivelse, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_EMAIL\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n email: { ...state.validation.email, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_EMNE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n emne: { ...state.validation.emne, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_FILELLERGEOMETRI\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n filEllerGeometri: {\r\n ...state.validation.filEllerGeometri,\r\n notify: false,\r\n },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_NYTSTEDNAVN\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n nytStednavn: { ...state.validation.nytStednavn, notify: false },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_VILKAAR_ACCEPTERET\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n vilkårAccepteret: {\r\n ...state.validation.vilkårAccepteret,\r\n notify: false,\r\n },\r\n },\r\n };\r\n }\r\n case \"RESET_NOTIFY_ÆNDRINGSTYPE\": {\r\n return {\r\n ...state,\r\n validation: {\r\n ...state.validation,\r\n ændringstype: { ...state.validation.ændringstype, notify: false },\r\n },\r\n };\r\n }\r\n }\r\n };\r\n const initialState: NyIndberetningState = {\r\n ændringstype: undefined,\r\n vilkårAccepteret: false,\r\n nytStednavn: \"\",\r\n beskrivelse: \"\",\r\n geometri: undefined,\r\n fil: undefined,\r\n email: \"\",\r\n emne: \"\",\r\n validation: {\r\n ændringstype: {\r\n valid: false,\r\n message: \"\",\r\n touched: false,\r\n notify: false,\r\n },\r\n nytStednavn: {\r\n valid: false,\r\n message: \"Stednavn skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n emne: {\r\n valid: false,\r\n message: \"Vælg et eksisterende stednavn ved at søge\",\r\n touched: false,\r\n notify: false,\r\n },\r\n vilkårAccepteret: {\r\n valid: false,\r\n message: \"Betingelserne skal være accepteret\",\r\n touched: false,\r\n notify: false,\r\n },\r\n beskrivelse: {\r\n valid: false,\r\n message: \"Beskrivelse skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n filEllerGeometri: {\r\n valid: false,\r\n message: \"Indberetning skal indeholde mindst én fil eller geometri\",\r\n touched: false,\r\n notify: false,\r\n },\r\n email: {\r\n valid: false,\r\n message: \"Email skal udfyldes\",\r\n touched: false,\r\n notify: false,\r\n },\r\n },\r\n };\r\n const [indberetning, setIndberetning] = useReducer(\r\n indberetningReducer,\r\n initialState\r\n );\r\n\r\n // Set email when authstate is ready\r\n useEffect(() => {\r\n const userEmail = authState.currentUser.email;\r\n if (userEmail && userEmail !== indberetning.email) {\r\n setIndberetning({ type: \"SET_EMAIL\", email: userEmail });\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [authState]);\r\n\r\n useEffect(() => {\r\n setIndberetning({\r\n type: \"SET_SEARCHRESULT\",\r\n searchResult,\r\n });\r\n\r\n return () => {};\r\n }, [searchResult]);\r\n return (\r\n
    \r\n
    \r\n \r\n

    Nedlæggelse af stednavn

    \r\n

    \r\n Foreslå nedlæggelse af et eksisterende stednavn\r\n

    \r\n \r\n \r\n
    \r\n setIndberetning({ type: \"RESET_NOTIFY_EMNE\" })}\r\n />\r\n
    \r\n

    Kommentar til nedlægning af stednavn

    \r\n

    Giv en kort forklaring på, hvorfor stednavnet skal nedlægges.

    \r\n \r\n setIndberetning({\r\n type: \"RESET_NOTIFY_BESKRIVELSE\",\r\n })\r\n }\r\n showValidationWarning={\r\n indberetning.validation.beskrivelse.touched &&\r\n !indberetning.validation.beskrivelse.valid\r\n }\r\n validationMessage={indberetning.validation.beskrivelse.message}\r\n kommentar={indberetning.beskrivelse}\r\n setKommentar={(kommentar) =>\r\n setIndberetning({\r\n type: \"SET_BESKRIVELSE\",\r\n beskrivelse: kommentar,\r\n })\r\n }\r\n />\r\n
    \r\n
    \r\n

    Send indberetning

    \r\n

    \r\n Vi har brug for din e-mailadresse for at kunne give dig besked om\r\n behandlingen af din indberetning og for at kunne kontakte dig, hvis\r\n vi eventuelt har spørgsmål til din indberetning eller har brug for\r\n flere oplysninger. Hvis du tidligere har indberettet, vil din e-mail\r\n allerede være udfyldt. Du kan rette din e-mailadresse i det udfyldte\r\n felt, hvis der er brug for det.\r\n

    \r\n
    \r\n {\r\n setIndberetning({ type: \"SET_EMAIL\", email });\r\n }}\r\n notifyValidationWarning={indberetning.validation.email.notify}\r\n resetNotifyValidationWarning={() =>\r\n setIndberetning({ type: \"RESET_NOTIFY_EMAIL\" })\r\n }\r\n disableForm={false}\r\n showValidationWarning={\r\n indberetning.validation.email.touched &&\r\n !indberetning.validation.email.valid\r\n }\r\n validationWarningMessage={indberetning.validation.email.message}\r\n />\r\n \r\n setIndberetning({\r\n type: \"RESET_NOTIFY_VILKAAR_ACCEPTERET\",\r\n })\r\n }\r\n disabled={false}\r\n checked={indberetning.vilkårAccepteret}\r\n setChecked={(checked) => {\r\n setIndberetning({\r\n type: \"SET_VILKAAR_ACCEPTERET\",\r\n vilkårAccepteret: checked,\r\n });\r\n }}\r\n showValidationWarning={\r\n indberetning.validation.vilkårAccepteret.touched &&\r\n !indberetning.validation.vilkårAccepteret.valid\r\n }\r\n validationWarningMessage={\r\n indberetning.validation.vilkårAccepteret.message\r\n }\r\n showModal={showModal}\r\n closeModal={closeModal}\r\n />\r\n
    \r\n {\r\n async function post() {\r\n try {\r\n const i = await postIndberetning(\r\n authState.currentUser.personId,\r\n indberetning.email,\r\n prepareDeleteStednavnSag(indberetning)\r\n );\r\n if (i.id) {\r\n if (authState.currentUser.email !== indberetning.email)\r\n setCurrentUserEmail(indberetning.email);\r\n toast({\r\n content: {\r\n message:\r\n \"Tak for din indberetning, her kan du se en opsummering af din indberetning\",\r\n },\r\n });\r\n history.push(\r\n routes.stednavnIndberetning.path.replace(\r\n \":id\",\r\n i.id.toString()\r\n )\r\n );\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n setIndberetning({ type: \"SET_ALL_TOUCHED\" });\r\n if (!indberetning.validation.emne.valid) {\r\n findStednavnRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.beskrivelse.valid) {\r\n kommentarRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.email.valid) {\r\n emailRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else if (!indberetning.validation.vilkårAccepteret.valid) {\r\n kommentarRef.current?.scrollIntoView({\r\n behavior: \"smooth\",\r\n });\r\n } else {\r\n post();\r\n }\r\n }}\r\n type=\"button\"\r\n className=\"btn btn-lg btn-primary mt-4\"\r\n >\r\n Indsend indberetning\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n","import { getIndberetninger } from \"api/stednavn\";\r\nimport IndberetningOversigt from \"components/common/IndberetningOversigt/IndberetningOversigt\";\r\nimport { updateStednavnSagWmsParams } from \"config/layers\";\r\nimport { getFilterValuesByRolleId } from \"config/StednavnConfig\";\r\nimport { IndberetningFilterContext } from \"context/IndberetningFilterProvider\";\r\nimport { SessionTimerContext } from \"context/SessionTimerProvider\";\r\nimport {\r\n getSearchFilterByValue,\r\n IndberetningerState,\r\n} from \"interfaces/IIndberetning\";\r\nimport { useContext, useEffect, useState } from \"react\";\r\n\r\nexport default function StednavnIndberetninger() {\r\n const {\r\n filter,\r\n filters,\r\n search,\r\n searchExtent,\r\n setFilter,\r\n setFilters,\r\n setSearch,\r\n searchInputText,\r\n setSearchInputText,\r\n currentUser,\r\n } = useContext(IndberetningFilterContext);\r\n const { resetSessionTimer } = useContext(SessionTimerContext);\r\n const [indberetningerState, setIndberetningerState] =\r\n useState({\r\n state: \"LOADING\",\r\n indberetninger: [],\r\n });\r\n useEffect(() => {\r\n setIndberetningerState((i) => {\r\n return { ...i, state: \"LOADING\" };\r\n });\r\n const timer = setTimeout(() => {\r\n setSearch(searchInputText);\r\n }, 1000);\r\n return () => clearTimeout(timer);\r\n }, [searchInputText, setSearch]);\r\n\r\n useEffect(() => {\r\n const filtersForUser = getFilterValuesByRolleId(\r\n currentUser.rolleId\r\n ).filterValues.map((value) => {\r\n return getSearchFilterByValue(value);\r\n });\r\n setFilters(filtersForUser);\r\n }, [currentUser, setFilters]);\r\n\r\n useEffect(() => {\r\n let stillMounted = true;\r\n if (filter.text === \"Alle indenfor kortvindue\" && searchExtent[0] === 0)\r\n return;\r\n setIndberetningerState({\r\n indberetninger: [],\r\n state: \"LOADING\",\r\n });\r\n const getFilteredIndberetningerForUser = async () => {\r\n const options = {\r\n personId: currentUser.personId,\r\n rolleId: currentUser.rolleId,\r\n filterId: filter.value,\r\n searchEmne: filter.text === \"Søgning\" ? search.emne : \"\",\r\n searchBeskrivelse: filter.text === \"Søgning\" ? search.beskrivelse : \"\",\r\n extent:\r\n filter.text === \"Alle indenfor kortvindue\" ? searchExtent : undefined,\r\n };\r\n updateStednavnSagWmsParams(options);\r\n const response = await getIndberetninger(options);\r\n resetSessionTimer();\r\n const indberetninger = response.reverse();\r\n if (stillMounted)\r\n setIndberetningerState({\r\n indberetninger,\r\n state: \"IDLE\",\r\n });\r\n };\r\n getFilteredIndberetningerForUser();\r\n return () => {\r\n stillMounted = false;\r\n };\r\n }, [currentUser, filter, search, searchExtent, resetSessionTimer]);\r\n\r\n const hideBecauseEmptySearch =\r\n filter.text === \"Søgning\" && !search.beskrivelse && !search.emne;\r\n return (\r\n \r\n );\r\n}\r\n","import { sagsbehandlingApi } from \"api/stednavn\";\r\nimport Chat from \"components/common/Indberetning/Chat/Chat\";\r\nimport Detaljevisning from \"components/common/Indberetning/Detaljevisning\";\r\nimport IndberetningNav from \"components/common/Indberetning/IndberetningNav\";\r\nimport ChevronLeft from \"components/icons/ChevronLeft\";\r\nimport { finishedDrawingSource } from \"config/interactions\";\r\nimport { statusStore } from \"config/StednavnConfig\";\r\nimport { AuthContext } from \"context/AuthProvider\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport {\r\n Hoeringssag,\r\n IndberetningState,\r\n RessourceRolleIdEnum,\r\n} from \"interfaces/IIndberetning\";\r\nimport {\r\n useContext,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { useErrorHandler } from \"react-error-boundary\";\r\nimport { useParams } from \"react-router\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { NewFileState } from \"routes/Fip/FipIndberet\";\r\nimport { isIndberetningMine } from \"routes/Fip/FipIndberetning\";\r\nimport { getSagsaktFeaturesFromHoeringssag } from \"routes/Fip/fipUtil\";\r\nimport { paths } from \"routes/routesConfig\";\r\nimport { convertWktToFeature, zoomToFeature } from \"util/ol\";\r\nimport StednavnSagsbehandlerfunktioner from \"components/common/Indberetning/Stednavn/StednavnSagsbehandlerfunktioner\";\r\nimport { SessionTimerContext } from \"context/SessionTimerProvider\";\r\n\r\nexport default function StednavnIndberetning() {\r\n const { getIndberetning } = sagsbehandlingApi;\r\n let { id } = useParams();\r\n const { authState } = useContext(AuthContext);\r\n const { resetSessionTimer } = useContext(SessionTimerContext);\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n const { map } = mapState;\r\n const handleError = useErrorHandler();\r\n const { currentUser } = authState;\r\n const [indberetningState, setIndberetningState] = useState(\r\n {\r\n state: \"LOADING\",\r\n indberetning: undefined,\r\n }\r\n );\r\n const [newFile, setNewFile] = useState({\r\n state: \"IDLE\",\r\n file: undefined,\r\n });\r\n const cancelDrawingAndUploadFile = () => {\r\n setNewFile({ state: \"IDLE\", file: undefined });\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n dispatchToMap({\r\n type: \"SET_DRAWTOOL\",\r\n drawTool: undefined,\r\n });\r\n };\r\n const indberetningStateHandler = (indberetning: Hoeringssag) => {\r\n setIndberetningState({\r\n ...indberetningState,\r\n indberetning: indberetning,\r\n });\r\n };\r\n\r\n const hash = window.location.hash.replace(\"#\", \"\");\r\n const [activePaneState, setActivePaneState] = useState<\r\n \"sagsdetaljer\" | \"sagsbehandling\" | \"hoeringssag\"\r\n >(\r\n hash === \"sagsbehandling\" || hash === \"hoeringssag\" ? hash : \"sagsdetaljer\"\r\n );\r\n\r\n useLayoutEffect(() => {\r\n window.location.hash = activePaneState;\r\n }, [activePaneState]);\r\n\r\n const [sagsbehandlingChatScrollPos, setSagsbehandlingChatScrollPos] =\r\n useState(undefined);\r\n useEffect(() => {\r\n setIndberetningState({ indberetning: undefined, state: \"LOADING\" });\r\n const testApi = async () => {\r\n const response = await getIndberetning(id, currentUser.personId);\r\n resetSessionTimer();\r\n try {\r\n const features = getSagsaktFeaturesFromHoeringssag(response);\r\n\r\n features.forEach((feature) => {\r\n finishedDrawingSource.addFeature(feature);\r\n });\r\n\r\n setIndberetningState({\r\n indberetning: response,\r\n state: \"IDLE\",\r\n });\r\n } catch (error) {\r\n handleError(error);\r\n }\r\n };\r\n testApi();\r\n }, [\r\n setIndberetningState,\r\n id,\r\n currentUser,\r\n handleError,\r\n getIndberetning,\r\n resetSessionTimer,\r\n ]);\r\n\r\n const didZoomAlready = useRef(false);\r\n useEffect(() => {\r\n const { indberetning } = indberetningState;\r\n if (map && indberetning && indberetning.bbox && !didZoomAlready.current) {\r\n zoomToFeature(map, convertWktToFeature(indberetning.bbox));\r\n didZoomAlready.current = true;\r\n }\r\n }, [indberetningState, map, activePaneState]);\r\n\r\n useEffect(() => {\r\n const { indberetning } = indberetningState;\r\n if (map && indberetningState.state === \"IDLE\" && indberetning) {\r\n finishedDrawingSource.clear();\r\n const features = getSagsaktFeaturesFromHoeringssag(indberetning);\r\n features.forEach((feature) => {\r\n finishedDrawingSource.addFeature(feature);\r\n });\r\n }\r\n return () => {\r\n finishedDrawingSource.clear();\r\n };\r\n }, [map, indberetningState, dispatchToMap]);\r\n\r\n const titelRef = useRef(null);\r\n const loadingRef = useRef(null);\r\n useLayoutEffect(() => {\r\n if (indberetningState.state === \"IDLE\") titelRef.current?.focus();\r\n if (indberetningState.state === \"LOADING\") loadingRef.current?.focus();\r\n }, [indberetningState.state]);\r\n\r\n if (indberetningState.state === \"LOADING\")\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n Henter sag ...\r\n

    \r\n \r\n );\r\n if (indberetningState.state === \"IDLE\" && indberetningState.indberetning) {\r\n const { indberetning } = indberetningState;\r\n const {\r\n ressource,\r\n indberetningsmappe: indberetningsmappeListe,\r\n sagsbehandlermappe: sagsbehandlermappeListe,\r\n } = indberetning;\r\n\r\n const indberettere = ressource?.filter((r) => r.rolleId === 1);\r\n const indberetter = indberettere?.length > 0 ? indberettere[0] : undefined;\r\n\r\n const sagsbehandlere = ressource?.filter((r) => r.rolleId === 2);\r\n const sagsbehandler =\r\n sagsbehandlere?.length > 0 ? sagsbehandlere[0] : undefined;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n Tilbage til indberetninger\r\n \r\n

    \r\n {indberetning.emne}\r\n

    \r\n
    \r\n Status: \r\n {isIndberetningMine(currentUser, indberetning, false) && (\r\n \r\n {currentUser.rolleId === RessourceRolleIdEnum.indberetter\r\n ? \"Indberettet af dig\"\r\n : \"Din indberetning\"}\r\n , \r\n \r\n )}\r\n s.id === indberetning.statusId)\r\n ?.className\r\n }`}\r\n >\r\n {statusStore.find((s) => s.id === indberetning.statusId)?.name}\r\n \r\n {/*I høring\r\n Afventer sagsbehandling */}\r\n
    \r\n
    \r\n {/* Fane Nav */}\r\n \r\n {/* Fane indhold */}\r\n
    \r\n {/* Detaljevisning */}\r\n {activePaneState === \"sagsdetaljer\" &&\r\n indberetningsmappeListe &&\r\n indberetningsmappeListe.length > 0 && (\r\n {\r\n if (map) {\r\n zoomToFeature(map, convertWktToFeature(indberetning.bbox));\r\n }\r\n }}\r\n />\r\n )}\r\n {/* Sagsbehandling / Chat mellem sagsbehandler og indberetter */}\r\n {activePaneState === \"sagsbehandling\" &&\r\n ((sagsbehandlermappeListe && sagsbehandlermappeListe.length > 0) ||\r\n (indberetningsmappeListe &&\r\n indberetningsmappeListe.length > 0)) && (\r\n /**/\r\n <>\r\n \r\n \r\n )}\r\n {sagsbehandlermappeListe &&\r\n sagsbehandlermappeListe.length > 0 &&\r\n ![\r\n RessourceRolleIdEnum.indberetter,\r\n RessourceRolleIdEnum.høringspart,\r\n ].includes(currentUser.rolleId) && (\r\n \r\n )}\r\n
    \r\n
    \r\n );\r\n }\r\n return (\r\n
    \r\n

    Noget gik galt ...

    \r\n
    \r\n );\r\n}\r\n","import { Link } from \"react-router-dom\";\r\nimport { paths } from \"routes/routesConfig\";\r\n// import { baselayers } from \"config/FipConfig\";\r\n\r\nexport default function Postnr() {\r\n return (\r\n
    \r\n {/* Gå til FIP */}\r\n

    Postnummer Indberetningsportal

    \r\n

    \r\n Velkommen til Postnummer Indberetningsportal, leveret af{\" \"}\r\n Styrelsen for Dataforsyning og Infrastruktur (SDFI).\r\n

    \r\n
    \r\n
    \r\n Mulige handlinger\r\n
    \r\n \r\n Indberet\r\n \r\n \r\n Se oversigt over indberetninger\r\n \r\n
    \r\n
    \r\n
    \r\n

    Vedligeholdelse af postnumre

    \r\n

    \r\n Danske Postnumre opdateres af Styrelsen for Dataforsyning og\r\n Infrastruktur. Danske Postnumre kan kontaktes på{\" \"}\r\n danskepostnumre@sdfi.dk.\r\n

    \r\n
    \r\n );\r\n}\r\n","export default function PostnrIndberet() {\r\n return
    ;\r\n}\r\n","export default function PostnrIndberetninger() {\r\n return
    ;\r\n}\r\n","export default function PostnrIndberetning() {\r\n return
    ;\r\n}\r\n","import { Link } from \"react-router-dom\";\r\nimport { paths } from \"routes/routesConfig\";\r\n// import { baselayers } from \"config/FipConfig\";\r\n\r\nexport default function Sogn() {\r\n return (\r\n
    \r\n {/* Gå til FIP */}\r\n

    Sogne Indberetningsportal

    \r\n

    \r\n Velkommen til Sogne Indberetningsportal, leveret af{\" \"}\r\n Styrelsen for Dataforsyning og Infrastruktur (SDFI).\r\n

    \r\n
    \r\n
    \r\n Mulige handlinger\r\n
    \r\n \r\n Indberet\r\n \r\n \r\n Se oversigt over indberetninger\r\n \r\n
    \r\n
    \r\n
    \r\n

    Vedligeholdelse af sogne

    \r\n

    \r\n Danske Sogne opdateres af Styrelsen for Dataforsyning og\r\n Infrastruktur. Danske Sogne kan kontaktes på{\" \"}\r\n danskesogn@sdfi.dk.\r\n

    \r\n
    \r\n );\r\n}\r\n","export default function SognIndberet() {\r\n return
    ;\r\n}\r\n","export default function SognIndberetninger() {\r\n return
    ;\r\n}\r\n","export default function SognIndberetning() {\r\n return
    ;\r\n}\r\n","import { Link, useLocation } from \"react-router-dom\";\r\nimport { routesArray } from \"routes/routesConfig\";\r\nimport { makeBreadCrumbs } from \"./breadcrumbsUtil\";\r\n\r\nexport default function BreadCrumbs() {\r\n const Wrapper = ({ children }) => {\r\n return (\r\n \r\n );\r\n };\r\n const { pathname } = useLocation();\r\n\r\n const crumbs = makeBreadCrumbs(pathname, routesArray);\r\n\r\n if (crumbs.length === 0)\r\n return (\r\n \r\n \r\n 404\r\n \r\n \r\n );\r\n return (\r\n \r\n );\r\n}\r\n","export const makeBreadCrumbs = (\r\n pathname: string,\r\n routes: {\r\n path: string;\r\n name: string;\r\n }[]\r\n): {\r\n name: string;\r\n path: string;\r\n}[] => {\r\n const pathnameParts = pathname.split(\"/\");\r\n return routes\r\n .filter(({ path }) => {\r\n // path = path.replace(\":id\", \"\");\r\n const routePathParts = path.split(\"/\");\r\n if (pathnameParts.length < routePathParts.length) return false;\r\n if (\r\n Number.isInteger(parseInt(pathnameParts[pathnameParts.length - 1])) &&\r\n routePathParts[routePathParts.length - 1] === \":id\"\r\n )\r\n routePathParts[routePathParts.length - 1] =\r\n pathnameParts[pathnameParts.length - 1];\r\n const a = pathnameParts.slice(0, routePathParts.length).join();\r\n const b = routePathParts.join();\r\n return a === b;\r\n // console.log({ routePathParts, pathnameParts });\r\n // return pathname.includes(path);\r\n })\r\n .map((route) => {\r\n const { name, path } = route;\r\n return {\r\n name: path.includes(\":id\") // Visningsnavn skal være id dersom vi er inde på en enkel indberetning\r\n ? pathnameParts[pathnameParts.length - 1]\r\n : name,\r\n path,\r\n };\r\n });\r\n};\r\n","import { useRef } from \"react\";\r\nimport _uniqueId from \"lodash/uniqueId\";\r\n\r\ninterface IDropdown {\r\n children: JSX.Element | string;\r\n dropdownMenu: JSX.Element;\r\n buttonStyle?:\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"success\"\r\n | \"danger\"\r\n | \"warning\"\r\n | \"info\"\r\n | \"light\"\r\n | \"dark\"\r\n | \"link\";\r\n buttonSize?: \"large\" | \"normal\" | \"small\";\r\n}\r\nexport default function Dropdown(props: IDropdown) {\r\n const id = useRef(_uniqueId(\"dropdownMenuButton\"));\r\n const {\r\n dropdownMenu,\r\n buttonStyle = \"primary\",\r\n children,\r\n buttonSize = \"normal\",\r\n } = props;\r\n return (\r\n
    \r\n \r\n {children}\r\n \r\n
    \r\n {dropdownMenu}\r\n
    \r\n
    \r\n );\r\n}\r\n","import { AuthContext, Bruger } from \"context/AuthProvider\";\r\nimport { useContext } from \"react\";\r\nimport Dropdown from \"../Dropdown/Dropdown\";\r\nimport authApi from \"api/auth\";\r\nimport { rolleStore } from \"config/FipConfig\";\r\nimport { useLocation } from \"react-router\";\r\ninterface ISkiftBrugerProps {\r\n brugere: Bruger[];\r\n currentBruger?: Bruger;\r\n setCurrentBruger: (bruger: Bruger) => void;\r\n}\r\nexport default function DemoSkiftBruger(props: ISkiftBrugerProps) {\r\n const { brugere, currentBruger } = props;\r\n const { authState, setAuthState } = useContext(AuthContext);\r\n const location = useLocation();\r\n const renderMenu = () => {\r\n return (\r\n <>\r\n {brugere.map((b) => {\r\n return (\r\n {\r\n let prefix_url = \"\";\r\n if (location.pathname.toLowerCase().includes(\"/stednavn\")) {\r\n prefix_url = \"stednavn/\";\r\n }\r\n authApi.getMe(b.personId, prefix_url).then((bruger) => {\r\n setAuthState({\r\n ...authState,\r\n currentUser: bruger,\r\n });\r\n });\r\n }}\r\n >\r\n {b.navn}\r\n \r\n );\r\n })}\r\n \r\n );\r\n };\r\n return (\r\n
    \r\n
    DEMO bruger
    \r\n \r\n {currentBruger ? currentBruger.navn : \"Vælg\"}\r\n \r\n
    \r\n {`rolle: ${rolleStore[authState.currentUser.rolleId].name}`}\r\n
    \r\n {`personId: ${authState.currentUser.personId}`}\r\n
    \r\n
    \r\n );\r\n}\r\n","export default function Skat() {\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 );\r\n}\r\n","import BreadCrumbs from \"components/common/BreadCrumbs/BreadCrumbs\";\r\nimport DemoSkiftBruger from \"components/common/DemoSkiftBruger/DemoSkiftBruger\";\r\nimport Skat from \"components/icons/Skat\";\r\nimport {\r\n AuthContext,\r\n fipDemoUsers,\r\n stednavnDemoUsers,\r\n} from \"context/AuthProvider\";\r\nimport { useContext } from \"react\";\r\nimport { Link, NavLink, useLocation } from \"react-router-dom\";\r\nimport { routes } from \"routes/routesConfig\";\r\nimport { authenticationMode, loginUrl, logoutUrl } from \"api\";\r\nimport { AuthenticationMode } from \"api/auth\";\r\n\r\nconst setPathname = (pathname) => {\r\n let exceptions = [\"loggetud\", \"forlavloa\"];\r\n\r\n exceptions.forEach((e) => {\r\n if (pathname.includes(e)) {\r\n pathname = pathname.replace(e, \"\");\r\n pathname = pathname.slice(0, -1);\r\n }\r\n });\r\n\r\n return pathname;\r\n};\r\nexport default function Header() {\r\n const { pathname } = useLocation();\r\n const correctedPathname = setPathname(pathname);\r\n const appRoot = correctedPathname.split(\"/\")[1];\r\n let routeSet = {\r\n root: routes.kort,\r\n indberet: routes.kortIndberet,\r\n indberetning: routes.kortIndberetning,\r\n indberetninger: routes.kortIndberetninger,\r\n };\r\n switch (appRoot) {\r\n case \"kort\":\r\n break;\r\n case \"stednavn\":\r\n routeSet = {\r\n root: routes.stednavn,\r\n indberet: routes.stednavnIndberet,\r\n indberetning: routes.stednavnIndberetning,\r\n indberetninger: routes.stednavnIndberetninger,\r\n };\r\n break;\r\n case \"postnr\":\r\n routeSet = {\r\n root: routes.postnr,\r\n indberet: routes.postnrIndberet,\r\n indberetning: routes.postnrIndberetning,\r\n indberetninger: routes.postnrIndberetninger,\r\n };\r\n break;\r\n case \"sogn\":\r\n routeSet = {\r\n root: routes.sogn,\r\n indberet: routes.sognIndberet,\r\n indberetning: routes.sognIndberetning,\r\n indberetninger: routes.sognIndberetninger,\r\n };\r\n break;\r\n }\r\n\r\n const { authState } = useContext(AuthContext);\r\n const { currentUser } = authState;\r\n const loginA = document.createElement(\"a\");\r\n return (\r\n <>\r\n {/*
    */}\r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n Fælles Indberetning\r\n Styrelsen for Dataforsyning og Infrastruktur\r\n
    \r\n {/* \r\n Indberet\r\n \r\n \r\n {routeSet.root.name}\r\n */}\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
      \r\n
    • \r\n \r\n Indberet\r\n \r\n
    • \r\n
    • \r\n \r\n Oversigt\r\n \r\n
    • \r\n {authenticationMode === AuthenticationMode.forms && (\r\n
    • \r\n {authState.currentUser.rolleId === 0 && (\r\n {\r\n loginA.setAttribute(\r\n \"href\",\r\n loginUrl + \"?returnUrl=\" + correctedPathname\r\n );\r\n loginA.click();\r\n }}\r\n aria-label=\"Log Ind\"\r\n title=\"Log Ind\"\r\n >\r\n Log Ind\r\n \r\n \r\n \r\n \r\n )}\r\n {authState.currentUser.rolleId !== 0 && (\r\n {\r\n loginA.setAttribute(\r\n \"href\",\r\n logoutUrl + \"?returnUrl=/\" + appRoot + \"/loggetud\"\r\n );\r\n loginA.click();\r\n }}\r\n aria-label=\"Log Ud\"\r\n title={\"Log Ud (\" + authState.currentUser.navn + \")\"}\r\n >\r\n Log Ud\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 {authenticationMode === AuthenticationMode.none && appRoot === \"kort\" && (\r\n {}}\r\n />\r\n )}\r\n {authenticationMode === AuthenticationMode.none &&\r\n appRoot === \"stednavn\" && (\r\n {}}\r\n />\r\n )}\r\n \r\n );\r\n}\r\n","import { LayoutContext } from \"context/LayoutProvider\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport { useMedia } from \"hooks/useMedia\";\r\nimport { useContext, useEffect } from \"react\";\r\nimport { useLocation } from \"react-router\";\r\nimport Header from \"../Header/Header\";\r\n// import LogOut from \"../../icons/LogOut\";\r\n\r\ninterface ITwoPaneLayoutProps {\r\n children: React.ReactNode;\r\n rightPane: React.ReactNode;\r\n}\r\nexport default function TwoPaneLayout(props: ITwoPaneLayoutProps) {\r\n const { mapState } = useContext(MapContext);\r\n const { map } = mapState;\r\n const { children, rightPane } = props;\r\n const { paneToShow, setPaneToShow } = useContext(LayoutContext);\r\n const location = useLocation();\r\n const shouldHidePane = useMedia([\"(max-width: 767px)\"], [true], false);\r\n const leftPaneHidden = shouldHidePane && paneToShow === \"right\";\r\n const rightPaneHidden = shouldHidePane && paneToShow === \"left\";\r\n const leftPaneClassNames = leftPaneHidden\r\n ? \"col-12 col-md-6 shadow-lg h-100 px-3 bg-white d-none\"\r\n : \"col-12 col-md-6 shadow-lg h-100 px-3 bg-white\";\r\n const rightPaneClassNames = rightPaneHidden\r\n ? \"col-12 col-md-6 d-none\"\r\n : \"col-12 col-md-6\";\r\n\r\n const guideLink = location.pathname.toLowerCase().includes(\"/stednavn\")\r\n ? \"https://indberetning.sdfe.dk/stednavn/fip_guide.pdf\"\r\n : \"https://indberetning.sdfe.dk/fip_guide.pdf\";\r\n\r\n useEffect(() => {\r\n if (map) {\r\n setTimeout(() => {\r\n map.updateSize();\r\n }, 100);\r\n setTimeout(() => {\r\n const canvasEl = document.getElementsByTagName(\"canvas\").length\r\n ? document.getElementsByTagName(\"canvas\")[0]\r\n : undefined;\r\n if (canvasEl && !canvasEl.ariaLabel) {\r\n canvasEl.setAttribute(\"aria-label\", \"Interaktivt kort\");\r\n }\r\n }, 3000);\r\n }\r\n }, [paneToShow, map]);\r\n\r\n return (\r\n
    \r\n {shouldHidePane && (\r\n {\r\n if (paneToShow === \"left\") setPaneToShow(\"right\");\r\n else setPaneToShow(\"left\");\r\n }}\r\n aria-live=\"assertive\"\r\n aria-label={\r\n paneToShow === \"left\" ? \"Vis kort\" : \"Tilbage til Indhold\"\r\n }\r\n >\r\n {paneToShow === \"left\" && (\r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {paneToShow === \"right\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n \r\n {/* Content */}\r\n \r\n Sæt fokus til primært indhold\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n {/* aria-live=\"polite\" - Vi skal nok finde en anden måde at announce siderne på */}\r\n {children}\r\n\r\n
    \r\n

    \r\n © 2022 Styrelsen for Dataforsyning og Infrastruktur\r\n

    \r\n

    \r\n © FIP er udviklet af{\" \"}\r\n \r\n {/* Septima */}\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 Tilgængelighedserklæring\r\n \r\n \r\n •\r\n \r\n \r\n Hjælp\r\n \r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {/* Map */}\r\n {rightPane}\r\n
    \r\n \r\n );\r\n}\r\n","// https://usehooks.com/useMedia/\r\nimport { useEffect, useState } from \"react\";\r\n\r\nexport function useMedia(queries, values, defaultValue) {\r\n // Array containing a media query list for each query\r\n const mediaQueryLists = queries.map((q) => window.matchMedia(q));\r\n\r\n // Function that gets value based on matching media query\r\n const getValue = () => {\r\n // Get index of first media query that matches\r\n const index = mediaQueryLists.findIndex((mql) => mql.matches);\r\n\r\n // Return related value or defaultValue if none\r\n return typeof values[index] !== \"undefined\" ? values[index] : defaultValue;\r\n };\r\n\r\n // State and setter for matched value\r\n const [value, setValue] = useState(getValue);\r\n\r\n useEffect(\r\n () => {\r\n // Event listener callback\r\n // Note: By defining getValue outside of useEffect we ensure that it has ...\r\n // ... current values of hook args (as this hook callback is created once on mount).\r\n const handler = () => setValue(getValue);\r\n\r\n // Set a listener for each media query with above handler as callback.\r\n mediaQueryLists.forEach((mql) => mql.addListener(handler));\r\n\r\n // Remove listeners on cleanup\r\n return () =>\r\n mediaQueryLists.forEach((mql) => mql.removeListener(handler));\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [] // Empty array ensures effect is only run on mount and unmount\r\n );\r\n\r\n return value;\r\n}\r\n","export default function MinusSquare(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-dash-square\";\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","export default function PlusSquare(props: { class?: string }) {\r\n const classNames = props.class\r\n ? `${props.class} bi`\r\n : \"bi bi-plus-square-fill\";\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","import { tema } from \"config/FipConfig\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport { useRouter } from \"hooks/useRouter\";\r\nimport { useContext, useEffect, useState } from \"react\";\r\n\r\nexport default function LayerToggleTemaselect() {\r\n const [value, setValue] = useState(\"0\");\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n useEffect(() => {\r\n if (mapState.tema) setValue(mapState.tema.id.toString());\r\n }, [mapState.tema]);\r\n const { isFipGenerel } = useRouter();\r\n if (!isFipGenerel) return null;\r\n\r\n return (\r\n
    \r\n {\r\n const temaId = e.target.value;\r\n setValue(temaId);\r\n const t = tema.find((t) => t.id.toString() === temaId);\r\n if (t) {\r\n dispatchToMap({\r\n type: \"SET_LAYERS\",\r\n baselayers: t.baseLayers,\r\n layers: t.layers,\r\n });\r\n }\r\n }}\r\n >\r\n {tema\r\n .map((t) => {\r\n return { value: t.id.toString(), label: t.name };\r\n })\r\n .map((option) => {\r\n const { value, label } = option;\r\n return (\r\n \r\n );\r\n })}\r\n \r\n {mapState.tema && mapState.tema.id.toString() !== value && (\r\n \r\n

    \r\n Du har valgt et andet kort end det du er igang med at indberette i.\r\n {\r\n if (mapState.tema) setValue(mapState.tema?.id.toString());\r\n }}\r\n type=\"button\"\r\n className=\"btn btn-link d-inline p-0 btn-sm\"\r\n >\r\n Skift til indberetningskort\r\n \r\n

    \r\n
    \r\n )}\r\n \r\n );\r\n}\r\n","export default function HandPointing(props: {\r\n class?: string;\r\n ariaLabel?: string;\r\n}) {\r\n const { ariaLabel } = props;\r\n const classNames = props.class ? `${props.class} bi` : \"bi\";\r\n return (\r\n \r\n {ariaLabel}\r\n \r\n \r\n \r\n \r\n \r\n\r\n );\r\n}\r\n","import { FipLayer } from \"interfaces/FipLayer\";\r\n// import ChevronUp from \"components/icons/ChevronUp\";\r\nimport MinusSquare from \"components/icons/MinusSquare\";\r\nimport PlusSquare from \"components/icons/PlusSquare\";\r\nimport { uniqueId } from \"lodash\";\r\nimport LayerToggleTemaselect from \"./LayerToggleTemaselect\";\r\nimport { useState } from \"react\";\r\nimport { FipLayerFolder, isFipLayer } from \"interfaces/IIndberetning\";\r\nimport HandPointing from \"components/icons/HandPointing\";\r\n\r\nexport default function LayerToggle(props: {\r\n baselayers: FipLayer[];\r\n layers: (FipLayer | FipLayerFolder)[];\r\n setLayerVisibility: (layer: FipLayer, visible: boolean) => void;\r\n setVisibleBaselayer: (layer: FipLayer) => void;\r\n viewState: {\r\n center: number[];\r\n resolution: number;\r\n zoom: number;\r\n };\r\n}) {\r\n const {\r\n baselayers,\r\n layers,\r\n setLayerVisibility,\r\n setVisibleBaselayer,\r\n viewState,\r\n } = props;\r\n const [expanded, setExpanded] = useState(true);\r\n return (\r\n
    \r\n {\r\n setExpanded(!expanded);\r\n }}\r\n >\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n Lagvælger\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {expanded && (\r\n
    \r\n \r\n
    \r\n Baggrundslag\r\n {baselayers.map((l) => {\r\n const className = l.loading\r\n ? \"form-check is-loading\"\r\n : \"form-check\";\r\n const id = uniqueId();\r\n return (\r\n
    \r\n {\r\n if (e.target.checked) setVisibleBaselayer(l);\r\n }}\r\n />\r\n \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n Kortlag\r\n {layers.map((l) => {\r\n if (isFipLayer(l)) {\r\n return (\r\n \r\n );\r\n } else {\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\nconst FolderItem = (props: {\r\n folder: FipLayerFolder;\r\n currResolution: number;\r\n setLayerVisibility: (layer: FipLayer, visible: boolean) => void;\r\n}) => {\r\n const [expanded, setExpanded] = useState(false);\r\n const { folder, currResolution, setLayerVisibility } = props;\r\n const id = uniqueId(\"layer-folder\");\r\n return (\r\n
    \r\n {\r\n setExpanded(!expanded);\r\n }}\r\n className=\"btn btn-sm btn-primary bg-white text-dark fw-semibold w-100 py-0 my-1\"\r\n type=\"button\"\r\n data-bs-toggle=\"collapse\"\r\n data-bs-target={`#${id}`}\r\n aria-expanded={expanded}\r\n aria-controls={id}\r\n >\r\n \r\n {expanded && }\r\n {!expanded && }\r\n \r\n {folder.title}\r\n \r\n \r\n {folder.layers.map((layer) => {\r\n return (\r\n \r\n );\r\n })}\r\n
    \r\n \r\n );\r\n};\r\nconst LayerItem = (props: {\r\n layer: FipLayer;\r\n currResolution: number;\r\n setLayerVisibility: (layer: FipLayer, visible: boolean) => void;\r\n}) => {\r\n const { layer, currResolution, setLayerVisibility } = props;\r\n const id = uniqueId();\r\n const className = layer.loading ? \"form-check is-loading\" : \"form-check\";\r\n\r\n return (\r\n
    \r\n {\r\n setLayerVisibility(layer, e.target.checked);\r\n }}\r\n />\r\n \r\n
    \r\n );\r\n};\r\n","export default function DrawSelect(props: { class?: string }) {\r\n const classNames = props.class ? `${props.class} bi` : \"bi bi-draw-select\";\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n","import { DrawTool, MapContext } from \"context/MapProvider\";\r\n\r\nimport IconDrawPoint from \"../../icons/DrawPoint\";\r\nimport IconDrawSelect from \"../../icons/DrawSelect\";\r\nimport IconDrawLine from \"../../icons/DrawLine\";\r\nimport IconDrawPolygon from \"../../icons/DrawPolygon\";\r\nimport { useContext, useEffect, useLayoutEffect, useRef } from \"react\";\r\n\r\nexport default function DrawTools(props: {\r\n showToast: () => void;\r\n allowedDrawTools: DrawTool[];\r\n}) {\r\n const {\r\n showToast,\r\n allowedDrawTools = [\"line\", \"point\", \"polygon\", \"udpeg\"],\r\n } = props;\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n const { activeDrawTool } = mapState;\r\n const focusRef = useRef(null);\r\n useLayoutEffect(() => {\r\n if (focusRef.current) {\r\n focusRef.current.focus();\r\n }\r\n }, []);\r\n useEffect(() => {\r\n showToast();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [activeDrawTool]);\r\n return (\r\n \r\n {allowedDrawTools.indexOf(\"polygon\") > -1 && (\r\n {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: \"polygon\" });\r\n }}\r\n >\r\n <>\r\n
    \r\n \r\n
    \r\n Polygon\r\n \r\n \r\n )}\r\n {allowedDrawTools.indexOf(\"point\") > -1 && (\r\n {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: \"point\" });\r\n }}\r\n >\r\n <>\r\n
    \r\n \r\n
    \r\n Punkt\r\n \r\n \r\n )}\r\n\r\n {allowedDrawTools.indexOf(\"line\") > -1 && (\r\n {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: \"line\" });\r\n }}\r\n >\r\n <>\r\n
    \r\n \r\n
    \r\n Linje\r\n \r\n \r\n )}\r\n {allowedDrawTools.indexOf(\"udpeg\") > -1 && (\r\n {\r\n dispatchToMap({ type: \"SET_DRAWTOOL\", drawTool: \"udpeg\" });\r\n }}\r\n >\r\n <>\r\n
    \r\n \r\n
    \r\n Udpeg\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nconst DrawToolButton = (props: {\r\n children: JSX.Element | string;\r\n onClick: Function;\r\n isActive: boolean;\r\n}) => {\r\n const { children, isActive, onClick } = props;\r\n return (\r\n onClick()}\r\n type=\"button\"\r\n className={`btn btn-outline-primary ${isActive ? \"active\" : \"\"}`}\r\n aria-current={isActive ? \"true\" : \"false\"}\r\n >\r\n {children}\r\n \r\n );\r\n};\r\n","import { DrawTool } from \"context/MapProvider\";\r\n\r\nexport default function DrawToolsToasts(props: {\r\n activeDrawTool: DrawTool;\r\n showToast: boolean;\r\n setShowToast: (show: boolean) => void;\r\n}) {\r\n const { activeDrawTool, setShowToast, showToast } = props;\r\n const renderToast = () => {\r\n if (showToast) {\r\n switch (activeDrawTool) {\r\n case \"point\":\r\n return (\r\n \r\n
    \r\n
    \r\n Sæt ét punkt i kortet med kortets tegneværktøj.\r\n
    \r\n setShowToast(false)}\r\n aria-label=\"Close\"\r\n >\r\n
    \r\n \r\n );\r\n case \"line\":\r\n return (\r\n \r\n
    \r\n
    \r\n Sæt min. 2 punkter i kortet med kortets tegneværktøj.{\" \"}\r\n Dobbeltklik for at afslutte din linje.\r\n
    \r\n setShowToast(false)}\r\n aria-label=\"Close\"\r\n >\r\n
    \r\n \r\n );\r\n case \"polygon\":\r\n return (\r\n \r\n
    \r\n
    \r\n Sæt min. 3 punkter i kortet med kortets tegneværktøj.{\" \"}\r\n Dobbeltklik for at afslutte din polygon.\r\n
    \r\n setShowToast(false)}\r\n aria-label=\"Close\"\r\n >\r\n
    \r\n \r\n );\r\n case \"udpeg\":\r\n return (\r\n \r\n
    \r\n
    \r\n For at udpege med kortets tegneværktøj skal du tænde for det kortlag, som du ønsker at\r\n udpege i. Herefter skal du vælge et objekt ved at klikke på det i kortet.\r\n Hvis du bevæger musen over et objekt i kortet, vil den blive\r\n til en hånd med pegefinger.\r\n
    \r\n setShowToast(false)}\r\n aria-label=\"Close\"\r\n >\r\n
    \r\n \r\n );\r\n }\r\n }\r\n };\r\n return
    {renderToast()}
    ;\r\n}\r\n","import { useEffect, useState, useMemo, useRef, useContext } from \"react\";\r\nimport { createMap } from \"../../../config/map\";\r\nimport LayerToggle from \"components/common/Map/LayerToggle\";\r\nimport Search from \"./Search\";\r\nimport { isEqual, uniqueId } from \"lodash\";\r\nimport { MapContext } from \"context/MapProvider\";\r\nimport { usePrevious } from \"hooks/usePrevious\";\r\nimport {\r\n addDrawInteractionsToMap,\r\n disableAllInteractions,\r\n modifySource,\r\n} from \"config/interactions\";\r\nimport DrawTools from \"./DrawTools\";\r\nimport { addLayerToMap } from \"util/ol\";\r\nimport DrawToolsToasts from \"./DrawToolsToasts\";\r\nimport { FipLayer } from \"interfaces/FipLayer\";\r\nimport { FipLayerFolder, isFipLayer } from \"interfaces/IIndberetning\";\r\nimport { useRouter } from \"hooks/useRouter\";\r\nimport { bboxLayer } from \"config/layers\";\r\nimport { IndberetningFilterContext } from \"context/IndberetningFilterProvider\";\r\nimport { getFipFeatureInfo } from \"api/fip\";\r\nimport { MapBrowserEvent } from \"ol\";\r\nimport { useHistory } from \"react-router\";\r\nimport { routes } from \"routes/routesConfig\";\r\nimport { getStednavnFeatureInfo } from \"api/stednavn\";\r\n\r\nexport default function Map() {\r\n const { dispatchToMap, mapState } = useContext(MapContext);\r\n const { currentUser, filter, search } = useContext(IndberetningFilterContext);\r\n const { isStednavn } = useRouter();\r\n const history = useHistory();\r\n const {\r\n baselayers,\r\n layers,\r\n map,\r\n activeDrawTool,\r\n editGeometryState,\r\n viewState,\r\n } = mapState;\r\n\r\n const prevLayers = usePrevious(layers);\r\n const prevBaselayers = usePrevious(baselayers);\r\n const showDrawTools = activeDrawTool !== undefined;\r\n\r\n const mapId = useMemo(() => uniqueId(\"map\"), []);\r\n const renderMapDiv = useMemo(() => {\r\n return
    ;\r\n }, [mapId]);\r\n const hoveredFeaturesRef = useRef([]);\r\n\r\n const onMapClick = useRef<(e: MapBrowserEvent) => void | undefined>();\r\n useEffect(() => {\r\n onMapClick.current = (e) => {\r\n const { pathname } = history.location;\r\n if (\r\n !activeDrawTool &&\r\n !editGeometryState.active &&\r\n [\r\n routes.stednavnIndberetCreate.path,\r\n routes.stednavnIndberetDelete.path,\r\n routes.stednavnIndberetUpdate.path,\r\n routes.kortIndberet.path,\r\n ].indexOf(pathname) < 0\r\n ) {\r\n const getIndberetninger = async () => {\r\n const { pixel } = e;\r\n const { personId, rolleId } = currentUser;\r\n const size = e.map.getSize();\r\n const extent = e.map.getView().calculateExtent(size);\r\n if (isStednavn) {\r\n const indberetninger = await getStednavnFeatureInfo({\r\n extent,\r\n width: size[0],\r\n height: size[1],\r\n personId,\r\n rolleId,\r\n filterId: filter.value,\r\n x: Math.trunc(pixel[0]),\r\n y: Math.trunc(pixel[1]),\r\n searchBeskrivelse: search.beskrivelse,\r\n searchEmne: search.emne,\r\n });\r\n if (indberetninger.features.length > 0) {\r\n const first = indberetninger.features[0];\r\n const sagid = (first.properties?.SagId as number) ?? -1;\r\n if (sagid > -1) {\r\n const route = `/stednavn/indberetninger/${sagid}`;\r\n if (pathname !== route) history.push(route);\r\n }\r\n }\r\n } else {\r\n const indberetninger = await getFipFeatureInfo({\r\n extent,\r\n width: size[0],\r\n height: size[1],\r\n personId,\r\n rolleId,\r\n filterId: filter.value,\r\n x: Math.trunc(pixel[0]),\r\n y: Math.trunc(pixel[1]),\r\n searchBeskrivelse: search.beskrivelse,\r\n searchEmne: search.emne,\r\n });\r\n if (indberetninger.features.length > 0) {\r\n const first = indberetninger.features[0];\r\n const sagid = (first.properties?.SagId as number) ?? -1;\r\n if (sagid > -1) {\r\n const route = `/kort/indberetninger/${sagid}`;\r\n if (pathname !== route) history.push(route);\r\n }\r\n }\r\n }\r\n };\r\n getIndberetninger();\r\n }\r\n };\r\n }, [\r\n currentUser,\r\n filter,\r\n search,\r\n isStednavn,\r\n history,\r\n activeDrawTool,\r\n editGeometryState,\r\n ]);\r\n useEffect(() => {\r\n const newmap = createMap(mapId);\r\n newmap.on(\"pointermove\", (e) => {\r\n const hoveredFeatures = newmap.getFeaturesAtPixel(e.pixel).map((f) => {\r\n return f.get(\"id\");\r\n });\r\n if (!isEqual(hoveredFeatures, hoveredFeaturesRef.current)) {\r\n hoveredFeaturesRef.current = hoveredFeatures;\r\n dispatchToMap({ type: \"SET_HOVERED_FEATURES\", hoveredFeatures });\r\n }\r\n });\r\n newmap.on(\"moveend\", (e) => {\r\n const { map } = e;\r\n const view = map.getView();\r\n const extent = view.calculateExtent();\r\n const resolution = view.getResolution();\r\n const center = view.getCenter();\r\n const zoom = view.getZoom();\r\n dispatchToMap({\r\n type: \"SET_VIEWSTATE\",\r\n viewState: { center, resolution, zoom, extent },\r\n });\r\n });\r\n newmap.on(\"click\", (e) => {\r\n if (onMapClick.current) onMapClick.current(e);\r\n });\r\n addDrawInteractionsToMap(newmap);\r\n addLayerToMap(newmap, bboxLayer);\r\n disableAllInteractions();\r\n dispatchToMap({ type: \"SET_MAP\", map: newmap });\r\n }, [mapId, dispatchToMap, onMapClick]);\r\n\r\n useEffect(() => {\r\n const layersChanged = (\r\n prevLayers: (FipLayer | FipLayerFolder)[] | undefined,\r\n currLayers: (FipLayer | FipLayerFolder)[]\r\n ) => {\r\n if (!prevLayers) return true;\r\n if (prevLayers.length !== layers.length) return true;\r\n const prevlayersTitles = prevLayers.map((l) => l.title).join(\",\");\r\n const currlayersTitles = currLayers.map((l) => l.title).join(\",\");\r\n return prevlayersTitles !== currlayersTitles;\r\n };\r\n if (\r\n map &&\r\n (layersChanged(prevLayers, layers) ||\r\n layersChanged(prevBaselayers, baselayers))\r\n ) {\r\n prevBaselayers?.forEach((l) => map.removeLayer(l.maplayer));\r\n prevLayers?.forEach((l) => {\r\n if (isFipLayer(l)) {\r\n map.removeLayer(l.maplayer);\r\n } else {\r\n l.layers.forEach((folderLayers) => {\r\n map.removeLayer(folderLayers.maplayer);\r\n });\r\n }\r\n });\r\n baselayers.forEach((l) => {\r\n addLayerToMap(map, l.maplayer);\r\n l.maplayer.setVisible(l.visible);\r\n });\r\n layers.forEach((l) => {\r\n if (isFipLayer(l)) {\r\n addLayerToMap(map, l.maplayer);\r\n l.maplayer.setVisible(l.visible);\r\n } else {\r\n l.layers.forEach((folderLayers) => {\r\n addLayerToMap(map, folderLayers.maplayer);\r\n folderLayers.maplayer.setVisible(folderLayers.visible);\r\n });\r\n }\r\n });\r\n }\r\n }, [baselayers, prevBaselayers, layers, prevLayers, map]);\r\n const containerClasses = mapState.activeDrawTool\r\n ? \"l-map has-focus\"\r\n : \"l-map\";\r\n const [showToast, setShowToast] = useState(true);\r\n\r\n const setVisibleBaselayer = (layer: FipLayer) => {\r\n dispatchToMap({ type: \"SET_VISIBLE_BASELAYER\", layer });\r\n };\r\n const setLayerVisibility = (layer: FipLayer, visible: boolean) => {\r\n dispatchToMap({ type: \"SET_LAYER_VISIBILITY\", layer, visible });\r\n };\r\n return (\r\n
    \r\n {renderMapDiv}\r\n
    \r\n {map && (\r\n \r\n )}\r\n \r\n\r\n \r\n\r\n {editGeometryState.active && (\r\n
    \r\n {\r\n dispatchToMap({ type: \"CANCEL_EDIT_GEOMETRY\" });\r\n }}\r\n >\r\n Fortryd\r\n \r\n {\r\n const modifyFeatures = modifySource.getFeatures();\r\n const modifyFeature =\r\n modifyFeatures.length > 0 ? modifyFeatures[0] : undefined;\r\n if (modifyFeature) {\r\n dispatchToMap({\r\n type: \"SAVE_EDIT_GEOMETRY\",\r\n clonedGeometry: modifyFeature.clone().getGeometry(),\r\n });\r\n }\r\n }}\r\n >\r\n Gem ændring\r\n \r\n
    \r\n )}\r\n\r\n {showDrawTools && (\r\n setShowToast(true)}\r\n allowedDrawTools={\r\n isStednavn\r\n ? [\"line\", \"point\", \"polygon\"]\r\n : [\"line\", \"point\", \"polygon\", \"udpeg\"]\r\n }\r\n />\r\n )}\r\n\r\n
    \r\n Kilder til kort: \r\n \r\n © Septima\r\n \r\n ,{\" \"}\r\n \r\n © SDFE\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n","import { createContext, useContext, useEffect } from \"react\";\r\nimport { MapAction, MapContext } from \"./MapProvider\";\r\nimport { tema } from \"../config/FipConfig\";\r\nimport {\r\n baselayers as stednavnBaselayers,\r\n layers as stednavnLayers,\r\n} from \"config/StednavnConfig\";\r\nimport { FipLayer } from \"interfaces/FipLayer\";\r\nimport BaseTileLayer from \"ol/layer/BaseTile\";\r\nimport { ImageWMS, TileImage } from \"ol/source\";\r\nimport ImageLayer from \"ol/layer/Image\";\r\nimport VectorLayer from \"ol/layer/Vector\";\r\nimport VectorSource from \"ol/source/Vector\";\r\nimport Geometry from \"ol/geom/Geometry\";\r\nimport { useRouter } from \"hooks/useRouter\";\r\nimport { isFipLayer } from \"interfaces/IIndberetning\";\r\n\r\nexport const ConfigContext = createContext(undefined);\r\n\r\nconst ConfigProvider = ({ children }) => {\r\n const { dispatchToMap } = useContext(MapContext);\r\n const { isFipGenerel, isStednavn } = useRouter();\r\n useEffect(() => {\r\n if (isFipGenerel) {\r\n dispatchToMap({\r\n type: \"SET_LAYERS\",\r\n baselayers: tema[0].baseLayers,\r\n layers: tema[0].layers,\r\n });\r\n tema.forEach((t) => {\r\n const allTemaLayers = [...t.baseLayers, ...t.layers];\r\n allTemaLayers.forEach((l) => {\r\n if (isFipLayer(l)) {\r\n setLoadingCallback(l, dispatchToMap);\r\n } else {\r\n l.layers.forEach((folderLayer) => {\r\n setLoadingCallback(folderLayer, dispatchToMap);\r\n });\r\n }\r\n });\r\n });\r\n } else if (isStednavn) {\r\n dispatchToMap({\r\n type: \"SET_LAYERS\",\r\n baselayers: stednavnBaselayers,\r\n layers: stednavnLayers,\r\n });\r\n stednavnBaselayers.forEach((l) => {\r\n setLoadingCallback(l, dispatchToMap);\r\n });\r\n stednavnLayers.forEach((l) => {\r\n setLoadingCallback(l, dispatchToMap);\r\n });\r\n }\r\n }, [dispatchToMap, isFipGenerel, isStednavn]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default ConfigProvider;\r\n\r\n/**\r\n * Setup loading callbacks for layers shown in layer selector\r\n * @param l\r\n * @param dispatchToMap\r\n */\r\nfunction setLoadingCallback(\r\n l: FipLayer,\r\n dispatchToMap: React.Dispatch\r\n) {\r\n const tilelayer = l.maplayer as BaseTileLayer;\r\n if (tilelayer) {\r\n const progress = { loading: 0, loaded: 0 };\r\n tilelayer.getSource().on(\"tileloadstart\", (e) => {\r\n progress.loading += 1;\r\n if (progress.loading > progress.loaded) {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: true,\r\n });\r\n }\r\n });\r\n tilelayer.getSource().on(\"tileloadend\", (e) => {\r\n progress.loaded += 1;\r\n if (progress.loaded === progress.loading) {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: false,\r\n });\r\n progress.loaded = 0;\r\n progress.loading = 0;\r\n }\r\n });\r\n tilelayer.getSource().on(\"tileloaderror\", (e) => {\r\n progress.loaded += 1;\r\n if (progress.loaded === progress.loading) {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: false,\r\n });\r\n progress.loaded = 0;\r\n progress.loading = 0;\r\n }\r\n });\r\n }\r\n const imageLayer = l.maplayer as ImageLayer;\r\n if (imageLayer) {\r\n imageLayer.getSource().on(\"imageloadstart\", (e) => {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: true,\r\n });\r\n });\r\n imageLayer.getSource().on(\"imageloadend\", (e) => {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: false,\r\n });\r\n });\r\n imageLayer.getSource().on(\"imageloaderror\", (e) => {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: false,\r\n });\r\n });\r\n }\r\n\r\n const vectorLayer = l.maplayer as VectorLayer>;\r\n if (vectorLayer) {\r\n vectorLayer.getSource().on(\"featuresloadstart\", () => {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: true,\r\n });\r\n });\r\n vectorLayer.getSource().on(\"featuresloadend\", () => {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: false,\r\n });\r\n });\r\n vectorLayer.getSource().on(\"featuresloaderror\", () => {\r\n dispatchToMap({\r\n type: \"SET_LAYER_LOADING\",\r\n layer: l,\r\n loading: false,\r\n });\r\n });\r\n }\r\n}\r\n","import { useLayoutEffect, useRef } from \"react\";\r\n\r\nexport default function NotFound() {\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n

    \r\n 404 siden kunne ikke findes\r\n

    \r\n
    \r\n );\r\n}\r\n\r\nexport function Error() {\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n

    \r\n 500 intern serverfejl\r\n

    \r\n
    \r\n );\r\n}\r\n","import { useLayoutEffect, useRef } from \"react\";\r\n\r\nexport default function Forbidden() {\r\n const titelRef = useRef(null);\r\n useLayoutEffect(() => {\r\n titelRef.current?.focus();\r\n }, []);\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n Ingen adgang\r\n

    \r\n

    Du har ikke adgang til dette indhold - login først

    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n","import { Route, Redirect } from \"react-router-dom\";\r\nimport { AuthState } from \"context/AuthProvider\";\r\nimport { authenticationMode, loginUrl } from \"api\";\r\nimport Forbidden from \"./Forbidden/Forbidden\";\r\nimport { AuthenticationMode } from \"api/auth\";\r\n//import Forbidden from \"./components/Error/Forbidden\";\r\n\r\n// A wrapper for that redirects to the home\r\n// screen if you're not yet authenticated.\r\n\r\nexport default function PrivateRoute(props: PrivateRouteProps) {\r\n const { path, component, authState } = props;\r\n\r\n if (authState.currentUser === undefined) {\r\n return
    ;\r\n }\r\n // If user is not logged in\r\n if (\r\n authState.currentUser.personId === 0 &&\r\n (authState.currentUser.autentifikationId === null ||\r\n authState.currentUser.autentifikationId === \"\") &&\r\n authenticationMode === AuthenticationMode.forms\r\n ) {\r\n return (\r\n {\r\n const { pathname, search } = location;\r\n window.location.href = `${loginUrl}?returnurl=${encodeURIComponent(\r\n pathname\r\n )}${encodeURIComponent(search)}`;\r\n return (\r\n
    \r\n Sender dig til SSO for autenticering ...\r\n
    \r\n );\r\n }}\r\n />\r\n );\r\n // User is logged in, but has too low LOA\r\n } else if (\r\n authenticationMode === AuthenticationMode.forms &&\r\n authState.currentUser.loaTooLow === true\r\n ) {\r\n return (\r\n \r\n );\r\n }\r\n // If the user is logged in, but personId === 0 or state is already forbidden\r\n else if (\r\n authenticationMode === AuthenticationMode.none &&\r\n authState.currentUser.personId === 0\r\n ) {\r\n return ;\r\n } else {\r\n // Else everything is good\r\n return ;\r\n }\r\n}\r\n\r\ninterface PrivateRouteProps {\r\n exact?: boolean;\r\n path: string;\r\n component: any;\r\n authState: AuthState;\r\n}\r\n","import React, { useContext } from \"react\";\r\nimport { Redirect, Route, Switch, useHistory } from \"react-router\";\r\nimport \"ol/ol.css\";\r\nimport \"./App.scss\";\r\nimport TwoPaneLayout from \"components/layouts/TwoPaneLayout/TwoPaneLayout\";\r\nimport Map from \"components/common/Map/Map\";\r\nimport ConfigProvider from \"context/ConfigProvider\";\r\nimport AuthProvider, { AuthContext } from \"context/AuthProvider\";\r\nimport { ModalProvider } from \"components/common/Modal/Modal\";\r\nimport MapProvider from \"context/MapProvider\";\r\nimport NotFound, { Error } from \"routes/404/404\";\r\nimport { routes, routesArray } from \"routes/routesConfig\";\r\nimport ToastProvider from \"context/ToastProvider\";\r\nimport IndberetningFilterProvider from \"context/IndberetningFilterProvider\";\r\nimport PrivateRoute from \"routes/PrivateRoute\";\r\n\r\nimport { ErrorBoundary } from \"react-error-boundary\";\r\nimport { LayoutProvider } from \"context/LayoutProvider\";\r\nimport SessionTimerProvider from \"context/SessionTimerProvider\";\r\nfunction ErrorFallback({ error, resetErrorBoundary }) {\r\n return (\r\n
    \r\n {error?.response?.status === 404 ? : }\r\n\r\n
    {error.message}
    \r\n \r\n Gå tilbage\r\n \r\n
    \r\n );\r\n}\r\nfunction App() {\r\n const history = useHistory();\r\n const { authState } = useContext(AuthContext);\r\n return (\r\n
    \r\n {\r\n history.push(\"/\");\r\n }}\r\n >\r\n }>\r\n \r\n \r\n \r\n \r\n\r\n {routesArray.map(({ path, isPublic, Component }, key) => {\r\n if (isPublic) {\r\n return (\r\n \r\n );\r\n } else {\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\nconst AppWrapper = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AppWrapper;\r\n","import ReactDOM from \"react-dom\";\r\nimport \"bootstrap/dist/css/bootstrap.css\";\r\nimport \"bootstrap/dist/js/bootstrap.bundle\";\r\nimport { BrowserRouter } from \"react-router-dom\";\r\nimport reportWebVitals from \"./reportWebVitals\";\r\nimport App from \"./App\";\r\n\r\nconst base = document.getElementsByTagName(\"base\")[0];\r\nconst baseUrl = base ? base.getAttribute(\"href\") : undefined;\r\nReactDOM.render(\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":""}