{"version":3,"sources":["serviceWorker.ts","constants.ts","config.ts","components/Auth/Auth.ts","Redux/Actions.tsx","Redux/Constants.tsx","components/Auth/Index.tsx","components/Auth/Login.tsx","components/Auth/LoginCallback.tsx","components/ascom/ErrorAlert.tsx","components/users/RequestNewPassword.tsx","components/users/SetPassword.tsx","useHasPermission.ts","components/ascom/AccessDenied.tsx","components/Auth/AuthRoute.tsx","components/users/EditUserModal.tsx","components/users/DeleteUserModal.tsx","components/users/ListUsers.tsx","components/users/UserRoles.tsx","components/users/UserAxCompanies.tsx","components/users/UserDetails.tsx","components/users/UserComponent.tsx","components/applications/ApplicationRow.tsx","components/applications/ApplicationList.tsx","components/applications/ApplicationEditor.tsx","components/permissions/PermissionEditor.tsx","components/permissions/DeletePermissionDialog.tsx","components/applications/ApplicationPermissions.tsx","components/roles/RoleEditor.tsx","components/roles/DeleteRoleDialog.tsx","components/applications/ApplicationRoles.tsx","components/allowedorigins/DeleteAllowedOriginDialog.tsx","components/allowedorigins/AllowedOriginEditor.tsx","components/applications/ApplicationAllowedOrigins.tsx","components/applications/ApplicationDetails.tsx","components/roles/ManageRoles.tsx","components/permissions/PermissionDetails.tsx","components/ascom/ConfirmDialog.tsx","components/roles/RoleGroups.tsx","components/roles/RoleUsers.tsx","components/roles/RolePermissions.tsx","components/roles/RoleDetails.tsx","components/applications/ApplicationComponent.tsx","components/ascom/MainMenu.tsx","components/users/RequestDeletionModal.tsx","components/users/ChangePasswordModal.tsx","components/users/Profile.tsx","components/Auth/SilentRedirect.tsx","components/ascom/TitleBar.tsx","components/Auth/Routes.tsx","App.tsx","Redux/Reducers.tsx","index.tsx"],"names":["Boolean","window","location","hostname","match","Permission","config","BASE_URL","BASE_URL_OIDC","BASE_URL_API","CLIENT_ID","withBaseURL","Uri","withApiURL","manager","UserManager","authority","client_id","redirect_uri","response_type","scope","post_logout_redirect_uri","automaticSilentRenew","loadUserInfo","silent_redirect_uri","userStore","WebStorageStateStore","store","localStorage","AUTHORIZATION_API_APPLICATION_URL","AUTHORIZATION_API_COUNTRY_URL","AUTHORIZATION_API_ROLE_URL","AUTHORIZATION_API_ROLE_USER_URL","AUTHORIZATION_API_GROUP_URL","AUTHORIZATION_API_USER_URL","AUTHORIZATION_API_ROLE_ADMINISTRATOR_URL","AUTHORIZATION_API_ROLE_PERMISSION_URL","AUTHORIZATION_API_PERMISSION_URL","AUTHORIZATION_API_ALLOWED_ORIGIN_URL","AUTHORIZATION_API_GET_PERMISSIONS_URL","AUTHORIZATION_API_AXCOMPANY_URL","createSetLoginAction","login","type","createSetLoginThunk","dispatch","getState","a","fetch","method","headers","Authorization","access_token","then","response","json","catch","error","signinRedirect","data","createSetPermissionsAction","createSetPermissionsFetchErrorAction","message","payload","Index","className","Login","useEffect","Spinner","animation","variant","LoginCallback","useState","done","setDone","useDispatch","lastVisitedUrl","useSelector","state","signinRedirectCallback","to","ErrorAlert","props","errorMessage","role","dangerouslySetInnerHTML","__html","replace","RequestNewPassword","userName","setUserName","setErrorMessage","requestSubmitted","setRequestSubmitted","Fragment","Form","id","onSubmit","event","preventDefault","body","JSON","stringify","ok","Group","Control","onChange","e","currentTarget","value","placeholder","Text","Row","Button","disabled","SetPassword","password","setPassword","repeatPassword","setRepeatPassword","isValidPasswordResetGuid","setIsValidPasswordResetGuid","init","setInit","guid","params","passwordOk","length","toUpperCase","toLowerCase","test","href","useHasPermission","permission","permissions","undefined","includes","toString","AccessDenied","AuthRoute","Component","component","rest","loginFetch","auth","permissionsFetch","permissionsFetchError","hasPermission","userPermissions","forEach","useHasPermissions","render","pathname","from","onClick","signinSilent","EditUserModal","cancelFunction","okFunction","show","user","loadingCountries","setLoadingCountries","save","setSave","saving","setSaving","countries","setCountries","editedUser","setEditedUser","cancelled","setCancelled","handleInputChange","persist","target","name","Constants","statusText","closeModal","Modal","onHide","Header","closeButton","Title","Body","Label","defaultValue","firstName","key","lastName","email","controlId","as","countryName","map","index","selected","isoCode","Check","label","defaultChecked","enabled","checked","Footer","size","DeleteUserModal","performDelete","setPerformDelete","deleting","setDeleting","ListUsers","users","setUsers","loading","setLoading","loadingFinished","setLoadingFinished","userToEdit","setUserToEdit","userToDelete","setUserToDelete","filterText","setFilterText","onlyShowEnabledUsers","setOnlyShowEnabledUsers","userCanViewUserDetails","VIEWUSERDETAILS","userCanEditUser","EDITUSER","userCanDeleteUser","DELETEUSER","pragma","parse","colSpan","filter","customerId","internal","UserRoles","userObjectId","userRoles","setUserRoles","userRole","roleId","applicationName","roleName","roleGroupName","UserAxCompanies","setUser","axCompanies","setAxCompanies","console","log","Accept","text","userClone","cloneDeep","axCompany","code","find","c","push","UserDetails","showEditUserModal","setShowEditUserModal","companyName","Tabs","defaultActiveKey","Tab","eventKey","title","objectId","UserComponent","url","path","LISTUSERS","ApplicationRow","setShow","clientid","refresh","userCanDeleteApplication","DELETEAPPLICATION","userCanViewApplicationDetails","VIEWAPPLICATIONDETAILS","userCanEditApplication","EDITAPPLICATION","dialogClassName","aria-labelledby","handleDeleteApplication","ApplicationList","applications","setApplications","row","clientId","ApplicationEditor","application","setApplication","loadErrorMessage","setLoadErrorMessage","saveErrorMessage","setSaveErrorMessage","bodyData","document","getElementById","onKeyUp","updateClientId","minLength","maxLength","replaceIllegalCharsInClientId","nameTextBox","updateSubmitEnabled","clientIdTextBox","PermissionEditor","closeDialog","description","DeletePermissionDialog","deletePermission","ApplicationPermissions","refreshParent","showDialog","setShowDialog","editedPermission","setEditedPermission","permissionToDelete","setPermissionToDelete","userCanDeletePermission","AppPermission","DELETEPERMISSION","userCanCreatePermission","CREATEPERMISSION","userCanEditPermission","EDITPERMISSION","userCanViewPermissionDetails","VIEWPERMISSIONDETAILS","RoleEditor","DeleteRoleDialog","deleteRole","ApplicationRoles","editedRole","setEditedRole","roleToDelete","setRoleToDelete","userCanDeleteRole","DELETEROLE","userCanCreateRole","CREATEROLE","userCanEditRole","EDITROLE","roles","DeleteAllowedOriginDialog","allowedOrigin","AllowedOriginEditor","ApplicationAllowedOrigins","editedAllowedOrigin","setEditedAllowedOrigin","allowedOriginToDelete","setAllowedOriginToDelete","userCanDeleteAllowedOrigin","DELETEALLOWEDORIGIN","userCanCreateAllowedOrigin","CREATEALLOWEDORIGIN","userCanEditAllowedOrigin","EDITALLOWEDORIGIN","allowedOrigins","ApplicationDetails","ManageRoles","setRoles","PermissionDetails","permissionRequest","setPermissionRequest","ConfirmDialog","okButtonText","RoleGroups","groups","setGroups","selectedGroup","setSelectedGroup","groupToDelete","setGroupToDelete","userCanAddGroupToRole","ADDGROUPTOROLE","userCanRemoveGroupFromRole","REMOVEGROUPFROMROLE","userCanAddGroupToRole_RoleAdministrator","ADDGROUPTOROLE_ROLEADMINISTRATOR","userCanRemoveGroupFromRole_RoleAdministrator","REMOVEGROUPFROMROLE_ROLEADMINISTRATOR","userCanViewRoleAdministratorRoleDetails","VIEWROLEADMINISTRATORROLEDETAILS","userCanViewRoleDetails","VIEWROLEDETAILS","fetchGroups","group","deletedGroupId","g","loadOptions","inputValue","callback","setTimeout","option","meta","RoleUsers","showAdministrators","selectedUser","setSelectedUser","userTerm","userCanAddUserToRole","ADDUSERTOROLE","userCanRemoveUserFromRole","REMOVEUSERFROMROLE","userCanAddUserToRole_RoleAdministrator","ADDUSERTOROLE_ROLEADMINISTRATOR","userCanRemoveUserFromRole_RoleAdministrator","REMOVEUSERFROMROLE_ROLEADMINISTRATOR","userCanAddAdministratorToRole","ADDADMINISTRATORTOROLE","userCanRemoveAdministratorFromRole","REMOVEADMINISTATORFROMROLE","baseUrl","fetchUsers","userId","deletedUserId","u","RolePermissions","applicationId","setPermissions","allPermissions","setAllPermissions","selectedPermission","setSelectedPermission","userCanAddPermissionToRole","ADDPERMISSIONTOROLE","userCanRemovePermissionFromRole","REMOVEPERMISSIONFROMROLE","fetchPermissions","getSelectOptions","deletedPermissionId","p","options","RoleDetails","roleRequest","setRoleRequest","roleAdministrator","ApplicationComponent","CREATEAPPLICATION","VIEWROLEADMINISTRATORROLES","LISTAPPLICATIONS","MainMenu","activeMenu","getMenuClassName","menuName","data-toggle","data-target","aria-controls","aria-expanded","aria-label","RequestDeletionModal","deletionConfirmed","setDeletionConfirmed","requestDeletion","ChangePasswordModal","oldPassword","setOldPassword","newPassword","setNewPassword","repeatNewPassword","setRepeatNewPassword","Profile","profile","setProfile","deletionRequested","setDeletionRequested","showChangePasswordModal","setShowChangePasswordModal","column","sm","Col","plaintext","readOnly","SilentRedirect","signinSilentCallback","err","TitleBar","this","height","alt","React","Routes","isLoginFetch","indexOf","exact","App","getUser","initialAuthState","initialPermissionState","initialLastVisitedUrlState","rootReducer","combineReducers","action","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","persistConfig","storage","stateReconciler","autoMergeLevel2","blacklist","pReducer","persistReducer","createStore","applyMiddleware","thunk","persistor","persistStore","LoadingView","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.6890c33b.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\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.1/8 is 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 as { env: { [key: string]: string } }).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\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\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\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 .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.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import { BASE_URL_API } from \"./config\";\r\n\r\nexport const AUTHORIZATION_API_BASE_URL = BASE_URL_API;\r\nexport const AUTHORIZATION_API_APPLICATION_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/application\";\r\nexport const AUTHORIZATION_API_COUNTRY_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/country\";\r\nexport const AUTHORIZATION_API_ROLE_URL = AUTHORIZATION_API_BASE_URL + \"/role\";\r\nexport const AUTHORIZATION_API_ROLE_USER_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/roleuser\";\r\nexport const AUTHORIZATION_API_GROUP_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/group\";\r\nexport const AUTHORIZATION_API_USER_URL = AUTHORIZATION_API_BASE_URL + \"/user\";\r\nexport const AUTHORIZATION_API_ROLE_ADMINISTRATOR_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/roleadministrator\";\r\nexport const AUTHORIZATION_API_ROLE_PERMISSION_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/rolepermission\";\r\nexport const AUTHORIZATION_API_PERMISSION_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/permission\";\r\nexport const AUTHORIZATION_API_ALLOWED_ORIGIN_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/allowedorigin\";\r\nexport const AUTHORIZATION_API_GET_PERMISSIONS_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/haspermission/authorization\";\r\nexport const AUTHORIZATION_API_AXCOMPANY_URL =\r\n AUTHORIZATION_API_BASE_URL + \"/axcompany\";\r\n\r\nexport enum Permission {\r\n CREATEAPPLICATION = \"CreateApplication\",\r\n EDITAPPLICATION = \"EditApplication\",\r\n DELETEAPPLICATION = \"DeleteApplication\",\r\n LISTAPPLICATIONS = \"ListApplications\",\r\n VIEWAPPLICATIONDETAILS = \"ViewApplicationDetails\",\r\n CREATEPERMISSION = \"CreatePermission\",\r\n EDITPERMISSION = \"EditPermission\",\r\n DELETEPERMISSION = \"DeletePermission\",\r\n VIEWPERMISSIONDETAILS = \"ViewPermissionDetails\",\r\n CREATEROLE = \"CreateRole\",\r\n EDITROLE = \"EditRole\",\r\n DELETEROLE = \"DeleteRole\",\r\n VIEWROLEDETAILS = \"ViewRoleDetails\",\r\n ADDPERMISSIONTOROLE = \"AddPermissionToRole\",\r\n REMOVEPERMISSIONFROMROLE = \"RemovePermissionFromRole\",\r\n ADDADMINISTRATORTOROLE = \"AddAdministratorToRole\",\r\n REMOVEADMINISTATORFROMROLE = \"RemoveAdministatorFromRole\",\r\n VIEWROLEADMINISTRATORROLES = \"ViewRoleAdministratorRoles\",\r\n VIEWROLEADMINISTRATORROLEDETAILS = \"ViewRoleAdministratorRoleDetails\",\r\n ADDUSERTOROLE = \"AddUserToRole\",\r\n REMOVEUSERFROMROLE = \"RemoveUserFromRole\",\r\n ADDGROUPTOROLE = \"AddGroupToRole\",\r\n REMOVEGROUPFROMROLE = \"RemoveGroupFromRole\",\r\n ADDUSERTOROLE_ROLEADMINISTRATOR = \"AddUserToRole_RoleAdministrator\",\r\n REMOVEUSERFROMROLE_ROLEADMINISTRATOR = \"RemoveUserFromRole_RoleAdministrator\",\r\n ADDGROUPTOROLE_ROLEADMINISTRATOR = \"AddGroupToRole_RoleAdministrator\",\r\n REMOVEGROUPFROMROLE_ROLEADMINISTRATOR = \"RemoveGroupFromRole_RoleAdministrator\",\r\n SEARCHGROUPS = \"SearchGroups\",\r\n SEARCHUSERS = \"SearchUsers\",\r\n CREATEALLOWEDORIGIN = \"CreateAllowedOrigin\",\r\n EDITALLOWEDORIGIN = \"EditAllowedOrigin\",\r\n DELETEALLOWEDORIGIN = \"DeleteAllowedOrigin\",\r\n CREATECOMPANY = \"CreateCompany\",\r\n EDITCOMPANY = \"EditCompany\",\r\n DELETECOMPANY = \"DeleteCompany\",\r\n LISTCOMPANIES = \"ListCompanies\",\r\n VIEWCOMPANYDETAILS = \"ViewCompanyDetails\",\r\n ADDCOMPANYADMINISTRATOR = \"AddCompanyAdministrator\",\r\n REMOVECOMPANYADMINISTRATOR = \"RemoveCompanyAdministrator\",\r\n SETCOMPANYPRODUCTCATEGORIES = \"SetCompanyProductCategories\",\r\n SETCOMPANYDISTRIBUTIONCHANNELS = \"SetCompanyDistributionChannels\",\r\n LISTUSERS = \"ListUsers\",\r\n VIEWUSERDETAILS = \"ViewUserDetails\",\r\n EDITUSER = \"EditUser\",\r\n ENABLEORDISABLEUSER = \"EnableOrDisableUser\",\r\n DELETEUSER = \"DeleteUser\",\r\n CREATEUSER = \"CreateUser\",\r\n VIEWACCOUNTDELETIONREQUESTS = \"ViewAccountDeletionRequests\",\r\n APPROVEACCOUNTDELETIONREQUEST = \"ApproveAccountDeletionRequest\",\r\n DENYACCOUNTDELETIONREQUEST = \"DenyAccountDeletionRequest\",\r\n VIEWPENDINGACCOUNTREQUESTS = \"ViewPendingAccountRequests\",\r\n APPROVEPENDINGACCOUNTREQUEST = \"ApprovePendingAccountRequest\",\r\n DENYPENDINGACCOUNTREQUEST = \"DenyPendingAccountRequest\"\r\n}\r\n\r\n// SQL query to generate Permission enum values\r\n\r\n// DECLARE ps CURSOR LOCAL FOR\r\n// SELECT [Key] FROM Permission WHERE ApplicationId=1\r\n\r\n// DECLARE @permission nvarchar(255)\r\n\r\n// OPEN ps\r\n// FETCH NEXT FROM ps INTO @permission\r\n\r\n// WHILE @@FETCH_STATUS = 0\r\n// BEGIN\r\n// \tPRINT UPPER(@permission) + '=\"' + @permission + '\",'\r\n\r\n// \tFETCH NEXT FROM ps INTO @permission\r\n// END\r\n\r\n// CLOSE ps\r\n// DEALLOCATE ps\r\n","const dev = {\r\n BASE_URL: \"https://localhost:3000\",\r\n BASE_URL_OIDC: \"https://login.microsoftonline.com/0a054ad1-7e5a-4c04-b55b-44bc45351419/v2.0\",\r\n BASE_URL_API: \"https://localhost:44323\",\r\n CLIENT_ID: \"64cb8cd8-0acf-4cca-97f4-9b7c4b3d9fd1\"\r\n};\r\n\r\nconst test = {\r\n BASE_URL: \"https://auth-test.ascom.com\",\r\n BASE_URL_OIDC: \"https://login.microsoftonline.com/0a054ad1-7e5a-4c04-b55b-44bc45351419/v2.0\",\r\n BASE_URL_API: \"https://auth-test.ascom.com/api\",\r\n CLIENT_ID: \"5e229103-50c0-4800-8068-961d3927513f\"\r\n};\r\n\r\nconst staging = {\r\n BASE_URL: \"https://auth-staging.ascom.com\",\r\n BASE_URL_OIDC: \"https://login.microsoftonline.com/0a054ad1-7e5a-4c04-b55b-44bc45351419/v2.0\",\r\n BASE_URL_API: \"https://auth-staging.ascom.com/api\",\r\n CLIENT_ID: \"2cdc9aa6-d22c-40be-b151-b520a24df644\"\r\n};\r\n\r\nconst prod = {\r\n BASE_URL: \"https://auth.ascom.com\",\r\n BASE_URL_OIDC: \"https://login.microsoftonline.com/0a054ad1-7e5a-4c04-b55b-44bc45351419/v2.0\",\r\n BASE_URL_API: \"https://auth.ascom.com/api\",\r\n CLIENT_ID: \"64cb8cd8-0acf-4cca-97f4-9b7c4b3d9fd1\"\r\n};\r\n\r\nconst config =\r\n process.env.REACT_APP_STAGE === \"prod\"\r\n ? prod\r\n : process.env.REACT_APP_STAGE === \"staging\"\r\n ? staging\r\n : process.env.REACT_APP_STAGE === \"test\"\r\n ? test\r\n : dev;\r\n\r\nconst withBaseURL = (Uri: string) => {\r\n return config.BASE_URL + Uri;\r\n};\r\n\r\nconst withApiURL = (Uri: string) => {\r\n return config.BASE_URL_API + Uri;\r\n};\r\n\r\nconst BASE_URL_OIDC = config.BASE_URL_OIDC;\r\nconst BASE_URL_API = config.BASE_URL_API;\r\nconst CLIENT_ID = config.CLIENT_ID;\r\n\r\nexport { withBaseURL, withApiURL, BASE_URL_OIDC, BASE_URL_API, CLIENT_ID };\r\n","import { UserManager, WebStorageStateStore } from \"oidc-client\";\r\nimport { withBaseURL, BASE_URL_OIDC, CLIENT_ID } from \"../../config\";\r\n\r\nexport const manager = new UserManager({\r\n authority: BASE_URL_OIDC,\r\n client_id: CLIENT_ID,\r\n redirect_uri: withBaseURL(\"/logincallback\"),\r\n response_type: \"id_token token\",\r\n scope: \"api://ff90259c-24ff-408b-a89e-998bac80de50/authorizationApi openid profile\",\r\n post_logout_redirect_uri: withBaseURL(\"/\"),\r\n automaticSilentRenew: true,\r\n loadUserInfo: false,\r\n silent_redirect_uri: withBaseURL(\"/logincallback\"),\r\n userStore: new WebStorageStateStore({ store: localStorage }),\r\n});","import { User } from \"oidc-client\";\r\nimport {\r\n CLEAR_LOGIN,\r\n SET_LOGIN,\r\n SET_LOGIN_FETCH,\r\n SET_PERMISSIONS,\r\n SET_PERMISSIONS_FETCH_ERROR,\r\n SET_LAST_VISITED_URL\r\n} from \"./Constants\";\r\nimport { ThunkAction } from \"redux-thunk\";\r\nimport { RootState } from \"./Reducers\";\r\nimport { AUTHORIZATION_API_GET_PERMISSIONS_URL } from \"../constants\";\r\nimport { manager } from \"../components/Auth/Auth\";\r\n\r\nexport interface SetLoginAction {\r\n type: SET_LOGIN;\r\n login: User;\r\n}\r\n\r\nexport const createSetLoginAction = (login: User): SetLoginAction => ({\r\n type: SET_LOGIN,\r\n login\r\n});\r\n\r\nexport type LoginActions =\r\n | SetLoginAction\r\n | SetPermissionsAction\r\n | SetPermissionsFetchErrorAction;\r\n\r\nexport type ThunkResult = ThunkAction;\r\n\r\nexport const createSetLoginThunk = (login: User): ThunkResult => {\r\n return async (dispatch, getState) => {\r\n dispatch(createSetLoginAction(login));\r\n\r\n fetch(AUTHORIZATION_API_GET_PERMISSIONS_URL, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n })\r\n .then(response => response.json().catch(error => {\r\n manager.signinRedirect();\r\n }))\r\n .then(data => dispatch(createSetPermissionsAction(data)))\r\n .catch(error =>\r\n dispatch(createSetPermissionsFetchErrorAction(error.message))\r\n );\r\n };\r\n};\r\n\r\nexport interface ClearLoginAction {\r\n type: CLEAR_LOGIN;\r\n}\r\n\r\nexport const createClearLoginAction = (): ClearLoginAction => ({\r\n type: CLEAR_LOGIN\r\n});\r\n\r\nexport interface SetLoginFetchAction {\r\n type: SET_LOGIN_FETCH;\r\n}\r\n\r\nexport const createSetLoginFetchAction = (): SetLoginFetchAction => ({\r\n type: SET_LOGIN_FETCH\r\n});\r\n\r\nexport type AuthActions =\r\n | ClearLoginAction\r\n | SetLoginAction\r\n | SetLoginFetchAction;\r\n\r\nexport interface SetPermissionsAction {\r\n type: SET_PERMISSIONS;\r\n payload: string[];\r\n}\r\n\r\nexport const createSetPermissionsAction = (\r\n payload: string[]\r\n): SetPermissionsAction => ({\r\n type: SET_PERMISSIONS,\r\n payload\r\n});\r\n\r\nexport interface SetPermissionsFetchErrorAction {\r\n type: SET_PERMISSIONS_FETCH_ERROR;\r\n payload: string;\r\n}\r\n\r\nexport const createSetPermissionsFetchErrorAction = (\r\n payload: string\r\n): SetPermissionsFetchErrorAction => ({\r\n type: SET_PERMISSIONS_FETCH_ERROR,\r\n payload\r\n});\r\n\r\nexport type PermissionActions =\r\n | SetPermissionsAction\r\n | SetPermissionsFetchErrorAction;\r\n\r\nexport interface SetLastVisitedUrlAction {\r\n type: SET_LAST_VISITED_URL;\r\n payload: string;\r\n}\r\n\r\nexport const createSetLastVisitedUrlAction = (\r\n payload: string\r\n): SetLastVisitedUrlAction => ({\r\n type: SET_LAST_VISITED_URL,\r\n payload\r\n});\r\n\r\nexport type LastVisitedUrlActions = SetLastVisitedUrlAction;\r\n","export const SET_LOGIN = \"SET_LOGIN\";\r\nexport type SET_LOGIN = typeof SET_LOGIN;\r\n\r\nexport const CLEAR_LOGIN = \"CLEAR_LOGIN\";\r\nexport type CLEAR_LOGIN = typeof CLEAR_LOGIN;\r\n\r\nexport const SET_LOGIN_FETCH = \"SET_LOGIN_FETCH\";\r\nexport type SET_LOGIN_FETCH = typeof SET_LOGIN_FETCH;\r\n\r\nexport const GET_PERMISSIONS = \"GET_PERMISSIONS\";\r\nexport type GET_PERMISSIONS = typeof GET_PERMISSIONS;\r\n\r\nexport const SET_PERMISSIONS = \"SET_PERMISSIONS\";\r\nexport type SET_PERMISSIONS = typeof SET_PERMISSIONS;\r\n\r\nexport const SET_PERMISSIONS_FETCH_ERROR = \"SET_PERMISSIONS_FETCH_ERROR\";\r\nexport type SET_PERMISSIONS_FETCH_ERROR = typeof SET_PERMISSIONS_FETCH_ERROR;\r\n\r\nexport const SET_LAST_VISITED_URL = \"SET_LAST_VISITED_URL\";\r\nexport type SET_LAST_VISITED_URL = typeof SET_LAST_VISITED_URL;\r\n","import * as React from \"react\";\r\n\r\nexport const Index: React.FC = () => {\r\n return \r\n {
\r\n
\r\n

Ascom Authorization Portal

\r\n

This tool manages authorization for various applications, both for external and\r\n internal users, giving them permissions to different features in\r\n these applications.\r\n

\r\n
\r\n
}
;\r\n};\r\n","import * as React from \"react\";\r\nimport { manager } from \"./Auth\";\r\nimport { useEffect } from \"react\";\r\nimport { Spinner } from \"react-bootstrap\";\r\n\r\nexport const Login: React.FC = () => {\r\n useEffect(() => {\r\n manager.signinRedirect();\r\n }, []);\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n","import { Redirect } from \"react-router-dom\";\r\nimport { manager } from \"./Auth\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { useEffect, useState } from \"react\";\r\nimport * as React from \"react\";\r\nimport { createSetLoginThunk } from \"../../Redux/Actions\";\r\nimport { Spinner } from \"react-bootstrap\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport const LoginCallback: React.FC = () => {\r\n const [done, setDone] = useState(false);\r\n const dispatch = useDispatch();\r\n const lastVisitedUrl = useSelector(\r\n (state: RootState) => state.lastVisitedUrl.lastVisitedUrl\r\n );\r\n useEffect(() => {\r\n manager.signinRedirectCallback().then(login => {\r\n dispatch(createSetLoginThunk(login));\r\n setDone(true);\r\n });\r\n }, [dispatch]);\r\n return done ? (\r\n \r\n ) : (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const ErrorAlert : React.FC<{errorMessage : string}> = (props) => {\r\n const errorMessage = props.errorMessage;\r\n\r\n return (\r\n \")\r\n }}\r\n />\r\n );\r\n}","import React, { useState } from \"react\";\r\nimport { Form, Button } from \"react-bootstrap\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\n\r\nexport const RequestNewPassword: React.FC = () => {\r\n const [userName, setUserName] = useState(\"\");\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [requestSubmitted, setRequestSubmitted] = useState(false);\r\n\r\n const handleSubmit = (event: React.FormEvent) => {\r\n event.preventDefault();\r\n fetch(\"https://authepi.ascom.com/api/resetpassword\", {\r\n method: \"POST\",\r\n body: JSON.stringify(userName),\r\n headers: { \"Content-Type\": \"application/json\" }\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n setErrorMessage(\r\n \"Try again later. Inform someone at Ascom if the problem persists.\"\r\n );\r\n } else {\r\n setRequestSubmitted(true);\r\n }\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n };\r\n\r\n return (\r\n

