{"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/ModalBetingelser.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/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","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","ModalBetingelser","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","flex","onScroll","scrollTop","slice","reverse","høringsansvarlig","rolleTypeToIndlaegType","files","FormData","append","isMine","afsluttetGST","putIndberetningSDSYS","getStednavnFeatureInfo","Kategori","KategoriServiceMapning","ChevronLeft","StednavnSagsbehandlerfunktioner","klarmeldtTilSDSYS","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","status","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","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","stednavnIndberetninger","stednavnIndberetCreate","aria-current","stednavnIndberetUpdate","stednavnIndberetDelete","kategoriRef","stednavnInputRef","tegningInputRef","nytStednavn","Object","entries","stednavnIndberetning","searchRef","findStednavnRef","testApi","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","routeSet","root","indberet","loginA","createElement","forms","setAttribute","none","setCurrentBruger","TwoPaneLayout","rightPane","shouldHidePane","queries","defaultValue","mediaQueryLists","q","matchMedia","getValue","mql","matches","setValue","addListener","removeListener","useMedia","leftPaneClassNames","rightPaneClassNames","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","exact","render","ErrorFallback","resetErrorBoundary","App","FallbackComponent","onReset","AppWrapper","StrictMode","base","getAttribute","ReactDOM","basename"],"mappings":"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","file":"static/js/main.3f30b168.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: `logout.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}logout.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: [704845, 6192783],\r\n extent: [390000, 5900000, 920000, 6600000],\r\n zoom: 4,\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\", \"navne_basis_kort\", \"trafik\"],\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: \"Adresser\" },\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: \"fipudv:Sag2\",\r\n STYLES: \"fipudv: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: \"fipudv:Sag2\",\r\n STYLES: \"fipudv: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: \"Fip 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 fipSagWmsSource.updateParams({\r\n LAYERS: \"fipudv:Sag2\",\r\n STYLES: \"fipudv: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: \"fipudv:Sag2\",\r\n STYLES: \"fipudv: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 klarmeldtTilSDSYS = 20,\r\n overførtTilSDSYS = 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}\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 },\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[3],\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) 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 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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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: \"fipudv:Sag2\",\r\n QUERY_LAYERS: \"fipudv: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: `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 SDSYS\", className: \"bg-warning\" },\r\n { id: 21, name: \"Overført til SDSYS\", 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 i kort

