{"version":3,"sources":["utils/enum.ts","components/common/DialogBoxAlert.tsx","components/common/VisKommuner.tsx","components/beredskapsomrader/OmradeStatus.tsx","components/common/SearchInput.tsx","components/common/NotificationIcon.tsx","components/prester/contexts/PrestContextProvider.tsx","utils/constants.ts","services/http/HttpConfig.ts","services/http/httpService.ts","components/Pages/Unauthorized.tsx","components/common/contexts/RoleContextProvider.tsx","components/settings/SettingsMenu.tsx","utils/isIOsInStandaloneMode.ts","components/settings/KirkeLogo.tsx","components/common/Drawer.tsx","components/settings/UserInfo.tsx","components/settings/RoleViews.tsx","components/leggTilBruker/role.ts","components/settings/Logout.tsx","components/settings/desktop/DesktopView.tsx","components/settings/mobile/MobileView.tsx","components/settings/Settings.tsx","components/Layout/Header.tsx","utils/roleProvider.ts","components/serviceWorker/AlertContent.tsx","components/serviceWorker/serviceWorkerAlert.tsx","components/common/TableHeader.tsx","components/common/TableBodyWrapper.tsx","components/common/Table.tsx","components/beredskapsomrade/contexts/beredskapsomradeContext.tsx","components/prester/RemovePrestDialogBox.tsx","components/common/SettingsMenu.tsx","components/prester/prestSettingsMenu.tsx","components/beredskapsomrade/ToggleBeredskapDialogBox.tsx","components/prester/PresterTableRow.tsx","components/beredskapsomrade/BeredskapsomradeTabell.tsx","components/leggTilBruker/UserSearchInput.tsx","components/leggTilBruker/UserSearchList.tsx","components/leggTilBruker/AddUserDialogBoxContent.tsx","components/leggTilBruker/AddUserDialogBox.tsx","components/common/Breadcrumb.tsx","components/common/TilbakeButton.tsx","components/common/HideForRole.tsx","components/beredskapsomrade/prestIBeredskap.tsx","components/notifications/ToggleNotification.tsx","components/notifications/NotificationStatus.tsx","components/notifications/useNotification.ts","components/proster/KontaktpersonerIBeredskapsomradet.tsx","components/beredskapsomrade/Beredskapsomrade.tsx","components/beredskapsomrade/getBreadcrumbProps.ts","components/beredskapsomrader/BeredskapsomradeListe.tsx","components/beredskapsomrader/Beredskapsomrader.tsx","components/proster/RemoveProstDialogBox.tsx","components/proster/ProstVarslingerListe.tsx","components/proster/ProstVarslingerDialogBox.tsx","components/proster/ProstSettingsMenu.tsx","components/proster/ProsterListe.tsx","components/proster/Proster.tsx","components/bispedomme/BispedommeStatus.tsx","components/bispedomme/Bispedomme.tsx","components/prester/KontaktListe.tsx","components/prester/PresterIBeredskapsomradetMobil.tsx","components/prester/BeredskapsomradeMedKommunerTittel.tsx","components/prester/PresterIBeredskapsomradet.tsx","components/Layout/Routes.tsx","components/Layout/App.tsx","serviceWorker.ts","store/auth/authReducer.ts","store/account/accountReducer.ts","store/prester/presterReducer.ts","store/bispedommer/bispedommerReducer.ts","store/serviceWorker/serviceWorkerReducer.ts","store/combinedReducers.ts","store/auth/types.ts","store/account/types.ts","store/prester/types.ts","store/serviceWorker/types.ts","store/bispedommer/types.ts","utils/theme.ts","authentication/AuthProvider.tsx","store/auth/authActions.ts","store/account/accountActions.ts","index.tsx","components/customHooks/useLoader.ts","services/varslinger/varslingsService.tsx","components/common/InfoBox.tsx","authentication/authConfig.ts","authentication/authModule.ts","components/common/DialogBox.tsx","components/common/contexts/UserContextProvider.tsx","components/common/Card.tsx","components/common/TelephoneNumber.tsx","components/common/Background.tsx"],"names":["roles","useStyles","makeStyles","root","display","margin","paddingRight","paddingLeft","paddingTop","paddingBottom","content","icon","textAlign","marginRight","DialogBoxAlert","feilmelding","classes","className","color","variant","visKommuner","kommuner","kommuneLimit","type","kommuneTekst","slice","map","kommune","navn","join","length","theme","iconText","marginLeft","OmradeStatus","text","ariaLabel","iconStyle","containerStyle","useTheme","isOnMobileDevice","useMediaQuery","breakpoints","down","noSsr","aria-label","input","spacing","flex","iconButton","padding","alignItems","width","borderColor","palette","common","black","white","title","marginBottom","SearchInput","handleSearch","placeholderText","searchInputTitle","useState","searchText","setSearchText","elevation","component","onSubmit","event","preventDefault","placeholder","onChange","target","value","autoFocus","id","notificationIcon","NotificationIcon","smDown","PrestContext","createContext","PrestContextProvider","children","beredskapsomrader","setBeredskapsomrader","Provider","CUSTOM_ERRORS","Object","freeze","ValidationError","NotFoundError","feilmeldinger","ingenOmraderFunnet","uventetFeil","uventetFeilProvPaNytt","alleredeLagtTil","ingenPrestIBeredskap","ingenProsterLagtTilIBispedommet","ingenPresterLagtTilIOmradet","prestErIkkeLagtTilOmrade","prostErIkkeLagtTilBispedomme","http","404","401","500","sok","finnerIngenPrest","tomtSok","upresistSok","feilmeldingerMedInput","prostErIkkeLagtTilIBispedommet","ikkeRegistertIBispedomme","sjekkEpost","forsattFeil","prostOgPrest","toastVarslinger","varselPaaIBispedommet","varselAvIBispedommet","varselPaaIBeredskapsomradet","varselAvIBeredskapsomradet","HttpConfig","token","baseUrl","headers","this","window","config","apiUrl","Authorization","defaultHttpConfig","axios","interceptors","response","use","error","clientError","status","console","log","convertToProblemDetails","problemDetailsData","errors","errormsg","values","errorMessage","handleError","Error","problemDetails","data","message","name","httpClient","create","httpCall","url","options","a","getTokenSilent","request","httpGet","method","httpPost","body","httpPut","httpDelete","marginTop","errorCodeMessage","Unauthorized","startIcon","onClick","signout","RoleContext","RoleContextProvider","role","setRole","roleList","setRoleList","ROLLE","isIOsInStandaloneMode","windowNavigator","navigator","userAgent","toLowerCase","test","standalone","imageWrapper","KirkeLogo","isOnMobile","src","alt","height","menuButtonInDrawerContainer","justifyContent","menuButtonHeader","cursor","menuButtonInDrawerWrapper","up","Drawer","isOpen","state","setState","toggleDrawer","open","key","Logo","IconButton","Button","size","endIcon","SwipeableDrawer","onOpen","onClose","anchor","Container","userInfo","fontSize","avatar","userInfoWrapper","userTitles","UserInfo","useContext","UserContext","user","userPhoto","email","useSelector","undefined","accountReducer","account","username","Avatar","Typography","telephonenumber","mobilephone","radioButtonGroup","RoleViews","rolle","setRolle","history","useHistory","FormControl","RadioGroup","i","PROST","push","PREST","handleRedirect","FormControlLabel","control","Radio","label","Role","list","listItem","listIcon","minWidth","SettingsMenu","visRoller","visOmrader","menuItems","isVisibleForUser","includes","expandedContent","List","filter","item","ListItem","button","ListItemIcon","ListItemText","primary","LogoutListItem","Logout","settingsMenu","alignSelf","DesktopView","flexDirection","flexGrow","MobileView","Divider","Settings","logo","wrapper","Header","navigateHome","AppBar","position","Toolbar","location","assign","pathname","getRoleByPriority","ADMIN","BEREDSKAPSANSVARLIG","SECURITAS","Alertcontent","handleClose","updateServiceWorker","style","data-testid","snackbar","background","main","ServiceWorkerAlert","dispatch","useDispatch","isServiceWorkerUpdated","serviceWorkerReducer","serviceWorkerUpdated","serviceWorkerRegistration","payload","Snackbar","anchorOrigin","vertical","horizontal","action","AlertContent","registrationWaiting","waiting","postMessage","addEventListener","e","reload","fontWeight","TableHeader","columns","TableHead","TableRow","header","Hidden","hideOnMobile","TableCell","path","TableBodyWrapper","TableBody","Table","BeredskapsomradeContext","BeredskapsomradeProvider","beredskapsomrade","bispedommeNavn","kommuneNr","varsel","prester","setData","updateIBeredskap","prestId","iBeredskap","oppdatertePrester","prest","previousState","removePrest","p","customToast","success","leggTilPrest","getPrestIBeredskap","RemovePrestDialogBox","omradeId","setOpen","loading","setLoading","setError","handleRemovePrest","DialogBox","handleClick","buttonText","cancelButtonText","anchorEl","setAnchorEl","aria-controls","aria-haspopup","currentTarget","keepMounted","Boolean","MenuItem","menuItemText","PrestSettingsMenu","beredskapsomrade_id","useParams","chip","dialogContent","ToggleBeredskapDialogBox","successText","warningText","handleToggleBeredskap","beredskapsomradeId","parseInt","notificationIsSent","warning","Checkbox","disabled","checked","statusColumn","moreOptions","PresterTableRow","hover","TelephoneNumber","telefonnummer","Chip","float","fontStyle","BeredskapsomradeTabell","sortAsc","setSortAsc","handleSort","sortedPrester","sort","b","localeCompare","reverse","TableSortLabel","active","direction","UserSearchInput","searchResultsUser","searchResults","count","limit","secondary","dark","borderRadius","UserSearchList","selectedId","handleItemClick","handleChangeRadio","selected","textDecoration","limitText","AddUserDialogBoxContent","clearSelected","setSearchResults","toUpperCase","substring","result","users","LinearProgress","AddUserDialogBox","leggTil","initialState","azureAdId","mobilePhone","setSelected","setSelectedId","area","handleLeggTil","areapath","disableButton","toString","link","Breadcrumb","paths","pathName","handleKeyPress","Breadcrumbs","Link","tabIndex","onKeyPress","tilbake","TilbakeButton","linkTo","to","HideForRole","currentUserRole","condition","flexWrap","PrestIBeredskap","formControll","ToggleNotification","notification","Switch","labelPlacement","varsling","NotificationStatus","useNotification","initialValue","setNotification","loadingNotification","setLoadingNotification","useEffect","putVarselParameters","putUrl","putBody","handleToggleNotification","toastText","userId","bispedommeId","topWrapper","mainTitle","statusDiv","presterHeader","Beredskapsomrade","bispedomme_id","useLoader","then","res","prestIBeredskap","breadcrumbProps","getBreadcrumbPropsByRole","Background","Card","InfoBox","container","nameWrapper","flexFlow","nextIcon","errorIcon","fill","errorContent","maxWidth","warningIcon","warningContent","successIcon","successContent","prestIBerdskapMobil","BeredskapsomradeListe","beredskapsInfo","handleClickListItem","nameOfPrestIBeredskap","currentBeredskapInfo","find","info","presterIBeredskap","antallPresterIBeredskap","disableGutters","divider","allignItems","beredskapsOmraderText","statusOversiktText","Beredskapsomrader","currentPath","useLocation","RemoveProstDialogBox","prost","removeProst","handleRemoveProst","toggleSwitch","ProstVarslingerListe","beredskapsomradeName","index","newData","handleToggle","ProstVarslingerDialogBox","handleUpdateVarsler","BispedommeId","ProstSettingsMenu","openRemoveProst","setOpenRemoveProst","openVarslinger","setOpenVarslinger","ProsterListe","proster","sortedProster","Proster","setProster","prostId","okicon","warningicon","BispedommeStatus","antallOmrader","antallOmraderMedUgyldigStatus","omrade","Bispedomme","bispedomme","presterIBeredskapError","flexstyle","colortext","invchip","telefonnr","Kontaktliste","kontaktpersoner","tittel","erPrest","sortedKontakter","kontaktperson","href","number","PresterIBeredskapsomradetMobil","personer","x","BeredskapsomradeMedKommunerTittel","PresterIBeredskapsomradet","beredans","beredansMobile","KontaktpersonerIBeredskapsomradet","beredansListe","roleId","beredskapsansvarlig","prosteListe","SecuritasPage","lazy","BeredskapsansvarligPage","PrestPage","NotFound","ProstPage","Routes","from","exact","getPaths","fallback","App","tokenModel","JSON","parse","atob","split","getToken","UserContextProvider","isLocalhost","hostname","match","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","catch","authenticated","bispedommer","serviceWorkerInitialized","rootReducer","combineReducers","authReducer","presterReducer","bispedommerReducer","store","createStore","composeWithDevTools","applyMiddleware","thunk","Kirketheme","createMuiTheme","typography","fontFamily","AuthProvider","handleRedirectPromise","login","authenticateFail","ReactDOM","render","StrictMode","ThemeProvider","CssBaseline","document","getElementById","URL","process","origin","fetch","contentType","get","indexOf","ready","unregister","checkValidServiceWorker","loadingFunction","deps","defaultProps","hideProgressBar","closeOnClick","pauseOnHover","SnackbarLayout","getIcon","toast","autoClose","closeButton","msalConfig","auth","clientId","authority","redirectUri","pwaRedirectUrl","cache","cacheLocation","storeAuthStateInCookie","system","loggerOptions","loggerCallback","level","containsPii","LogLevel","Info","Verbose","debug","Warning","warn","msalInstance","PublicClientApplication","loginRequest","scopes","apiScope","logout","loginRedirect","getAccount","acquireTokenSilent","accessToken","InteractionRequiredAuthError","acquireTokenRedirect","currentAccounts","getAllAccounts","right","top","DialogTitle","other","aria-labelledby","fullWidth","setUser","setPhoto","userPhotoResponse","userResponse","paper","numberlink","telephoneNumber","replace","cardWrapper","lg","sm","md"],"mappings":"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","file":"static/js/main.153c4530.chunk.js","sourcesContent":["export enum roles {\r\n ADMIN = \"Admin\",\r\n PREST = \"Prest\",\r\n PROST = \"Prost\",\r\n BEREDSKAPSANSVARLIG = \"Beredskapsansvarlig\",\r\n SECURITAS = \"Securitas\",\r\n UNKNOW = \"Unknown\",\r\n}\r\n","import React from \"react\";\r\nimport ErrorIcon from \"@material-ui/icons/Error\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\r\nimport Container from \"@material-ui/core/Container\";\r\n\r\ninterface Props {\r\n feilmelding: string;\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n display: \"flex\",\r\n margin: \"auto\",\r\n paddingRight: \"1.5rem\",\r\n paddingLeft: \"1.5rem\",\r\n paddingTop: \"1rem\",\r\n paddingBottom: \"1rem\",\r\n },\r\n content: {\r\n paddingRight: \"1.5rem\",\r\n paddingLeft: \"1.5rem\",\r\n display: \"flex\",\r\n },\r\n icon: {\r\n textAlign: \"center\",\r\n marginRight: 8,\r\n },\r\n}));\r\nconst DialogBoxAlert: React.FC<Props> = ({ feilmelding }) => {\r\n const classes = useStyles();\r\n return (\r\n <div className={classes.root}>\r\n <Container className={classes.content}>\r\n <ErrorIcon className={classes.icon} color=\"error\" />\r\n <Typography variant=\"body2\">{feilmelding}</Typography>\r\n </Container>\r\n </div>\r\n );\r\n};\r\n\r\nexport default DialogBoxAlert;\r\n","import React from \"react\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { Variant } from \"@material-ui/core/styles/createTypography\";\r\n\r\ninterface Kommune {\r\n navn: string;\r\n}\r\n\r\nexport const visKommuner = (\r\n kommuner: Array<Kommune>,\r\n kommuneLimit = 3,\r\n type: Variant = \"subtitle1\"\r\n) => {\r\n let kommuneTekst = kommuner\r\n .slice(0, kommuneLimit)\r\n .map((kommune) => kommune.navn)\r\n .join(\", \");\r\n\r\n if (kommuner.length > kommuneLimit) {\r\n kommuneTekst += \" ...\";\r\n }\r\n return <Typography variant={type}>{kommuneTekst}</Typography>;\r\n};\r\n","import React from \"react\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport ErrorIcon from \"@material-ui/icons/Error\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\nimport { Container } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n iconText: {\r\n marginLeft: \"0.2rem\",\r\n marginRight: \"0.2rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n text: string;\r\n ariaLabel: string;\r\n iconStyle: string;\r\n containerStyle: string;\r\n}\r\n\r\nconst OmradeStatus: React.FC<Props> = ({ text, ariaLabel, iconStyle, containerStyle }) => {\r\n const classes = useStyles();\r\n\r\n const theme = useTheme();\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n return (\r\n <>\r\n {isOnMobileDevice ? (\r\n <ErrorIcon className={iconStyle} aria-label={ariaLabel} />\r\n ) : (\r\n <Container className={containerStyle}>\r\n <ErrorIcon className={iconStyle} aria-label={ariaLabel} />\r\n <Typography\r\n variant=\"subtitle1\"\r\n className={classes.iconText}\r\n >\r\n {text}\r\n </Typography>\r\n </Container>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default OmradeStatus;\r\n","import React, { useState } from \"react\";\r\nimport InputBase from \"@material-ui/core/InputBase\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport SearchIcon from \"@material-ui/icons/Search\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n input: {\r\n marginLeft: theme.spacing(1),\r\n flex: 1,\r\n },\r\n iconButton: {\r\n padding: 10,\r\n },\r\n root: {\r\n padding: \"2px 4px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n width: \"100%\",\r\n borderColor:\r\n theme.palette.type === \"light\"\r\n ? theme.palette.common.black\r\n : theme.palette.common.white,\r\n margin: \"auto\",\r\n },\r\n title: {\r\n marginBottom: \"1.3rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n handleSearch: (searchText: string) => void;\r\n placeholderText: string;\r\n searchInputTitle?: string;\r\n}\r\n\r\nconst SearchInput: React.FC<Props> = ({\r\n handleSearch,\r\n placeholderText,\r\n searchInputTitle,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearchText(event.target.value);\r\n };\r\n\r\n const handleSubmit = (event: React.FormEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n handleSearch(searchText);\r\n };\r\n\r\n return (\r\n <>\r\n {searchInputTitle && (\r\n <Typography variant=\"h6\" className={classes.title}>\r\n {searchInputTitle}\r\n </Typography>\r\n )}\r\n <Paper\r\n elevation={0}\r\n variant=\"outlined\"\r\n component=\"form\"\r\n className={classes.root}\r\n onSubmit={handleSubmit}\r\n >\r\n <InputBase\r\n className={classes.input}\r\n placeholder={placeholderText}\r\n onChange={handleChange}\r\n value={searchText}\r\n autoFocus\r\n />\r\n <IconButton\r\n id=\"searchButton\"\r\n type=\"submit\"\r\n className={classes.iconButton}\r\n aria-label=\"search\"\r\n >\r\n <SearchIcon />\r\n </IconButton>\r\n </Paper>\r\n </>\r\n );\r\n};\r\nexport default SearchInput;\r\n","import React from \"react\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport NotificationsActiveIcon from \"@material-ui/icons/NotificationsActive\";\r\nimport Hidden from \"@material-ui/core/Hidden\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n notificationIcon: {\r\n marginRight: \"0.1rem\",\r\n marginLeft: \"2rem\", \r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginLeft: 0,\r\n },\r\n },\r\n iconText: {\r\n marginLeft: \"0.25rem\",\r\n marginRight: \"auto\",\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n },\r\n}));\r\n\r\nconst NotificationIcon: React.FC = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n <NotificationsActiveIcon\r\n className={classes.notificationIcon}\r\n color=\"disabled\"\r\n aria-label=\"Varslig er slått på.\"\r\n />\r\n <Hidden smDown>\r\n <Typography variant=\"subtitle1\" className={classes.iconText}>\r\n Varsel på\r\n </Typography>\r\n </Hidden>\r\n </>\r\n );\r\n};\r\nexport default NotificationIcon;\r\n","import React, { useState, createContext } from \"react\";\r\nimport { Beredskapsomrade } from \"../../prestSokeResultater/types\";\r\n\r\nexport type PrestContextType = {\r\n beredskapsomrader: Beredskapsomrade[];\r\n setBeredskapsomrader: (res: any) => void;\r\n};\r\n\r\nexport const PrestContext = createContext<PrestContextType | {}>({});\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const PrestContextProvider: React.FC<Props> = ({ children }) => {\r\n const [beredskapsomrader, setBeredskapsomrader] = useState<\r\n Beredskapsomrade[]\r\n >([]);\r\n return (\r\n <PrestContext.Provider\r\n value={{\r\n beredskapsomrader,\r\n setBeredskapsomrader,\r\n }}\r\n >\r\n {children}\r\n </PrestContext.Provider>\r\n );\r\n};\r\n","export const CUSTOM_ERRORS = Object.freeze({\r\n ValidationError: \"ValidationError\",\r\n NotFoundError: \"NotFoundError\"\r\n});\r\n\r\nexport const feilmeldinger = {\r\n ingenOmraderFunnet:\r\n \"Ingen områder samsvarte med søket ditt på stedsnavn/adresse.\",\r\n uventetFeil: \"Det har oppstått en uventet feil.\",\r\n uventetFeilProvPaNytt: \"Det har oppstått en uventet feil. Prøv på nytt\",\r\n alleredeLagtTil:\r\n \"har allerede blitt lagt til i beredskapsområdet, og legges ikke til på nytt.\",\r\n ingenPrestIBeredskap: \"Det er ingen prest i beredskap i dette området.\",\r\n ingenProsterLagtTilIBispedommet:\r\n \"Det er ingen proster lagt til i bispedømmet.\",\r\n ingenPresterLagtTilIOmradet: \"Det er ingen prester lagt til i området.\",\r\n prestErIkkeLagtTilOmrade: \"Du er ikke lagt til i noen beredskapsområder. Hvis du mener dette er feil, kontakt din leder.\",\r\n prostErIkkeLagtTilBispedomme: \"Du er ikke lagt til i noen bispedommer. Hvis du mener dette er feil, kontakt din leder.\",\r\n http: {\r\n 404: \"Denne siden eksisterer ikke. Sjekk om du har skrevet inn riktig addresse i addressefeltet.\",\r\n 401: `Du har ikke tilgang til denne tjenesten. Hvis du mener det er feil, prøv å refresh siden eller lukk nettleseren og prøv igjen`,\r\n 500: \"Det har oppstått en uventet feil\",\r\n },\r\n sok: {\r\n finnerIngenPrest:\r\n \"Det finnes ingen prest med dette navnet. Søk på nytt.\",\r\n tomtSok: \"Søket kan ikke være tomt. Skriv inn navnet på en prest.\",\r\n upresistSok:\r\n \"Søket ditt er for upresist og gir for mange treff. Vennligst oppgi en mer nøyaktig adresse.\",\r\n },\r\n};\r\n\r\n\r\nexport const feilmeldingerMedInput = (input:string) => {\r\n return {\r\n prostErIkkeLagtTilIBispedommet: {\r\n ikkeRegistertIBispedomme: `Du har logget inn med ${input}. Denne e-posten er ikke registrert i noen av bispedømmene i løsningen. `,\r\n sjekkEpost: `Sjekk at du har brukt riktig e-post og prøv igjen.`,\r\n forsattFeil: `Hvis du mener noe fortsatt er feil, kontakt din leder for å løse problemet. `,\r\n prostOgPrest: ` Du kan forsatt oppdatere din egen beredskapsstatus, ved å gå til menyen oppe til venstre og endre visning til \"Prest\".`,\r\n },\r\n prestErIkkeLagtTilOmrade: `Du har logget inn med ${input}. Denne e-posten er ikke registrert i noen av beredskapsområdene i løsningen. \\\r\n Sjekk at du har brukt riktig e-post og prøv igjen. \\\r\n Hvis du mener noe fortsatt er feil, kontakt din leder for å løse problemet. `,\r\n }\r\n}\r\n\r\nexport const toastVarslinger = {\r\n varselPaaIBispedommet: `Du får nå varsel fra dette bispedømmet.`,\r\n varselAvIBispedommet: `Du får ikke varsel fra dette bispedømmet.`,\r\n varselPaaIBeredskapsomradet: `Du får nå varsel fra dette beredskapsområdet.`,\r\n varselAvIBeredskapsomradet: `Du får ikke varsel fra dette beredskapsområdet.`,\r\n uventetFeil: \"Det har oppstått en uventet feil.\",\r\n};\r\n","export class HttpConfig {\r\n baseUrl: string;\r\n headers: {};\r\n\r\n constructor(token: string) {\r\n this.baseUrl = window.config.apiUrl;\r\n\r\n this.headers = {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `bearer ${token}`,\r\n };\r\n }\r\n}\r\n\r\nexport const baseUrl = window.config.apiUrl;\r\n\r\nexport const defaultHttpConfig = {\r\n baseUrl,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n};\r\n","import axios, { AxiosError, AxiosResponse, AxiosRequestConfig } from \"axios\";\r\nimport { getTokenSilent } from \"../../authentication/authModule\";\r\nimport { HttpConfig, baseUrl, defaultHttpConfig } from \"./HttpConfig\";\r\nimport { CUSTOM_ERRORS, feilmeldinger } from \"../../utils/constants\";\r\n\r\naxios.interceptors.response.use(\r\n (response: AxiosResponse): AxiosResponse => {\r\n return response;\r\n },\r\n (error) => {\r\n const clientError =\r\n error.response &&\r\n error.response.status >= 400 &&\r\n error.response.status < 500;\r\n\r\n if (error.response.status === 403) {\r\n console.log(\"Forbidden\");\r\n }\r\n if (error.response.status === 401) {\r\n console.log(\"Unauthorized\");\r\n }\r\n\r\n if (clientError) {\r\n console.log(\"Client error\");\r\n }\r\n }\r\n);\r\n\r\ninterface ProblemDetails {\r\n type: string;\r\n title: string;\r\n status: number;\r\n errors: { [key: string]: string[] };\r\n errorMessage: string;\r\n}\r\n\r\nconst convertToProblemDetails = (\r\n problemDetailsData: ProblemDetails\r\n): ProblemDetails => {\r\n const { errors } = problemDetailsData;\r\n\r\n var errormsg = Object.values(errors)[0][0];\r\n\r\n return {\r\n type: problemDetailsData.type,\r\n title: problemDetailsData.title,\r\n status: problemDetailsData.status,\r\n errors: errors,\r\n errorMessage: errormsg,\r\n };\r\n};\r\n\r\nconst handleError = (error: AxiosError) => {\r\n if (error.response) {\r\n if (error.response.status === 400) {\r\n const problemDetails = convertToProblemDetails(error.response.data);\r\n throw new ValidationError(problemDetails.errorMessage);\r\n }\r\n else if (error.response.status === 404) {\r\n const problemDetails = convertToProblemDetails(error.response.data);\r\n throw new NotFoundError(problemDetails.errorMessage);\r\n }\r\n } else {\r\n throw new Error(feilmeldinger.uventetFeil);\r\n }\r\n};\r\n\r\nclass ValidationError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = CUSTOM_ERRORS.ValidationError;\r\n }\r\n}\r\n\r\nexport class NotFoundError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = CUSTOM_ERRORS.NotFoundError;\r\n }\r\n}\r\n\r\n\r\nexport const httpClient = (config: HttpConfig = defaultHttpConfig) =>\r\n axios.create(config);\r\n\r\nexport const httpCall = async (\r\n url: string,\r\n options: AxiosRequestConfig\r\n): Promise<any> => {\r\n const token = await getTokenSilent();\r\n const config = new HttpConfig(token);\r\n\r\n try {\r\n const response = await httpClient(config).request({\r\n url: baseUrl + url,\r\n ...options,\r\n });\r\n return response.data;\r\n } catch (e) {\r\n return handleError(e);\r\n }\r\n};\r\n\r\nexport const httpGet = async (url: string): Promise<any> => {\r\n return httpCall(url, { method: \"get\" });\r\n};\r\n\r\nexport const httpPost = async (url: string, body: Object): Promise<any> => {\r\n return httpCall(url, { data: body, method: \"post\" });\r\n};\r\n\r\nexport const httpPut = async (url: string, body: Object): Promise<any> => {\r\n return httpCall(url, { data: body, method: \"put\" });\r\n};\r\n\r\nexport const httpDelete = async (url: string): Promise<any> => {\r\n return httpCall(url, { method: \"delete\" });\r\n};\r\n","import React from \"react\";\r\nimport InfoBox from \"../common/InfoBox\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport { signout } from \"../../authentication/authModule\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport { Theme } from \"@material-ui/core/styles/createMuiTheme\";\r\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\r\nimport ExitToAppIcon from \"@material-ui/icons/ExitToApp\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\n\r\ninterface Props {\r\n errorMessage?: string;\r\n}\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n marginTop: \"2rem\",\r\n textAlign: \"center\",\r\n },\r\n errorCodeMessage: {\r\n margin: \"1rem\",\r\n },\r\n}));\r\nconst Unauthorized: React.FC<Props> = ({ errorMessage }) => {\r\n const classes = useStyles();\r\n return (\r\n <Container className={classes.root}>\r\n <InfoBox\r\n message={feilmeldinger.http[401]}\r\n icon={<ErrorOutlineIcon />}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n className={classes.errorCodeMessage}\r\n >\r\n Feil av type: 401.\r\n </Typography>\r\n <Button startIcon={<ExitToAppIcon />} onClick={signout}>\r\n Logg ut\r\n </Button>\r\n </InfoBox>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default Unauthorized;\r\n","import React, { useState, createContext } from \"react\";\r\nimport { RoleType } from \"../../../utils/types\";\r\n\r\nexport type RoleContextType = {\r\n role: RoleType;\r\n roleList: RoleType[];\r\n setRole: (role: RoleType) => void;\r\n setRoleList: (roleList: RoleType[]) => void;\r\n};\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\nexport const RoleContext = createContext<RoleContextType | {}>({});\r\n\r\nexport const RoleContextProvider: React.FC<Props> = ({ children }) => {\r\n const [role, setRole] = useState<RoleType | \"Unknown\">();\r\n const [roleList, setRoleList] = useState<RoleType[]>([]);\r\n\r\n return (\r\n <RoleContext.Provider value={{ setRole, role, roleList, setRoleList }}>\r\n {children}\r\n </RoleContext.Provider>\r\n );\r\n};\r\n\r\nexport default RoleContext;\r\n","import React, { useState, useContext } from \"react\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\r\nimport ListItemText from \"@material-ui/core/ListItemText\";\r\nimport List from \"@material-ui/core/List\";\r\nimport SwapHorizIcon from \"@material-ui/icons/SwapHoriz\";\r\nimport ArrowDownIcon from \"@material-ui/icons/KeyboardArrowDownRounded\";\r\nimport ArrowUpIcon from \"@material-ui/icons/KeyboardArrowUpRounded\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport RoleViews from \"./RoleViews\";\r\n\r\nexport enum ROLLE {\r\n prest = 0,\r\n prostOgBeredskapsansvarlig = 1,\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n list: {\r\n marginTop: \"2rem\",\r\n paddingBottom: \"0rem\",\r\n },\r\n listItem: {\r\n paddingLeft: \"2rem\",\r\n },\r\n listIcon: {\r\n minWidth: \"2.5rem\",\r\n },\r\n}));\r\n\r\nconst SettingsMenu: React.FC = () => {\r\n const [state, setState] = useState({\r\n visRoller: false,\r\n visOmrader: false,\r\n });\r\n const { roleList } = useContext(RoleContext) as RoleContextType;\r\n\r\n const visRoller = () => {\r\n setState({\r\n ...state,\r\n visRoller: !state.visRoller,\r\n });\r\n };\r\n\r\n const menuItems = [\r\n {\r\n icon: <SwapHorizIcon />,\r\n label: \"Endre visning\",\r\n isVisibleForUser:\r\n roleList.includes(roles.PREST) &&\r\n roleList.includes(roles.PROST),\r\n content: (\r\n <IconButton onClick={visRoller}>\r\n {state.visRoller ? (\r\n <ArrowUpIcon id=\"arrowUp\" />\r\n ) : (\r\n <ArrowDownIcon id=\"arrowDown\" />\r\n )}\r\n </IconButton>\r\n ),\r\n expandedContent: <>{state.visRoller && <RoleViews />}</>,\r\n onClick: () => visRoller(),\r\n },\r\n ];\r\n const classes = useStyles();\r\n\r\n return (\r\n <List className={classes.list}>\r\n {menuItems\r\n .filter((i) => i.isVisibleForUser)\r\n .map((item, i) => (\r\n <div key={i}>\r\n <ListItem\r\n className={classes.listItem}\r\n onClick={item.onClick}\r\n button\r\n >\r\n <ListItemIcon className={classes.listIcon}>\r\n {item.icon}\r\n </ListItemIcon>\r\n <ListItemText primary={item.label} />\r\n {item.content || null}\r\n </ListItem>\r\n {item.expandedContent || null}\r\n </div>\r\n ))}\r\n </List>\r\n );\r\n};\r\n\r\nexport default SettingsMenu;\r\n","export const isIOsInStandaloneMode = () => {\r\n const windowNavigator: any = window.navigator;\r\n\r\n const userAgent = windowNavigator.userAgent.toLowerCase();\r\n\r\n if (/iphone|ipad|ipod/.test(userAgent)) {\r\n return \"standalone\" in windowNavigator && windowNavigator.standalone;\r\n }\r\n return false;\r\n};\r\n","import React from \"react\";\r\nimport { makeStyles, Theme, useTheme } from \"@material-ui/core/styles\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n imageWrapper: {\r\n [theme.breakpoints.down(\"sm\")]: {\r\n paddingTop: \"2rem\",\r\n paddingLeft: \"2rem\",\r\n paddingBottom: \"2rem\",\r\n },\r\n paddingTop: \"1rem\",\r\n paddingLeft: \"2rem\",\r\n },\r\n}));\r\n\r\nconst KirkeLogo: React.FC = () => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const isOnMobile = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n\r\n return (\r\n <div className={classes.imageWrapper}>\r\n <img\r\n src=\"/images/logo-kirken.svg\"\r\n alt=\"kirke logo\"\r\n width={isOnMobile ? \"70%\" : \"60%\"}\r\n height=\"auto\"\r\n />\r\n </div>\r\n );\r\n};\r\nexport default KirkeLogo;\r\n","import React, { useState } from \"react\";\r\nimport SwipeableDrawer from \"@material-ui/core/SwipeableDrawer\";\r\nimport MenuIcon from \"@material-ui/icons/Menu\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ChevronLeftIcon from \"@material-ui/icons/ChevronLeft\";\r\nimport { makeStyles, Theme, useTheme } from \"@material-ui/core/styles\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { Container } from \"@material-ui/core\";\r\nimport KirkeLogo from \"../settings/KirkeLogo\";\r\nimport Button from \"@material-ui/core/Button\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n menuButtonInDrawerContainer: {\r\n display: \"flex\",\r\n\r\n [theme.breakpoints.down(\"sm\")]: {\r\n justifyContent: \"flex-end\",\r\n },\r\n justifyContent: \"space-between\",\r\n alignItems: \"flex-start\",\r\n marginTop: \"0.5rem\",\r\n },\r\n menuButtonHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n \"&:hover\": {\r\n cursor: \"pointer\",\r\n },\r\n },\r\n menuButtonInDrawerWrapper: {\r\n [theme.breakpoints.up(\"lg\")]: {\r\n marginRight: \"2rem\",\r\n },\r\n \"&:hover\": {\r\n cursor: \"pointer\",\r\n },\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst Drawer: React.FC<Props> = ({ children }) => {\r\n const [state, setState] = useState({\r\n isOpen: false,\r\n });\r\n\r\n const handleClickOpen = () => {\r\n setState({ ...state, isOpen: !state.isOpen });\r\n };\r\n\r\n const toggleDrawer = (open: boolean) => (\r\n event: React.KeyboardEvent | React.MouseEvent\r\n ) => {\r\n if (\r\n event &&\r\n event.type === \"keydown\" &&\r\n ((event as React.KeyboardEvent).key === \"Tab\" ||\r\n (event as React.KeyboardEvent).key === \"Shift\")\r\n ) {\r\n return;\r\n }\r\n\r\n setState({ ...state, isOpen: open });\r\n };\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n\r\n const Logo = () => {\r\n return isOnMobileDevice ? <></> : <KirkeLogo />;\r\n };\r\n\r\n return (\r\n <>\r\n <div className={classes.menuButtonHeader} onClick={handleClickOpen}>\r\n {isOnMobileDevice ? (\r\n <IconButton>\r\n <MenuIcon />\r\n </IconButton>\r\n ) : (\r\n <Button size=\"large\" endIcon={<MenuIcon />} variant=\"text\">\r\n Meny\r\n </Button>\r\n )}\r\n </div>\r\n <SwipeableDrawer\r\n open={state.isOpen}\r\n onOpen={toggleDrawer(true)}\r\n onClose={toggleDrawer(false)}\r\n anchor={isOnMobileDevice ? \"left\" : \"top\"}\r\n >\r\n <Container className={classes.menuButtonInDrawerContainer}>\r\n <Logo />\r\n <div\r\n className={classes.menuButtonInDrawerWrapper}\r\n onClick={toggleDrawer(false)}\r\n >\r\n <IconButton>\r\n {isOnMobileDevice ? (\r\n <ChevronLeftIcon />\r\n ) : (\r\n <CloseIcon />\r\n )}\r\n </IconButton>\r\n </div>\r\n </Container>\r\n {children}\r\n </SwipeableDrawer>\r\n </>\r\n );\r\n};\r\n\r\nexport default Drawer;\r\n","import React, { useContext } from \"react\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport Avatar from \"@material-ui/core/Avatar\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../store/combinedReducers\";\r\nimport Telephonenumber from \"../common/TelephoneNumber\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport UserContext, {\r\n UserContextType,\r\n} from \"../common/contexts/UserContextProvider\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n userInfo: {\r\n padding: \"2rem 2rem 2rem 2rem\",\r\n },\r\n name: {\r\n marginBottom: \"1rem\",\r\n marginTop: \"1rem\",\r\n },\r\n body: {\r\n marginBottom: \"0.5rem\",\r\n fontSize: \"1rem\",\r\n },\r\n avatar: {\r\n marginBottom: \"0.5rem\",\r\n width: theme.spacing(7),\r\n height: theme.spacing(7),\r\n },\r\n userInfoWrapper: {\r\n display: \"flex\",\r\n },\r\n userTitles: {\r\n marginRight: \"1rem\",\r\n },\r\n}));\r\nconst UserInfo: React.FC = () => {\r\n const classes = useStyles();\r\n const { role } = useContext(RoleContext) as RoleContextType;\r\n const { user, userPhoto } = useContext(UserContext) as UserContextType;\r\n\r\n const email = useSelector((state: RootState) => {\r\n if (state.accountReducer.account !== undefined) {\r\n return state.accountReducer.account.username;\r\n } else {\r\n return \"\";\r\n }\r\n });\r\n\r\n return (\r\n <div className={classes.userInfo}>\r\n <Avatar\r\n className={classes.avatar}\r\n src={`data:image/jpeg;base64, ${userPhoto}`}\r\n />\r\n <Typography variant=\"h5\" className={classes.name}>\r\n {user?.name}\r\n </Typography>\r\n <div className={classes.userInfoWrapper}>\r\n <div className={classes.userTitles}>\r\n <Typography className={classes.body}>Din rolle:</Typography>\r\n <Typography className={classes.body}>E-post:</Typography>\r\n <Typography className={classes.body}>Telefon:</Typography>\r\n </div>\r\n <div>\r\n <Typography className={classes.body}>{role}</Typography>\r\n <Typography className={classes.body}>{email}</Typography>\r\n <Typography className={classes.body}>\r\n <Telephonenumber telephonenumber={user?.mobilephone} />\r\n </Typography>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default UserInfo;\r\n","import React, { useContext, useState } from \"react\";\r\nimport Radio from \"@material-ui/core/Radio\";\r\nimport RadioGroup from \"@material-ui/core/RadioGroup\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\nimport FormControl from \"@material-ui/core/FormControl\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n radioButtonGroup: {\r\n marginLeft: \"4.3rem\",\r\n },\r\n}));\r\n\r\nconst RoleViews: React.FC = () => {\r\n const [rolle, setRolle] = useState(\"prest\");\r\n\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const { roleList, setRole } = useContext(RoleContext) as RoleContextType;\r\n const handleChangeRadio = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setRolle(event.target.value);\r\n };\r\n const handleRedirect = (role: any) => {\r\n if (role === roles.PROST) {\r\n setRole(roles.PROST);\r\n history.push(\"/bispedommer\");\r\n }\r\n\r\n if (role === roles.PREST) {\r\n setRole(roles.PREST);\r\n history.push(\"/prest\");\r\n }\r\n };\r\n return (\r\n <FormControl>\r\n <RadioGroup\r\n className={classes.radioButtonGroup}\r\n aria-label=\"rolle\"\r\n name=\"rolle\"\r\n value={rolle}\r\n onChange={handleChangeRadio}\r\n >\r\n {roleList.map((role, i) => (\r\n <div onClick={() => handleRedirect(role)} key={i}>\r\n <FormControlLabel\r\n control={<Radio color=\"primary\" />}\r\n label={role}\r\n value={role}\r\n />\r\n </div>\r\n ))}\r\n </RadioGroup>\r\n </FormControl>\r\n );\r\n};\r\n\r\nexport default RoleViews;\r\n","export enum Role {\r\n PREST = \"prest\",\r\n PROST = \"prost\"\r\n}\r\n","import React from \"react\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\r\nimport ListItemText from \"@material-ui/core/ListItemText\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport ExitToAppIcon from \"@material-ui/icons/ExitToApp\";\r\nimport { signout } from \"../../authentication/authModule\";\r\nimport List from \"@material-ui/core/List\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n listItem: {\r\n paddingLeft: \"2rem\",\r\n marginBottom: \"1rem\",\r\n },\r\n listIcon: {\r\n minWidth: \"2.5rem\",\r\n },\r\n}));\r\n\r\nexport const LogoutListItem: React.FC = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <ListItem button className={classes.listItem} onClick={signout}>\r\n <ListItemIcon className={classes.listIcon}>\r\n <ExitToAppIcon />\r\n </ListItemIcon>\r\n <ListItemText primary={\"Logg ut\"} />\r\n </ListItem>\r\n );\r\n};\r\nconst Logout: React.FC = () => {\r\n return (\r\n <List>\r\n <LogoutListItem />\r\n </List>\r\n );\r\n};\r\nexport default Logout;\r\n","import React from \"react\";\r\nimport UserInfo from \"../UserInfo\";\r\nimport SettingsMenu from \"../SettingsMenu\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport Logout from \"../Logout\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n height: \"100%\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n },\r\n settingsMenu: {\r\n alignSelf: \"center\",\r\n paddingRight: \"2rem\",\r\n },\r\n}));\r\n\r\nconst DesktopView: React.FC = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <Container className={classes.root}>\r\n <UserInfo />\r\n <div className={classes.settingsMenu}>\r\n <SettingsMenu />\r\n <Logout />\r\n </div>\r\n </Container>\r\n );\r\n};\r\n\r\nexport default DesktopView;\r\n","import React from \"react\";\r\nimport UserInfo from \"../UserInfo\";\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport SettingsMenu from \"../SettingsMenu\";\r\nimport Logout from \"../Logout\";\r\nimport KirkeLogo from \"../KirkeLogo\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n content: {\r\n flexGrow: 1,\r\n },\r\n list: {\r\n width: \"18rem\",\r\n },\r\n}));\r\n\r\nconst MobileView: React.FC = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <div role=\"presentation\" className={classes.root}>\r\n <div className={classes.content}>\r\n <UserInfo />\r\n <br></br>\r\n <Divider />\r\n\r\n <SettingsMenu />\r\n </div>\r\n <Logout />\r\n <Divider />\r\n <KirkeLogo />\r\n </div>\r\n );\r\n};\r\n\r\nexport default MobileView;\r\n","import React from \"react\";\r\nimport { useTheme } from \"@material-ui/core/styles\";\r\nimport DesktopView from \"./desktop/DesktopView\";\r\nimport MobileView from \"./mobile/MobileView\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\n\r\nconst Settings: React.FC = () => {\r\n const theme = useTheme();\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n\r\n return <>{isOnMobileDevice ? <MobileView /> : <DesktopView />}</>;\r\n};\r\n\r\nexport default Settings;\r\n","import React from \"react\";\r\nimport AppBar from \"@material-ui/core/AppBar\";\r\nimport Toolbar from \"@material-ui/core/Toolbar\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport SyncRoundedIcon from \"@material-ui/icons/SyncRounded\";\r\nimport { isIOsInStandaloneMode } from \"../../utils/isIOsInStandaloneMode\";\r\nimport Drawer from \"../common/Drawer\";\r\nimport Settings from \"../settings/Settings\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { Container } from \"@material-ui/core\";\r\nimport { makeStyles, Theme, useTheme } from \"@material-ui/core/styles\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n logo: {\r\n cursor: \"pointer\",\r\n paddingLeft: \"1rem\",\r\n },\r\n wrapper: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n },\r\n}));\r\n\r\nconst Header: React.FC = () => {\r\n const classes = useStyles();\r\n\r\n const refreshPage = () => {\r\n window.location.assign(window.location.pathname);\r\n };\r\n const theme = useTheme();\r\n const isOnMobile = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n const history = useHistory();\r\n\r\n const navigateHome = () => {\r\n history.push(\"/\");\r\n };\r\n\r\n const Logo: React.FC = () => {\r\n if (isOnMobile || isIOsInStandaloneMode()) {\r\n return <></>;\r\n }\r\n return (\r\n <img\r\n className={classes.logo}\r\n src=\"/images/logo-kirken.svg\"\r\n alt=\"kirke logo\"\r\n width=\"180px\"\r\n height=\"auto\"\r\n onClick={navigateHome}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <AppBar\r\n elevation={0}\r\n position=\"static\"\r\n color=\"inherit\"\r\n className={classes.root}\r\n >\r\n <Container>\r\n <Toolbar className={classes.wrapper}>\r\n <Logo />\r\n {isIOsInStandaloneMode() && (\r\n <Button\r\n endIcon={<SyncRoundedIcon />}\r\n onClick={refreshPage}\r\n >\r\n Oppdater status\r\n </Button>\r\n )}\r\n <Drawer>\r\n <Settings />\r\n </Drawer>\r\n </Toolbar>\r\n </Container>\r\n </AppBar>\r\n );\r\n};\r\n\r\nexport default Header;\r\n","import { TokenType } from \"../utils/types\";\r\nimport { roles } from \"./enum\";\r\n\r\nexport const getRoleByPriority = (token: TokenType) => {\r\n if (token.roles.includes(roles.ADMIN)) {\r\n return roles.ADMIN;\r\n }\r\n if (token.roles.includes(roles.BEREDSKAPSANSVARLIG)) {\r\n return roles.BEREDSKAPSANSVARLIG;\r\n }\r\n if (token.roles.includes(roles.PROST)) {\r\n return roles.PROST;\r\n }\r\n if (token.roles.includes(roles.PREST)) {\r\n return roles.PREST;\r\n }\r\n if (token.roles.includes(roles.SECURITAS)) {\r\n return roles.SECURITAS;\r\n }\r\n return \"Unknown\";\r\n};\r\n","import React from \"react\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n button: {\r\n marginRight: \"1rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n handleClose: () => void;\r\n updateServiceWorker: () => void;\r\n}\r\nconst Alertcontent: React.FC<Props> = ({\r\n handleClose,\r\n updateServiceWorker,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <div>\r\n <Button\r\n size=\"small\"\r\n className={classes.button}\r\n style={{ color: \"#A4C6FF\" }}\r\n onClick={updateServiceWorker}\r\n >\r\n Oppdater\r\n </Button>\r\n <IconButton\r\n data-testid=\"closeButton\"\r\n size=\"small\"\r\n color=\"inherit\"\r\n aria-label=\"lukk\"\r\n onClick={handleClose}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Alertcontent;\r\n","import React from \"react\";\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { RootState } from \"../../store/combinedReducers\";\r\nimport Snackbar from \"@material-ui/core/Snackbar\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport AlertContent from \"./AlertContent\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n snackbar: {\r\n background: theme.palette.primary.main,\r\n },\r\n}));\r\n\r\nconst ServiceWorkerAlert = () => {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n\r\n const isServiceWorkerUpdated = useSelector(\r\n (state: RootState) => state.serviceWorkerReducer.serviceWorkerUpdated\r\n );\r\n\r\n const serviceWorkerRegistration = useSelector(\r\n (state: RootState) =>\r\n state.serviceWorkerReducer.serviceWorkerRegistration\r\n );\r\n\r\n const updateServiceWorker = () => {\r\n const registrationWaiting = serviceWorkerRegistration.waiting;\r\n if (registrationWaiting) {\r\n registrationWaiting.postMessage({ type: \"SKIP_WAITING\" });\r\n\r\n registrationWaiting.addEventListener(\"statechange\", (e: any) => {\r\n if (e.target.state === \"activated\") {\r\n window.location.reload();\r\n }\r\n });\r\n } else {\r\n window.location.reload();\r\n }\r\n };\r\n\r\n const handleClose = () => {\r\n dispatch({ type: \"SW_UPDATE\", payload: {} });\r\n };\r\n\r\n return (\r\n <div>\r\n {isServiceWorkerUpdated && (\r\n <Snackbar\r\n className={classes.snackbar}\r\n message=\"En ny oppdatering er tilgjengelig. Du blir ikke logget ut.\"\r\n anchorOrigin={{ vertical: \"top\", horizontal: \"center\" }}\r\n open={isServiceWorkerUpdated}\r\n onClose={handleClose}\r\n action={\r\n <AlertContent\r\n handleClose={handleClose}\r\n updateServiceWorker={updateServiceWorker}\r\n />\r\n }\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\nexport default ServiceWorkerAlert;\r\n","import React from \"react\";\r\nimport TableHead from \"@material-ui/core/TableHead\";\r\nimport TableCell from \"@material-ui/core/TableCell\";\r\nimport TableRow from \"@material-ui/core/TableRow\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { Column } from \"./types\";\r\nimport Hidden from \"@material-ui/core/Hidden\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n fontWeight: 700,\r\n },\r\n}));\r\n\r\ninterface Props {\r\n columns: Column[];\r\n}\r\n\r\nconst TableHeader: React.FC<Props> = ({ columns }) => {\r\n const classes = useStyles();\r\n return (\r\n <TableHead>\r\n <TableRow>\r\n {columns.map((header, i) => (\r\n <Hidden key={i} smDown={header.hideOnMobile}>\r\n <TableCell key={header.path} className={classes.root}>\r\n {header.content && header.content()}\r\n {header.label}\r\n </TableCell>\r\n </Hidden>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n );\r\n};\r\n\r\nexport default TableHeader;\r\n","import React from \"react\";\r\nimport TableBodyMUI from \"@material-ui/core/TableBody\";\r\n\r\ninterface Props {\r\n data: Array<any>;\r\n children: (item: any, key: number) => React.ReactNode;\r\n}\r\n\r\nconst TableBodyWrapper: React.FC<Props> = ({ data, children }) => {\r\n return (\r\n <TableBodyMUI>\r\n {data.map((item: any, key: number) => children(item, key))}\r\n </TableBodyMUI>\r\n );\r\n};\r\n\r\nexport default TableBodyWrapper;\r\n","import React from \"react\";\r\nimport TableMUI from \"@material-ui/core/Table\";\r\nimport TableHeader from \"./TableHeader\";\r\nimport { Column } from \"./types\";\r\nimport TableBodyWrapper from \"../common/TableBodyWrapper\";\r\n\r\ninterface Props {\r\n columns: Column[];\r\n data: Array<any>;\r\n children: (item: any, key: number) => React.ReactNode;\r\n}\r\n\r\nconst Table: React.FC<Props> = ({ columns, data, children }) => {\r\n return (\r\n <TableMUI>\r\n <TableHeader columns={columns} />\r\n <TableBodyWrapper data={data}>\r\n {(item: any, key: number) => children(item, key)}\r\n </TableBodyWrapper>\r\n </TableMUI>\r\n );\r\n};\r\n\r\nexport default Table;\r\n","import React, { useState, createContext } from \"react\";\r\nimport { Prest } from \"../../../store/prester/types\";\r\nimport { customToast } from \"../../../services/varslinger/varslingsService\";\r\n\r\nexport type BeredskapsContextType = {\r\n data: any;\r\n updateIBeredskap: (prestId: number, iBeredskap: boolean) => void;\r\n removePrest: (prestId: number) => void;\r\n setData: (res: any) => void;\r\n leggTilPrest: (prest: Prest) => void;\r\n getPrestIBeredskap: () => Prest[];\r\n};\r\n\r\nexport const BeredskapsomradeContext = createContext<\r\n BeredskapsContextType | {}\r\n>({});\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const BeredskapsomradeProvider: React.FC<Props> = ({ children }) => {\r\n const [data, setData] = useState({\r\n beredskapsomrade: {\r\n id: 0,\r\n bispedommeNavn: \"\",\r\n navn: \"\",\r\n kommuner: [\r\n {\r\n navn: \"\",\r\n kommuneNr: \"\",\r\n },\r\n ],\r\n varsel: undefined,\r\n },\r\n prester: [] as Prest[],\r\n });\r\n\r\n const removePrest = (prestId: number) => {\r\n setData((previousState) => ({\r\n ...previousState,\r\n prester: previousState.prester.filter(\r\n (p: Prest) => p.id !== prestId\r\n ),\r\n }));\r\n customToast.success(\"Prest ble fjernet fra området.\");\r\n };\r\n\r\n const leggTilPrest = (prest: Prest) => {\r\n setData((previousState) => ({\r\n ...previousState,\r\n prester: [...previousState.prester, prest],\r\n }));\r\n customToast.success(\"Prest ble lagt til i området.\");\r\n };\r\n\r\n const updateIBeredskap = (prestId: number, iBeredskap: boolean) => {\r\n const oppdatertePrester = data.prester.map((prest) =>\r\n prest.id === prestId ? { ...prest, iBeredskap } : prest\r\n );\r\n setData((previousState) => ({\r\n ...previousState,\r\n prester: oppdatertePrester,\r\n }));\r\n };\r\n\r\n const getPrestIBeredskap = () => {\r\n return data.prester.filter((p) => p.iBeredskap);\r\n };\r\n\r\n return (\r\n <BeredskapsomradeContext.Provider\r\n value={{\r\n data,\r\n setData,\r\n updateIBeredskap,\r\n removePrest,\r\n leggTilPrest,\r\n getPrestIBeredskap,\r\n }}\r\n >\r\n {children}\r\n </BeredskapsomradeContext.Provider>\r\n );\r\n};\r\n","import React, { useContext, useState } from \"react\";\r\nimport DialogBox from \"../common/DialogBox\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport { Prest } from \"../../store/prester/types\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport { httpDelete } from \"../../services/http/httpService\";\r\nimport {\r\n BeredskapsomradeContext,\r\n BeredskapsContextType,\r\n} from \"../beredskapsomrade/contexts/beredskapsomradeContext\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\n\r\ninterface Props {\r\n omradeId: string;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n prest: Prest;\r\n}\r\n\r\nconst RemovePrestDialogBox: React.FC<Props> = ({\r\n omradeId,\r\n open,\r\n setOpen,\r\n prest,\r\n}) => {\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n\r\n const { removePrest } = useContext(\r\n BeredskapsomradeContext\r\n ) as BeredskapsContextType;\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n setError(null);\r\n };\r\n\r\n const handleRemovePrest = async () => {\r\n setLoading(true);\r\n try {\r\n await httpDelete(\r\n `api/Beredskapsomrader/${omradeId}/prest/${prest.id}`\r\n );\r\n\r\n removePrest(prest.id);\r\n setError(null);\r\n setOpen(false);\r\n } catch (e) {\r\n setError(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <DialogBox\r\n handleClick={handleRemovePrest}\r\n title=\"\"\r\n buttonText={prest.iBeredskap ? \"\" : \"Fjern\"}\r\n cancelButtonText={prest.iBeredskap ? \"OK\" : \"Avbryt\"}\r\n open={open}\r\n handleClose={handleClose}\r\n loading={loading}\r\n error={error ? feilmeldinger.uventetFeilProvPaNytt : \"\"}\r\n >\r\n <Container>\r\n {prest.iBeredskap ? (\r\n <Typography variant=\"h6\">\r\n Du kan ikke fjerne en prest som er i aktiv\r\n beredskap. Sett {prest.navn} av beredskap først, og\r\n så kan du slette presten fra beredskapsområdet.\r\n </Typography>\r\n ) : (\r\n <Typography variant=\"h6\">\r\n Er du sikker på at du vil fjerne {prest.navn} fra\r\n beredskapsområdet?\r\n </Typography>\r\n )}\r\n </Container>\r\n </DialogBox>\r\n </>\r\n );\r\n};\r\nexport default RemovePrestDialogBox;\r\n","import React, { useState } from \"react\";\r\nimport MoreVertIcon from \"@material-ui/icons/MoreVert\";\r\nimport { IconButton, Menu, MenuItem } from \"@material-ui/core\";\r\n\r\ninterface Props {\r\n menuItems: MenuItem[];\r\n}\r\n\r\nexport type MenuItem = {\r\n menuItemText: string;\r\n setOpen: (open: boolean) => void;\r\n};\r\n\r\nconst SettingsMenu: React.FC<Props> = ({ menuItems }) => {\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n return (\r\n <>\r\n <IconButton\r\n aria-label=\"settings\"\r\n aria-controls=\"settings-menu\"\r\n aria-haspopup=\"true\"\r\n onClick={handleClick}\r\n >\r\n <MoreVertIcon />\r\n </IconButton>\r\n\r\n <Menu\r\n id=\"settings-menu\"\r\n anchorEl={anchorEl}\r\n keepMounted\r\n open={Boolean(anchorEl)}\r\n onClose={handleClose}\r\n >\r\n {menuItems.map((item, i) => (\r\n <MenuItem\r\n onClick={() => {\r\n handleClose();\r\n item.setOpen(true);\r\n }}\r\n key={i}\r\n >\r\n {item.menuItemText}\r\n </MenuItem>\r\n ))}\r\n </Menu>\r\n </>\r\n );\r\n};\r\n\r\nexport default SettingsMenu;\r\n","import React, { useState } from \"react\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { Prest } from \"../../store/prester/types\";\r\nimport RemovePrestDialogBox from \"./RemovePrestDialogBox\";\r\nimport SettingsMenu from \"../common/SettingsMenu\";\r\n\r\ninterface Props {\r\n prest: Prest;\r\n}\r\n\r\ninterface ParamTypes {\r\n beredskapsomrade_id: string;\r\n}\r\n\r\nconst PrestSettingsMenu: React.FC<Props> = ({ prest }) => {\r\n const { beredskapsomrade_id } = useParams<ParamTypes>();\r\n const [open, setOpen] = useState(false);\r\n\r\n return (\r\n <>\r\n <SettingsMenu\r\n menuItems={[\r\n {\r\n menuItemText: \"Fjern prest fra området\",\r\n setOpen: setOpen,\r\n },\r\n ]}\r\n />\r\n\r\n <RemovePrestDialogBox\r\n omradeId={beredskapsomrade_id}\r\n open={open}\r\n setOpen={setOpen}\r\n prest={prest}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default PrestSettingsMenu;\r\n","import React, { useState, useContext } from \"react\";\r\nimport DialogBox from \"../common/DialogBox\";\r\nimport { httpPut } from \"../../services/http/httpService\";\r\nimport {\r\n BeredskapsomradeContext,\r\n BeredskapsContextType,\r\n} from \"../beredskapsomrade/contexts/beredskapsomradeContext\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { Prest } from \"../../store/prester/types\";\r\nimport { customToast } from \"../../services/varslinger/varslingsService\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport Checkbox from \"@material-ui/core/Checkbox\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n chip: {\r\n background: \"#F4D150\",\r\n color: theme.palette.common.black,\r\n },\r\n dialogContent: {\r\n marginTop: \"16px\",\r\n marginBottom: \"16px\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n prest: Prest;\r\n}\r\n\r\ninterface ParamTypes {\r\n beredskapsomrade_id: string;\r\n}\r\n\r\nconst ToggleBeredskapDialogBox: React.FC<Props> = ({ prest }) => {\r\n const [open, setOpen] = useState<boolean>(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const { iBeredskap } = prest;\r\n const { updateIBeredskap } = useContext(\r\n BeredskapsomradeContext\r\n ) as BeredskapsContextType;\r\n const classes = useStyles();\r\n\r\n const { beredskapsomrade_id } = useParams<ParamTypes>();\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const successText = iBeredskap\r\n ? \"Prest er satt av beredskap, og har fått beskjed på SMS\"\r\n : \"Prest er satt i beredskap, og har fått beskjed på SMS\";\r\n const warningText = iBeredskap\r\n ? \"Prest er satt av beredskap, men har ikke har fått beskjed på SMS\"\r\n : \"Prest er satt i beredskap, men har ikke har fått beskjed på SMS\";\r\n\r\n const handleToggleBeredskap = async () => {\r\n setLoading(true);\r\n\r\n try {\r\n const response = await httpPut(\r\n `api/Beredskapsomrader/${beredskapsomrade_id}/prest`,\r\n {\r\n prestId: prest.id,\r\n beredskapsomradeId: parseInt(beredskapsomrade_id),\r\n iBeredskap: !iBeredskap,\r\n }\r\n );\r\n\r\n updateIBeredskap(prest.id, response.iBeredskap);\r\n\r\n response.notificationIsSent\r\n ? customToast.success(successText)\r\n : customToast.warning(warningText);\r\n } catch (e) {\r\n customToast.error(feilmeldinger.uventetFeil);\r\n } finally {\r\n setLoading(false);\r\n setOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Checkbox\r\n id=\"toggleBeredskap\"\r\n disabled={loading}\r\n color=\"primary\"\r\n checked={iBeredskap}\r\n onChange={() => setOpen(true)}\r\n value={iBeredskap}\r\n />\r\n <DialogBox\r\n open={open}\r\n handleClick={handleToggleBeredskap}\r\n title=\"\"\r\n buttonText=\"Ja\"\r\n loading={loading}\r\n handleClose={handleClose}\r\n >\r\n <Typography variant=\"h6\" className={classes.dialogContent}>\r\n {`Er du sikker på at du vil sette ${prest.navn} ${\r\n iBeredskap ? \"av\" : \"i\"\r\n } beredskap?`}\r\n </Typography>\r\n </DialogBox>\r\n </>\r\n );\r\n};\r\nexport default ToggleBeredskapDialogBox;\r\n","import React, { useContext } from \"react\";\r\nimport TableRow from \"@material-ui/core/TableRow\";\r\nimport TableCell from \"@material-ui/core/TableCell\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport Chip from \"@material-ui/core/Chip\";\r\nimport Hidden from \"@material-ui/core/Hidden\";\r\nimport { Prest } from \"../../store/prester/types\";\r\nimport PrestSettingsMenu from \"./prestSettingsMenu\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport TelephoneNumber from \"../common/TelephoneNumber\";\r\nimport ToggleBeredskapDialogBox from \"../beredskapsomrade/ToggleBeredskapDialogBox\";\r\n\r\ninterface Props {\r\n prest: Prest;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n chip: {\r\n background: \"#43a047\",\r\n color: theme.palette.common.black,\r\n },\r\n statusColumn: {\r\n width: 327,\r\n },\r\n errorMessage: {\r\n color: theme.palette.error.main,\r\n },\r\n moreOptions: {\r\n textAlign: \"end\",\r\n },\r\n}));\r\n\r\nconst PresterTableRow: React.FC<Props> = ({ prest }) => {\r\n const { iBeredskap } = prest;\r\n const { role } = useContext(RoleContext) as RoleContextType;\r\n const classes = useStyles();\r\n\r\n return (\r\n <TableRow hover>\r\n <TableCell>{prest.navn}</TableCell>\r\n <Hidden smDown>\r\n <TableCell>\r\n <TelephoneNumber telephonenumber={prest.telefonnummer} />\r\n </TableCell>\r\n </Hidden>\r\n <TableCell>\r\n <ToggleBeredskapDialogBox prest={prest} />\r\n </TableCell>\r\n <Hidden smDown>\r\n <TableCell className={classes.statusColumn}>\r\n {iBeredskap && (\r\n <Chip label=\"I BEREDSKAP\" className={classes.chip} />\r\n )}\r\n </TableCell>\r\n </Hidden>\r\n {role !== roles.PROST && (\r\n <TableCell className={classes.moreOptions}>\r\n <PrestSettingsMenu prest={prest} />\r\n </TableCell>\r\n )}\r\n </TableRow>\r\n );\r\n};\r\n\r\nexport default PresterTableRow;\r\n","import React, { useContext, useState } from \"react\";\r\nimport Tabell from \"../common/Table\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { Prest } from \"../../store/prester/types\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport PresterTableRow from \"../prester/PresterTableRow\";\r\nimport TableSortLabel from \"@material-ui/core/TableSortLabel\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n icon: {\r\n float: \"right\",\r\n },\r\n message: {\r\n marginBottom: \"1rem\",\r\n marginTop: \"1rem\",\r\n fontStyle: \"italic\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n prester: Prest[];\r\n}\r\n\r\nconst BeredskapsomradeTabell: React.FC<Props> = ({ prester }) => {\r\n const classes = useStyles();\r\n const { role } = useContext(RoleContext) as RoleContextType;\r\n\r\n const [sortAsc, setSortAsc] = useState(true);\r\n const handleSort = () => {\r\n setSortAsc(!sortAsc);\r\n };\r\n\r\n const sortedPrester = sortAsc\r\n ? [...prester].sort((a, b) => a.navn.localeCompare(b.navn))\r\n : [...prester].sort((a, b) => a.navn.localeCompare(b.navn)).reverse();\r\n\r\n const columns = [\r\n {\r\n path: \"navn\",\r\n label: \"Prest\",\r\n content: () => (\r\n <TableSortLabel\r\n active={true}\r\n direction={sortAsc ? \"asc\" : \"desc\"}\r\n onClick={handleSort}\r\n />\r\n ),\r\n },\r\n {\r\n path: \"telefonnummer\",\r\n label: \"Telefonnummer\",\r\n hideOnMobile: true,\r\n },\r\n {\r\n path: \"\",\r\n label: \"Beredskap\",\r\n },\r\n {\r\n path: \"status\",\r\n label: \"Status\",\r\n hideOnMobile: true,\r\n },\r\n ];\r\n\r\n if (role === roles.ADMIN || role === roles.BEREDSKAPSANSVARLIG) {\r\n columns.push({\r\n path: \"\",\r\n label: \"\",\r\n });\r\n }\r\n\r\n return (\r\n <>\r\n {prester.length > 0 ? (\r\n <Tabell columns={columns} data={sortedPrester}>\r\n {(item: any, key: number) => (\r\n <PresterTableRow prest={item} key={key} />\r\n )}\r\n </Tabell>\r\n ) : (\r\n <p className={classes.message}>\r\n {feilmeldinger.ingenPresterLagtTilIOmradet}\r\n </p>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default BeredskapsomradeTabell;\r\n","import React from \"react\";\r\nimport SearchInput from \"../common/SearchInput\";\r\nimport { Role } from \"./role\";\r\nimport DialogBoxAlert from \"../common/DialogBoxAlert\";\r\nimport { User, UserSearchResponse } from \"../types\";\r\n\r\ninterface Props {\r\n role: Role;\r\n handleSearch: (searchText: string) => void;\r\n searchResultsUser: User[] | undefined;\r\n error: Error | undefined;\r\n loading: boolean;\r\n searchResults: UserSearchResponse | undefined;\r\n}\r\n\r\nconst UserSearchInput: React.FC<Props> = ({\r\n role,\r\n handleSearch,\r\n searchResultsUser,\r\n error,\r\n loading,\r\n searchResults,\r\n}) => {\r\n return (\r\n <>\r\n <SearchInput\r\n handleSearch={handleSearch}\r\n placeholderText={`Søk etter ${role} (fornavn etternavn)`}\r\n />\r\n\r\n {searchResultsUser?.length === 0 && !error && !loading && (\r\n <DialogBoxAlert\r\n feilmelding={`Det finnes ingen ${role} med dette navnet. Søk på nytt.`}\r\n />\r\n )}\r\n\r\n {error && (\r\n <DialogBoxAlert\r\n feilmelding={`Søket kan ikke være tomt. Skriv inn navnet på en ${role}.`}\r\n />\r\n )}\r\n\r\n {searchResults &&\r\n searchResults.count > searchResults.limit &&\r\n !error &&\r\n !loading && (\r\n <p>\r\n Resultatet viser de {searchResults.limit} første {role}\r\n ene fra søket. Hvis du ikke finner {role}en du leter\r\n etter må du presisere søket.\r\n </p>\r\n )}\r\n </>\r\n );\r\n};\r\nexport default UserSearchInput;\r\n","import React from \"react\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport List from \"@material-ui/core/List\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport Radio from \"@material-ui/core/Radio\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { User } from \"../types\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n navn: {\r\n margin: \"0\",\r\n },\r\n listItem: {\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n background: theme.palette.secondary.main,\r\n marginBottom: \"0.5rem\",\r\n \"&:hover\": {\r\n background: theme.palette.secondary.dark,\r\n },\r\n borderRadius: \"10px\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n selectedId: string;\r\n searchResultsUser: User[] | undefined;\r\n handleItemClick: (id: number, item: any) => void;\r\n handleChangeRadio: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n}\r\n\r\nconst UserSearchList: React.FC<Props> = ({\r\n selectedId,\r\n searchResultsUser,\r\n handleItemClick,\r\n handleChangeRadio,\r\n}) => {\r\n const classes = useStyles();\r\n return (\r\n <List>\r\n {searchResultsUser?.map((user, i) => (\r\n <div key={i}>\r\n <ListItem\r\n alignItems=\"flex-start\"\r\n button\r\n selected={selectedId === `${i}`}\r\n className={classes.listItem}\r\n onClick={() => handleItemClick(i, user)}\r\n >\r\n <div>\r\n <Typography className={classes.navn}>\r\n {user.name}\r\n </Typography>\r\n <small>{user.email}</small>\r\n </div>\r\n <Radio\r\n color=\"primary\"\r\n checked={selectedId === `${i}`}\r\n onChange={handleChangeRadio}\r\n value={i}\r\n name=\"radio-button\"\r\n />\r\n </ListItem>\r\n </div>\r\n ))}\r\n </List>\r\n );\r\n};\r\nexport default UserSearchList;\r\n","import React, { useState } from \"react\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { httpGet } from \"../../services/http/httpService\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport UserSearchInput from \"./UserSearchInput\";\r\nimport UserSearchList from \"./UserSearchList\";\r\nimport { Role } from \"./role\";\r\nimport { User, UserSearchResponse } from \"../types\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n padding: \"2px 4px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n width: \"100%\",\r\n borderColor: theme.palette.common.black,\r\n margin: \"auto\",\r\n },\r\n input: {\r\n marginLeft: theme.spacing(1),\r\n flex: 1,\r\n },\r\n iconButton: {\r\n padding: 10,\r\n },\r\n selected: {\r\n textDecoration: \"underline\",\r\n },\r\n\r\n limitText: {\r\n marginTop: \"1rem\",\r\n marginBottom: \"1rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n role: Role;\r\n selectedId: string;\r\n selected: User;\r\n handleChangeRadio: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n handleItemClick: (id: number, item: any) => void;\r\n clearSelected: () => void;\r\n}\r\n\r\nconst AddUserDialogBoxContent: React.FC<Props> = ({\r\n role,\r\n selectedId,\r\n selected,\r\n handleChangeRadio,\r\n handleItemClick,\r\n clearSelected,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const [searchResults, setSearchResults] = useState<UserSearchResponse>();\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState();\r\n\r\n const responseLimit = 5;\r\n\r\n const handleSearch = async (searchText: string) => {\r\n setSearchResults(undefined);\r\n setError(undefined);\r\n clearSelected();\r\n setLoading(true);\r\n try {\r\n const result = await httpGet(\r\n `api/Users/search?SearchText=${searchText}&Limit=${responseLimit}&Role=${\r\n role[0].toUpperCase() + role.substring(1)\r\n }`\r\n );\r\n setSearchResults(result);\r\n } catch (e) {\r\n setError(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n return (\r\n <div>\r\n <UserSearchInput\r\n role={role}\r\n handleSearch={handleSearch}\r\n searchResultsUser={searchResults?.users}\r\n error={error}\r\n loading={loading}\r\n searchResults={searchResults}\r\n />\r\n\r\n {loading ? (\r\n <LinearProgress />\r\n ) : (\r\n <UserSearchList\r\n selectedId={selectedId}\r\n searchResultsUser={searchResults?.users}\r\n handleItemClick={handleItemClick}\r\n handleChangeRadio={handleChangeRadio}\r\n />\r\n )}\r\n\r\n {selected.name && (\r\n <Typography variant=\"subtitle1\" id=\"selected\">\r\n <span className={classes.selected}>{selected.name}</span>\r\n <span>{\" legges til i listen.\"}</span>\r\n </Typography>\r\n )}\r\n </div>\r\n );\r\n};\r\nexport default AddUserDialogBoxContent;\r\n","import React, { useState } from \"react\";\r\nimport DialogBox from \"../common/DialogBox\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport AddIcon from \"@material-ui/icons/Add\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport AddUserDialogBoxContent from \"./AddUserDialogBoxContent\";\r\nimport { httpPost } from \"../../services/http/httpService\";\r\nimport { Role } from \"./role\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n button: {\r\n marginTop: \"1rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n omradeId: string;\r\n leggTil: (data: any) => void;\r\n role: Role;\r\n}\r\n\r\nconst AddUserDialogBox: React.FC<Props> = ({ omradeId, leggTil, role }) => {\r\n const classes = useStyles();\r\n const initialState = {\r\n id: 0,\r\n azureAdId: \"\",\r\n name: \"\",\r\n mobilePhone: \"\",\r\n email: \"\",\r\n };\r\n const [open, setOpen] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [selected, setSelected] = useState(initialState);\r\n const [selectedId, setSelectedId] = useState(\"\");\r\n\r\n const handleChangeRadio = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setSelectedId(event.target.value);\r\n setError(null);\r\n };\r\n const handleItemClick = (id: number, item: any) => {\r\n setSelectedId(id.toString());\r\n setSelected(item);\r\n };\r\n\r\n const clearSelected = () => {\r\n setSelected(initialState);\r\n setSelectedId(\"\");\r\n setError(null);\r\n };\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n setSelected(initialState);\r\n setSelectedId(\"\");\r\n setError(null);\r\n };\r\n\r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n const area = role === Role.PREST ? \"beredskapsområdet\" : \"bispedømmet\";\r\n\r\n const handleLeggTil = async () => {\r\n setLoading(true);\r\n const areapath =\r\n role === Role.PREST ? \"Beredskapsomrader\" : \"Bispedommer\";\r\n try {\r\n const result = await httpPost(\r\n `api/${areapath}/${omradeId}/${role}`,\r\n {\r\n azureAdId: selected.azureAdId,\r\n id: parseInt(omradeId),\r\n }\r\n );\r\n leggTil(result);\r\n clearSelected();\r\n setOpen(false);\r\n } catch (e) {\r\n setError(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Button\r\n startIcon={<AddIcon />}\r\n variant=\"contained\"\r\n color=\"secondary\"\r\n className={classes.button}\r\n onClick={handleOpen}\r\n >\r\n Legg Til {role}\r\n </Button>\r\n <DialogBox\r\n handleClick={handleLeggTil}\r\n title={`Legg til ${role} i ${area}`}\r\n buttonText=\"Legg til\"\r\n open={open}\r\n handleClose={handleClose}\r\n loading={loading}\r\n disableButton={!selectedId}\r\n error={\r\n error\r\n ? `${selected.name} har allerede blitt lagt til i ${area}, og legges ikke til på nytt.`\r\n : \"\"\r\n }\r\n >\r\n <Container>\r\n <AddUserDialogBoxContent\r\n role={role}\r\n handleChangeRadio={handleChangeRadio}\r\n selectedId={selectedId}\r\n handleItemClick={handleItemClick}\r\n selected={selected}\r\n clearSelected={clearSelected}\r\n />\r\n </Container>\r\n </DialogBox>\r\n </>\r\n );\r\n};\r\nexport default AddUserDialogBox;\r\n","import React from \"react\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport Breadcrumbs from \"@material-ui/core/Breadcrumbs\";\r\nimport Link from \"@material-ui/core/Link\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n marginBottom: \"1rem\",\r\n },\r\n link: {\r\n \"&:hover\": {\r\n cursor: \"pointer\",\r\n },\r\n },\r\n}));\r\n\r\ninterface Props {\r\n root: { name: string; url: string };\r\n paths: { name: string; url: string }[];\r\n}\r\n\r\nconst Breadcrumb: React.FC<Props> = ({ root, paths }) => {\r\n const classes = useStyles();\r\n\r\n const history = useHistory();\r\n\r\n const handleClick = (pathName: string) => {\r\n history.push(pathName);\r\n };\r\n\r\n const handleKeyPress = (e: React.KeyboardEvent, path: string) => {\r\n if (e.key === \"Enter\") {\r\n handleClick(path);\r\n }\r\n };\r\n return (\r\n <Breadcrumbs aria-label=\"breadcrumb\" className={classes.root}>\r\n <Link\r\n color=\"inherit\"\r\n tabIndex={0}\r\n onKeyPress={(e: React.KeyboardEvent) =>\r\n handleKeyPress(e, root.url)\r\n }\r\n className={classes.link}\r\n onClick={() => handleClick(root.url)}\r\n >\r\n {root.name}\r\n </Link>\r\n {paths.map((path, i) => {\r\n const isLastPath = i === paths.length - 1;\r\n\r\n return isLastPath ? (\r\n <Typography color=\"textPrimary\" key={i}>\r\n {path.name}\r\n </Typography>\r\n ) : (\r\n <Link\r\n className={classes.link}\r\n key={i}\r\n tabIndex={0}\r\n color=\"inherit\"\r\n onClick={() => handleClick(path.url)}\r\n onKeyPress={(e: React.KeyboardEvent) =>\r\n handleKeyPress(e, path.url)\r\n }\r\n >\r\n {path.name}\r\n </Link>\r\n );\r\n })}\r\n </Breadcrumbs>\r\n );\r\n};\r\n\r\nexport default Breadcrumb;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport ArrowBackIcon from \"@material-ui/icons/ArrowBack\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n buttonText: {\r\n \"&:hover\": {\r\n textDecoration: \"underline\",\r\n },\r\n },\r\n tilbake: {\r\n marginBottom: \"2rem\",\r\n },\r\n link: { textDecoration: \"none\" },\r\n}));\r\n\r\ninterface Props {\r\n linkTo: string;\r\n}\r\n\r\nconst TilbakeButton: React.FC<Props> = ({ linkTo }) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={classes.tilbake}>\r\n <Link to={linkTo} className={classes.link}>\r\n <Button startIcon={<ArrowBackIcon />}>\r\n <div className={classes.buttonText}>Tilbake</div>\r\n </Button>\r\n </Link>\r\n </div>\r\n );\r\n};\r\nexport default TilbakeButton;\r\n","import React, { useContext } from \"react\";\r\nimport { RoleType } from \"../../utils/types\";\r\nimport {\r\n RoleContextType,\r\n RoleContext,\r\n} from \"../common/contexts/RoleContextProvider\";\r\n\r\ninterface Props {\r\n role?: RoleType;\r\n roles?: RoleType[];\r\n children: React.ReactNode;\r\n}\r\n\r\nconst HideForRole: React.FC<Props> = ({ role, roles, children }) => {\r\n const { role: currentUserRole } = useContext(\r\n RoleContext\r\n ) as RoleContextType;\r\n\r\n var condition = false;\r\n if (role) {\r\n condition = currentUserRole !== role;\r\n } else if (roles) {\r\n condition = !roles.includes(currentUserRole);\r\n }\r\n\r\n return <>{condition && children}</>;\r\n};\r\nexport default HideForRole;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { Prest } from \"../../store/prester/types\";\r\nimport TelephoneNumber from \"../common/TelephoneNumber\";\r\nimport { Theme } from \"@material-ui/core/styles/createMuiTheme\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n background: {\r\n padding: \"2rem\",\r\n background: \"#F2F2F2\",\r\n borderRadius: \"4px\",\r\n marginBottom: \"1rem\",\r\n },\r\n wrapper: {\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n justifyContent: \"space-between\",\r\n [theme.breakpoints.up(\"lg\")]: {\r\n width: \"60%\",\r\n },\r\n },\r\n body: {\r\n marginBottom: \"0.5rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginTop: \"1rem\",\r\n },\r\n },\r\n}));\r\n\r\ninterface Props {\r\n prest: Prest;\r\n}\r\n\r\nconst PrestIBeredskap: React.FC<Props> = ({ prest }) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={classes.background}>\r\n <div className={classes.wrapper}>\r\n <div>\r\n <Typography className={classes.body}>\r\n Prest i beredskap:\r\n </Typography>\r\n <Typography variant=\"h5\" className={classes.body}>\r\n {prest?.navn}\r\n </Typography>\r\n </div>\r\n <div>\r\n <Typography className={classes.body}>\r\n Telefonnummer til prest:\r\n </Typography>\r\n <Typography variant=\"h5\">\r\n <TelephoneNumber\r\n telephonenumber={prest?.telefonnummer}\r\n />\r\n </Typography>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default PrestIBeredskap;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Switch from \"@material-ui/core/Switch\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n formControll: {\r\n \"& .MuiFormControlLabel-label\": {\r\n fontSize: \"14px\",\r\n },\r\n },\r\n}));\r\n\r\ninterface Props {\r\n notification: boolean;\r\n loading: boolean;\r\n handleClick: () => void;\r\n}\r\n\r\nconst ToggleNotification: React.FC<Props> = ({\r\n notification,\r\n loading,\r\n handleClick,\r\n}) => {\r\n const classes = useStyles();\r\n return (\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n disabled={loading}\r\n color=\"primary\"\r\n checked={notification}\r\n onChange={handleClick}\r\n value={notification}\r\n />\r\n }\r\n className={classes.formControll}\r\n label={notification ? \"VARSLING PÅ\" : \"VARSLING AV\"}\r\n labelPlacement={\"start\"}\r\n />\r\n );\r\n};\r\nexport default ToggleNotification;\r\n","import React, { useContext } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport NotificationsActiveIcon from \"@material-ui/icons/NotificationsActive\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport {\r\n RoleContextType,\r\n RoleContext,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport { roles } from \"../../utils/enum\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n varsling: {\r\n display: \"flex\"\r\n },\r\n notificationIcon: {\r\n marginRight: \"0.5rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n notification: boolean;\r\n}\r\n\r\nconst NotificationStatus: React.FC<Props> = ({ notification }) => {\r\n const classes = useStyles();\r\n\r\n const { role: currentUserRole } = useContext(\r\n RoleContext\r\n ) as RoleContextType;\r\n\r\n let text = \"\";\r\n if (\r\n currentUserRole === roles.BEREDSKAPSANSVARLIG ||\r\n currentUserRole === roles.ADMIN\r\n ) {\r\n text = \"Du får varsel for dette bispedømmet.\";\r\n } else if (currentUserRole === roles.PROST) {\r\n text = \"Du får varsel for dette beredskapsområdet.\";\r\n }\r\n\r\n return (\r\n <>\r\n {notification ? (\r\n <div className={classes.varsling}>\r\n <NotificationsActiveIcon\r\n className={classes.notificationIcon}\r\n color=\"disabled\"\r\n aria-label=\"varsel ikon\"\r\n />\r\n <Typography>{text}</Typography>\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n </>\r\n );\r\n};\r\nexport default NotificationStatus;\r\n","import { useState, useEffect } from \"react\";\r\nimport { httpPut } from \"../../services/http/httpService\";\r\nimport { customToast } from \"../../services/varslinger/varslingsService\";\r\nimport { feilmeldinger, toastVarslinger } from \"../../utils/constants\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport { RoleType } from \"../../utils/types\";\r\nimport { UserType } from \"../common/contexts/UserContextProvider\";\r\n\r\nexport interface Notification<T> {\r\n notification: boolean;\r\n loadingNotification: boolean;\r\n handleToggleNotification: () => void;\r\n}\r\n\r\nexport function useNotification<T>(\r\n omradeId: string,\r\n user: UserType,\r\n role: RoleType,\r\n initialValue: boolean | undefined\r\n): Notification<T> {\r\n const [notification, setNotification] = useState(false);\r\n const [loadingNotification, setLoadingNotification] = useState(false);\r\n\r\n useEffect(() => {\r\n if (typeof initialValue === \"boolean\") {\r\n setNotification(initialValue);\r\n }\r\n }, [initialValue]);\r\n\r\n const { putUrl, putBody } = putVarselParameters(\r\n role,\r\n omradeId,\r\n user,\r\n notification\r\n );\r\n\r\n const handleToggleNotification = async () => {\r\n setLoadingNotification(true);\r\n try {\r\n const response = await httpPut(putUrl, putBody);\r\n setNotification(response.varsel);\r\n customToast.success(toastText(role, response.varsel));\r\n } catch (e) {\r\n customToast.error(feilmeldinger.uventetFeil);\r\n } finally {\r\n setLoadingNotification(false);\r\n }\r\n };\r\n\r\n return {\r\n notification,\r\n loadingNotification,\r\n handleToggleNotification,\r\n };\r\n}\r\n\r\nconst putVarselParameters = (\r\n role: RoleType,\r\n omradeId: string,\r\n user: UserType,\r\n notification: boolean\r\n) => {\r\n let putUrl = \"\";\r\n let putBody = {};\r\n if (role === roles.BEREDSKAPSANSVARLIG || role === roles.ADMIN) {\r\n putUrl = `api/Bispedommer/${omradeId}/varsel`;\r\n putBody = {\r\n userId: user.id,\r\n bispedommeId: omradeId,\r\n varsel: !notification,\r\n };\r\n } else if (role === roles.PROST) {\r\n putUrl = `api/Beredskapsomrader/${omradeId}/varsel`;\r\n putBody = {\r\n userId: user.id,\r\n beredskapsomradeId: omradeId,\r\n varsel: !notification,\r\n };\r\n }\r\n return { putUrl, putBody };\r\n};\r\n\r\nconst toastText = (role: RoleType, notification: any) => {\r\n if (role === roles.BEREDSKAPSANSVARLIG || role === roles.ADMIN) {\r\n return notification\r\n ? toastVarslinger.varselPaaIBispedommet\r\n : toastVarslinger.varselAvIBispedommet;\r\n } else if (role === roles.PROST) {\r\n return notification\r\n ? toastVarslinger.varselPaaIBeredskapsomradet\r\n : toastVarslinger.varselAvIBeredskapsomradet;\r\n }\r\n return toastVarslinger.uventetFeil;\r\n};\r\n","import React from \"react\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport Card from \"../common/Card\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { useLoader } from \"../customHooks/useLoader\";\r\nimport { httpGet } from \"../../services/http/httpService\";\r\nimport InfoBox from \"../common/InfoBox\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport TilbakeButton from \"../common/TilbakeButton\";\r\nimport Background from \"../common/Background\";\r\nimport Kontaktliste from \"../prester/KontaktListe\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport BeredskapsomradeMedKommunerTittel from \"../prester/BeredskapsomradeMedKommunerTittel\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n mainTitle: {\r\n marginBottom: \"1rem\",\r\n },\r\n beredans: {\r\n marginTop: \"5rem\",\r\n },\r\n beredansMobile: {\r\n marginTop: \"2rem\",\r\n fontWeight: \"bold\",\r\n },\r\n}));\r\n\r\ninterface ParamTypes {\r\n beredskapsomrade_id: string;\r\n}\r\n\r\nexport enum ROLLE {\r\n prost = 2,\r\n beredskapsansvarlig = 3,\r\n}\r\n\r\nconst KontaktpersonerIBeredskapsomradet: React.FC = () => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n\r\n const { beredskapsomrade_id } = useParams<ParamTypes>();\r\n const { data, loading, error } = useLoader(() =>\r\n httpGet(`api/Beredskapsomrader/${beredskapsomrade_id}/kontaktpersoner`)\r\n );\r\n\r\n const beredansListe = (response: any) =>\r\n response.kontaktpersoner.filter(\r\n (e: any) => e.roleId === ROLLE.beredskapsansvarlig\r\n );\r\n const prosteListe = (response: any) =>\r\n response.kontaktpersoner.filter((e: any) => e.roleId === ROLLE.prost);\r\n\r\n return (\r\n <Background>\r\n <Card padding=\"1.5rem\">\r\n <TilbakeButton linkTo={\"/prest\"} />\r\n {loading && <LinearProgress />}\r\n {error && (\r\n <InfoBox\r\n message={feilmeldinger.uventetFeil}\r\n icon={<ErrorOutlineIcon />}\r\n />\r\n )}\r\n\r\n {!isOnMobileDevice && data && (\r\n <>\r\n <BeredskapsomradeMedKommunerTittel\r\n beredskapsomrade={data.beredskapsomrade}\r\n kommuner={data.beredskapsomrade.kommuner}\r\n />\r\n <Kontaktliste\r\n kontaktpersoner={prosteListe(data)}\r\n tittel=\"Prost og prostesaksbehandler\"\r\n />\r\n <Kontaktliste\r\n kontaktpersoner={beredansListe(data)}\r\n tittel=\"Beredskapsansvarlig\"\r\n />\r\n </>\r\n )}\r\n {isOnMobileDevice && data && (\r\n <>\r\n <Typography variant=\"h4\" className={classes.mainTitle}>\r\n {data.beredskapsomrade.navn}\r\n </Typography>\r\n <Kontaktliste\r\n kontaktpersoner={prosteListe(data)}\r\n tittel=\"Prost og prostesaksbehandler:\"\r\n />\r\n\r\n <Kontaktliste\r\n kontaktpersoner={beredansListe(data)}\r\n tittel=\"Beredskapsansvarlig:\"\r\n />\r\n </>\r\n )}\r\n </Card>\r\n </Background>\r\n );\r\n};\r\nexport default KontaktpersonerIBeredskapsomradet;\r\n","import React, { useContext } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport Card from \"../common/Card\";\r\nimport BeredskapsomradeTabell from \"./BeredskapsomradeTabell\";\r\nimport AddUserDialogBox from \"../leggTilBruker/AddUserDialogBox\";\r\nimport { visKommuner } from \"../common/VisKommuner\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { useLoader } from \"../customHooks/useLoader\";\r\nimport { httpGet } from \"../../services/http/httpService\";\r\nimport Breadcrumb from \"../common/Breadcrumb\";\r\nimport InfoBox from \"../common/InfoBox\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport { Role } from \"../leggTilBruker/role\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport {\r\n BeredskapsomradeContext,\r\n BeredskapsContextType,\r\n} from \"../beredskapsomrade/contexts/beredskapsomradeContext\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport TilbakeButton from \"../common/TilbakeButton\";\r\nimport Background from \"../common/Background\";\r\nimport HideForRole from \"../common/HideForRole\";\r\nimport PrestIBeredskap from \"./prestIBeredskap\";\r\nimport { Theme } from \"@material-ui/core/styles/createMuiTheme\";\r\nimport { getBreadcrumbPropsByRole } from \"./getBreadcrumbProps\";\r\nimport ToggleNotification from \"../notifications/ToggleNotification\";\r\nimport NotificationStatus from \"../notifications/NotificationStatus\";\r\nimport { useNotification } from \"../notifications/useNotification\";\r\nimport UserContext, {\r\n UserContextType,\r\n} from \"../common/contexts/UserContextProvider\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n topWrapper: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"baseline\",\r\n },\r\n mainTitle: {\r\n marginBottom: \"1rem\",\r\n },\r\n statusDiv: {\r\n marginTop: \"2rem\",\r\n marginBottom: \"3rem\",\r\n },\r\n button: {\r\n marginTop: \"1rem\",\r\n },\r\n\r\n link: { textDecoration: \"none\" },\r\n kommuner: {\r\n marginBottom: \"3rem\",\r\n },\r\n presterHeader: {\r\n marginTop: \"4rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginTop: \"2rem\",\r\n },\r\n marginBottom: \"1rem\",\r\n },\r\n}));\r\n\r\ninterface ParamTypes {\r\n beredskapsomrade_id: string;\r\n bispedomme_id: string;\r\n}\r\n\r\nconst Beredskapsomrade: React.FC = () => {\r\n const classes = useStyles();\r\n\r\n const { user } = useContext(UserContext) as UserContextType;\r\n const { role } = useContext(RoleContext) as RoleContextType;\r\n\r\n const { data, setData, leggTilPrest, getPrestIBeredskap } = useContext(\r\n BeredskapsomradeContext\r\n ) as BeredskapsContextType;\r\n\r\n const { beredskapsomrade_id, bispedomme_id } = useParams<ParamTypes>();\r\n const { loading, error } = useLoader(() =>\r\n httpGet(`api/Beredskapsomrader/${beredskapsomrade_id}`).then(\r\n (res) => res && setData(res)\r\n )\r\n );\r\n\r\n const {\r\n notification,\r\n loadingNotification,\r\n handleToggleNotification,\r\n } = useNotification(\r\n beredskapsomrade_id,\r\n user,\r\n role,\r\n data?.beredskapsomrade.varsel\r\n );\r\n\r\n var prestIBeredskap = getPrestIBeredskap();\r\n var breadcrumbProps = getBreadcrumbPropsByRole(\r\n role,\r\n data.beredskapsomrade,\r\n bispedomme_id,\r\n beredskapsomrade_id\r\n );\r\n return (\r\n <Background>\r\n <Breadcrumb\r\n root={breadcrumbProps.root}\r\n paths={breadcrumbProps.paths}\r\n />\r\n\r\n <Card padding=\"1.5rem\">\r\n <div className={classes.topWrapper}>\r\n <TilbakeButton linkTo={`/bispedommer/${bispedomme_id}`} />\r\n\r\n <HideForRole\r\n roles={[roles.ADMIN, roles.BEREDSKAPSANSVARLIG]}\r\n >\r\n {/* Hide for berans aswell */}\r\n {!loading && (\r\n <ToggleNotification\r\n loading={loadingNotification}\r\n notification={notification}\r\n handleClick={handleToggleNotification}\r\n />\r\n )}\r\n </HideForRole>\r\n </div>\r\n {loading && <LinearProgress />}\r\n {error ? (\r\n <InfoBox\r\n message={error.message}\r\n icon={<ErrorOutlineIcon />}\r\n />\r\n ) : (\r\n <>\r\n <Typography variant=\"h4\" className={classes.mainTitle}>\r\n {data.beredskapsomrade.navn}\r\n </Typography>\r\n <div className={classes.kommuner}>\r\n {visKommuner(\r\n data.beredskapsomrade.kommuner,\r\n data.beredskapsomrade.kommuner.length\r\n )}\r\n </div>\r\n\r\n <div className={classes.statusDiv}>\r\n <NotificationStatus notification={notification} />\r\n </div>\r\n\r\n {prestIBeredskap.map((prest) => (\r\n <PrestIBeredskap prest={prest}></PrestIBeredskap>\r\n ))}\r\n\r\n <Typography\r\n className={classes.presterHeader}\r\n variant=\"h6\"\r\n >\r\n Prester i beredskapsområdet:\r\n </Typography>\r\n\r\n <BeredskapsomradeTabell prester={data.prester} />\r\n\r\n <HideForRole role={roles.PROST}>\r\n <AddUserDialogBox\r\n omradeId={beredskapsomrade_id}\r\n leggTil={leggTilPrest}\r\n role={Role.PREST}\r\n />\r\n </HideForRole>\r\n </>\r\n )}\r\n </Card>\r\n </Background>\r\n );\r\n};\r\nexport default Beredskapsomrade;\r\n","import { roles } from \"../../utils/enum\";\r\nimport { Beredskapsomrade } from \"../prestSokeResultater/types\";\r\n\r\nexport const getBreadcrumbPropsByRole = ( role: string, beredskapsomrade: Beredskapsomrade, bispedommeId: string, beredskapsomradeId: string) => {\r\n if (role === roles.PROST) {\r\n return {\r\n root: {\r\n name: beredskapsomrade.bispedommeNavn,\r\n url: `/bispedommer/${bispedommeId}`,\r\n },\r\n paths: [\r\n {\r\n name: beredskapsomrade.navn,\r\n url: `/bispedommer/${bispedommeId}/beredskapsomrade/${beredskapsomradeId}`,\r\n },\r\n ],\r\n };\r\n } else {\r\n return {\r\n root: { name: \"Bispedømmer\", url: \"/bispedommer\" },\r\n paths: [\r\n {\r\n name: beredskapsomrade.bispedommeNavn,\r\n url: `/bispedommer/${bispedommeId}`,\r\n },\r\n {\r\n name: beredskapsomrade.navn,\r\n url: `/bispedommer/${bispedommeId}/beredskapsomrader/${beredskapsomradeId}`,\r\n },\r\n ],\r\n };\r\n }\r\n};\r\n","import React from \"react\";\r\nimport ListMUI from \"@material-ui/core/List\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport NavigateNextIcon from \"@material-ui/icons/NavigateNext\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport NotificationIcon from \"../common/NotificationIcon\";\r\nimport { PresterIBeredskap, Beredskapsomrade } from \"../types\";\r\nimport { Container } from \"@material-ui/core\";\r\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\r\nimport OmradeStatus from \"./OmradeStatus\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n display: \"inline-flex\",\r\n },\r\n nameWrapper: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n flexFlow: \"wrap\",\r\n width: \"50%\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n width: \"90%\",\r\n },\r\n },\r\n nextIcon: {\r\n marginTop: \"0.5rem\",\r\n marginBottom: \"0.5rem\",\r\n marginLeft: \"0.5rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginLeft: \"0\",\r\n },\r\n },\r\n header: {\r\n marginTop: \"0.5rem\",\r\n marginBottom: \"0.5rem\",\r\n marginLeft: \"0.5rem\",\r\n },\r\n errorIcon: {\r\n fill: \"#D90011\",\r\n marginRight: \"0.2rem\",\r\n marginBottom: \"0.1rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginLeft: \"0\",\r\n marginRight: \"1rem\"\r\n },\r\n },\r\n errorContent: {\r\n fill: \"#D90011\",\r\n background:\r\n \"linear-gradient(0deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)), #D90011;\",\r\n display: \"flex\",\r\n borderRadius: \"0.25rem\",\r\n maxWidth: 280,\r\n padding: \"0.5rem\",\r\n marginLeft: 0,\r\n },\r\n warningIcon: {\r\n fill: \"#F4D150\",\r\n marginRight: \"0.2rem\",\r\n marginBottom: \"0.1rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginLeft: \"0\",\r\n marginRight: \"1rem\"\r\n },\r\n },\r\n warningContent: {\r\n fill: \"#F4D150\",\r\n background:\r\n \"linear-gradient(0deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)), #F4D150;\",\r\n display: \"flex\",\r\n borderRadius: \"0.25rem\",\r\n maxWidth: 280,\r\n padding: \"0.5rem\",\r\n marginLeft: 0,\r\n },\r\n successIcon: {\r\n marginRight: \"0.2rem\",\r\n fill: \"#06893A\",\r\n marginBottom: \"0.1rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n fontSize: \"large\",\r\n marginBottom: \"auto\",\r\n marginRight: \"0.5rem\",\r\n },\r\n },\r\n successContent: {\r\n marginLeft: 0,\r\n fill: \"#F4D150\",\r\n display: \"flex\",\r\n borderRadius: \"0.25rem\",\r\n maxWidth: 280,\r\n padding: \"0.5rem\",\r\n },\r\n prestIBerdskapMobil: {\r\n marginLeft: \"0.5rem\",\r\n },\r\n iconText: {\r\n marginLeft: \"0.2rem\",\r\n marginRight: \"0.2rem\",\r\n },\r\n placeholder: {\r\n marginLeft: \"2rem\",\r\n marginRight: \"auto\",\r\n width: \"8%\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n beredskapsomrader: Beredskapsomrade[];\r\n beredskapsInfo: PresterIBeredskap[];\r\n handleClickListItem: (listItem: Beredskapsomrade) => void;\r\n}\r\n\r\nconst BeredskapsomradeListe: React.FC<Props> = ({\r\n beredskapsomrader,\r\n beredskapsInfo,\r\n handleClickListItem,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const theme = useTheme();\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n\r\n const nameOfPrestIBeredskap = (id: number) => {\r\n if (beredskapsInfo) {\r\n const currentBeredskapInfo = beredskapsInfo.find(\r\n (info) => info.beredskapsomradeId === id\r\n );\r\n if (currentBeredskapInfo && currentBeredskapInfo.presterIBeredskap.length > 0) {\r\n return currentBeredskapInfo.presterIBeredskap[0].name;\r\n }\r\n }\r\n return \"\";\r\n };\r\n\r\n const antallPresterIBeredskap = (id: number) => {\r\n if (beredskapsInfo) {\r\n const currentBeredskapInfo = beredskapsInfo.find(\r\n (info) => info.beredskapsomradeId === id\r\n );\r\n if (currentBeredskapInfo) {\r\n return currentBeredskapInfo.antallPresterIBeredskap;\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n return (\r\n <ListMUI>\r\n {beredskapsomrader.map((area) => (\r\n <ListItem\r\n disableGutters\r\n divider\r\n button\r\n key={area.id}\r\n onClick={() => handleClickListItem(area)}\r\n className={classes.container}\r\n >\r\n <NavigateNextIcon className={classes.nextIcon} />\r\n <div className={classes.nameWrapper}>\r\n <Typography className={classes.header} variant={\"h6\"}>\r\n {area.navn}\r\n </Typography>\r\n {isOnMobileDevice &&\r\n antallPresterIBeredskap(area.id) === 1 && (\r\n <Typography\r\n variant=\"subtitle1\"\r\n className={classes.prestIBerdskapMobil}\r\n >\r\n <CheckCircleIcon\r\n className={classes.successIcon}\r\n />\r\n {nameOfPrestIBeredskap(area.id)}\r\n </Typography>\r\n )}\r\n </div>\r\n\r\n {antallPresterIBeredskap(area.id) > 1 && (\r\n <OmradeStatus\r\n text=\"For mange prester i beredskap\"\r\n ariaLabel=\"Beredskapsområdet har for mange prester i beredskap.\"\r\n iconStyle={classes.warningIcon}\r\n containerStyle={classes.warningContent}\r\n />\r\n )}\r\n\r\n {antallPresterIBeredskap(area.id) === 0 && (\r\n <OmradeStatus\r\n text=\"Mangler prest i beredskap\"\r\n ariaLabel=\"Beredskapsområdet mangler prest i beredskap.\"\r\n iconStyle={classes.errorIcon}\r\n containerStyle={classes.errorContent}\r\n />\r\n )}\r\n\r\n {!isOnMobileDevice &&\r\n antallPresterIBeredskap(area.id) === 1 && (\r\n <>\r\n <Container className={classes.successContent}>\r\n <CheckCircleIcon\r\n className={classes.successIcon}\r\n />\r\n <Typography\r\n variant=\"subtitle1\"\r\n className={classes.iconText}\r\n >\r\n {nameOfPrestIBeredskap(area.id)}\r\n </Typography>\r\n </Container>\r\n </>\r\n )}\r\n\r\n {area.varsel ? (\r\n <NotificationIcon />\r\n ) : (\r\n <div className={classes.placeholder} />\r\n )}\r\n </ListItem>\r\n ))}\r\n </ListMUI>\r\n );\r\n};\r\nexport default BeredskapsomradeListe;\r\n","import React from \"react\";\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport BeredskapsomradeListe from \"./BeredskapsomradeListe\";\r\nimport { Beredskapsomrade, PresterIBeredskap } from \"../types\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { Hidden } from \"@material-ui/core\";\r\n\r\n\r\ninterface Props {\r\n beredskapsomrader: Beredskapsomrade[];\r\n presterIBeredskap: PresterIBeredskap[];\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n display: \"flex\",\r\n allignItems: \"flex-start\",\r\n },\r\n beredskapsOmraderText: {\r\n marginLeft: \"0.2rem\",\r\n marginRight: \"auto\",\r\n width: \"21%\",\r\n },\r\n placeholder: {\r\n marginLeft: \"0.6rem\",\r\n marginRight: \"auto\",\r\n },\r\n statusOversiktText: {\r\n marginRight: \"auto\",\r\n marginLeft: \"1rem\",\r\n },\r\n}));\r\n\r\nconst Beredskapsomrader: React.FC<Props> = ({\r\n beredskapsomrader,\r\n presterIBeredskap,\r\n}) => {\r\n const history = useHistory();\r\n const currentPath = useLocation().pathname;\r\n\r\n const handleClickListItem = (beredskapsomrade: Beredskapsomrade) => {\r\n history.push(`${currentPath}/beredskapsomrader/${beredskapsomrade.id}`);\r\n };\r\n const classes = useStyles();\r\n return (\r\n <>\r\n <div className={classes.container}>\r\n <Typography\r\n variant=\"h5\"\r\n className={classes.beredskapsOmraderText}\r\n >\r\n Beredskapsområder\r\n </Typography>\r\n\r\n <Hidden smDown>\r\n <Typography\r\n variant=\"h5\"\r\n className={classes.statusOversiktText}\r\n >\r\n Prest i beredskap\r\n </Typography>\r\n </Hidden>\r\n </div>\r\n <BeredskapsomradeListe\r\n beredskapsomrader={beredskapsomrader}\r\n beredskapsInfo={presterIBeredskap}\r\n handleClickListItem={handleClickListItem}\r\n />\r\n </>\r\n );\r\n};\r\nexport default Beredskapsomrader;\r\n","import React, { useState } from \"react\";\r\nimport DialogBox from \"../common/DialogBox\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport { httpDelete } from \"../../services/http/httpService\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport { User } from \"../types\";\r\n\r\ninterface Props {\r\n omradeId: string;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n prost: User;\r\n removeProst: (id: number) => void;\r\n}\r\n\r\nconst RemoveProstDialogBox: React.FC<Props> = ({\r\n omradeId,\r\n open,\r\n setOpen,\r\n prost,\r\n removeProst,\r\n}) => {\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n setError(null);\r\n };\r\n\r\n const handleRemoveProst = async () => {\r\n setLoading(true);\r\n try {\r\n await httpDelete(`api/Bispedommer/${omradeId}/prost/${prost.id}`);\r\n removeProst(prost.id);\r\n setError(null);\r\n setOpen(false);\r\n } catch (e) {\r\n setError(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <DialogBox\r\n handleClick={handleRemoveProst}\r\n title=\"\"\r\n buttonText=\"Fjern\"\r\n open={open}\r\n handleClose={handleClose}\r\n loading={loading}\r\n error={error ? feilmeldinger.uventetFeilProvPaNytt : \"\"}\r\n >\r\n <Container>\r\n <Typography variant=\"h6\">\r\n Er du sikker på at du vil fjerne {prost.name} fra\r\n bispedømmet?\r\n </Typography>\r\n </Container>\r\n </DialogBox>\r\n </>\r\n );\r\n};\r\nexport default RemoveProstDialogBox;\r\n","import React from \"react\";\r\nimport ListMUI from \"@material-ui/core/List\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\nimport Switch from \"@material-ui/core/Switch\";\r\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\r\nimport { User } from \"../types\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport { useLoader } from \"../customHooks/useLoader\";\r\nimport { httpGet } from \"../../services/http/httpService\";\r\nimport { LinearProgress } from \"@material-ui/core\";\r\nimport InfoBox from \"../common/InfoBox\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n header: {\r\n marginTop: \"0.5rem\",\r\n marginBottom: \"0.5rem\",\r\n marginLeft: \"0.5rem\",\r\n },\r\n toggleSwitch: {\r\n marginLeft: \"auto\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n prost: User;\r\n bispedommeId: string;\r\n data: ProstVarselResponse[] | null;\r\n setData: (curr: any) => void;\r\n}\r\n\r\nexport type ProstVarselResponse = {\r\n userId: number;\r\n beredskapsomradeId: number;\r\n beredskapsomradeName: string;\r\n varsel: boolean;\r\n};\r\n\r\nconst ProstVarslingerListe: React.FC<Props> = ({\r\n bispedommeId,\r\n prost,\r\n data,\r\n setData,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const theme = useTheme();\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n const label = (varsel: boolean) => {\r\n if (isOnMobileDevice) {\r\n return \"\";\r\n }\r\n return varsel ? \"Varsling på\" : \"Varsling av\";\r\n };\r\n\r\n const { loading, error } = useLoader(() =>\r\n httpGet(\r\n `api/Bispedommer/${bispedommeId}/proster/${prost.id}/varsel`\r\n ).then((res) => {\r\n setData(res);\r\n })\r\n );\r\n\r\n const handleToggle = (index: number) => {\r\n if (data && index < data.length) {\r\n const newData = [...data];\r\n newData[index].varsel = !data[index].varsel;\r\n setData(newData);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {loading && <LinearProgress />}\r\n {error ? (\r\n <InfoBox\r\n message={feilmeldinger.uventetFeilProvPaNytt}\r\n icon={<ErrorOutlineIcon />}\r\n />\r\n ) : (\r\n <ListMUI>\r\n {data?.map((area, i) => (\r\n <ListItem disableGutters divider key={i}>\r\n <Typography className={classes.header}>\r\n {area.beredskapsomradeName}\r\n </Typography>\r\n\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n disabled={loading}\r\n color=\"primary\"\r\n checked={area.varsel}\r\n onChange={() => handleToggle(i)}\r\n value={area.varsel}\r\n />\r\n }\r\n className={classes.toggleSwitch}\r\n label={label(area.varsel)}\r\n labelPlacement={\"start\"}\r\n />\r\n </ListItem>\r\n ))}\r\n </ListMUI>\r\n )}\r\n </>\r\n );\r\n};\r\nexport default ProstVarslingerListe;\r\n","import React, { useState } from \"react\";\r\nimport DialogBox from \"../common/DialogBox\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport { httpPut } from \"../../services/http/httpService\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport { User } from \"../types\";\r\nimport ProstVarslingerListe, {\r\n ProstVarselResponse,\r\n} from \"./ProstVarslingerListe\";\r\nimport { Typography } from \"@material-ui/core\";\r\nimport { customToast } from \"../../services/varslinger/varslingsService\";\r\n\r\ninterface Props {\r\n bispedommeId: string;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n prost: User;\r\n}\r\n\r\nconst ProstVarslingerDialogBox: React.FC<Props> = ({\r\n bispedommeId,\r\n open,\r\n setOpen,\r\n prost,\r\n}) => {\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [data, setData] = useState<ProstVarselResponse[] | null>(null);\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n setError(null);\r\n };\r\n\r\n const handleUpdateVarsler = async () => {\r\n setLoading(true);\r\n try {\r\n await httpPut(\r\n `api/Bispedommer/${bispedommeId}/proster/${prost.id}/varsel`,\r\n {\r\n data:data,\r\n userId: prost.id,\r\n BispedommeId: bispedommeId\r\n }\r\n );\r\n \r\n setError(null);\r\n setOpen(false);\r\n customToast.success(`Varslinger er endret for ${prost.name}`);\r\n } catch (e) {\r\n setError(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <DialogBox\r\n handleClick={handleUpdateVarsler}\r\n title={\"\"}\r\n buttonText=\"Bekreft\"\r\n cancelButtonText=\"Nei, avbryt\"\r\n open={open}\r\n handleClose={handleClose}\r\n loading={loading}\r\n error={error ? feilmeldinger.uventetFeilProvPaNytt : \"\"}\r\n >\r\n <Container>\r\n <Typography variant=\"h6\">\r\n Administrer varslinger for {prost.name}\r\n </Typography>\r\n <ProstVarslingerListe\r\n data={data}\r\n setData={setData}\r\n bispedommeId={bispedommeId}\r\n prost={prost}\r\n />\r\n </Container>\r\n </DialogBox>\r\n </>\r\n );\r\n};\r\nexport default ProstVarslingerDialogBox;\r\n","import React, { useState } from \"react\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport RemoveProstDialogBox from \"./RemoveProstDialogBox\";\r\nimport { User } from \"../types\";\r\nimport SettingsMenu from \"../common/SettingsMenu\";\r\nimport ProstVarslingerDialogBox from \"./ProstVarslingerDialogBox\";\r\n\r\ninterface Props {\r\n prost: User;\r\n removeProst: (id: number) => void;\r\n}\r\n\r\ninterface ParamTypes {\r\n bispedomme_id: string;\r\n}\r\n\r\nconst ProstSettingsMenu: React.FC<Props> = ({ prost, removeProst }) => {\r\n const { bispedomme_id } = useParams<ParamTypes>();\r\n const [openRemoveProst, setOpenRemoveProst] = useState(false);\r\n const [openVarslinger, setOpenVarslinger] = useState(false);\r\n\r\n const menuItems = [\r\n {\r\n menuItemText: \"Fjern prost fra bispedømmet\",\r\n setOpen: setOpenRemoveProst,\r\n },\r\n { menuItemText: \"Administer varslinger\", setOpen: setOpenVarslinger },\r\n ];\r\n return (\r\n <>\r\n <SettingsMenu menuItems={menuItems} />\r\n\r\n <RemoveProstDialogBox\r\n omradeId={bispedomme_id}\r\n open={openRemoveProst}\r\n setOpen={setOpenRemoveProst}\r\n prost={prost}\r\n removeProst={removeProst}\r\n />\r\n <ProstVarslingerDialogBox\r\n bispedommeId={bispedomme_id}\r\n open={openVarslinger}\r\n setOpen={setOpenVarslinger}\r\n prost={prost}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nexport default ProstSettingsMenu;\r\n","import React from \"react\";\r\nimport ListMUI from \"@material-ui/core/List\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport ProstSettingsMenu from \"./ProstSettingsMenu\";\r\nimport { User } from \"../types\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n header: {\r\n marginTop: \"0.5rem\",\r\n marginBottom: \"0.5rem\",\r\n marginLeft: \"0.5rem\",\r\n width: \"98%\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n proster: User[];\r\n removeProst: (id: number) => void;\r\n}\r\n\r\nconst ProsterListe: React.FC<Props> = ({ proster, removeProst }) => {\r\n const classes = useStyles();\r\n const sortedProster = [...proster].sort((a, b) =>\r\n a.name.localeCompare(b.name)\r\n );\r\n return (\r\n <ListMUI>\r\n {sortedProster?.map((prost, i) => (\r\n <ListItem disableGutters divider key={i}>\r\n <Typography className={classes.header} variant={\"h6\"}>\r\n {prost.name}\r\n </Typography>\r\n <ProstSettingsMenu\r\n prost={prost}\r\n removeProst={removeProst}\r\n />\r\n </ListItem>\r\n ))}\r\n </ListMUI>\r\n );\r\n};\r\nexport default ProsterListe;\r\n","import React, { useState } from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { useLoader } from \"../customHooks/useLoader\";\r\nimport { httpGet } from \"../../services/http/httpService\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport InfoBox from \"../common/InfoBox\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport { User } from \"../types\";\r\nimport { Role } from \"../leggTilBruker/role\";\r\nimport ProsterListe from \"./ProsterListe\";\r\nimport { customToast } from \"../../services/varslinger/varslingsService\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport AddUserDialogBox from \"../leggTilBruker/AddUserDialogBox\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n header: {\r\n marginTop: \"3rem\",\r\n },\r\n message: {\r\n marginBottom: \"1rem\",\r\n marginTop: \"1rem\",\r\n fontStyle: \"italic\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n bispedomme_id: string;\r\n}\r\n\r\nconst Proster: React.FC<Props> = ({ bispedomme_id }) => {\r\n const [proster, setProster] = useState<User[]>([]);\r\n\r\n const { loading, error } = useLoader(() =>\r\n httpGet(`api/Bispedommer/${bispedomme_id}/proster`).then(\r\n (res) => res && setProster(res)\r\n )\r\n );\r\n\r\n const leggTilProst = (prost: User) => {\r\n setProster((previousState) => [...previousState, prost]);\r\n customToast.success(\"Prost ble lagt til i bispedømmet.\");\r\n };\r\n\r\n const removeProst = (prostId: number) => {\r\n setProster(proster.filter((p: User) => p.id !== prostId));\r\n customToast.success(\"Prost ble fjernet fra området.\");\r\n };\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n <Typography className={classes.header} variant=\"h5\">\r\n Proster i bispedømmet\r\n </Typography>\r\n {loading && <LinearProgress />}\r\n {error ? (\r\n <InfoBox\r\n message={feilmeldinger.uventetFeil}\r\n icon={<ErrorOutlineIcon />}\r\n />\r\n ) : (\r\n <>\r\n <ProsterListe proster={proster} removeProst={removeProst} />\r\n {proster?.length === 0 && (\r\n <p className={classes.message}>\r\n {feilmeldinger.ingenProsterLagtTilIBispedommet}\r\n </p>\r\n )}\r\n </>\r\n )}\r\n <AddUserDialogBox\r\n omradeId={bispedomme_id}\r\n leggTil={leggTilProst}\r\n role={Role.PROST}\r\n />\r\n </>\r\n );\r\n};\r\nexport default Proster;\r\n","import React from \"react\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport ErrorIcon from \"@material-ui/icons/Error\";\r\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport { PresterIBeredskap } from \"../types\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n marginTop: \"1rem\",\r\n },\r\n errorContent: {\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n borderRadius: \"0.25rem\",\r\n maxWidth: 390,\r\n padding: \"0.5rem\",\r\n margin: 0,\r\n background:\r\n \"linear-gradient(0deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)), #FF9100;\",\r\n },\r\n content: {\r\n display: \"flex\",\r\n padding: 0,\r\n },\r\n okicon: {\r\n marginRight: \"0.5rem\",\r\n fill: \"green\",\r\n },\r\n warningicon: {\r\n marginRight: \"0.5rem\",\r\n fill: \"#F4D150\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n beredskapsInfo: PresterIBeredskap[];\r\n error: Error | undefined;\r\n}\r\n\r\nconst BispedommeStatus: React.FC<Props> = ({ beredskapsInfo, error }) => {\r\n const antallOmrader = beredskapsInfo?.length;\r\n\r\n const antallOmraderMedUgyldigStatus = beredskapsInfo?.filter(\r\n (omrade) => omrade.antallPresterIBeredskap !== 1\r\n ).length;\r\n\r\n const classes = useStyles();\r\n return (\r\n <div className={classes.root}>\r\n {beredskapsInfo && (\r\n <>\r\n {antallOmraderMedUgyldigStatus > 0 ? (\r\n <Container className={classes.errorContent}>\r\n <ErrorIcon className={classes.warningicon} />\r\n <Typography>\r\n Det er avvik i {antallOmraderMedUgyldigStatus}{\" \"}\r\n av {antallOmrader} beredskapsområder.\r\n </Typography>\r\n </Container>\r\n ) : (\r\n <Container className={classes.content}>\r\n <CheckCircleIcon className={classes.okicon} />\r\n <Typography>\r\n Alle områder har prest i beredskap.\r\n </Typography>\r\n </Container>\r\n )}\r\n </>\r\n )}\r\n {error && (\r\n <Container className={classes.errorContent}>\r\n <ErrorIcon className={classes.warningicon} />\r\n <Typography>{feilmeldinger.uventetFeil}</Typography>\r\n </Container>\r\n )}\r\n </div>\r\n );\r\n};\r\nexport default BispedommeStatus;\r\n","import React, { useContext } from \"react\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport Card from \"../common/Card\";\r\nimport Breadcrumb from \"../common/Breadcrumb\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { useLoader } from \"../customHooks/useLoader\";\r\nimport { httpGet } from \"../../services/http/httpService\";\r\nimport Beredskapsomrader from \"../beredskapsomrader/Beredskapsomrader\";\r\nimport InfoBox from \"../common/InfoBox\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport Proster from \"../proster/Proster\";\r\nimport BispedommeStatus from \"./BispedommeStatus\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport ToggleNotification from \"../notifications/ToggleNotification\";\r\nimport TilbakeButton from \"../common/TilbakeButton\";\r\nimport Background from \"../common/Background\";\r\nimport HideForRole from \"../common/HideForRole\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport UserContext, {\r\n UserContextType,\r\n} from \"../common/contexts/UserContextProvider\";\r\nimport NotificationStatus from \"../notifications/NotificationStatus\";\r\nimport { useNotification } from \"../notifications/useNotification\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n topWrapper: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"baseline\",\r\n },\r\n statusDiv: {\r\n marginTop: \"2rem\",\r\n marginBottom: \"3rem\",\r\n },\r\n}));\r\n\r\ninterface ParamTypes {\r\n bispedomme_id: string;\r\n}\r\n\r\nconst Bispedomme: React.FC = () => {\r\n const { bispedomme_id } = useParams<ParamTypes>();\r\n\r\n const {\r\n data: bispedomme,\r\n loading,\r\n error,\r\n } = useLoader(() => {\r\n return httpGet(`api/Bispedommer/${bispedomme_id}`);\r\n });\r\n\r\n const { data: presterIBeredskap, error: presterIBeredskapError } =\r\n useLoader(() => {\r\n return httpGet(\r\n `api/Bispedommer/${bispedomme_id}/presterIBeredskap`\r\n );\r\n });\r\n const { user } = useContext(UserContext) as UserContextType;\r\n const { role } = useContext(RoleContext) as RoleContextType;\r\n\r\n const { notification, loadingNotification, handleToggleNotification } =\r\n useNotification(bispedomme_id, user, role, bispedomme?.varsel);\r\n\r\n const classes = useStyles();\r\n return (\r\n <Background>\r\n <HideForRole role={roles.PROST}>\r\n <Breadcrumb\r\n root={{ name: \"Bispedømmer\", url: \"/bispedommer\" }}\r\n paths={[\r\n {\r\n name: bispedomme?.navn,\r\n url: `bispedommer/${bispedomme_id}`,\r\n },\r\n ]}\r\n />\r\n </HideForRole>\r\n\r\n <Card padding=\"1.5rem\">\r\n {loading && <LinearProgress />}\r\n {error && (\r\n <InfoBox\r\n message={error.message}\r\n icon={<ErrorOutlineIcon />}\r\n />\r\n )}\r\n\r\n {bispedomme && (\r\n <>\r\n <HideForRole role={roles.PROST}>\r\n <div className={classes.topWrapper}>\r\n <TilbakeButton linkTo={\"/bispedommer\"} />\r\n\r\n {!loading && (\r\n <ToggleNotification\r\n loading={loadingNotification}\r\n notification={notification}\r\n handleClick={handleToggleNotification}\r\n />\r\n )}\r\n </div>\r\n </HideForRole>\r\n\r\n <Typography variant=\"h4\">\r\n {bispedomme.navn} bispedømme\r\n </Typography>\r\n\r\n <div className={classes.statusDiv}>\r\n <NotificationStatus notification={notification} />\r\n\r\n <BispedommeStatus\r\n beredskapsInfo={presterIBeredskap}\r\n error={presterIBeredskapError}\r\n />\r\n </div>\r\n\r\n <Beredskapsomrader\r\n beredskapsomrader={bispedomme.beredskapsomrader}\r\n presterIBeredskap={presterIBeredskap}\r\n />\r\n\r\n <HideForRole role={roles.PROST}>\r\n <Proster bispedomme_id={bispedomme_id} />\r\n </HideForRole>\r\n\r\n <br />\r\n </>\r\n )}\r\n </Card>\r\n </Background>\r\n );\r\n};\r\nexport default Bispedomme;\r\n","import React from \"react\";\r\nimport ListMUI from \"@material-ui/core/List\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { makeStyles, useTheme } from \"@material-ui/core/styles\";\r\nimport { Kontaktinfo } from \"../../store/prester/types\";\r\nimport TelephoneNumber from \"../common/TelephoneNumber\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport { Container } from \"@material-ui/core\";\r\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\r\nimport Chip from \"@material-ui/core/Chip\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n header: {\r\n marginTop: \"2rem\",\r\n marginBottom: \"0.5rem\",\r\n marginLeft: \"0.5rem\",\r\n width: \"50%\",\r\n fontWeight: \"bold\",\r\n },\r\n info: {\r\n marginTop: \"0.5rem\",\r\n marginBottom: \"0.5rem\",\r\n marginLeft: \"0.5rem\",\r\n width: \"50%\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n width: \"100%\",\r\n },\r\n },\r\n flexstyle: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n },\r\n colortext: {\r\n color: \"black\",\r\n marginLeft: \"1rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n marginLeft: \"0\",\r\n },\r\n },\r\n successIcon: {\r\n marginRight: \"0.2rem\",\r\n fill: \"#06893A\",\r\n marginBottom: \"0.1rem\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n display: \"flex\",\r\n marginLeft: \"auto\",\r\n marginRight: \"0.5rem\",\r\n marginBottom: \"1.5rem\",\r\n flexDirection: \"row\",\r\n alignItems: \"space-between\",\r\n justifyContent: \"space-between\",\r\n },\r\n display: \"inline-flex\",\r\n },\r\n successContent: {\r\n marginLeft: 0,\r\n fill: \"#06893A\",\r\n display: \"flex\",\r\n borderRadius: \"0.25rem\",\r\n maxWidth: 280,\r\n padding: \"0.5rem\",\r\n },\r\n chip: {\r\n background: \"#06893A\",\r\n color: theme.palette.common.white,\r\n marginLeft: \"-0.5rem\",\r\n },\r\n invchip: {\r\n background: \"white\",\r\n color: theme.palette.common.white,\r\n },\r\n container: {\r\n display: \"inline-flex\",\r\n },\r\n telefonnr: {\r\n marginTop: \"0.5rem\",\r\n marginBottom: \"0.5rem\",\r\n marginLeft: \"0.5rem\",\r\n width: \"50%\",\r\n [theme.breakpoints.down(\"sm\")]: {\r\n width: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"flex-start\",\r\n justifyContent: \"flex-start\",\r\n },\r\n },\r\n}));\r\n\r\ninterface Props {\r\n kontaktpersoner: Kontaktinfo[];\r\n tittel: string;\r\n}\r\n\r\nconst Kontaktliste: React.FC<Props> = ({ kontaktpersoner, tittel }) => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const erPrest = tittel === \"Prest\";\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n const sortedKontakter = [...kontaktpersoner].sort((a, b) =>\r\n a.navn.localeCompare(b.navn)\r\n );\r\n const getNumber = (number: string) => \"tel:+47\" + number;\r\n\r\n return (\r\n <ListMUI>\r\n {isOnMobileDevice && (\r\n <>\r\n <ListItem disableGutters divider>\r\n <Typography className={classes.header} variant={\"h6\"}>\r\n {tittel}\r\n </Typography>\r\n </ListItem>\r\n {sortedKontakter?.map((kontaktperson, i) => (\r\n <ListItem\r\n className={classes.flexstyle}\r\n divider\r\n disableGutters\r\n key={i}\r\n >\r\n <Typography className={classes.info} variant={\"h6\"}>\r\n {kontaktperson.navn}\r\n </Typography>\r\n <Typography\r\n className={classes.telefonnr}\r\n variant={\"h6\"}\r\n >\r\n <a\r\n href={getNumber(\r\n kontaktperson.telefonnummer\r\n )}\r\n className={classes.colortext}\r\n >\r\n {kontaktperson.telefonnummer}\r\n </a>\r\n {kontaktperson.iBeredskap && (\r\n <CheckCircleIcon\r\n className={classes.successIcon}\r\n />\r\n )}\r\n </Typography>\r\n </ListItem>\r\n ))}\r\n </>\r\n )}\r\n\r\n {!isOnMobileDevice && (\r\n <>\r\n <ListItem disableGutters divider>\r\n <Typography className={classes.header} variant={\"h6\"}>\r\n {tittel}\r\n </Typography>\r\n <Typography className={classes.header} variant={\"h6\"}>\r\n Telefonnummer\r\n </Typography>\r\n {erPrest && (\r\n <Typography\r\n className={classes.header}\r\n variant={\"h6\"}\r\n >\r\n I beredskap\r\n </Typography>\r\n )}\r\n </ListItem>\r\n {sortedKontakter?.map((kontaktperson, i) => (\r\n <ListItem disableGutters divider key={i}>\r\n <Typography className={classes.info} variant={\"h6\"}>\r\n {kontaktperson.navn}\r\n </Typography>\r\n <Typography className={classes.info} variant={\"h6\"}>\r\n <TelephoneNumber\r\n telephonenumber={\r\n kontaktperson.telefonnummer\r\n }\r\n />\r\n </Typography>\r\n {erPrest && (\r\n <Typography\r\n className={classes.info}\r\n variant={\"h6\"}\r\n >\r\n <Container\r\n className={classes.successContent}\r\n >\r\n {kontaktperson.iBeredskap ? (\r\n <Chip\r\n label=\"I BEREDSKAP\"\r\n className={classes.chip}\r\n />\r\n ) : (\r\n <Chip\r\n label=\"IKKE BEREDSKAP\"\r\n className={classes.invchip}\r\n />\r\n )}\r\n </Container>\r\n </Typography>\r\n )}\r\n </ListItem>\r\n ))}\r\n </>\r\n )}\r\n </ListMUI>\r\n );\r\n};\r\nexport default Kontaktliste;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport Kontaktliste from \"./KontaktListe\";\r\nimport PrestIBeredskap from \"../beredskapsomrade/prestIBeredskap\";\r\nimport { Kontaktinfo } from \"../../store/prester/types\";\r\nimport { Beredskapsomrade } from \"../types\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n mainTitle: {\r\n marginBottom: \"1rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n prester: Kontaktinfo[];\r\n beredskapsomrade: Beredskapsomrade;\r\n}\r\n\r\nconst PresterIBeredskapsomradetMobil: React.FC<Props> = ({\r\n prester,\r\n beredskapsomrade,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const getThreeFirst = (personer: Kontaktinfo[]) => {\r\n const sortedPersoner = [...personer].sort((a, b) =>\r\n a.navn.localeCompare(b.navn)\r\n );\r\n return sortedPersoner.filter((x) => x.iBeredskap).slice(0, 2);\r\n };\r\n\r\n return (\r\n <>\r\n <Typography variant=\"h4\" className={classes.mainTitle}>\r\n {beredskapsomrade.navn}\r\n </Typography>\r\n\r\n {getThreeFirst(prester)?.map((prest, index) => (\r\n <div key={index}>\r\n <PrestIBeredskap prest={prest} />\r\n </div>\r\n ))}\r\n\r\n <Kontaktliste kontaktpersoner={prester} tittel=\"Prest:\" />\r\n </>\r\n );\r\n};\r\nexport default PresterIBeredskapsomradetMobil;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { visKommuner } from \"../common/VisKommuner\";\r\nimport { Beredskapsomrade, Kommune } from \"../prestSokeResultater/types\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n mainTitle: {\r\n marginBottom: \"1rem\",\r\n },\r\n kommuner: {\r\n marginBottom: \"3rem\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n beredskapsomrade: Beredskapsomrade;\r\n kommuner: Kommune[];\r\n}\r\n\r\nconst BeredskapsomradeMedKommunerTittel: React.FC<Props> = ({\r\n beredskapsomrade,\r\n kommuner,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <>\r\n <Typography variant=\"h4\" className={classes.mainTitle}>\r\n {beredskapsomrade.navn}\r\n </Typography>\r\n <div className={classes.kommuner}>\r\n {visKommuner(kommuner, kommuner.length)}\r\n </div>\r\n </>\r\n );\r\n};\r\nexport default BeredskapsomradeMedKommunerTittel;\r\n","import React from \"react\";\r\nimport { useTheme } from \"@material-ui/core/styles\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport Card from \"../common/Card\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { useLoader } from \"../customHooks/useLoader\";\r\nimport { httpGet } from \"../../services/http/httpService\";\r\nimport InfoBox from \"../common/InfoBox\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport { feilmeldinger } from \"../../utils/constants\";\r\nimport TilbakeButton from \"../common/TilbakeButton\";\r\nimport Background from \"../common/Background\";\r\nimport Kontaktliste from \"./KontaktListe\";\r\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\r\nimport PrestIBeredskap from \"../beredskapsomrade/prestIBeredskap\";\r\nimport PresterIBeredskapsomradetMobil from \"./PresterIBeredskapsomradetMobil\";\r\nimport BeredskapsomradeMedKommunerTittel from \"./BeredskapsomradeMedKommunerTittel\";\r\n\r\ninterface ParamTypes {\r\n beredskapsomrade_id: string;\r\n}\r\n\r\nconst PresterIBeredskapsomradet: React.FC = () => {\r\n const theme = useTheme();\r\n const isOnMobileDevice = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n const { beredskapsomrade_id } = useParams<ParamTypes>();\r\n const { data, loading, error } = useLoader(() =>\r\n httpGet(`api/Beredskapsomrader/${beredskapsomrade_id}`)\r\n );\r\n const hentTreFørsteIBeredskap = (personer: any[]) => {\r\n const sortedPersoner = [...personer].sort((a, b) =>\r\n a.navn.localeCompare(b.navn)\r\n );\r\n return sortedPersoner.filter((x) => x.iBeredskap).slice(0, 2);\r\n };\r\n\r\n return (\r\n <Background>\r\n <Card padding=\"1.5rem\">\r\n <TilbakeButton linkTo={\"/prest\"} />\r\n {loading && <LinearProgress />}\r\n {error && (\r\n <InfoBox\r\n message={feilmeldinger.uventetFeil}\r\n icon={<ErrorOutlineIcon />}\r\n />\r\n )}\r\n {!isOnMobileDevice && data && (\r\n <>\r\n <BeredskapsomradeMedKommunerTittel\r\n beredskapsomrade={data.beredskapsomrade}\r\n kommuner={data.beredskapsomrade.kommuner}\r\n />\r\n {hentTreFørsteIBeredskap(data.prester)?.map(\r\n (prest, index) => (\r\n <div key={index}>\r\n <PrestIBeredskap prest={prest} />\r\n </div>\r\n )\r\n )}\r\n <Kontaktliste\r\n kontaktpersoner={data.prester}\r\n tittel=\"Prest\"\r\n />\r\n </>\r\n )}\r\n {isOnMobileDevice && data && (\r\n <PresterIBeredskapsomradetMobil\r\n prester={data.prester}\r\n beredskapsomrade={data.beredskapsomrade}\r\n />\r\n )}\r\n </Card>\r\n </Background>\r\n );\r\n};\r\nexport default PresterIBeredskapsomradet;\r\n","import React, { lazy, Suspense } from \"react\";\r\nimport { Switch, Route, Redirect } from \"react-router-dom\";\r\nimport { roles } from \"../../utils/enum\";\r\nimport Beredskapsomrade from \"../beredskapsomrade/Beredskapsomrade\";\r\nimport Bispedomme from \"../bispedomme/Bispedomme\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport { BeredskapsomradeProvider } from \"../beredskapsomrade/contexts/beredskapsomradeContext\";\r\nimport { RoleType } from \"../../utils/types\";\r\nimport PresterIBeredskapsomradet from \"../prester/PresterIBeredskapsomradet\";\r\nimport KontaktpersonerIBeredskapsomradet from \"../proster/KontaktpersonerIBeredskapsomradet\";\r\n\r\nconst SecuritasPage = lazy(\r\n () =>\r\n import(/* webpackChunkName: \"SecuritasPage\" */ \"../Pages/SecuritasPage\")\r\n);\r\nconst BeredskapsansvarligPage = lazy(\r\n () =>\r\n import(\r\n /* webpackChunkName: \"BeredskapsansvarligPage\" */ \"../Pages/BeredskapsansvarligPage\"\r\n )\r\n);\r\nconst PrestPage = lazy(\r\n () => import(/* webpackChunkName: \"PrestPage\" */ \"../Pages/PrestPage\")\r\n);\r\nconst NotFound = lazy(\r\n () => import(/* webpackChunkName: \"NotFound\" */ \"../Pages/NotFound\")\r\n);\r\nconst Unauthorized = lazy(\r\n () => import(/* webpackChunkName: \"Unauthorized\" */ \"../Pages/Unauthorized\")\r\n);\r\n\r\nconst ProstPage = lazy(\r\n () => import(/* webpackChunkName:\"ProstPage\" */ \"../Pages/ProstPage\")\r\n);\r\n\r\ninterface Props {\r\n role: RoleType;\r\n roleList: RoleType[];\r\n}\r\n\r\nconst Routes: React.FC<Props> = ({ role, roleList }) => {\r\n const { ADMIN, BEREDSKAPSANSVARLIG, SECURITAS, PREST, PROST } = roles;\r\n const getPaths = (rolle?: RoleType) => {\r\n switch (rolle) {\r\n case BEREDSKAPSANSVARLIG:\r\n case ADMIN:\r\n case PROST:\r\n return \"/bispedommer\";\r\n case SECURITAS:\r\n return \"/securitas\";\r\n case PREST:\r\n return \"/prest\";\r\n default:\r\n return \"/not-found\";\r\n }\r\n };\r\n\r\n return (\r\n <Switch>\r\n <Redirect from=\"/\" exact to={getPaths(role)} />\r\n {(role === BEREDSKAPSANSVARLIG ||\r\n role === ADMIN ||\r\n role === PROST) && (\r\n <Route\r\n exact\r\n path={\r\n \"/bispedommer/:bispedomme_id/beredskapsomrader/:beredskapsomrade_id\"\r\n }\r\n >\r\n <BeredskapsomradeProvider>\r\n <Beredskapsomrade />\r\n </BeredskapsomradeProvider>\r\n </Route>\r\n )}\r\n {(role === SECURITAS || role === ADMIN) && (\r\n <Route exact path=\"/securitas\">\r\n <Suspense fallback={<LinearProgress />}>\r\n <SecuritasPage />\r\n </Suspense>\r\n </Route>\r\n )}\r\n {(role === BEREDSKAPSANSVARLIG ||\r\n role === PROST ||\r\n role === ADMIN) && (\r\n <Route exact path={\"/bispedommer/:bispedomme_id\"}>\r\n <Bispedomme />\r\n </Route>\r\n )}\r\n {(role === PREST ||\r\n role === ADMIN ||\r\n (role === PROST && roleList.includes(PREST))) && (\r\n <Route exact path=\"/prest\">\r\n <Suspense fallback={<LinearProgress />}>\r\n <PrestPage />\r\n </Suspense>\r\n </Route>\r\n )}\r\n {role === PREST && (\r\n <Route\r\n exact\r\n path=\"/prest/beredskapsomrader/:beredskapsomrade_id\"\r\n >\r\n <PresterIBeredskapsomradet />\r\n </Route>\r\n )}\r\n {role === PREST && (\r\n <Route\r\n exact\r\n path=\"/prest/beredskapsomrader/:beredskapsomrade_id/kontaktpersoner\"\r\n >\r\n <KontaktpersonerIBeredskapsomradet />\r\n </Route>\r\n )}\r\n {(role === BEREDSKAPSANSVARLIG || role === ADMIN) && (\r\n <Route exact path=\"/bispedommer\">\r\n <Suspense fallback={<LinearProgress />}>\r\n <BeredskapsansvarligPage />\r\n </Suspense>\r\n </Route>\r\n )}\r\n {role === PROST && (\r\n <Route exact path=\"/bispedommer\">\r\n <Suspense fallback={<LinearProgress />}>\r\n <ProstPage />\r\n </Suspense>\r\n </Route>\r\n )}\r\n\r\n <Route path=\"/unauthorized\">\r\n <Suspense fallback={<LinearProgress />}>\r\n <Unauthorized />\r\n </Suspense>\r\n </Route>\r\n <Route path=\"/not-found\">\r\n <Suspense fallback={<LinearProgress />}>\r\n <NotFound />\r\n </Suspense>\r\n </Route>\r\n <Redirect to=\"/not-found\" />\r\n </Switch>\r\n );\r\n};\r\n\r\nexport default Routes;\r\n","import React, { useEffect, useContext } from \"react\";\r\nimport { BrowserRouter } from \"react-router-dom\";\r\nimport Header from \"./Header\";\r\nimport { getRoleByPriority } from \"../../utils/roleProvider\";\r\nimport { getTokenSilent } from \"../../authentication/authModule\";\r\nimport { TokenType } from \"../../utils/types\";\r\nimport ServiceWorkerAlert from \"../serviceWorker/serviceWorkerAlert\";\r\nimport Routes from \"./Routes\";\r\nimport {\r\n RoleContext,\r\n RoleContextType,\r\n} from \"../common/contexts/RoleContextProvider\";\r\nimport { UserContextProvider } from \"../common/contexts/UserContextProvider\";\r\n\r\nconst App: React.FC = () => {\r\n const { setRole, role, setRoleList, roleList } = useContext(\r\n RoleContext\r\n ) as RoleContextType;\r\n useEffect(() => {\r\n async function getToken() {\r\n const token = await getTokenSilent();\r\n var tokenModel: TokenType = JSON.parse(atob(token.split(\".\")[1]));\r\n setRoleList(tokenModel.roles);\r\n setRole(getRoleByPriority(tokenModel));\r\n }\r\n\r\n getToken();\r\n }, [setRole, setRoleList]);\r\n\r\n return (\r\n <BrowserRouter>\r\n {role && (\r\n <UserContextProvider>\r\n <Header />\r\n <ServiceWorkerAlert />\r\n <Routes role={role} roleList={roleList} />\r\n </UserContextProvider>\r\n )}\r\n </BrowserRouter>\r\n );\r\n};\r\n\r\nexport default App;\r\n","// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n process.env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then(registration => {\r\n registration.unregister();\r\n })\r\n .catch(error => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import {\r\n AuthState,\r\n AuthActionTypes,\r\n AUTHENTICATE_FAIL,\r\n AUTHENTICATE_START,\r\n AUTHENTICATE_SUCCESS,\r\n} from \"./types\";\r\n\r\nexport const initialState: AuthState = {\r\n authenticated: null,\r\n loading: false,\r\n error: null,\r\n};\r\n\r\nexport const authReducer = (state = initialState, action: AuthActionTypes) => {\r\n switch (action.type) {\r\n case AUTHENTICATE_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case AUTHENTICATE_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n authenticated: true,\r\n };\r\n case AUTHENTICATE_FAIL:\r\n return {\r\n ...state,\r\n loading: false,\r\n authenticated: false,\r\n error: action.payload?.error,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n AccountState,\r\n AccountActionTypes,\r\n SET_ACCOUNT,\r\n SET_ACCOUNT_FAIL,\r\n} from \"./types\";\r\n\r\nexport const initialState: AccountState = {\r\n account: undefined,\r\n error: null,\r\n};\r\n\r\nexport const accountReducer = (\r\n state = initialState,\r\n action: AccountActionTypes\r\n) => {\r\n switch (action.type) {\r\n case SET_ACCOUNT:\r\n return {\r\n ...state,\r\n account: action.payload,\r\n };\r\n case SET_ACCOUNT_FAIL:\r\n return {\r\n ...state,\r\n error: action.payload.error,\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n PrestState,\r\n PrestActionTypes,\r\n LEGG_TIL_PREST_FAIL,\r\n LEGG_TIL_PREST_START,\r\n LEGG_TIL_PREST_SUCCESS,\r\n} from \"./types\";\r\n\r\nexport const initialState: PrestState = {\r\n loading: false,\r\n error: null,\r\n};\r\n\r\nexport const presterReducer = (\r\n state = initialState,\r\n action: PrestActionTypes\r\n) => {\r\n switch (action.type) {\r\n case LEGG_TIL_PREST_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case LEGG_TIL_PREST_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n };\r\n case LEGG_TIL_PREST_FAIL:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload.error,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import {\r\n BispedommeState,\r\n BispedommeActionTypes,\r\n HENT_BISPEDOMMER_SUCCESS,\r\n HENT_BISPEDOMMER_START,\r\n HENT_BISPEDOMMER_FAIL,\r\n} from \"./types\";\r\n\r\nexport const initialState: BispedommeState = {\r\n loading: false,\r\n error: null,\r\n bispedommer: [],\r\n};\r\n\r\nexport const bispedommerReducer = (\r\n state = initialState,\r\n action: BispedommeActionTypes\r\n) => {\r\n switch (action.type) {\r\n case HENT_BISPEDOMMER_START:\r\n return {\r\n ...state,\r\n loading: true,\r\n };\r\n case HENT_BISPEDOMMER_SUCCESS:\r\n return {\r\n ...state,\r\n loading: false,\r\n bispedommer: action.payload,\r\n };\r\n case HENT_BISPEDOMMER_FAIL:\r\n return {\r\n ...state,\r\n loading: false,\r\n error: action.payload,\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import { SW_INIT, SW_UPDATE,ServiceWorkerActionTypes } from './types';\r\n\r\nexport const initialState = {\r\n serviceWorkerInitialized: false,\r\n serviceWorkerUpdated: false,\r\n serviceWorkerRegistration: null,\r\n}\r\n\r\nexport const serviceWorkerReducer = (state = initialState, action: ServiceWorkerActionTypes) =>{\r\n switch (action.type) {\r\n case SW_INIT:\r\n return {\r\n ...state,\r\n serviceWorkerInitialized: !state.serviceWorkerInitialized,\r\n };\r\n case SW_UPDATE:\r\n return {\r\n ...state,\r\n serviceWorkerUpdated: !state.serviceWorkerUpdated,\r\n serviceWorkerRegistration: action.payload,\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { combineReducers, createStore, applyMiddleware } from \"redux\";\r\nimport { authReducer } from \"./auth/authReducer\";\r\nimport { accountReducer } from \"./account/accountReducer\";\r\nimport { presterReducer } from \"./prester/presterReducer\";\r\nimport { bispedommerReducer } from \"./bispedommer/bispedommerReducer\";\r\nimport { serviceWorkerReducer } from \"./serviceWorker/serviceWorkerReducer\";\r\nimport { composeWithDevTools } from \"redux-devtools-extension\";\r\nimport thunk from \"redux-thunk\";\r\n\r\nconst rootReducer = combineReducers({\r\n authReducer,\r\n accountReducer,\r\n presterReducer,\r\n serviceWorkerReducer,\r\n bispedommerReducer,\r\n});\r\n\r\nconst store = createStore(\r\n rootReducer,\r\n composeWithDevTools(applyMiddleware(thunk))\r\n);\r\n\r\nexport type RootState = ReturnType<typeof rootReducer>;\r\n\r\nexport default store;\r\n","export const AUTHENTICATE_START = \"AUTHENTICATE_START\";\r\nexport const AUTHENTICATE_SUCCESS = \"AUTHENTICATE_SUCCESS\";\r\nexport const AUTHENTICATE_FAIL = \"AUTHENTICATE_FAIL\";\r\n\r\nexport interface AuthState {\r\n authenticated: boolean | null;\r\n loading: boolean;\r\n error: any;\r\n}\r\n\r\ninterface AuthAction {\r\n type: string;\r\n payload?: any;\r\n}\r\n\r\nexport type AuthActionTypes = AuthAction;\r\n","import { AccountInfo } from \"@azure/msal-browser\";\r\n\r\nexport type AccountAction = {\r\n type: string;\r\n payload: any;\r\n};\r\n\r\nexport interface AccountState {\r\n account: AccountInfo | undefined;\r\n error: any;\r\n}\r\n\r\nexport const SET_ACCOUNT = \"SET_ACCOUNT\";\r\nexport const SET_ACCOUNT_FAIL = \"SET_ACCOUNT_FAIL\";\r\n\r\nexport type AccountActionTypes = AccountAction;\r\n","export const LEGG_TIL_PREST_START = \"LEGG_TIL_PREST_START\";\r\nexport const LEGG_TIL_PREST_SUCCESS = \"LEGG_TIL_PREST_SUCCESS\";\r\nexport const LEGG_TIL_PREST_FAIL = \"LEGG_TIL_PREST_FAIL\";\r\n\r\nexport interface PrestState {\r\n loading: boolean;\r\n error: any;\r\n}\r\n\r\ninterface PrestAction {\r\n type: string;\r\n payload?: any;\r\n}\r\n\r\nexport interface Prest {\r\n id: number;\r\n azureAdId: string;\r\n navn: string;\r\n telefonnummer: string;\r\n iBeredskap: boolean;\r\n}\r\n\r\nexport interface Kontaktinfo {\r\n id: number;\r\n azureAdId: string;\r\n navn: string;\r\n telefonnummer: string;\r\n iBeredskap: boolean;\r\n}\r\n\r\nexport type PrestActionTypes = PrestAction;\r\n","export const SW_INIT = \"SW_INIT\";\r\nexport const SW_UPDATE = \"SW_UPDATE\";\r\n\r\ninterface ServiceWorkerAction {\r\n type: string;\r\n payload?: any;\r\n}\r\n\r\nexport type ServiceWorkerActionTypes = ServiceWorkerAction;\r\n","import { Beredskapsomrade } from \"../../components/prestSokeResultater/types\";\r\n\r\nexport const HENT_BISPEDOMMER_START = \"HENT_BISPEDOMMER_START\";\r\nexport const HENT_BISPEDOMMER_SUCCESS = \"HENT_BISPEDOMMER_SUCCESS\";\r\nexport const HENT_BISPEDOMMER_FAIL = \"HENT_BISPEDOMMER_FAIL\";\r\n\r\nexport interface BispedommeState {\r\n loading: boolean;\r\n error: Error | null;\r\n bispedommer: Bispedomme[];\r\n}\r\n\r\ninterface BispedommeAction {\r\n type: string;\r\n payload?: Bispedomme[] | Error;\r\n}\r\n\r\nexport interface Bispedomme {\r\n id: number;\r\n navn: string;\r\n beredskapsomrader: Beredskapsomrade[];\r\n}\r\n\r\nexport type BispedommeActionTypes = BispedommeAction;\r\n","import { createMuiTheme } from \"@material-ui/core\";\r\n\r\nexport const Kirketheme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: \"#393938\",\r\n },\r\n secondary: {\r\n main: \"#F2F2F2\",\r\n },\r\n common: {\r\n black: \"#000\",\r\n white: \"#fff\",\r\n },\r\n error: {\r\n main: \"#D90011\",\r\n },\r\n warning: {\r\n main: \"#FF9100\",\r\n },\r\n info: {\r\n main: \"#0578CA\",\r\n },\r\n success: {\r\n main: \"#06893A\",\r\n },\r\n type: \"light\",\r\n },\r\n\r\n typography: {\r\n fontFamily: \"Arial\",\r\n fontSize: 14,\r\n },\r\n});\r\n","import React, { ReactNode, useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { RootState } from \"../store/combinedReducers\";\r\nimport { login, handleRedirectPromise } from \"./authModule\";\r\nimport {\r\n authenticateStart,\r\n authenticateSuccess,\r\n authenticateFail,\r\n} from \"../store/auth/authActions\";\r\nimport { setAccount } from \"../store/account/accountActions\";\r\nimport Unauthorized from \"../components/Pages/Unauthorized\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n}\r\n\r\nconst AuthProvider: React.FC<Props> = ({ children }) => {\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n handleRedirectPromise()\r\n .then((response) => {\r\n dispatch(authenticateStart());\r\n if (response !== null) {\r\n dispatch(authenticateSuccess());\r\n dispatch(setAccount(response.account));\r\n } else {\r\n login();\r\n }\r\n })\r\n .catch((e) => {\r\n dispatch(authenticateFail(e));\r\n });\r\n }, [dispatch]);\r\n\r\n const authenticated = useSelector(\r\n (state: RootState) => state.authReducer.authenticated\r\n );\r\n\r\n const checkAuth = () => {\r\n if (authenticated === null) {\r\n return <LinearProgress />;\r\n }\r\n if (authenticated) {\r\n return <>{children}</>;\r\n }\r\n if (!authenticated) {\r\n return <Unauthorized />;\r\n }\r\n return <div></div>;\r\n };\r\n\r\n return <>{checkAuth()}</>;\r\n};\r\n\r\nexport default AuthProvider;\r\n","import {\r\n AUTHENTICATE_START,\r\n AUTHENTICATE_FAIL,\r\n AUTHENTICATE_SUCCESS,\r\n} from \"./types\";\r\n\r\nexport const authenticateStart = () => {\r\n return {\r\n type: AUTHENTICATE_START,\r\n };\r\n};\r\n\r\nexport const authenticateSuccess = () => {\r\n return {\r\n type: AUTHENTICATE_SUCCESS,\r\n };\r\n};\r\n\r\nexport const authenticateFail = (e?: Error) => {\r\n return {\r\n type: AUTHENTICATE_FAIL,\r\n payload: e,\r\n };\r\n};\r\n","import { SET_ACCOUNT, SET_ACCOUNT_FAIL } from \"./types\";\r\n\r\nexport const setAccount = (payload: any) => {\r\n return {\r\n type: SET_ACCOUNT,\r\n payload,\r\n };\r\n};\r\n\r\nexport const setAccountFail = (payload: any) => {\r\n return {\r\n type: SET_ACCOUNT_FAIL,\r\n payload: payload,\r\n };\r\n};\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\nimport App from \"./components/Layout/App\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\nimport { Provider } from \"react-redux\";\r\nimport store from \"./store/combinedReducers\";\r\nimport { Kirketheme } from \"./utils/theme\";\r\nimport AuthProvider from \"./authentication/AuthProvider\";\r\nimport { ThemeProvider } from \"@material-ui/core\";\r\nimport CssBaseline from \"@material-ui/core/CssBaseline\";\r\nimport { SW_UPDATE, SW_INIT } from \"./store/serviceWorker/types\";\r\nimport { ToastContainer } from \"react-toastify\";\r\nimport { RoleContextProvider } from \"./components/common/contexts/RoleContextProvider\";\r\nimport { PrestContextProvider } from \"./components/prester/contexts/PrestContextProvider\";\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <Provider store={store}>\r\n <AuthProvider>\r\n <ThemeProvider theme={Kirketheme}>\r\n <ToastContainer />\r\n <CssBaseline />\r\n <RoleContextProvider>\r\n <PrestContextProvider>\r\n <App />\r\n </PrestContextProvider>\r\n </RoleContextProvider>\r\n </ThemeProvider>\r\n </AuthProvider>\r\n </Provider>\r\n </React.StrictMode>,\r\n document.getElementById(\"root\")\r\n);\r\n\r\nserviceWorker.register({\r\n onSuccess: () => store.dispatch({ type: SW_INIT }),\r\n onUpdate: (registration) =>\r\n store.dispatch({ type: SW_UPDATE, payload: registration }),\r\n });","import { useState, useEffect } from \"react\";\r\n\r\nexport interface Loader<T> {\r\n data?: T;\r\n loading: boolean;\r\n error?: Error;\r\n reload(): void;\r\n}\r\n\r\ntype DependencyList = [];\r\n\r\nexport function useLoader<T>(\r\n loadingFunction: () => Promise<T>,\r\n deps: DependencyList = []\r\n): Loader<T> {\r\n const [data, setData] = useState<T | undefined>();\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<Error | undefined>();\r\n\r\n async function reload() {\r\n setLoading(true);\r\n setError(undefined);\r\n setData(undefined);\r\n try {\r\n setData(await loadingFunction());\r\n } catch (e) {\r\n setError(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n reload();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps);\r\n return { data, loading, error, reload };\r\n}\r\n","import React from \"react\";\r\nimport { toast, ToastOptions } from \"react-toastify\";\r\nimport \"react-toastify/dist/ReactToastify.css\";\r\nimport \"./snackbarStyle.css\";\r\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport ErrorOutlineIcon from \"@material-ui/icons/ErrorOutline\";\r\nimport WarningIcon from \"@material-ui/icons/Warning\";\r\nimport InfoIcon from \"@material-ui/icons/Info\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\n\r\nconst defaultProps: ToastOptions = {\r\n position: \"bottom-center\",\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n};\r\n\r\ninterface Props {\r\n message: string;\r\n type: string;\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n },\r\n icon: {\r\n marginRight: \"1rem\",\r\n },\r\n}));\r\n\r\nconst SnackbarLayout: React.FC<Props> = ({ message, type }) => {\r\n const classes = useStyles();\r\n const getIcon = () => {\r\n switch (type) {\r\n case \"error\":\r\n return (\r\n <ErrorOutlineIcon\r\n color=\"secondary\"\r\n className={classes.icon}\r\n />\r\n );\r\n case \"success\":\r\n return (\r\n <CheckCircleIcon\r\n color=\"secondary\"\r\n className={classes.icon}\r\n />\r\n );\r\n case \"warning\":\r\n return <WarningIcon color=\"primary\" className={classes.icon} />;\r\n case \"info\":\r\n return <InfoIcon color=\"secondary\" className={classes.icon} />;\r\n default:\r\n return <></>;\r\n }\r\n };\r\n\r\n return (\r\n <div className={classes.root}>\r\n {getIcon()} {message}\r\n </div>\r\n );\r\n};\r\n\r\nexport const customToast = {\r\n success(message: string, options: ToastOptions = {}) {\r\n toast.success(<SnackbarLayout message={message} type=\"success\" />, {\r\n ...options,\r\n ...defaultProps,\r\n autoClose: 3000,\r\n className: \"snackbarSuccess\",\r\n });\r\n },\r\n warning(message: string, options: ToastOptions = {}) {\r\n toast.warning(<SnackbarLayout message={message} type=\"warning\" />, {\r\n ...options,\r\n ...defaultProps,\r\n autoClose: 5000,\r\n className: \"snackbarWarning\",\r\n closeButton: <CloseIcon fontSize=\"small\" />,\r\n });\r\n },\r\n error(message: string, options: ToastOptions = {}) {\r\n toast.error(<SnackbarLayout message={message} type=\"error\" />, {\r\n ...options,\r\n ...defaultProps,\r\n autoClose: false,\r\n className: \"snackbarError\",\r\n });\r\n },\r\n info(message: string, options: ToastOptions = {}) {\r\n toast.info(<SnackbarLayout message={message} type=\"info\" />, {\r\n ...options,\r\n ...defaultProps,\r\n autoClose: 5000,\r\n className: \"snackbarInfo\",\r\n });\r\n },\r\n};\r\n","import React from \"react\";\r\nimport Card from \"@material-ui/core/Card\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\n\r\ninterface Props {\r\n message: string;\r\n icon: React.ReactNode;\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n padding: \"2rem\",\r\n },\r\n icon: {\r\n textAlign: \"center\",\r\n },\r\n message: {\r\n textAlign: \"center\",\r\n },\r\n}));\r\n\r\nconst InfoBox: React.FC<Props> = ({ message, icon, children }) => {\r\n const classes = useStyles();\r\n return (\r\n <Card className={classes.root}>\r\n <CardContent>\r\n <p className={classes.icon}>{icon}</p>\r\n <Typography variant=\"h6\" className={classes.message}>\r\n {message}\r\n </Typography>\r\n\r\n {children}\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default InfoBox;\r\n","import { Configuration, LogLevel } from \"@azure/msal-browser\";\r\n\r\nexport const msalConfig: Configuration = {\r\n auth: {\r\n clientId: window.config.clientId,\r\n authority:\r\n \"https://login.microsoftonline.com/512024a4-8685-4f03-8086-14a61730e817\",\r\n redirectUri: window.config.pwaRedirectUrl,\r\n },\r\n cache: {\r\n cacheLocation: \"sessionStorage\",\r\n storeAuthStateInCookie: false, // Set this to \"true\" if you are having issues on IE11 or Edge\r\n },\r\n system: {\r\n loggerOptions: {\r\n loggerCallback: (\r\n level: LogLevel,\r\n message: string,\r\n containsPii: boolean\r\n ) => {\r\n if (containsPii) {\r\n return;\r\n }\r\n switch (level) {\r\n case LogLevel.Error:\r\n console.error(message);\r\n return;\r\n case LogLevel.Info:\r\n console.info(message);\r\n return;\r\n case LogLevel.Verbose:\r\n console.debug(message);\r\n return;\r\n case LogLevel.Warning:\r\n console.warn(message);\r\n return;\r\n }\r\n },\r\n },\r\n },\r\n};\r\n","import {\r\n PublicClientApplication,\r\n InteractionRequiredAuthError,\r\n} from \"@azure/msal-browser\";\r\n\r\nimport { msalConfig } from \"./authConfig\";\r\n\r\nexport const msalInstance = new PublicClientApplication(msalConfig);\r\n\r\nconst loginRequest = {\r\n scopes: [\"openid\", \"profile\", window.config.apiScope],\r\n};\r\n\r\nexport const handleRedirectPromise = () => {\r\n return msalInstance.handleRedirectPromise();\r\n};\r\n\r\nexport const signout = () => {\r\n msalInstance.logout();\r\n};\r\n\r\nexport const signoutAndRedirect = () => {\r\n msalInstance.logout().then(() => {\r\n msalInstance.loginRedirect(loginRequest);\r\n });\r\n};\r\n\r\nexport const login = () => {\r\n msalInstance.loginRedirect(loginRequest);\r\n};\r\n\r\nexport const getTokenSilent = async () => {\r\n var account = getAccount();\r\n if (account === undefined) {\r\n console.log(\r\n \"[getTokenSilent] Account is undefined. Cannot do msalInstance.acquireTokenSilent without account\"\r\n );\r\n return \"\";\r\n }\r\n var request = {\r\n scopes: [window.config.apiScope],\r\n account,\r\n };\r\n try {\r\n const res = await msalInstance.acquireTokenSilent(request);\r\n return res.accessToken;\r\n } catch (e) {\r\n if (e instanceof InteractionRequiredAuthError) {\r\n console.log(\"acquiring token using redirect\");\r\n msalInstance.acquireTokenRedirect(request).catch(console.error);\r\n } else {\r\n console.log(e);\r\n }\r\n }\r\n\r\n return \"\";\r\n};\r\n\r\nconst getAccount = () => {\r\n const currentAccounts = msalInstance.getAllAccounts();\r\n if (currentAccounts === null) {\r\n console.log(\"No accounts detected\");\r\n return undefined;\r\n }\r\n\r\n if (currentAccounts.length > 1) {\r\n console.log(\r\n \"Multiple accounts detected, need to add choose account code.\"\r\n );\r\n return currentAccounts[0];\r\n } else if (currentAccounts.length === 1) {\r\n return currentAccounts[0];\r\n }\r\n};\r\n","import React from \"react\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport DialogTitleMUI from \"@material-ui/core/DialogTitle\";\r\nimport DialogContent from \"@material-ui/core/DialogContent\";\r\nimport DialogActions from \"@material-ui/core/DialogActions\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport DialogBoxAlert from \"./DialogBoxAlert\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) => ({\r\n root: {\r\n margin: 0,\r\n padding: \"1rem\",\r\n },\r\n closeButton: {\r\n position: \"absolute\",\r\n right: \"0.5rem\",\r\n top: \"0.5rem\",\r\n color: \"grey\",\r\n },\r\n title: {\r\n marginLeft: \"0.5rem\",\r\n },\r\n error: {\r\n color: theme.palette.error.main,\r\n },\r\n}));\r\n\r\ninterface Props {\r\n open: boolean;\r\n handleClose: () => void;\r\n children: React.ReactNode;\r\n title: string;\r\n buttonText?: string;\r\n cancelButtonText?: string;\r\n handleClick: () => void;\r\n loading?: boolean;\r\n disableButton?: boolean;\r\n error?: any;\r\n}\r\n\r\ninterface DialogTitleProps {\r\n children: React.ReactNode;\r\n onClose: () => void;\r\n}\r\n\r\nexport const DialogTitle: React.FC<DialogTitleProps> = ({\r\n children,\r\n onClose,\r\n ...other\r\n}) => {\r\n const classes = useStyles();\r\n return (\r\n <DialogTitleMUI className={classes.root} {...other}>\r\n <div className={classes.title}>{children}</div>\r\n {onClose ? (\r\n <IconButton\r\n id=\"closeDialog\"\r\n aria-label=\"close\"\r\n className={classes.closeButton}\r\n onClick={onClose}\r\n >\r\n <CloseIcon />\r\n </IconButton>\r\n ) : null}\r\n </DialogTitleMUI>\r\n );\r\n};\r\n\r\nconst DialogBox: React.FC<Props> = ({\r\n open,\r\n loading,\r\n handleClose,\r\n children,\r\n title,\r\n buttonText,\r\n cancelButtonText = \"Avbryt\",\r\n handleClick,\r\n disableButton,\r\n error,\r\n}) => {\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={handleClose}\r\n aria-labelledby=\"dialogbox\"\r\n fullWidth\r\n >\r\n <DialogTitle onClose={handleClose}>{title}</DialogTitle>\r\n <DialogContent>{children}</DialogContent>\r\n {error && <DialogBoxAlert feilmelding={error} />}\r\n <DialogActions>\r\n <Button\r\n variant=\"contained\"\r\n color=\"secondary\"\r\n onClick={handleClose}\r\n >\r\n {cancelButtonText}\r\n </Button>\r\n {buttonText && (\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={handleClick}\r\n disabled={loading || disableButton}\r\n >\r\n {buttonText}\r\n </Button>\r\n )}\r\n </DialogActions>\r\n {loading && <LinearProgress />}\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default DialogBox;\r\n","import React, { useState, createContext, useEffect, useContext } from \"react\";\r\nimport { httpGet } from \"../../../services/http/httpService\";\r\nimport { useLoader } from \"../../customHooks/useLoader\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport { RoleContext, RoleContextType } from \"./RoleContextProvider\";\r\nimport { roles } from \"../../../utils/enum\";\r\n\r\nexport type UserContextType = {\r\n user: UserType;\r\n setUser: (user: UserType) => void;\r\n userPhoto: string;\r\n setPhoto: (img: string) => void;\r\n loading: boolean;\r\n error: Error;\r\n};\r\n\r\nexport type UserType = {\r\n id: number;\r\n azureAdId: string;\r\n name: string;\r\n mobilephone: string;\r\n email: string;\r\n bispedommeIds: number[];\r\n};\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\nexport const UserContext = createContext<UserContextType | {}>({});\r\n\r\nexport const UserContextProvider: React.FC<Props> = ({ children }) => {\r\n const [user, setUser] = useState<UserType>();\r\n const [userPhoto, setPhoto] = useState<string>();\r\n\r\n const { role } = useContext(RoleContext) as RoleContextType;\r\n\r\n useEffect(() => {\r\n (async () => {\r\n try {\r\n const userPhotoResponse = await httpGet(\"api/Users/user/photo\");\r\n setPhoto(userPhotoResponse);\r\n } catch (e) {\r\n console.error(\r\n \"Error in api/Users/user/photo response from api\",\r\n e\r\n );\r\n }\r\n })();\r\n }, []);\r\n\r\n const { loading, error } = useLoader(async () => {\r\n if (role && role !== roles.SECURITAS) {\r\n const userResponse = await httpGet(`api/Users/user`);\r\n setUser(userResponse);\r\n }\r\n });\r\n\r\n return (\r\n <UserContext.Provider\r\n value={{ user, setUser, userPhoto, setPhoto, error }}\r\n >\r\n {loading ? <LinearProgress /> : children}\r\n </UserContext.Provider>\r\n );\r\n};\r\n\r\nexport default UserContext;\r\n","import React from \"react\";\r\nimport CardMUI from \"@material-ui/core/Card\";\r\nimport CardContent from \"@material-ui/core/CardContent\";\r\nimport makeStyles from \"@material-ui/core/styles/makeStyles\";\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n style?: any;\r\n padding?: string;\r\n background?: string;\r\n}\r\n\r\nconst Card: React.FC<Props> = ({\r\n children,\r\n style,\r\n padding = \"2.5rem\",\r\n background = \"white\",\r\n}) => {\r\n const useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: \"100%\",\r\n background: theme.palette.background.paper,\r\n padding,\r\n [theme.breakpoints.down(\"sm\")]: {\r\n padding: \"0.5rem\",\r\n },\r\n ...style,\r\n },\r\n\r\n content: {\r\n [theme.breakpoints.down(330)]: {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n },\r\n }));\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <CardMUI className={classes.root}>\r\n <CardContent className={classes.content}>{children}</CardContent>\r\n </CardMUI>\r\n );\r\n};\r\n\r\nexport default Card;\r\n","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n numberlink: {\r\n color: \"inherit\",\r\n textDecoration: \"none\",\r\n },\r\n}));\r\n\r\ninterface Props {\r\n telephonenumber: string;\r\n}\r\n\r\nconst TelephoneNumber: React.FC<Props> = ({ telephonenumber }) => {\r\n const classes = useStyles();\r\n\r\n const formatTelephoneNumber = (telephoneNumber: string) => {\r\n if (telephoneNumber) {\r\n return ` ${telephoneNumber.replace(/(\\d{2})/g, \"$1 \")}`;\r\n }\r\n return \"-\";\r\n };\r\n\r\n return (\r\n <a href={`tel: ${telephonenumber}`} className={classes.numberlink}>\r\n {formatTelephoneNumber(telephonenumber)}\r\n </a>\r\n );\r\n};\r\nexport default TelephoneNumber;\r\n","import React from \"react\";\r\nimport Container from \"@material-ui/core/Container\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n marginTop: \"2rem\",\r\n },\r\n cardWrapper: {\r\n margin: 0,\r\n width: \"100%\",\r\n height: 365,\r\n },\r\n}));\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst Background: React.FC<Props> = ({ children }) => {\r\n const classes = useStyles();\r\n return (\r\n <Container className={classes.root}>\r\n <Grid item lg={12} sm={12} md={12} className={classes.cardWrapper}>\r\n {children}\r\n <br />\r\n </Grid>\r\n </Container>\r\n );\r\n};\r\nexport default Background;\r\n"],"sourceRoot":""}