Reset password

\r\n {errorMessage === \"\" && !requestSubmitted && (\r\n
\r\n \r\n {\r\n setUserName(e.currentTarget.value);\r\n }}\r\n placeholder=\"User name or e-mail\"\r\n />\r\n \r\n

Enter your user name or e-mail and click \"Submit request\".\r\n If you enter a valid user name/e-mail, an e-mail will be\r\n sent to you with a link where you can reset your password.

\r\n\r\n

If you are an internal user, contact ICT to reset your password.

\r\n
\r\n
\r\n \r\n \r\n {/*
\r\n \r\n
*/}\r\n
\r\n
\r\n )}\r\n {errorMessage !== \"\" && }\r\n {requestSubmitted &&\r\n \"Your request has been submitted to Ascom. Check your e-mail inbox for an instruction on how to reset your password.\"}\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Form, Button } from \"react-bootstrap\";\r\nimport { withApiURL } from \"../../config\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { RouteComponentProps } from \"react-router\";\r\n\r\nexport interface GuidProps {\r\n guid: string;\r\n}\r\n\r\nexport const SetPassword: React.FC> = props => {\r\n const [password, setPassword] = useState(\"\");\r\n const [repeatPassword, setRepeatPassword] = useState(\"\");\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [requestSubmitted, setRequestSubmitted] = useState(false);\r\n const [isValidPasswordResetGuid, setIsValidPasswordResetGuid] = useState(\r\n false\r\n );\r\n const [init, setInit] = useState(true);\r\n const guid = props.match.params.guid;\r\n\r\n const handleSubmit = (event: React.FormEvent) => {\r\n event.preventDefault();\r\n\r\n fetch(\"https://authepi.ascom.com/api/setpassword\", {\r\n method: \"POST\",\r\n body: JSON.stringify({ password: password, guid: guid }),\r\n headers: { \"Content-Type\": \"application/json\" }\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n setErrorMessage(\r\n \"Try again later. Inform someone at Ascom if the problem persists.\"\r\n );\r\n } else {\r\n setRequestSubmitted(true);\r\n }\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n };\r\n\r\n useEffect(() => {\r\n if (init) {\r\n setInit(false);\r\n fetch(\"https://authepi.ascom.com/api/setpassword/checkguid\", {\r\n method: \"POST\",\r\n body: JSON.stringify({ guid: guid }),\r\n headers: { \"Content-Type\": \"application/json\" }\r\n })\r\n .then(response => {\r\n if (response.ok) {\r\n response.json().then(data => {\r\n setIsValidPasswordResetGuid(data);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n });\r\n }\r\n }, [init, setInit, guid]);\r\n\r\n // Password requirements: Minimum 8 chars, lowercase, uppercase and numbers.\r\n const passwordOk: () => boolean = () => {\r\n if (password.length < 8) return false;\r\n if (password.toUpperCase() === password) return false;\r\n if (password.toLowerCase() === password) return false;\r\n if (!/\\d/.test(password)) return false;\r\n\r\n return true;\r\n };\r\n\r\n return (\r\n \r\n

Set new password

\r\n {!isValidPasswordResetGuid && (\r\n
\r\n The link is not valid. Before setting the password you need to\r\n request that here.\r\n
\r\n )}\r\n {errorMessage === \"\" &&\r\n !requestSubmitted &&\r\n isValidPasswordResetGuid && (\r\n
\r\n \r\n {\r\n setPassword(e.currentTarget.value);\r\n }}\r\n placeholder=\"New password\"\r\n />\r\n \r\n {passwordOk()\r\n ? \"The current password fulfills the requirements.\"\r\n : \"The password must be at least 8 characters long and contain lowercase characters, uppercase characters and numbers.\"}\r\n {\" \"}\r\n \r\n\r\n \r\n {\r\n setRepeatPassword(e.currentTarget.value);\r\n }}\r\n placeholder=\"Repeat new password\"\r\n />\r\n \r\n\r\n \r\n Submit request\r\n \r\n \r\n )}\r\n {errorMessage !== \"\" && }\r\n {requestSubmitted && \"Your password has been reset.\"}\r\n
\r\n );\r\n};\r\n","import { useSelector } from \"react-redux\";\r\nimport { RootState } from \"./Redux/Reducers\";\r\nimport { Permission } from \"./constants\";\r\n\r\nexport function useHasPermission(permission: Permission) {\r\n const permissions = useSelector(\r\n (state: RootState) => state.permissions.permissions\r\n );\r\n\r\n if (permission === undefined) return true;\r\n\r\n return permissions.includes(permission.toString());\r\n}\r\n\r\nexport function useHasPermissions(permissions: Permission[]) {\r\n const userPermissions = useSelector(\r\n (state: RootState) => state.permissions.permissions\r\n );\r\n\r\n if (permissions === undefined || permissions.length === 0) return true;\r\n\r\n var hasPermission = false;\r\n permissions.forEach(permission => {\r\n if (userPermissions.includes(permission.toString())) {\r\n hasPermission = true;\r\n }\r\n });\r\n\r\n return hasPermission;\r\n}\r\n","import React from \"react\";\r\n\r\nexport const AccessDenied: React.FC = props => {\r\n return (\r\n
\r\n