\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 { baseUrl } from \"api\";\r\nimport { 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 = `${baseUrl}/proxy.ashx?service=WFS&version=1.1.0&request=GetFeature&typeName=fipudv: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","export default function ModalBetingelser(props: {\r\n closeModal: (withCallback: boolean) => void;\r\n}) {\r\n const { closeModal } = props;\r\n return (\r\n
    \r\n

    \r\n En betingelse for betingelser er at betingelserne ikke er betinget men\r\n hellere tinget.\r\n

    \r\n \r\n
    \r\n );\r\n}\r\n","import ValidationErrorMessage from \"../FormElements/ValidationErrorMessage\";\r\nimport { ShowModalSignature } from \"../Modal/Modal\";\r\nimport ModalBetingelser from \"./ModalBetingelser\";\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 dit 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\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}\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 oplyse os om 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: \"point\",\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\" && (\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 const resp = await uploadFile(formData);\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 }}\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

    Metadata og det generelle overblik.

    \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 Send\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\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\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

    Sagsbehandlings journal

    \r\n

    Oversigt over sagsbehandlingen.

    \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
    \r\n {\r\n setScrollPos((e.target as any).scrollTop);\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 {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).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 });\r\n\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 )}\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 putIndberetningSDSYS = 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: \"fipudv:Sag2\",\r\n QUERY_LAYERS: \"fipudv: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: `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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) 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 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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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) Promise.reject(resp);\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 SDSYS\", className: \"bg-warning\" },\r\n { id: 21, name: \"Overført til SDSYS\", 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 { putIndberetningSDSYS } 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 SDSYS */}\r\n {indberetning.statusId === 10 && (\r\n
    • \r\n {\r\n cancelDrawingAndUploadFile();\r\n showModal({\r\n title: \"Aktiver sag i SDSYS\",\r\n content: (\r\n {\r\n putIndberetningSDSYS(\r\n currentUser.personId,\r\n statusIdEnum.klarmeldtTilSDSYS,\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 SDSYS\r\n \r\n
    • \r\n )}\r\n {/* Annuler SDSYS */}\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 putIndberetningSDSYS(\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 SDSYS\r\n \r\n
    • \r\n )}\r\n {/* Er allerede overført til SDSYS */}\r\n {indberetning.statusId === 21 && (\r\n
    • \r\n {}}\r\n >\r\n Synliggør sag overfor SDSYS (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 oplyse os om stedet, som din indberetning omhandler. Du kan indtegne det med et punkt, en linje eller en polygon.\"}\r\n {type === \"update\" &&\r\n \"I kortet til højre kan du indtegne en ændring til placeringen eller udstrækningen af stednavnet. Du kan indtegne det med et punkt, en linje eller en polygon.\"}\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(\"point\");\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\" && !fil && (\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 const resp = await uploadFile(formData);\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(\"point\");\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

    \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 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\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 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: \"Ændre 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 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 Effektiviserings (SDFE) kort.\r\n

    \r\n
    \r\n
    \r\n Mulige handlinger\r\n
    \r\n \r\n Indberet\r\n \r\n \r\n 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

    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 SDFEs 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 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 navne, \r\n 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 i feltet \"Søg\".\r\n
    • \r\n
    • \r\n Når du har indberettet et stednavn, vil det hurtigst muligt blive \r\n udstillet. For kommuner og andre offentlige styrelser, som anvender \r\n NemID med medarbejdersignatur, vil stednavnet blive udstillet umiddelbart \r\n 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 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 \r\n og Effektivisering. Danske Stednavne kan kontaktes på{\" \"}\r\n danskestednavne@sdfe.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
    Opret stednavn
    \r\n Opret et ikke-registreret stednavn i kortet.\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    Ændre stednavn
    \r\n Foretag ændring i et eksisterende stednavn.\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    Nedlæg stednavn
    \r\n Nedlæg 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

    Opret stednavn

    \r\n

    \r\n Opret 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 \r\n og vælg den 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 gerne 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 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

    Ændre stednavn

    \r\n

    \r\n Foretag ændring i 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 gerne en beskrivelse af ændringen af stednavnet og begrundelsen\r\n for 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 {\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 {/*

    Danske Stednavne

    \r\n

    Nedlæg stednavn

    \r\n */}\r\n \r\n

    Nedlæg stednavn

    \r\n

    \r\n Nedlæg eksisterede 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 Effektivisering (SDFE).\r\n

    \r\n
    \r\n
    \r\n Mulige handlinger\r\n
    \r\n \r\n Indberet\r\n \r\n \r\n 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 Effektivisering. Danske Postnumre kan kontaktes på{\" \"}\r\n danskepostnumre@sdfe.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 Effektivisering (SDFE).\r\n

    \r\n
    \r\n
    \r\n Mulige handlinger\r\n
    \r\n \r\n Indberet\r\n \r\n \r\n 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 Effektivisering. Danske Sogne kan kontaktes på{\" \"}\r\n danskesogn@sdfe.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\nexport default function Header() {\r\n const { pathname } = useLocation();\r\n const appRoot = pathname.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 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 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=\" + pathname\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\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 {\r\n \r\n \r\n \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
    \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 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 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 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 Effektivisering\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(\"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(\"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(\"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 dit 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 { baseUrl } from \"api\";\r\nimport { 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}\r\n","import React from \"react\";\r\nimport { Route } 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\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\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 }\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":""}