Access denied

\r\n You don't have sufficient permissions to view this page.\r\n
\r\n );\r\n};\r\n","import { Route, Redirect } from \"react-router-dom\";\r\nimport * as React from \"react\";\r\nimport { manager } from \"./Auth\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { useHasPermissions } from \"../../useHasPermission\";\r\nimport { AccessDenied } from \"../ascom/AccessDenied\";\r\nimport { Button, Spinner } from \"react-bootstrap\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\n\r\nconst AuthRoute = ({ component: Component, permissions, ...rest }: any) => {\r\n const loginFetch = useSelector((state: RootState) => state.auth.loginFetch);\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n const permissionsFetch = useSelector(\r\n (state: RootState) => state.permissions.permissionsFetch\r\n );\r\n const permissionsFetchError = useSelector(\r\n (state: RootState) => state.permissions.permissionsFetchError\r\n );\r\n\r\n const hasPermission = useHasPermissions(permissions);\r\n\r\n const signIn = () => {\r\n manager.signinSilent();\r\n }\r\n\r\n return (\r\n {\r\n if (\r\n login &&\r\n permissions !== undefined &&\r\n permissions.length > 0 &&\r\n !hasPermission &&\r\n permissionsFetch\r\n ) {\r\n return ;\r\n }\r\n if (loginFetch && login === undefined) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n if (!permissionsFetch) {\r\n return (\r\n
\r\n
\r\n {permissionsFetchError === \"\" && (\r\n \r\n )}\r\n {permissionsFetchError !== \"\" && (\r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n\r\n return ;\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport { AuthRoute };\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Modal, Button, Form, Spinner } from \"react-bootstrap\";\r\nimport { withApiURL } from \"../../config\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { Country } from \"../../types/Country\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { User } from \"../../types/User\";\r\n\r\ninterface EditUserModalProps {\r\n cancelFunction: () => void;\r\n okFunction: (user: User) => void;\r\n show: boolean;\r\n user: User;\r\n}\r\n\r\nexport const EditUserModal: React.FC = props => {\r\n const { cancelFunction, okFunction, show, user } = props;\r\n const { login } = useSelector((state: RootState) => state.auth);\r\n const [loadingCountries, setLoadingCountries] = useState(true);\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [countries, setCountries] = useState([]);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [editedUser, setEditedUser] = useState(user);\r\n const [cancelled, setCancelled] = useState(false);\r\n\r\n const handleInputChange = (event: any) => {\r\n event.persist();\r\n\r\n setEditedUser((user: User) => ({\r\n ...user,\r\n [event.target.name]: event.target.value\r\n }));\r\n };\r\n\r\n useEffect(() => {\r\n if (\r\n (editedUser === undefined && user !== undefined) ||\r\n (cancelled &&\r\n editedUser !== undefined &&\r\n user !== undefined &&\r\n editedUser.id !== user.id)\r\n ) {\r\n setEditedUser(user);\r\n setCancelled(false);\r\n }\r\n\r\n if (loadingCountries) {\r\n setLoadingCountries(false);\r\n fetch(Constants.AUTHORIZATION_API_COUNTRY_URL, {\r\n method: \"GET\"\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setCountries(data);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n });\r\n }\r\n\r\n if (save && login !== undefined) {\r\n setSave(false);\r\n setSaving(true);\r\n fetch(withApiURL(`/user`), {\r\n method: \"PUT\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n },\r\n body: JSON.stringify(editedUser)\r\n })\r\n .then(response => {\r\n if (response.ok) {\r\n okFunction(editedUser);\r\n } else {\r\n setErrorMessage(\r\n \"Failed to update user data (\" + response.statusText + \")\"\r\n );\r\n }\r\n setSaving(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n setSaving(false);\r\n });\r\n }\r\n }, [\r\n editedUser,\r\n cancelled,\r\n user,\r\n loadingCountries,\r\n login,\r\n save,\r\n okFunction\r\n ]);\r\n\r\n const closeModal = () => {\r\n cancelFunction();\r\n setCancelled(true);\r\n };\r\n\r\n return (\r\n
\r\n {user !== undefined && (\r\n \r\n {(countries === []) && errorMessage === \"\" && (\r\n \r\n )}\r\n {countries !== [] && editedUser !== undefined && (\r\n
\r\n \r\n {`Edit ${editedUser.name}`}\r\n \r\n \r\n
\r\n \r\n First name:\r\n \r\n \r\n \r\n Last name:\r\n \r\n \r\n \r\n {\" \"}\r\n E-mail:\r\n \r\n \r\n \r\n {\" \"}\r\n AX customer ID:\r\n \r\n \r\n\r\n \r\n Country:\r\n \r\n {countries.length > 0 &&\r\n countries.map((value, index) => {\r\n return (\r\n \r\n {value.isoCode + \" - \" + value.name}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n (editedUser.enabled = event.currentTarget.checked)\r\n }\r\n key={editedUser.id}\r\n />\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Accept{\" \"}\r\n {saving && (\r\n \r\n )}\r\n \r\n \r\n {errorMessage !== \"\" && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Modal, Button, Spinner } from \"react-bootstrap\";\r\nimport { withApiURL } from \"../../config\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { User } from \"../../types/User\";\r\n\r\ninterface DeleteUserModalProps {\r\n cancelFunction: () => void;\r\n okFunction: () => void;\r\n show: boolean;\r\n user: User;\r\n}\r\n\r\nexport const DeleteUserModal: React.FC = props => {\r\n const { cancelFunction, okFunction, show, user } = props;\r\n const { login } = useSelector((state: RootState) => state.auth);\r\n const [performDelete, setPerformDelete] = useState(false);\r\n const [deleting, setDeleting] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (performDelete && login !== undefined && user !== undefined) {\r\n setPerformDelete(false);\r\n setDeleting(true);\r\n fetch(withApiURL(`/userprofile/` + user.id), {\r\n method: \"DELETE\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n })\r\n .then(response => {\r\n if (response.ok) {\r\n okFunction();\r\n } else {\r\n setErrorMessage(\r\n \"Failed to delete user (\" + response.statusText + \")\"\r\n );\r\n }\r\n setDeleting(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n setDeleting(false);\r\n });\r\n }\r\n }, [performDelete, login, user, okFunction]);\r\n\r\n return (\r\n
\r\n {user !== undefined && (\r\n \r\n {user !== undefined && (\r\n
\r\n \r\n {`Delete ${user.name}`}\r\n \r\n \r\n Please confirm that you want to permanently delete the AD\r\n account for the user {user.firstName} {user.lastName}. NB:\r\n Before you do this, make sure that the account must not be kept\r\n for regulatory reasons.\r\n \r\n \r\n {\r\n cancelFunction();\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n setPerformDelete(true);\r\n }}\r\n >\r\n Delete{\" \"}\r\n {deleting && (\r\n \r\n )}\r\n \r\n \r\n {errorMessage !== \"\" && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n","import { useEffect, useState } from \"react\";\r\nimport * as Constants from \"../../constants\";\r\nimport * as React from \"react\";\r\nimport { Spinner } from \"react-bootstrap\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { User } from \"../../types/User\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { Form } from \"react-bootstrap\";\r\nimport { EditUserModal } from \"./EditUserModal\";\r\nimport { DeleteUserModal } from \"./DeleteUserModal\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission } from \"../../constants\";\r\n\r\nexport const ListUsers: React.FC = () => {\r\n const { login } = useSelector((state: RootState) => state.auth);\r\n const [users, setUsers] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [loadingFinished, setLoadingFinished] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [userToEdit, setUserToEdit] = useState();\r\n const [userToDelete, setUserToDelete] = useState();\r\n const [filterText, setFilterText] = useState(\"\");\r\n const [onlyShowEnabledUsers, setOnlyShowEnabledUsers] = useState(false);\r\n const userCanViewUserDetails = useHasPermission(Permission.VIEWUSERDETAILS);\r\n const userCanEditUser = useHasPermission(Permission.EDITUSER);\r\n const userCanDeleteUser = useHasPermission(Permission.DELETEUSER);\r\n\r\n useEffect(() => {\r\n if (loading && !!login) {\r\n setLoading(false);\r\n const url = Constants.AUTHORIZATION_API_USER_URL;\r\n fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n setErrorMessage(\"Fetch failed (\" + response.statusText + \").\");\r\n } else {\r\n response.json().then(parse => {\r\n setUsers(parse);\r\n });\r\n }\r\n setLoadingFinished(true);\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n }\r\n }, [login, loading]);\r\n\r\n return (\r\n
\r\n {!loadingFinished && }\r\n {loadingFinished && errorMessage !== \"\" && (\r\n \r\n )}\r\n {loadingFinished && errorMessage === \"\" && (\r\n
\r\n

Manage users

\r\n {users.length > 0 && (\r\n \r\n
\r\n
\r\n \r\n {\r\n setFilterText(event.currentTarget.value);\r\n }}\r\n />\r\n \r\n \r\n {\r\n setOnlyShowEnabledUsers(event.currentTarget.checked);\r\n }}\r\n />\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {users\r\n .filter(\r\n user =>\r\n ((user.name && user.name.toLowerCase().includes(filterText.toLowerCase())) ||\r\n (user.email && user.email.toLowerCase().includes(filterText.toLowerCase())) ||\r\n (user.customerId && user.customerId.toLowerCase().includes(filterText.toLowerCase()))) &&\r\n (!onlyShowEnabledUsers || user.enabled === true)\r\n )\r\n .map(user => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
NameEmailCustomer ID\r\n Actions\r\n
{user.name}{user.email}{user.customerId}\r\n {\" \"}\r\n {userCanViewUserDetails && (\r\n \r\n list\r\n \r\n View details\r\n \r\n \r\n )}\r\n \r\n {\r\n setUserToEdit(user);\r\n }}\r\n >\r\n \r\n edit\r\n \r\n \r\n Edit\r\n \r\n \r\n \r\n {\r\n setUserToDelete(user);\r\n }}\r\n >\r\n \r\n delete\r\n \r\n \r\n Delete\r\n \r\n \r\n
\r\n
\r\n
\r\n )}\r\n
\r\n )}\r\n {\r\n setUserToEdit(undefined);\r\n }}\r\n okFunction={(editedUser: User) => {\r\n setUserToEdit(undefined);\r\n }}\r\n />\r\n {\r\n setUserToDelete(undefined);\r\n }}\r\n okFunction={() => {\r\n if (userToDelete === undefined) return;\r\n setUsers(users.filter(user => user.id !== userToDelete.id));\r\n setUserToDelete(undefined);\r\n }}\r\n />\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Spinner } from \"react-bootstrap\";\r\nimport { UserRole } from \"../../types/UserRole\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport const UserRoles: React.FC<{\r\n userObjectId: string;\r\n}> = props => {\r\n const { userObjectId } = props;\r\n const [userRoles, setUserRoles] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (!loading || login === undefined) return;\r\n\r\n fetch(Constants.AUTHORIZATION_API_USER_URL + \"/roles/\" + userObjectId, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setLoading(false);\r\n setUserRoles(data);\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n }, [loading, login, userObjectId]);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {userRoles.map(userRole => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
ApplicationRoleVia groupActions
{userRole.applicationName}{userRole.roleName}{userRole.roleGroupName}\r\n \r\n list\r\n View role details\r\n \r\n
\r\n\r\n {errorMessage !== \"\" && }\r\n {loading && errorMessage === \"\" && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { User } from \"../../types/User\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport * as Constants from \"../../constants\";\r\nimport { Form, Button, Spinner } from \"react-bootstrap\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { AxCompany } from \"../../types/AxCompany\";\r\nimport { cloneDeep } from \"lodash\";\r\n\r\nexport const UserAxCompanies: React.FC<{\r\n user: User,\r\n setUser: (user: User) => void\r\n}> = props => {\r\n var { user, setUser } = props;\r\n const [axCompanies, setAxCompanies] = useState<\r\n AxCompany[]\r\n >([]);\r\n const [loading, setLoading] = useState(true);\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (loading && login !== undefined) {\r\n fetch(Constants.AUTHORIZATION_API_AXCOMPANY_URL, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setAxCompanies(data);\r\n setLoading(false);\r\n })\r\n .catch(error => {\r\n console.log(error.message);\r\n setLoading(false);\r\n });\r\n }\r\n\r\n if (save && !saving && login !== undefined) {\r\n setSave(false);\r\n setSaving(true);\r\n\r\n fetch(\r\n Constants.AUTHORIZATION_API_USER_URL +\r\n \"/\" +\r\n user.id +\r\n \"/axcompanies\",\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n },\r\n body: JSON.stringify(user.axCompanies)\r\n }\r\n )\r\n .then(response => {\r\n if (!response.ok) {\r\n response.text().then(text => {\r\n setErrorMessage(text);\r\n });\r\n }\r\n setSaving(false);\r\n })\r\n .catch(error => {\r\n setSaving(false);\r\n setErrorMessage(error.message);\r\n });\r\n }\r\n }, [loading, login, save, saving, user]);\r\n\r\n return (\r\n
\r\n {loading && (\r\n
\r\n Loading...\r\n
\r\n )}\r\n {!loading && (\r\n
\r\n
\r\n {\" \"}\r\n \r\n ) => {\r\n var userClone = cloneDeep(user);\r\n userClone.axCompanies = [] as AxCompany[];\r\n if (event.currentTarget.checked) {\r\n userClone.axCompanies = cloneDeep(axCompanies);\r\n }\r\n setUser(userClone);\r\n }\r\n }\r\n />\r\n {axCompanies.map(axCompany => (\r\n c.id === axCompany.id\r\n ) !== undefined\r\n : false)\r\n }\r\n onChange={(\r\n event: any\r\n ) => {\r\n if (event.currentTarget.checked) {\r\n if (!user.axCompanies) {\r\n user.axCompanies = [] as AxCompany[];\r\n }\r\n\r\n user.axCompanies.push({\r\n id: axCompany.id,\r\n name: axCompany.name,\r\n code: axCompany.code\r\n });\r\n } else {\r\n user.axCompanies = user.axCompanies.filter(\r\n c => c.id.toString() !== event.currentTarget.id\r\n );\r\n }\r\n setUser(cloneDeep(user));\r\n }}\r\n />\r\n ))}\r\n \r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Save changes{\" \"}\r\n {saving && }\r\n \r\n {errorMessage !== \"\" && }\r\n
\r\n )}\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { User } from \"../../types/User\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Tabs, Tab, Spinner, Button } from \"react-bootstrap\";\r\nimport { IdProps } from \"../ascom/IdProps\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { UserRoles } from \"./UserRoles\";\r\nimport { EditUserModal } from \"./EditUserModal\";\r\nimport { UserAxCompanies } from \"./UserAxCompanies\";\r\n\r\nexport const UserDetails: React.FC> = props => {\r\n const [user, setUser] = useState(undefined);\r\n const [loading, setLoading] = useState(true);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [showEditUserModal, setShowEditUserModal] = useState(false);\r\n const id = props.match.params.id;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (loading && login !== undefined) {\r\n fetch(Constants.AUTHORIZATION_API_USER_URL + \"/\" + id, {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setUser(data);\r\n setLoading(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n setLoading(false);\r\n });\r\n }\r\n }, [id, loading, login]);\r\n\r\n return (\r\n
\r\n

{user === undefined ? \"\" : user.name}

\r\n
\r\n
\r\n {loading && }\r\n {!loading && errorMessage !== \"\" && (\r\n \r\n )}\r\n {!loading && errorMessage === \"\" && user !== undefined && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Name{user.name}
E-mail{user.email}
Company{user.companyName}
Country{user.countryName}
\r\n\r\n
\r\n {/* todo: update AD user not working right now, therefore this is disabled right now */}\r\n setShowEditUserModal(true)}\r\n disabled={true}\r\n >\r\n Edit\r\n \r\n \r\n {!user.internal && }\r\n
\r\n\r\n \r\n \r\n \r\n \r\n {user.internal && \r\n \r\n }\r\n \r\n
\r\n )}\r\n
\r\n
\r\n {\r\n setShowEditUserModal(false);\r\n }}\r\n okFunction={(editedUser: User) => {\r\n setShowEditUserModal(false);\r\n setUser(editedUser);\r\n }}\r\n />\r\n
\r\n );\r\n};\r\n","import { ListUsers } from \"./ListUsers\";\r\nimport { AuthRoute } from \"../Auth/AuthRoute\";\r\nimport React from \"react\";\r\nimport { Switch } from \"react-router-dom\";\r\nimport { UserDetails } from \"./UserDetails\";\r\nimport { Permission } from \"../../constants\";\r\n\r\ninterface Props {\r\n match: { url: string };\r\n}\r\nexport const UserComponent: React.FC = props => {\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { Modal, Button } from \"react-bootstrap\";\r\nimport * as Constants from \"../../constants\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { User } from \"oidc-client\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission } from \"../../constants\";\r\n\r\nexport interface ApplicationRowProps {\r\n name: string;\r\n clientid: string;\r\n id: number;\r\n refresh: () => void;\r\n}\r\n\r\nexport const ApplicationRow: React.FunctionComponent<\r\n ApplicationRowProps\r\n> = props => {\r\n const [show, setShow] = useState(false);\r\n const { name, clientid, id, refresh } = props;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n const userCanDeleteApplication = useHasPermission(\r\n Permission.DELETEAPPLICATION\r\n );\r\n const userCanViewApplicationDetails = useHasPermission(\r\n Permission.VIEWAPPLICATIONDETAILS\r\n );\r\n const userCanEditApplication = useHasPermission(Permission.EDITAPPLICATION);\r\n\r\n const handleCancel = () => setShow(false);\r\n const handleDeleteApplication = (login: User | undefined) => {\r\n if (login === undefined) return;\r\n\r\n fetch(Constants.AUTHORIZATION_API_APPLICATION_URL + \"/\" + id, {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }).then(() => refresh());\r\n setShow(false);\r\n };\r\n\r\n return (\r\n \r\n {name}\r\n {clientid}\r\n \r\n {userCanViewApplicationDetails && (\r\n \r\n list\r\n View details\r\n \r\n )}\r\n \r\n \r\n {userCanEditApplication && (\r\n \r\n edit\r\n Edit\r\n \r\n )}\r\n \r\n \r\n setShow(true)}\r\n >\r\n delete_forever\r\n Delete\r\n \r\n setShow(false)}\r\n dialogClassName=\"modal-90w\"\r\n aria-labelledby=\"example-custom-modal-styling-title\"\r\n >\r\n \r\n \r\n Delete application\r\n \r\n \r\n \r\n

\r\n Are you sure you want to delete the application {name}? The\r\n application will not work after this. All associated roles,\r\n permissions and role assignments will also be deleted.\r\n

\r\n
\r\n \r\n \r\n handleDeleteApplication(login)}\r\n >\r\n Delete application\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { ApplicationRow } from \"./ApplicationRow\";\r\nimport { Application } from \"../../types/Application\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport const ApplicationList: React.FC = props => {\r\n const [applications, setApplications] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (loading && login !== undefined) {\r\n fetch(Constants.AUTHORIZATION_API_APPLICATION_URL, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setApplications(data);\r\n setLoading(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n setLoading(false);\r\n });\r\n }\r\n });\r\n\r\n return (\r\n
\r\n

Applications

\r\n
\r\n
\r\n {loading && (\r\n
\r\n Loading...\r\n
\r\n )}\r\n {!loading && errorMessage !== \"\" && (\r\n \r\n )}\r\n {!loading && errorMessage === \"\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {applications.map(row => (\r\n {\r\n setLoading(true);\r\n }}\r\n />\r\n ))}\r\n \r\n
NameClient IDActions
\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { IdProps } from \"../ascom/IdProps\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Application } from \"../../types/Application\";\r\nimport { Spinner } from \"react-bootstrap\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport const ApplicationEditor: React.FC<\r\n RouteComponentProps\r\n> = props => {\r\n const [application, setApplication] = useState(null);\r\n const id = props.match.params.id;\r\n const [loading, setLoading] = useState(id !== undefined);\r\n const [saving, setSaving] = useState(false);\r\n const [save, setSave] = useState(false);\r\n const [loadErrorMessage, setLoadErrorMessage] = useState(\"\");\r\n const [saveErrorMessage, setSaveErrorMessage] = useState(\"\");\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (loading && login !== undefined) {\r\n fetch(Constants.AUTHORIZATION_API_APPLICATION_URL + \"/\" + id, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setApplication(data);\r\n setLoading(false);\r\n })\r\n .catch(error => {\r\n setLoadErrorMessage(error.message);\r\n setLoading(false);\r\n });\r\n }\r\n\r\n if (save && !saving && login !== undefined) {\r\n const bodyData = {\r\n name: (document.getElementById(\"nameTextBox\") as HTMLInputElement)\r\n .value,\r\n clientid: (document.getElementById(\r\n \"clientIdTextBox\"\r\n ) as HTMLInputElement).value,\r\n id: id\r\n };\r\n\r\n const method = id !== undefined ? \"PUT\" : \"POST\";\r\n setSaving(true);\r\n\r\n fetch(Constants.AUTHORIZATION_API_APPLICATION_URL, {\r\n method: method,\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n },\r\n body: JSON.stringify(bodyData)\r\n })\r\n .then(response => {\r\n if (response.ok) {\r\n window.location.replace(\"/applications/view\");\r\n } else {\r\n response.text().then(text => {\r\n setSaveErrorMessage(text);\r\n setSaving(false);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setSaveErrorMessage(error.message);\r\n setSaving(false);\r\n });\r\n }\r\n }, [id, loading, login, save, saving]);\r\n\r\n return (\r\n
\r\n

{id === undefined ? \"Create application\" : \"Update application\"}

\r\n ) => {\r\n event.preventDefault();\r\n setSave(true);\r\n }}\r\n >\r\n
\r\n
\r\n {loading && (\r\n
\r\n
\r\n
\r\n Loading...\r\n
\r\n
\r\n
\r\n )}\r\n {!loading && loadErrorMessage === \"\" && (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n )}\r\n {!loading &&\r\n (loadErrorMessage !== \"\" || saveErrorMessage !== \"\") && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n \r\n {id === undefined ? \"Create application\" : \"Update application\"}\r\n {saving && (\r\n \r\n {\" \"}\r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nconst updateClientId = () => {\r\n const nameTextBox: HTMLInputElement = document.getElementById(\r\n \"nameTextBox\"\r\n ) as HTMLInputElement;\r\n const clientIdTextBox: HTMLInputElement = document.getElementById(\r\n \"clientIdTextBox\"\r\n ) as HTMLInputElement;\r\n\r\n clientIdTextBox!.value = nameTextBox!.value\r\n .toLowerCase()\r\n .replace(/ /g, \"-\")\r\n .replace(/[^a-zA-Z0-9-]+/g, \"\");\r\n updateSubmitEnabled();\r\n};\r\n\r\nconst replaceIllegalCharsInClientId = () => {\r\n const clientIdTextBox: HTMLInputElement = document.getElementById(\r\n \"clientIdTextBox\"\r\n ) as HTMLInputElement;\r\n clientIdTextBox!.value = clientIdTextBox!.value\r\n .toLowerCase()\r\n .replace(/ /g, \"-\")\r\n .replace(/[^a-zA-Z0-9-]+/g, \"\");\r\n updateSubmitEnabled();\r\n};\r\n\r\nconst updateSubmitEnabled = () => {\r\n const nameTextBox: HTMLInputElement = document.getElementById(\r\n \"nameTextBox\"\r\n ) as HTMLInputElement;\r\n const clientIdTextBox: HTMLInputElement = document.getElementById(\r\n \"clientIdTextBox\"\r\n ) as HTMLInputElement;\r\n const submitButton: HTMLButtonElement = document.getElementById(\r\n \"submitButton\"\r\n ) as HTMLButtonElement;\r\n\r\n submitButton.disabled =\r\n nameTextBox.value === \"\" || clientIdTextBox.value === \"\";\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Button, Modal, Form, Spinner } from \"react-bootstrap\";\r\nimport { Permission } from \"../../types/Permission\";\r\nimport { Application } from \"../../types/Application\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport interface PermissionEditorProps {\r\n permission: Permission | null;\r\n application: Application;\r\n closeDialog: () => void;\r\n}\r\n\r\nexport const PermissionEditor: React.FC = props => {\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const { permission, application, closeDialog } = props;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (save && !saving && login !== undefined) {\r\n const bodyData = {\r\n name: (document.getElementById(\"nameTextBox\") as HTMLInputElement)\r\n .value,\r\n key: (document.getElementById(\"keyTextBox\") as HTMLInputElement).value,\r\n description: (document.getElementById(\r\n \"descriptionTextBox\"\r\n ) as HTMLInputElement).value,\r\n id: permission !== null ? permission.id : -1\r\n };\r\n\r\n const method = permission !== null ? \"PUT\" : \"POST\";\r\n setSave(false);\r\n setSaving(true);\r\n\r\n fetch(Constants.AUTHORIZATION_API_PERMISSION_URL + \"/\" + application.id, {\r\n method: method,\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n },\r\n body: JSON.stringify(bodyData)\r\n })\r\n .then(response => {\r\n if (response.ok) {\r\n closeDialog();\r\n } else {\r\n response.text().then(text => {\r\n setSaving(false);\r\n setErrorMessage(text);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setSaving(false);\r\n setErrorMessage(error.message);\r\n });\r\n }\r\n }, [save, saving, permission, application.id, closeDialog, login]);\r\n\r\n return (\r\n closeDialog()}>\r\n \r\n \r\n {permission !== null ? \"Edit permission\" : \"Add permission\"}\r\n \r\n \r\n\r\n \r\n \r\n Name\r\n \r\n \r\n The name of the permission, e. g. \"Edit settings\"\r\n \r\n \r\n\r\n \r\n Key\r\n \r\n \r\n The internal name of the permission, used in application code, e. g.\r\n \"EditSettings\"\r\n \r\n \r\n\r\n \r\n Description\r\n \r\n \r\n Short explanation of what the permission means.\r\n \r\n \r\n {errorMessage !== \"\" && }\r\n \r\n\r\n \r\n \r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Save{\" \"}\r\n {saving && }\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Modal, Button } from \"react-bootstrap\";\r\nimport { Permission } from \"../../types/Permission\";\r\nimport * as Constants from \"../../constants\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { User } from \"oidc-client\";\r\n\r\nexport interface DeletePermissionDialogProps {\r\n permission: Permission;\r\n closeDialog: () => void;\r\n}\r\n\r\nexport const DeletePermissionDialog: React.FC<\r\n DeletePermissionDialogProps\r\n> = props => {\r\n const { permission, closeDialog } = props;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n const deletePermission = (login: User | undefined) => {\r\n if (login === undefined) return;\r\n\r\n fetch(Constants.AUTHORIZATION_API_PERMISSION_URL + \"/\" + permission.id, {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }).then(() => closeDialog());\r\n };\r\n\r\n return (\r\n closeDialog()}>\r\n \r\n Delete permission\r\n \r\n \r\n

\r\n Are you sure you want to delete the permission \"{permission.name}\"?\r\n The application may not work correctly after this.\r\n

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { ApplicationProps } from \"./ApplicationProps\";\r\nimport { Permission } from \"../../types/Permission\";\r\nimport { PermissionEditor } from \"../permissions/PermissionEditor\";\r\nimport { DeletePermissionDialog } from \"../permissions/DeletePermissionDialog\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission as AppPermission } from \"../../constants\";\r\n\r\nexport const ApplicationPermissions: React.SFC = props => {\r\n const { application, refreshParent } = props;\r\n const [showDialog, setShowDialog] = useState(false);\r\n const [editedPermission, setEditedPermission] = useState(\r\n null\r\n );\r\n const [\r\n permissionToDelete,\r\n setPermissionToDelete\r\n ] = useState(null);\r\n const userCanDeletePermission = useHasPermission(\r\n AppPermission.DELETEPERMISSION\r\n );\r\n const userCanCreatePermission = useHasPermission(\r\n AppPermission.CREATEPERMISSION\r\n );\r\n const userCanEditPermission = useHasPermission(AppPermission.EDITPERMISSION);\r\n const userCanViewPermissionDetails = useHasPermission(\r\n AppPermission.VIEWPERMISSIONDETAILS\r\n );\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {application.permissions.map(permission => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
NameKeyDescriptionActions
{permission.name}{permission.key}{permission.description}\r\n {userCanViewPermissionDetails && (\r\n \r\n list\r\n View details\r\n \r\n )}\r\n \r\n {\r\n setEditedPermission(permission);\r\n setShowDialog(true);\r\n }}\r\n >\r\n edit\r\n \r\n Edit\r\n \r\n \r\n \r\n {\r\n setPermissionToDelete(permission);\r\n }}\r\n >\r\n delete\r\n \r\n Delete\r\n \r\n \r\n
\r\n\r\n {\r\n setEditedPermission(null);\r\n setShowDialog(true);\r\n }}\r\n >\r\n Add permission\r\n \r\n {permissionToDelete !== null && (\r\n {\r\n setPermissionToDelete(null);\r\n refreshParent();\r\n }}\r\n />\r\n )}\r\n {showDialog && (\r\n {\r\n setShowDialog(false);\r\n refreshParent();\r\n }}\r\n />\r\n )}\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Button, Modal, Form, Spinner } from \"react-bootstrap\";\r\nimport { Role } from \"../../types/Role\";\r\nimport { Application } from \"../../types/Application\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport interface RoleEditorProps {\r\n role: Role | null;\r\n application: Application;\r\n closeDialog: () => void;\r\n}\r\n\r\nexport const RoleEditor: React.FC = props => {\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const { role, application, closeDialog } = props;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (save && !saving && login !== undefined) {\r\n const bodyData = {\r\n name: (document.getElementById(\"nameTextBox\") as HTMLInputElement)\r\n .value,\r\n key: (document.getElementById(\"keyTextBox\") as HTMLInputElement).value,\r\n description: (document.getElementById(\r\n \"descriptionTextBox\"\r\n ) as HTMLInputElement).value,\r\n id: role !== null ? role.id : -1\r\n };\r\n\r\n const method = role !== null ? \"PUT\" : \"POST\";\r\n setSave(false);\r\n setSaving(true);\r\n\r\n fetch(Constants.AUTHORIZATION_API_ROLE_URL + \"/\" + application.id, {\r\n method: method,\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n },\r\n body: JSON.stringify(bodyData)\r\n })\r\n .then(response => {\r\n if (response.ok) {\r\n closeDialog();\r\n } else {\r\n response.text().then(text => {\r\n setSaving(false);\r\n setErrorMessage(text);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setSaving(false);\r\n setErrorMessage(error.message);\r\n });\r\n }\r\n }, [save, saving, role, application.id, closeDialog, login]);\r\n\r\n return (\r\n closeDialog()}>\r\n \r\n {role !== null ? \"Edit role\" : \"Add role\"}\r\n \r\n\r\n \r\n \r\n Name\r\n \r\n \r\n The name of the role, e. g. \"Power user\"\r\n \r\n \r\n\r\n \r\n Key\r\n \r\n \r\n The internal name of the role, used in application code, e. g.\r\n \"PowerUser\"\r\n \r\n \r\n\r\n \r\n Description\r\n \r\n \r\n Short explanation of what the role means.\r\n \r\n \r\n {errorMessage !== \"\" && }\r\n \r\n\r\n \r\n \r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Save{\" \"}\r\n {saving && }\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Modal, Button } from \"react-bootstrap\";\r\nimport { Role } from \"../../types/Role\";\r\nimport * as Constants from \"../../constants\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { User } from \"oidc-client\";\r\n\r\nexport interface DeleteRoleDialogProps {\r\n role: Role;\r\n closeDialog: () => void;\r\n}\r\n\r\nexport const DeleteRoleDialog: React.FC = props => {\r\n const { role, closeDialog } = props;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n const deleteRole = (login: User | undefined) => {\r\n if (login === undefined) return;\r\n\r\n fetch(Constants.AUTHORIZATION_API_ROLE_URL + \"/\" + role.id, {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }).then(() => closeDialog());\r\n };\r\n\r\n return (\r\n closeDialog()}>\r\n \r\n Delete role\r\n \r\n \r\n

\r\n Are you sure you want to delete the role \"{role.name}\"? It will affect\r\n the permissions of all users assigned to this role.\r\n

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { ApplicationProps } from \"./ApplicationProps\";\r\nimport { Role } from \"../../types/Role\";\r\nimport { RoleEditor } from \"../roles/RoleEditor\";\r\nimport { DeleteRoleDialog } from \"../roles/DeleteRoleDialog\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission } from \"../../constants\";\r\n\r\nexport const ApplicationRoles: React.FC = props => {\r\n const { application, refreshParent } = props;\r\n const [showDialog, setShowDialog] = useState(false);\r\n const [editedRole, setEditedRole] = useState(null);\r\n const [roleToDelete, setRoleToDelete] = useState(null);\r\n const userCanDeleteRole = useHasPermission(Permission.DELETEROLE);\r\n const userCanCreateRole = useHasPermission(Permission.CREATEROLE);\r\n const userCanEditRole = useHasPermission(Permission.EDITROLE);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {application.roles.map(role => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
NameKeyDescriptionActions
{role.name}{role.key}{role.description}\r\n \r\n list\r\n View details\r\n \r\n \r\n {\r\n setEditedRole(role);\r\n setShowDialog(true);\r\n }}\r\n >\r\n edit\r\n \r\n Edit\r\n \r\n \r\n \r\n {\r\n setRoleToDelete(role);\r\n }}\r\n >\r\n delete\r\n \r\n Delete\r\n \r\n \r\n
\r\n {\r\n setEditedRole(null);\r\n setShowDialog(true);\r\n }}\r\n >\r\n Add role\r\n \r\n {roleToDelete !== null && (\r\n {\r\n setRoleToDelete(null);\r\n refreshParent();\r\n }}\r\n />\r\n )}\r\n {showDialog && (\r\n {\r\n setShowDialog(false);\r\n refreshParent();\r\n }}\r\n />\r\n )}\r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Modal, Button } from \"react-bootstrap\";\r\nimport { AllowedOrigin } from \"../../types/AllowedOrigin\";\r\nimport * as Constants from \"../../constants\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport interface DeleteAllowedOriginDialogProps {\r\n allowedOrigin: AllowedOrigin;\r\n closeDialog: () => void;\r\n}\r\n\r\nexport const DeleteAllowedOriginDialog: React.FC<\r\n DeleteAllowedOriginDialogProps\r\n> = props => {\r\n const { allowedOrigin, closeDialog } = props;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n const deleteAllowedOrigin = () => {\r\n if (login !== undefined) {\r\n fetch(\r\n Constants.AUTHORIZATION_API_ALLOWED_ORIGIN_URL + \"/\" + allowedOrigin.id,\r\n {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n ).then(() => closeDialog());\r\n }\r\n };\r\n\r\n return (\r\n closeDialog()}>\r\n \r\n Delete allowed origin\r\n \r\n \r\n

\r\n Are you sure you want to delete the allowed origin \"\r\n {allowedOrigin.url}\"?\r\n

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Button, Modal, Form, Spinner } from \"react-bootstrap\";\r\nimport { AllowedOrigin } from \"../../types/AllowedOrigin\";\r\nimport { Application } from \"../../types/Application\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport interface AllowedOriginEditorProps {\r\n allowedOrigin: AllowedOrigin | null;\r\n application: Application;\r\n closeDialog: () => void;\r\n}\r\n\r\nexport const AllowedOriginEditor: React.FC<\r\n AllowedOriginEditorProps\r\n> = props => {\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const { allowedOrigin, application, closeDialog } = props;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (save && !saving && login !== undefined) {\r\n const bodyData = {\r\n url: (document.getElementById(\"urlTextBox\") as HTMLInputElement).value,\r\n id: allowedOrigin !== null ? allowedOrigin.id : -1\r\n };\r\n\r\n const method = allowedOrigin !== null ? \"PUT\" : \"POST\";\r\n setSave(false);\r\n setSaving(true);\r\n\r\n fetch(\r\n Constants.AUTHORIZATION_API_ALLOWED_ORIGIN_URL + \"/\" + application.id,\r\n {\r\n method: method,\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n },\r\n body: JSON.stringify(bodyData)\r\n }\r\n )\r\n .then(response => {\r\n if (response.ok) {\r\n closeDialog();\r\n } else {\r\n response.text().then(text => {\r\n setSaving(false);\r\n setErrorMessage(text);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setSaving(false);\r\n setErrorMessage(error.message);\r\n });\r\n }\r\n }, [save, saving, allowedOrigin, application.id, closeDialog, login]);\r\n\r\n return (\r\n closeDialog()}>\r\n \r\n \r\n {allowedOrigin !== null\r\n ? \"Edit allowed origin\"\r\n : \"Add allowed origin\"}\r\n \r\n \r\n\r\n \r\n \r\n URL\r\n \r\n \r\n The URL that should be allowed for this application to run from.\r\n \r\n \r\n {errorMessage !== \"\" && }\r\n \r\n\r\n \r\n \r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Save{\" \"}\r\n {saving && }\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { ApplicationProps } from \"./ApplicationProps\";\r\nimport { AllowedOrigin } from \"../../types/AllowedOrigin\";\r\nimport { DeleteAllowedOriginDialog } from \"../allowedorigins/DeleteAllowedOriginDialog\";\r\nimport { AllowedOriginEditor } from \"../allowedorigins/AllowedOriginEditor\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission } from \"../../constants\";\r\n\r\nexport const ApplicationAllowedOrigins: React.SFC = props => {\r\n const { application, refreshParent } = props;\r\n const [showDialog, setShowDialog] = useState(false);\r\n const [\r\n editedAllowedOrigin,\r\n setEditedAllowedOrigin\r\n ] = useState(null);\r\n const [\r\n allowedOriginToDelete,\r\n setAllowedOriginToDelete\r\n ] = useState(null);\r\n const userCanDeleteAllowedOrigin = useHasPermission(\r\n Permission.DELETEALLOWEDORIGIN\r\n );\r\n const userCanCreateAllowedOrigin = useHasPermission(\r\n Permission.CREATEALLOWEDORIGIN\r\n );\r\n const userCanEditAllowedOrigin = useHasPermission(\r\n Permission.EDITALLOWEDORIGIN\r\n );\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {application.allowedOrigins.map(allowedOrigin => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
UrlActions
{allowedOrigin.url}\r\n {\r\n setEditedAllowedOrigin(allowedOrigin);\r\n setShowDialog(true);\r\n }}\r\n >\r\n edit\r\n \r\n Edit\r\n \r\n \r\n \r\n {\r\n setAllowedOriginToDelete(allowedOrigin);\r\n }}\r\n >\r\n delete\r\n \r\n Delete\r\n \r\n \r\n
\r\n {\r\n setEditedAllowedOrigin(null);\r\n setShowDialog(true);\r\n }}\r\n >\r\n Add allowed origin\r\n \r\n {allowedOriginToDelete !== null && (\r\n {\r\n setAllowedOriginToDelete(null);\r\n refreshParent();\r\n }}\r\n />\r\n )}\r\n {showDialog && (\r\n {\r\n setShowDialog(false);\r\n refreshParent();\r\n }}\r\n />\r\n )}\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Application } from \"../../types/Application\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Tabs, Tab } from \"react-bootstrap\";\r\nimport { ApplicationPermissions } from \"./ApplicationPermissions\";\r\nimport { ApplicationRoles } from \"./ApplicationRoles\";\r\nimport { ApplicationAllowedOrigins } from \"./ApplicationAllowedOrigins\";\r\nimport { IdProps } from \"../ascom/IdProps\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport const ApplicationDetails: React.FC> = props => {\r\n const [application, setApplication] = useState(null);\r\n const [loading, setLoading] = useState(true);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const id = props.match.params.id;\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (loading && login !== undefined) {\r\n fetch(Constants.AUTHORIZATION_API_APPLICATION_URL + \"/\" + id, {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setApplication(data);\r\n setLoading(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n setLoading(false);\r\n });\r\n }\r\n }, [id, loading, login]);\r\n\r\n return (\r\n
\r\n

{application === null ? \"\" : application.name}

\r\n
\r\n
\r\n {loading && (\r\n
\r\n Loading...\r\n
\r\n )}\r\n {!loading && errorMessage !== \"\" && (\r\n \r\n )}\r\n {!loading && errorMessage === \"\" && application !== null && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Client Id{application === null ? \"\" : application.clientId}
\r\n\r\n \r\n \r\n setLoading(true)}\r\n />\r\n \r\n \r\n setLoading(true)}\r\n />\r\n \r\n \r\n setLoading(true)}\r\n />\r\n \r\n \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport * as Constants from \"../../constants\";\r\nimport { Role } from \"../../types/Role\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\n\r\nexport const ManageRoles: React.FC = props => {\r\n const [roles, setRoles] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (loading && login !== undefined) {\r\n fetch(Constants.AUTHORIZATION_API_ROLE_URL + \"/roleadministrator\", {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setRoles(data);\r\n setLoading(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n setLoading(false);\r\n });\r\n }\r\n }, [loading, login]);\r\n\r\n return (\r\n
\r\n

Roles

\r\n
\r\n
\r\n {loading && (\r\n
\r\n Loading...\r\n
\r\n )}\r\n {!loading && errorMessage !== \"\" && (\r\n \r\n )}\r\n {!loading && errorMessage === \"\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {roles.map(role => (\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n ))}\r\n \r\n
Application nameRole nameRole keyRole descriptionActions
{role.applicationName}{role.name}{role.key}{role.description}\r\n {\r\n \r\n list\r\n \r\n View details\r\n \r\n \r\n }\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Tab, Tabs } from \"react-bootstrap\";\r\nimport { Permission } from \"../../types/Permission\";\r\nimport { Role } from \"../../types/Role\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { IdProps } from \"../ascom/IdProps\";\r\nimport * as Constants from \"../../constants\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nexport interface PermissionRequestData {\r\n loading: boolean;\r\n error: boolean;\r\n errorMessage: string;\r\n permission: Permission | null;\r\n}\r\n\r\nexport const PermissionDetails: React.FC<\r\n RouteComponentProps\r\n> = props => {\r\n const id = props.match.params.id;\r\n const [permissionRequest, setPermissionRequest] = useState<\r\n PermissionRequestData\r\n >({\r\n loading: true,\r\n error: false,\r\n errorMessage: \"\",\r\n permission: null\r\n });\r\n const [roles, setRoles] = useState([]);\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n useEffect(() => {\r\n if (login === undefined) return;\r\n\r\n fetch(Constants.AUTHORIZATION_API_PERMISSION_URL + \"/\" + id, {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data =>\r\n setPermissionRequest({\r\n loading: false,\r\n error: false,\r\n errorMessage: \"\",\r\n permission: data\r\n })\r\n )\r\n .catch(error =>\r\n setPermissionRequest({\r\n loading: false,\r\n error: true,\r\n errorMessage: error.message,\r\n permission: null\r\n })\r\n );\r\n fetch(Constants.AUTHORIZATION_API_PERMISSION_URL + \"/\" + id + \"/roles\", {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => setRoles(data));\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [login]);\r\n\r\n return (\r\n
\r\n

\r\n {permissionRequest.permission === null\r\n ? \"Loading...\"\r\n : \"Permission: \" + permissionRequest.permission.name}\r\n

\r\n
\r\n
\r\n {permissionRequest.loading && (\r\n
\r\n Loading...\r\n
\r\n )}\r\n {!permissionRequest.loading && permissionRequest.error && (\r\n \r\n )}\r\n {!permissionRequest.loading &&\r\n !permissionRequest.error &&\r\n permissionRequest.permission !== null && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Key{permissionRequest.permission.key}
Description{permissionRequest.permission.description}
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {roles.map(role => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
NameKeyDescriptionActions
{role.name}{role.key}{role.description}\r\n \r\n list\r\n View\r\n \r\n
\r\n
\r\n
\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Modal, Button } from 'react-bootstrap';\r\n\r\nexport interface ConfirmDialogProps {\r\n okFunction: () => void,\r\n cancelFunction: () => void,\r\n title: string,\r\n text: string,\r\n okButtonText: string,\r\n show: boolean\r\n}\r\n\r\nexport const ConfirmDialog : React.FC = (props) => {\r\n const { okFunction, cancelFunction, title, text, okButtonText, show } = props;\r\n\r\n return (\r\n cancelFunction()}>\r\n \r\n {title}\r\n \r\n \r\n

{text}

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}","import React, { useState, useEffect } from \"react\";\r\nimport { Button, Spinner } from \"react-bootstrap\";\r\nimport { Group } from \"../../types/Group\";\r\nimport AsyncSelect from \"react-select/async\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { ActionMeta } from \"react-select/src/types\";\r\nimport { ConfirmDialog } from \"../ascom/ConfirmDialog\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission } from \"../../constants\";\r\n\r\nexport const RoleGroups: React.FC<{ roleId: string }> = props => {\r\n const roleId = props.roleId;\r\n const [groups, setGroups] = useState([]);\r\n const [selectedGroup, setSelectedGroup] = useState(\"\");\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [loading, setLoading] = useState(true);\r\n const [groupToDelete, setGroupToDelete] = useState(null);\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n const userCanAddGroupToRole = useHasPermission(Permission.ADDGROUPTOROLE);\r\n const userCanRemoveGroupFromRole = useHasPermission(\r\n Permission.REMOVEGROUPFROMROLE\r\n );\r\n const userCanAddGroupToRole_RoleAdministrator = useHasPermission(\r\n Permission.ADDGROUPTOROLE_ROLEADMINISTRATOR\r\n );\r\n const userCanRemoveGroupFromRole_RoleAdministrator = useHasPermission(\r\n Permission.REMOVEGROUPFROMROLE_ROLEADMINISTRATOR\r\n );\r\n const userCanViewRoleAdministratorRoleDetails = useHasPermission(\r\n Permission.VIEWROLEADMINISTRATORROLEDETAILS\r\n );\r\n const userCanViewRoleDetails = useHasPermission(\r\n Permission.VIEWROLEDETAILS\r\n );\r\n\r\n const handleSelectedGroupChange = (value: unknown, meta: ActionMeta) => {\r\n setSelectedGroup((value as HTMLSelectElement).value);\r\n };\r\n\r\n useEffect(() => {\r\n const fetchGroups = () => {\r\n if (!loading || login === undefined) return;\r\n\r\n fetch(\r\n Constants.AUTHORIZATION_API_GROUP_URL +\r\n \"/\" +\r\n (userCanViewRoleAdministratorRoleDetails && !userCanViewRoleDetails\r\n ? \"roleadministrator/\"\r\n : \"\") +\r\n roleId,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n }\r\n )\r\n .then(response => response.json())\r\n .then(data => {\r\n setLoading(false);\r\n setGroups(data);\r\n });\r\n };\r\n\r\n if (save && !saving && login !== undefined) {\r\n setSave(false);\r\n setSaving(true);\r\n\r\n fetch(\r\n Constants.AUTHORIZATION_API_GROUP_URL +\r\n \"/\" +\r\n (userCanAddGroupToRole_RoleAdministrator && !userCanAddGroupToRole\r\n ? \"roleadministrator/\"\r\n : \"\") +\r\n roleId +\r\n \"/\" +\r\n selectedGroup,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n )\r\n .then(response => {\r\n if (response.ok) {\r\n setSaving(false);\r\n setLoading(true);\r\n fetchGroups();\r\n } else {\r\n response.text().then(text => {\r\n setSaving(false);\r\n setErrorMessage(text);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setSaving(false);\r\n setErrorMessage(error.message);\r\n });\r\n } else {\r\n fetchGroups();\r\n }\r\n }, [\r\n save,\r\n saving,\r\n roleId,\r\n selectedGroup,\r\n loading,\r\n login,\r\n userCanAddGroupToRole_RoleAdministrator,\r\n userCanViewRoleAdministratorRoleDetails,\r\n userCanViewRoleDetails,\r\n userCanAddGroupToRole\r\n ]);\r\n\r\n const mapOptionsToValues = (options: Group[]) => {\r\n return options.map(option => ({\r\n value: option.objectId,\r\n label: option.name\r\n }));\r\n };\r\n\r\n const groupLoadOptions = (\r\n inputValue: string,\r\n callback: (options: readonly unknown[]) => void\r\n ) => {\r\n if (inputValue.length < 5 || login === undefined) return;\r\n\r\n setTimeout(() => {\r\n fetch(Constants.AUTHORIZATION_API_GROUP_URL + \"/search/\" + inputValue, {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }).then(response => {\r\n response.json().then(data => {\r\n callback(mapOptionsToValues(data));\r\n });\r\n });\r\n }, 1000);\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {groups.map(group => (\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
NameActions
{group.name}\r\n setGroupToDelete(group)}\r\n >\r\n delete\r\n \r\n Remove\r\n \r\n \r\n
\r\n {\r\n if (groupToDelete === null || login === undefined) return;\r\n fetch(\r\n Constants.AUTHORIZATION_API_GROUP_URL +\r\n \"/\" +\r\n (userCanRemoveGroupFromRole_RoleAdministrator\r\n ? \"roleadministrator/\"\r\n : \"\") +\r\n groupToDelete.id,\r\n {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n ).then(() => {\r\n var deletedGroupId = groupToDelete.id;\r\n setGroupToDelete(null);\r\n setGroups(\r\n groups.filter(g => {\r\n return g.id !== deletedGroupId;\r\n })\r\n );\r\n });\r\n }}\r\n cancelFunction={() => setGroupToDelete(null)}\r\n title=\"Remove group from role\"\r\n text={\r\n \"Are you sure you want remove the group \" +\r\n (!!groupToDelete ? groupToDelete.name : \"\") +\r\n \" from this role?\"\r\n }\r\n okButtonText=\"Remove group\"\r\n show={groupToDelete !== null}\r\n />\r\n {errorMessage !== \"\" && }\r\n {loading && errorMessage === \"\" && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Add group{\" \"}\r\n {saving && }\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Button, Spinner } from \"react-bootstrap\";\r\nimport { User } from \"../../types/User\";\r\nimport AsyncSelect from \"react-select/async\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ConfirmDialog } from \"../ascom/ConfirmDialog\";\r\nimport { ActionMeta } from \"react-select/src/types\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission } from \"../../constants\";\r\n\r\nexport const RoleUsers: React.FC<{\r\n roleId: string;\r\n showAdministrators: boolean;\r\n}> = props => {\r\n const { roleId, showAdministrators } = props;\r\n const [users, setUsers] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [userToDelete, setUserToDelete] = useState(null);\r\n const [selectedUser, setSelectedUser] = useState(\"\");\r\n const userTerm = showAdministrators ? \"admin\" : \"user\";\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n const userCanAddUserToRole = useHasPermission(Permission.ADDUSERTOROLE);\r\n const userCanRemoveUserFromRole = useHasPermission(\r\n Permission.REMOVEUSERFROMROLE\r\n );\r\n const userCanAddUserToRole_RoleAdministrator = useHasPermission(\r\n Permission.ADDUSERTOROLE_ROLEADMINISTRATOR\r\n );\r\n const userCanRemoveUserFromRole_RoleAdministrator = useHasPermission(\r\n Permission.REMOVEUSERFROMROLE_ROLEADMINISTRATOR\r\n );\r\n const userCanAddAdministratorToRole = useHasPermission(\r\n Permission.ADDADMINISTRATORTOROLE\r\n );\r\n const userCanRemoveAdministratorFromRole = useHasPermission(\r\n Permission.REMOVEADMINISTATORFROMROLE\r\n );\r\n const userCanViewRoleAdministratorRoleDetails = useHasPermission(\r\n Permission.VIEWROLEADMINISTRATORROLEDETAILS\r\n );\r\n const userCanViewRoleDetails = useHasPermission(\r\n Permission.VIEWROLEDETAILS\r\n );\r\n\r\n const handleSelectedUserChange = (value: unknown, meta: ActionMeta) => {\r\n setSelectedUser((value as HTMLSelectElement).value);\r\n };\r\n\r\n useEffect(() => {\r\n var baseUrl = Constants.AUTHORIZATION_API_ROLE_USER_URL;\r\n if (showAdministrators) {\r\n baseUrl = Constants.AUTHORIZATION_API_ROLE_ADMINISTRATOR_URL;\r\n }\r\n const fetchUsers = () => {\r\n if (!loading || login === undefined) return;\r\n\r\n fetch(\r\n baseUrl +\r\n \"/\" +\r\n (userCanViewRoleAdministratorRoleDetails && !userCanViewRoleDetails\r\n ? \"roleadministrator/\"\r\n : \"\") +\r\n roleId,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n }\r\n )\r\n .then(response => response.json())\r\n .then(data => {\r\n setLoading(false);\r\n setUsers(data);\r\n });\r\n };\r\n\r\n if (save && !saving && login !== undefined) {\r\n setSave(false);\r\n setSaving(true);\r\n\r\n fetch(\r\n baseUrl +\r\n \"/\" +\r\n (!showAdministrators &&\r\n userCanAddUserToRole_RoleAdministrator &&\r\n !userCanAddUserToRole\r\n ? \"roleadministrator/\"\r\n : \"\") +\r\n roleId +\r\n \"/\" +\r\n selectedUser,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n )\r\n .then(response => {\r\n if (response.ok) {\r\n setSaving(false);\r\n setLoading(true);\r\n fetchUsers();\r\n } else {\r\n response.text().then(text => {\r\n setSaving(false);\r\n setErrorMessage(text);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setSaving(false);\r\n setErrorMessage(error.message);\r\n });\r\n } else {\r\n fetchUsers();\r\n }\r\n }, [\r\n save,\r\n saving,\r\n roleId,\r\n selectedUser,\r\n loading,\r\n showAdministrators,\r\n login,\r\n userCanAddUserToRole_RoleAdministrator,\r\n userCanViewRoleAdministratorRoleDetails,\r\n userCanViewRoleDetails,\r\n userCanAddUserToRole\r\n ]);\r\n\r\n const mapOptionsToValues = (options: User[]) => {\r\n return options.map(user => ({\r\n value: user.objectId,\r\n label: user.name + \" (\" + user.userId + \")\"\r\n }));\r\n };\r\n\r\n const userLoadOptions = (\r\n inputValue: string,\r\n callback: (options: readonly unknown[]) => void\r\n ) => {\r\n if (inputValue.length < 3 || login === undefined) return;\r\n\r\n // if (abortController !== null) {\r\n // //abortController.abort(); - should cancel the previous fetch call, but throws exception in Firefox, todo: fix\r\n // }\r\n // abortController = new AbortController();\r\n\r\n fetch(Constants.AUTHORIZATION_API_USER_URL + \"/search/\" + inputValue, {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n // signal: abortController.signal\r\n }).then(response => {\r\n response.json().then(data => {\r\n callback(mapOptionsToValues(data));\r\n });\r\n });\r\n };\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {users.map(user => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
NameUser IdE-mailActions
{user.name}{user.userId}{user.email}\r\n setUserToDelete(user)}\r\n >\r\n delete\r\n \r\n Remove\r\n \r\n \r\n
\r\n {\r\n if (userToDelete === null || login === undefined) return;\r\n fetch(\r\n (showAdministrators\r\n ? Constants.AUTHORIZATION_API_ROLE_ADMINISTRATOR_URL\r\n : Constants.AUTHORIZATION_API_ROLE_USER_URL) +\r\n \"/\" +\r\n (!showAdministrators &&\r\n userCanRemoveUserFromRole_RoleAdministrator &&\r\n !userCanRemoveUserFromRole\r\n ? \"roleadministrator/\"\r\n : \"\") +\r\n userToDelete.id,\r\n {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n ).then(() => {\r\n var deletedUserId = userToDelete.id;\r\n setUserToDelete(null);\r\n setUsers(\r\n users.filter(u => {\r\n return u.id !== deletedUserId;\r\n })\r\n );\r\n });\r\n }}\r\n cancelFunction={() => setUserToDelete(null)}\r\n title={\"Remove \" + userTerm + \" from role\"}\r\n text={\r\n \"Are you sure you want remove the \" +\r\n userTerm +\r\n \" \" +\r\n (!!userToDelete ? userToDelete.name : \"\") +\r\n \" from this role?\"\r\n }\r\n okButtonText={\"Remove \" + userTerm}\r\n show={userToDelete !== null}\r\n />\r\n {errorMessage !== \"\" && }\r\n {loading && errorMessage === \"\" && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Add user{\" \"}\r\n {saving && }\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Button, Spinner } from \"react-bootstrap\";\r\nimport { Permission } from \"../../types/Permission\";\r\nimport * as Constants from \"../../constants\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { ActionMeta } from \"react-select/src/types\";\r\nimport { ConfirmDialog } from \"../ascom/ConfirmDialog\";\r\nimport Select from \"react-select\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission as AppPermission } from \"../../constants\";\r\n\r\nexport const RolePermissions: React.FC<{\r\n roleId: string;\r\n applicationId: number;\r\n}> = props => {\r\n const { roleId, applicationId } = props;\r\n const [permissions, setPermissions] = useState([]);\r\n const [allPermissions, setAllPermissions] = useState<\r\n { value: number; label: string }[]\r\n >([]);\r\n const [selectedPermission, setSelectedPermission] = useState(\"\");\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [loading, setLoading] = useState(true);\r\n const [\r\n permissionToDelete,\r\n setPermissionToDelete\r\n ] = useState(null);\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n const userCanAddPermissionToRole = useHasPermission(\r\n AppPermission.ADDPERMISSIONTOROLE\r\n );\r\n const userCanRemovePermissionFromRole = useHasPermission(\r\n AppPermission.REMOVEPERMISSIONFROMROLE\r\n );\r\n\r\n const handleSelectedPermissionChange = (value: unknown, meta: ActionMeta) => {\r\n setSelectedPermission((value as HTMLSelectElement).value);\r\n };\r\n\r\n useEffect(() => {\r\n const getSelectOptions = (permissions: Permission[]) => {\r\n return permissions.map(permission => ({\r\n value: permission.id,\r\n label: permission.name\r\n }));\r\n };\r\n\r\n const fetchPermissions = () => {\r\n if (!loading || login === undefined) return;\r\n\r\n fetch(Constants.AUTHORIZATION_API_ROLE_PERMISSION_URL + \"/\" + roleId, {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n setLoading(false);\r\n setPermissions(data);\r\n });\r\n\r\n fetch(\r\n Constants.AUTHORIZATION_API_PERMISSION_URL + \"/all/\" + applicationId,\r\n {\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n )\r\n .then(response => response.json())\r\n .then(data => {\r\n setAllPermissions(getSelectOptions(data));\r\n });\r\n };\r\n\r\n if (save && !saving && login !== undefined) {\r\n setSave(false);\r\n setSaving(true);\r\n\r\n fetch(\r\n Constants.AUTHORIZATION_API_ROLE_PERMISSION_URL +\r\n \"/\" +\r\n roleId +\r\n \"/\" +\r\n selectedPermission,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n )\r\n .then(response => {\r\n if (response.ok) {\r\n setSaving(false);\r\n setLoading(true);\r\n fetchPermissions();\r\n } else {\r\n response.text().then(text => {\r\n setSaving(false);\r\n setErrorMessage(text);\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n setSaving(false);\r\n setErrorMessage(error.message);\r\n });\r\n } else {\r\n fetchPermissions();\r\n }\r\n }, [save, saving, roleId, selectedPermission, loading, applicationId, login]);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {permissions.map(permission => (\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
NameActions
{permission.name}\r\n setPermissionToDelete(permission)}\r\n >\r\n delete\r\n \r\n Remove\r\n \r\n \r\n
\r\n {\r\n if (permissionToDelete === null || login === undefined) return;\r\n fetch(\r\n Constants.AUTHORIZATION_API_ROLE_PERMISSION_URL +\r\n \"/\" +\r\n permissionToDelete.id,\r\n {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n }\r\n ).then(() => {\r\n var deletedPermissionId = permissionToDelete.id;\r\n setPermissionToDelete(null);\r\n setPermissions(\r\n permissions.filter(p => {\r\n return p.id !== deletedPermissionId;\r\n })\r\n );\r\n });\r\n }}\r\n cancelFunction={() => setPermissionToDelete(null)}\r\n title=\"Remove permission from role\"\r\n text={\r\n \"Are you sure you want remove the permission \" +\r\n (!!permissionToDelete ? permissionToDelete.name : \"\") +\r\n \" from this role?\"\r\n }\r\n okButtonText=\"Remove permission\"\r\n show={permissionToDelete !== null}\r\n />\r\n {errorMessage !== \"\" && }\r\n {loading && errorMessage === \"\" && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {\r\n setSave(true);\r\n }}\r\n >\r\n Add permission{\" \"}\r\n {saving && }\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Tab, Tabs } from \"react-bootstrap\";\r\nimport { Role } from \"../../types/Role\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { IdProps } from \"../ascom/IdProps\";\r\nimport * as Constants from \"../../constants\";\r\nimport { RoleGroups } from \"./RoleGroups\";\r\nimport { RoleUsers } from \"./RoleUsers\";\r\nimport { RolePermissions } from \"./RolePermissions\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { useHasPermission } from \"../../useHasPermission\";\r\nimport { Permission } from \"../../constants\";\r\n\r\nexport interface RoleRequestData {\r\n loading: boolean;\r\n error: boolean;\r\n errorMessage: string;\r\n role: Role | null;\r\n}\r\n\r\nexport const RoleDetails: React.FC> = props => {\r\n const id = props.match.params.id;\r\n const [roleRequest, setRoleRequest] = useState({\r\n loading: true,\r\n error: false,\r\n errorMessage: \"\",\r\n role: null\r\n });\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n const userCanViewRoleAdministratorRoleDetails = useHasPermission(\r\n Permission.VIEWROLEADMINISTRATORROLEDETAILS\r\n );\r\n const userCanViewRoleDetails = useHasPermission(Permission.VIEWROLEDETAILS);\r\n\r\n useEffect(() => {\r\n if (login === undefined) return;\r\n\r\n var roleAdministrator = \"\";\r\n if (userCanViewRoleAdministratorRoleDetails && !userCanViewRoleDetails)\r\n roleAdministrator = \"roleadministrator/\";\r\n\r\n fetch(Constants.AUTHORIZATION_API_ROLE_URL + \"/\" + roleAdministrator + id, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data =>\r\n setRoleRequest({\r\n loading: false,\r\n error: false,\r\n errorMessage: \"\",\r\n role: data\r\n })\r\n )\r\n .catch(error =>\r\n setRoleRequest({\r\n loading: false,\r\n error: true,\r\n errorMessage: error.message,\r\n role: null\r\n })\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [login]);\r\n\r\n return (\r\n
\r\n

\r\n {roleRequest.role === null\r\n ? \"Loading...\"\r\n : \"Role: \" + roleRequest.role.name}\r\n

\r\n
\r\n
\r\n {roleRequest.loading && (\r\n
\r\n Loading...\r\n
\r\n )}\r\n {!roleRequest.loading && roleRequest.error && (\r\n \r\n )}\r\n {!roleRequest.loading &&\r\n !roleRequest.error &&\r\n roleRequest.role !== null && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Key{roleRequest.role.key}
Description{roleRequest.role.description}
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {userCanViewRoleDetails && (\r\n \r\n \r\n \r\n )}\r\n {userCanViewRoleDetails && (\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { AuthRoute } from \"../Auth/AuthRoute\";\r\nimport React from \"react\";\r\nimport { Switch } from \"react-router-dom\";\r\nimport { ApplicationList } from \"./ApplicationList\";\r\nimport { ApplicationEditor } from \"./ApplicationEditor\";\r\nimport { ApplicationDetails } from \"./ApplicationDetails\";\r\nimport { ManageRoles } from \"../roles/ManageRoles\";\r\nimport { PermissionDetails } from \"../permissions/PermissionDetails\";\r\nimport { RoleDetails } from \"../roles/RoleDetails\";\r\nimport { Permission } from \"../../constants\";\r\n\r\ninterface Props {\r\n match: { url: string };\r\n}\r\nexport const ApplicationComponent: React.FC = props => {\r\n return (\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\nexport const MainMenu: React.FC<{ activeMenu: string }> = props => {\r\n const activeMenu = props.activeMenu;\r\n\r\n const getMenuClassName = (menuName: string) => {\r\n return \"nav-link \" + (activeMenu === menuName ? \"nav-link-active\" : \"\");\r\n };\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n","import React, { useState, ChangeEvent } from \"react\";\r\nimport { Modal, Button, Form, Spinner } from \"react-bootstrap\";\r\n\r\nimport { withApiURL } from \"../../config\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { User } from \"oidc-client\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\n\r\ninterface RequestDeletionModalProps {\r\n cancelFunction: () => void;\r\n okFunction: () => void;\r\n show: boolean;\r\n userId: number;\r\n}\r\n\r\nexport const RequestDeletionModal: React.FC<\r\n RequestDeletionModalProps\r\n> = props => {\r\n const { cancelFunction, okFunction, show, userId } = props;\r\n const { login } = useSelector((state: RootState) => state.auth);\r\n const [deletionConfirmed, setDeletionConfirmed] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n\r\n const requestDeletion = (\r\n userId: number,\r\n login: User,\r\n okFunction: () => void\r\n ) => {\r\n const url = withApiURL(`/userprofile/requestdeletion/` + userId);\r\n\r\n fetch(url, {\r\n method: \"PUT\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n }\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n response.text().then(text => {\r\n if (text === \"\")\r\n setErrorMessage(\r\n \"Request failed. Please inform your Ascom contact.\"\r\n );\r\n else setErrorMessage(text);\r\n });\r\n } else okFunction();\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n };\r\n\r\n return (\r\n \r\n {login === undefined && }\r\n {login !== undefined && (\r\n
\r\n \r\n Request account deletion\r\n \r\n \r\n
\r\n ) => {\r\n if (e.currentTarget.checked !== undefined)\r\n setDeletionConfirmed(e.currentTarget.checked);\r\n }}\r\n label=\"I hereby confirm that I want my Ascom account to be deleted. The deletion may be refused, if it is necessary to keep the account for regulatory reasons.\"\r\n >\r\n \r\n
\r\n \r\n {\r\n setErrorMessage(\"\");\r\n cancelFunction();\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n requestDeletion(userId, login, okFunction);\r\n }}\r\n >\r\n Request deletion\r\n \r\n \r\n
\r\n )}\r\n {errorMessage !== \"\" && }\r\n
\r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { Modal, Button, Form, Spinner } from \"react-bootstrap\";\r\nimport { withApiURL } from \"../../config\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\n\r\ninterface ChangePasswordModalProps {\r\n cancelFunction: () => void;\r\n okFunction: () => void;\r\n show: boolean;\r\n}\r\n\r\nexport const ChangePasswordModal: React.FC = props => {\r\n const { cancelFunction, okFunction, show } = props;\r\n const { login } = useSelector((state: RootState) => state.auth);\r\n const [save, setSave] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [oldPassword, setOldPassword] = useState(\"\");\r\n const [newPassword, setNewPassword] = useState(\"\");\r\n const [repeatNewPassword, setRepeatNewPassword] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (save && login !== undefined) {\r\n setSave(false);\r\n setSaving(true);\r\n fetch(withApiURL(`/userprofile/changepassword`), {\r\n method: \"PUT\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: \"Bearer \" + login.access_token\r\n },\r\n body: JSON.stringify({\r\n oldPassword: oldPassword,\r\n newPassword: newPassword\r\n })\r\n })\r\n .then(response => {\r\n if (response.ok) {\r\n okFunction();\r\n } else {\r\n response.text().then(text => {\r\n setErrorMessage(text);\r\n });\r\n }\r\n setSaving(false);\r\n })\r\n .catch(error => {\r\n setErrorMessage(error.message);\r\n setSaving(false);\r\n });\r\n }\r\n }, [oldPassword, newPassword, repeatNewPassword, login, save, okFunction]);\r\n\r\n const passwordOk: () => boolean = () => {\r\n if (newPassword.length < 8) return false;\r\n if (newPassword.toUpperCase() === newPassword) return false;\r\n if (newPassword.toLowerCase() === newPassword) return false;\r\n if (!/\\d/.test(newPassword)) return false;\r\n\r\n return true;\r\n };\r\n\r\n const closeModal = () => {\r\n cancelFunction();\r\n setErrorMessage(\"\");\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n {`Change your password`}\r\n \r\n \r\n
\r\n \r\n Old password:\r\n {\r\n setOldPassword(event.currentTarget.value);\r\n }}\r\n key=\"oldPassword\"\r\n />\r\n \r\n \r\n New password:\r\n {\r\n setNewPassword(event.currentTarget.value);\r\n }}\r\n key=\"newPassword\"\r\n />\r\n \r\n \r\n {\" \"}\r\n Repeat new password:\r\n {\r\n setRepeatNewPassword(event.currentTarget.value);\r\n }}\r\n key=\"repeatNewPassword\"\r\n />\r\n \r\n
\r\n
\r\n \r\n {\r\n closeModal();\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n setSave(true);\r\n }}\r\n disabled={\r\n oldPassword === \"\" ||\r\n newPassword === \"\" ||\r\n newPassword !== repeatNewPassword ||\r\n !passwordOk()\r\n }\r\n >\r\n Change password{\" \"}\r\n {saving && (\r\n \r\n )}\r\n \r\n \r\n {errorMessage !== \"\" && }\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport { withApiURL } from \"../../config\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { Row, Col, Form, Spinner, Button } from \"react-bootstrap\";\r\nimport { RequestDeletionModal } from \"./RequestDeletionModal\";\r\nimport { ChangePasswordModal } from \"./ChangePasswordModal\";\r\nimport { ErrorAlert } from \"../ascom/ErrorAlert\";\r\n\r\ninterface ProfileProps {\r\n match: { params: { id: number } };\r\n}\r\n\r\ninterface ProfileData {\r\n id: number;\r\n name: string;\r\n email: string;\r\n companyName: string;\r\n countryName: string;\r\n deletionRequested: boolean;\r\n}\r\n\r\nexport const Profile: React.FC = props => {\r\n const [profile, setProfile] = useState();\r\n const [loading, setLoading] = useState(true);\r\n const [deletionRequested, setDeletionRequested] = useState(false);\r\n const [showChangePasswordModal, setShowChangePasswordModal] = useState(false);\r\n const { login } = useSelector((state: RootState) => state.auth);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (loading && !!login) {\r\n fetch(withApiURL(`/userprofile`), {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + login.access_token,\r\n \"Cache-Control\": \"no-cache\",\r\n pragma: \"no-cache\"\r\n }\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n setErrorMessage(\"Fetch failed (\" + response.statusText + \").\");\r\n } else {\r\n response.json().then(parse => {\r\n setProfile(parse);\r\n });\r\n }\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n\r\n setLoading(false);\r\n }\r\n }, [loading, login]);\r\n\r\n return (\r\n \r\n

User information

\r\n {!!!profile && errorMessage === \"\" && (\r\n \r\n )}\r\n {!!!profile && errorMessage !== \"\" && (\r\n \r\n )}{\" \"}\r\n {!!profile && (\r\n
\r\n
\r\n {\r\n setDeletionRequested(false);\r\n }}\r\n okFunction={() => {\r\n setDeletionRequested(false);\r\n }}\r\n />\r\n
\r\n \r\n \r\n Name\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Email\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Company\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Country\r\n \r\n \r\n \r\n \r\n \r\n
\r\n {\r\n setDeletionRequested(true);\r\n }}\r\n >\r\n {\"Request account deletion\" +\r\n (profile.deletionRequested ? \" (already pending)\" : \"\")}\r\n {\" \"}\r\n {\r\n setShowChangePasswordModal(true);\r\n }}\r\n >\r\n Change password\r\n \r\n
\r\n
\r\n )}\r\n\r\n {\r\n setShowChangePasswordModal(false);\r\n }}\r\n okFunction={() => {\r\n setShowChangePasswordModal(false);\r\n }}\r\n />\r\n
\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { manager } from \"./Auth\";\r\n\r\nexport const SilentRedirect: React.FC = () => {\r\n manager.signinSilentCallback().catch(err => {\r\n console.log(\"Silent redirect error: \" + err);\r\n });\r\n\r\n return
Silent redirect
;\r\n};\r\n","import React from 'react';\r\n\r\nexport class TitleBar extends React.Component<{ title: string }, {}> {\r\n render() {\r\n return (\r\n
\r\n

{this.props.title}

\r\n \"Ascom\"\r\n
\r\n );\r\n }\r\n}","import { Route, Switch } from \"react-router-dom\";\r\nimport * as React from \"react\";\r\nimport { Index } from \"./Index\";\r\nimport { Login } from \"./Login\";\r\nimport { LoginCallback } from \"./LoginCallback\";\r\nimport { RequestNewPassword } from \"../users/RequestNewPassword\";\r\nimport { SetPassword } from \"../users/SetPassword\";\r\nimport { AuthRoute } from \"./AuthRoute\";\r\nimport { UserComponent } from \"../users/UserComponent\";\r\nimport { ApplicationComponent } from \"../applications/ApplicationComponent\";\r\nimport { MainMenu } from \"../ascom/MainMenu\";\r\nimport { Profile } from \"../users/Profile\";\r\nimport { SilentRedirect } from \"./SilentRedirect\";\r\nimport { TitleBar } from \"../ascom/TitleBar\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { createSetLastVisitedUrlAction } from \"../../Redux/Actions\";\r\nimport \"./Routes.css\";\r\nimport { RootState } from \"../../Redux/Reducers\";\r\n\r\nconst Routes = ({ isLoginFetch, ...rest }: any) => {\r\n const dispatch = useDispatch();\r\n const login = useSelector((state: RootState) => state.auth.login);\r\n\r\n const getActiveMenu = (path: string) => {\r\n if (path.indexOf(\"/users\") !== -1) return \"users\";\r\n else if (path.indexOf(\"/applications\") !== -1) return \"applications\";\r\n else return \"\";\r\n };\r\n\r\n const showMenuAndTitleBar = (pathname: string) => {\r\n if (\r\n pathname.indexOf(\"/register\") !== -1 ||\r\n pathname.indexOf(\"/resetpassword\") !== -1 ||\r\n pathname.indexOf(\"/setpassword\") !== -1 ||\r\n pathname.indexOf(\"/profile\") !== -1\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n return (\r\n {\r\n // When setting last visited url (used in LoginCallback), ignore Login and LoginCallback urls\r\n if (location.pathname.indexOf(\"/login\") === -1)\r\n dispatch(createSetLastVisitedUrlAction(location.pathname));\r\n\r\n return showMenuAndTitleBar(location.pathname) ? (\r\n
\r\n {login && }\r\n
\r\n {login && }\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n ) : (\r\n
\r\n
\r\n
\r\n

User Services

\r\n \r\n \r\n \r\n \r\n {/* */}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport { Routes };\r\n","import React, { useEffect } from \"react\";\r\nimport { BrowserRouter as Router } from \"react-router-dom\";\r\nimport { manager } from \"./components/Auth/Auth\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport {\r\n createSetLoginThunk,\r\n createSetLoginFetchAction\r\n} from \"./Redux/Actions\";\r\nimport { Routes } from \"./components/Auth/Routes\";\r\nimport { RootState } from \"./Redux/Reducers\";\r\n\r\nconst App: React.FC = () => {\r\n const dispatch = useDispatch();\r\n const loginFetch = useSelector((state: RootState) => state.auth.loginFetch);\r\n\r\n useEffect(() => {\r\n manager.getUser().then(login => {\r\n if (login) {\r\n dispatch(createSetLoginThunk(login));\r\n }\r\n dispatch(createSetLoginFetchAction());\r\n });\r\n }, [dispatch]);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","import { combineReducers } from \"redux\";\r\n\r\nimport { User } from \"oidc-client\";\r\nimport {\r\n SET_LOGIN,\r\n CLEAR_LOGIN,\r\n SET_LOGIN_FETCH,\r\n SET_PERMISSIONS,\r\n SET_PERMISSIONS_FETCH_ERROR,\r\n SET_LAST_VISITED_URL\r\n} from \"./Constants\";\r\nimport {\r\n AuthActions,\r\n PermissionActions,\r\n LastVisitedUrlActions\r\n} from \"./Actions\";\r\n\r\ninterface AuthReducerState {\r\n login?: User;\r\n loginFetch: boolean;\r\n}\r\n\r\nconst initialAuthState: AuthReducerState = { loginFetch: false };\r\n\r\nconst authReducer = (\r\n state: AuthReducerState = initialAuthState,\r\n action: AuthActions\r\n): AuthReducerState => {\r\n switch (action.type) {\r\n case CLEAR_LOGIN:\r\n return { ...state, login: undefined };\r\n case SET_LOGIN:\r\n return { ...state, login: action.login };\r\n case SET_LOGIN_FETCH:\r\n return { ...state, loginFetch: true };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\ninterface PermissionReducerState {\r\n permissions: string[];\r\n permissionsFetch: boolean;\r\n permissionsFetchError: string;\r\n}\r\n\r\nconst initialPermissionState: PermissionReducerState = {\r\n permissions: [],\r\n permissionsFetch: false,\r\n permissionsFetchError: \"\"\r\n};\r\n\r\nconst permissionReducer = (\r\n state: PermissionReducerState = initialPermissionState,\r\n action: PermissionActions\r\n): PermissionReducerState => {\r\n switch (action.type) {\r\n case SET_PERMISSIONS:\r\n return { ...state, permissions: action.payload, permissionsFetch: true };\r\n case SET_PERMISSIONS_FETCH_ERROR:\r\n return { ...state, permissionsFetchError: action.payload };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\ninterface LastVisitedUrlReducerState {\r\n lastVisitedUrl: string;\r\n}\r\n\r\nconst initialLastVisitedUrlState: LastVisitedUrlReducerState = {\r\n lastVisitedUrl: \"\"\r\n};\r\n\r\nconst lastVisitedUrlReducer = (\r\n state: LastVisitedUrlReducerState = initialLastVisitedUrlState,\r\n action: LastVisitedUrlActions\r\n): LastVisitedUrlReducerState => {\r\n switch (action.type) {\r\n case SET_LAST_VISITED_URL:\r\n return { ...state, lastVisitedUrl: action.payload };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport interface RootState {\r\n auth: AuthReducerState;\r\n permissions: PermissionReducerState;\r\n lastVisitedUrl: LastVisitedUrlReducerState;\r\n}\r\n\r\nexport const rootReducer = combineReducers({\r\n auth: authReducer,\r\n permissions: permissionReducer,\r\n lastVisitedUrl: lastVisitedUrlReducer\r\n});\r\n\r\nexport type Actions = AuthActions | PermissionActions | LastVisitedUrlActions;\r\n","import 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport React from \"react\";\r\nimport \"./index.css\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\nimport App from \"./App\";\r\nimport { createStore, applyMiddleware, compose } from \"redux\";\r\nimport { render } from \"react-dom\";\r\nimport { Provider } from \"react-redux\";\r\nimport { rootReducer, RootState, Actions } from \"./Redux/Reducers\";\r\nimport thunk, { ThunkMiddleware } from \"redux-thunk\";\r\nimport { persistStore, persistReducer } from \"redux-persist\";\r\nimport storage from \"redux-persist/lib/storage\";\r\nimport autoMergeLevel2 from \"redux-persist/lib/stateReconciler/autoMergeLevel2\";\r\nimport { PersistGate } from \"redux-persist/lib/integration/react\";\r\nimport { Spinner } from \"react-bootstrap\";\r\n\r\nconst composeEnhancers =\r\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\r\n\r\nconst persistConfig = {\r\n key: \"root\",\r\n storage: storage,\r\n stateReconciler: autoMergeLevel2,\r\n blacklist: [\"auth\"]\r\n};\r\n\r\nconst pReducer = persistReducer(persistConfig, rootReducer);\r\n\r\nconst store = createStore(\r\n pReducer,\r\n composeEnhancers(\r\n applyMiddleware(thunk as ThunkMiddleware)\r\n )\r\n);\r\n\r\nconst persistor = persistStore(store);\r\n\r\nexport const LoadingView: React.FC = () => {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nrender(\r\n \r\n } persistor={persistor}>\r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}