{"version":3,"sources":["components/atoms/Col.tsx","components/atoms/Row.tsx","components/templates/PageBody.tsx","utils/index.ts","api/getDashboards.ts","api/saveDashboard.ts","api/saveUpdatedDashboard.ts","api/removeDashboard.ts","actions/dashboards.ts","actions/loadingDashboards.ts","components/molecules/AddTextField.tsx","constants/index.ts","components/pages/admin/AddDashboardPage.tsx","api/getFinancialYears.ts","api/saveFinancialYear.ts","actions/financialYears.ts","actions/loadingFinancialYears.ts","components/pages/admin/AddFinancialYearPage.tsx","api/getGroups.ts","api/removeGroup.ts","api/saveGroup.ts","api/saveUpdatedGroup.ts","actions/groups.ts","actions/loadingGroups.ts","components/pages/admin/AddGroupPage.tsx","api/getKpis.ts","api/removeKpi.ts","api/saveKpi.ts","api/saveUpdatedKpi.ts","actions/kpis.ts","actions/loadingKpis.ts","components/pages/admin/AddKpiPage.tsx","api/getPredicates.ts","api/removePredicate.ts","api/savePredicate.ts","api/saveUpdatedPredicate.ts","actions/predicates.ts","actions/loadingPredicates.ts","components/pages/admin/AddPredicatePage.tsx","api/getReports.ts","api/removeReport.ts","api/saveReport.ts","api/saveUpdatedReport.ts","actions/reports.ts","actions/loadingReports.ts","components/pages/admin/AddReportPage.tsx","api/getUserProfiles.ts","api/removeUserProfile.ts","api/saveUpdatedUserProfile.ts","api/saveUserProfile.ts","actions/editUserDetails.ts","actions/profiles.ts","actions/loadingUsers.ts","components/pages/admin/AddUserPage.tsx","components/molecules/DashboardDetailsTable.tsx","components/pages/admin/EditDashboardPage.tsx","components/molecules/GroupDetailsTable.tsx","components/pages/admin/EditGroupPage.tsx","components/molecules/KpiDetailsTable.tsx","components/pages/admin/EditKpiPage.tsx","components/molecules/PredicateDetailsTable.tsx","components/pages/admin/EditPredicatePage.tsx","components/molecules/ReportDetailsTable.tsx","components/pages/admin/EditReportPage.tsx","api/getRoleDashboards.ts","api/removeRoleDashboard.ts","api/saveRoleDashboard.ts","actions/loadingEditRoleDashboards.ts","actions/editRoleDetails.ts","api/getRolePredicates.ts","api/removeRolePredicate.ts","api/saveRolePredicate.ts","api/saveUpdatedRolePredicate.ts","actions/loadingEditRolePredicates.ts","actions/editRolePredicates.ts","api/getRoleReports.ts","api/removeRoleReport.ts","api/saveRoleReport.ts","actions/loadingEditRoleReports.ts","api/getRoleUsers.ts","api/removeRoleUser.ts","api/saveRoleUser.ts","actions/loadingEditRoleUsers.ts","api/getRoles.ts","api/saveRole.ts","api/saveUpdatedRole.ts","api/removeRole.ts","actions/roles.ts","actions/loadingRoles.ts","components/molecules/AddCurrencyCode.tsx","components/molecules/AddFYStartMonth.tsx","components/templates/admin/AddRoleDetails.tsx","components/molecules/DashboardsBadge.tsx","components/organisms/DataLoading.tsx","components/templates/admin/AssignRoleDashboards.tsx","actions/editRoleDashboardIds.ts","components/templates/admin/AssignRolePredicates.tsx","components/molecules/ReportsBadge.tsx","components/templates/admin/AssignRoleReports.tsx","actions/editRoleReportIds.ts","components/molecules/UsersBadge.tsx","components/templates/admin/AssignRoleUsers.tsx","actions/editRoleUserIds.ts","components/molecules/RoleDetailsTable.tsx","components/templates/admin/EditRoleDetails.tsx","components/molecules/RolePredicatesTable.tsx","components/templates/admin/RoleSummary.tsx","components/molecules/RoleWizardProgress.tsx","components/pages/admin/RoleWizardPage.tsx","components/pages/admin/SearchDashboardsPage.tsx","components/pages/admin/SearchGroupsPage.tsx","components/pages/admin/SearchKpisPage.tsx","components/pages/admin/SearchPredicatesPage.tsx","components/pages/admin/SearchReportsPage.tsx","components/pages/admin/SearchRolesPage.tsx","components/pages/admin/SearchUsersPage.tsx","api/getUserGroups.ts","api/removeUserGroup.ts","api/saveUserGroup.ts","actions/loadingEditUserGroups.ts","actions/editUserGroupIds.ts","api/getUserRoles.ts","actions/loadingEditUserRoles.ts","actions/editUserRoleIds.ts","actions/loadingEditUserDetails.ts","components/molecules/UserWizardProgress.tsx","components/templates/admin/AddUserDetails.tsx","components/molecules/GroupsBadge.tsx","components/templates/admin/AssignUserGroups.tsx","components/molecules/RolesBadge.tsx","components/templates/admin/AssignUserRoles.tsx","components/organisms/UserDetailsTable.tsx","components/templates/admin/EditUserDetails.tsx","components/templates/admin/UserSummary.tsx","components/pages/admin/UserWizardPage.tsx","api/getRoleClients.ts","actions/loadingRoleClients.ts","actions/activeRoleClients.ts","components/molecules/KpiClientSelector.tsx","actions/activeKpiClient.ts","api/getKpiEntriesForPredicateClientKpiYear.ts","api/saveKpiEntry.ts","api/saveUpdatedKpiEntry.ts","actions/loadingKpiEntries.ts","actions/activeKpiEntries.ts","api/getFyStartMonths.ts","actions/fyStartMonths.ts","actions/loadingFyStartMonths.ts","components/molecules/KpiEntriesEditTable.tsx","components/molecules/KpiEntriesTable.tsx","components/molecules/KpiEntriesContainer.tsx","components/molecules/KpiFYSelector.tsx","actions/activeKpiFinancialYear.ts","api/getRoleKpiGroupingPredicates.ts","actions/loadingRoleKpiGroupingPredicates.ts","actions/activeRoleKpiGroupingPredicates.ts","components/molecules/KpiGroupingSelector.tsx","actions/activeKpiPredicate.ts","components/molecules/KpiSelector.tsx","actions/activeKpi.ts","components/pages/KpiTargetsPage.tsx","api/getClient.ts","api/getAccessToken.ts","api/getUser.ts","api/index.ts","api/getDefaultRolePredicateClient.ts","actions/activeDashboardDefaultClient.ts","actions/activeDashboardDefaultPredicate.ts","actions/activeUserProfile.ts","api/getCurrencyCodes.ts","actions/currencyCodes.ts","actions/loadingCurrencyCodes.ts","api/refreshAccessToken.ts","actions/tokenData.ts","api/getUserDashboards.ts","actions/activeDashboard.ts","actions/userDashboards.ts","actions/loadingUserDashboards.ts","actions/userGroups.ts","actions/activeUserGroup.ts","actions/loadingUserGroups.ts","api/getUserReports.ts","actions/activeReport.ts","actions/userReports.ts","actions/loadingUserReports.ts","actions/userRoles.ts","actions/loadingUserRoles.ts","actions/shared.ts","actions/activeRole.ts","components/pages/Callback.tsx","actions/auth0.ts","actions/loading.ts","components/pages/CallbackSaml.tsx","components/pages/CallbackSamlNA.tsx","components/pages/CallbackSamlProdAu.tsx","components/pages/CallbackSamlProdNA.tsx","components/pages/CallbackSamlProdAsia.tsx","components/pages/CallbackSamlPrtlDevAu.tsx","components/pages/CallbackSamlPrtlQaAu.tsx","components/pages/CallbackSamlPrtlProdAu.tsx","components/atoms/Jumbotron.tsx","components/molecules/ActiveRoleBadge.tsx","components/molecules/ResetSizeToWindowButton.tsx","components/pages/DashboardViewPage.tsx","components/pages/DashboardViewPageV2.tsx","components/pages/DashboardSelectionPage.tsx","components/pages/ReportViewPage.tsx","components/atoms/Span.tsx","components/atoms/Text.tsx","components/molecules/LoginButton.tsx","components/pages/SplashPage.tsx","components/molecules/UserDashboardsCard.tsx","components/molecules/UserReportsCard.tsx","components/molecules/WelcomeCard.tsx","components/pages/WelcomePage.tsx","components/atoms/Navbar.tsx","components/atoms/NavLink.tsx","components/atoms/NavListItem.tsx","components/atoms/NavListLeft.tsx","components/atoms/NavListRight.tsx","components/atoms/Image.tsx","components/atoms/ToolTip.tsx","components/molecules/Icon.tsx","components/molecules/KpiIcon.tsx","components/atoms/NavbarBrand.tsx","components/molecules/Logo.tsx","components/molecules/LogoutIcon.tsx","components/molecules/LogoutButton.tsx","components/molecules/AdminIcon.tsx","components/organisms/ActiveRoleDropDownMenu.tsx","components/organisms/AdminDropDownMenu.tsx","components/molecules/DashboardIcon.tsx","components/organisms/DashboardDropDownMenu.tsx","components/molecules/ProfileCard.tsx","components/molecules/Avatar.tsx","components/organisms/ProfileBar.tsx","components/organisms/ProfileModal.tsx","components/molecules/ReportIcon.tsx","components/organisms/ReportDropDownMenu.tsx","components/molecules/HelpdeskCard.tsx","components/molecules/HelpIcon.tsx","components/molecules/PrivacyPolicyCard.tsx","components/molecules/UserManualCard.tsx","components/organisms/SupportModal.tsx","components/templates/TopNavBar.tsx","routes/RouteList.tsx","components/pages/ErrorPage.tsx","components/templates/SecureRoute.tsx","components/templates/SecureAdminRoute.tsx","components/templates/PageBodyRoutes.tsx","components/atoms/Container.tsx","components/templates/PageContainer.tsx","components/templates/PageHeader.tsx","components/templates/PageHeaderRoutes.tsx","routes/history.ts","App.tsx","auth/auth0-variables.ts","auth/Auth.ts","middleware/index.ts","reducers/activeDashboard.ts","reducers/activeDashboardDefaultClient.ts","reducers/activeDashboardDefaultPredicate.ts","reducers/activePaginatedReport.ts","actions/activePaginatedReport.ts","reducers/activeKpi.ts","reducers/activeKpiClient.ts","reducers/activeKpiEntries.ts","reducers/activeKpiFinancialYear.ts","reducers/activeKpiPredicate.ts","reducers/activeReport.ts","reducers/activeRole.ts","reducers/activeRoleClients.ts","reducers/activeRoleKpiGroupingPredicates.ts","reducers/activeUserGroup.ts","reducers/auth0.ts","reducers/currencyCodes.ts","reducers/dashboards.ts","reducers/paginatedReports.ts","actions/paginatedReports.ts","reducers/editRoleDashboardIds.ts","reducers/editRoleDetails.ts","reducers/editRolePredicates.ts","reducers/editRoleReportIds.ts","reducers/editRoleUserIds.ts","reducers/editUserDetails.ts","reducers/editUserGroupIds.ts","reducers/editUserRoleIds.ts","reducers/financialYears.ts","reducers/fyStartMonths.ts","reducers/groups.ts","reducers/kpis.ts","reducers/loading.ts","reducers/loadingCurrencyCodes.ts","reducers/loadingDashboards.ts","reducers/loadingEditRoleDashboards.ts","reducers/loadingPaginatedReports.ts","actions/loadingPaginatedReports.ts","reducers/loadingEditRolePredicates.ts","reducers/loadingEditRoleReports.ts","reducers/loadingEditRoleUsers.ts","reducers/loadingEditUserDetails.ts","reducers/loadingEditUserGroups.ts","reducers/loadingEditUserRoles.ts","reducers/loadingFinancialYears.ts","reducers/loadingFyStartMonths.ts","reducers/loadingGroups.ts","reducers/loadingKpiEntries.ts","reducers/loadingKpis.ts","reducers/loadingPredicates.ts","reducers/loadingReports.ts","reducers/loadingRoleClients.ts","reducers/loadingRoleKpiGroupingPredicates.ts","reducers/loadingRoles.ts","reducers/loadingUserDashboards.ts","reducers/loadingUserPaginatedReports.ts","actions/loadingUserPaginatedReports.ts","reducers/loadingUserGroups.ts","reducers/loadingUserReports.ts","reducers/loadingUserRoles.ts","reducers/loadingUsers.ts","reducers/predicates.ts","reducers/profiles.ts","reducers/reports.ts","reducers/rolePredicates.ts","actions/rolePredicates.ts","reducers/roles.ts","reducers/tokenData.ts","reducers/userDashboards.ts","reducers/userPaginatedReports.ts","actions/userPaginatedReports.ts","reducers/userGroups.ts","reducers/userProfile.ts","reducers/userReports.ts","reducers/userRoles.ts","reducers/index.ts","index.tsx","assets/icons/recentWhite.svg","assets/icons/logoutWhite.svg","assets/icons/manageWhite.svg","assets/icons/dashboardWhite.svg","assets/icons/GraphWhite.svg","assets/icons/helpWhite.svg","assets/images/ctm-bg1-min1.jpg"],"names":["Col","props","children","id","xs","sm","md","lg","style","Row","PageBody","rowStyle","colStyle","rowId","colId","validateGuid","text","test","String","trim","toLowerCase","validateEmail","validatePathText","validateParametersText","validateZoomPercent","value","Number","isNaN","validateRoleDisplayName","validateRoleName","validateDashboardDisplayName","validateDashboardName","validateGroupName","validateReportDisplayName","validateReportName","validateFinancialYearDisplayName","validateFinancialYearEndYear","year","validatePredicateName","validatePredicateDisplayName","validateKpiDisplayName","validateKpiName","validateNumber","fetchSecureData","method","url","accessToken","data","a","undefined","fetch","headers","Headers","Authorization","ContentType","body","JSON","stringify","buildIframeUrl","report","iframeUrl","sqlReportingViewerUrl","concat","path","name","parameters","defaultZoomMode","defaultZoomPercent","buildRolesParams","userRole","getDashboards","json","dashboards","saveDashboard","displayName","groupId","reportId","dashboardViewerVersion","isEnabled","dashboard","console","log","saveUpdatedDashboard","payload","result","removeDashboard","statusCode","addDashboard","type","updateDashboard","loadDashboards","handleLoadDashboards","dispatch","length","sort","b","dashboardsLoaded","AddTextField","state","duplicateValue","valueHasInvalidChars","valueChange","e","preventDefault","target","setState","valueFocus","valueBlur","callback","valueIsValid","isValid","noDuplicates","allowEmptyValues","existingValues","find","dn","bind","prevProps","this","title","FormGroup","Label","for","Input","placeholder","onChange","onFocus","onBlur","invalid","FormFeedback","tooltip","React","paths","addGroup","addKpi","addPredicate","addReport","addRole","addRoleWizard","addUser","admin","editDashboard","editGroup","editKpi","editPredicate","editReport","editRole","editUser","home","pbiDashboards","pbiPaginatedReports","profile","quickAddUser","root","searchDashboards","searchGroups","searchKpis","searchPredicates","searchReports","searchRoles","searchUsers","ssosaml","ssosamldevau","ssosamlqaau","ssosamlqana","ssosamlprodna","ssosamlstagingau","ssosamlprodas","ssosamlprodau","ssosamlqa","ssosamlprodprtlau","ssosamlqaprtlau","ssosamldevprtlau","sqlReports","kpitargets","addKpiTargets","addFinancialYear","settings","zoomModes","roleWizardStages","userWizardStages","AddDashboardPage","isLoaded","isReadyToSave","isEnabledChange","checked","readyToSave","save","addMore","onHandleSaveDashboard","history","push","cancel","onHandleLoadDashboards","existingDashboards","allowDisableDashboards","Form","Card","CardHeader","CardBody","map","d","n","gId","rId","toString","dvver","parseInt","Table","scope","defaultChecked","CardFooter","Button","onClick","margin","padding","connect","auth0","handleSaveDashboard","getFinancialYears","financialYears","saveFinancialYear","endYear","financialYear","loadFinancialYears","handleLoadFinancialYears","financialYearsLoaded","AddFinancialYearPage","onHandleSaveFinancialYear","onHandleLoadFinancialYears","existingFinancialYears","allowDisableFinancialYears","fy","ey","handleSaveFinancialYear","getGroups","groups","removeGroup","saveGroup","group","saveUpdatedGroup","updateGroup","loadGroups","handleLoadGroups","groupsLoaded","AddGroupPage","onHandleSaveGroup","onHandleLoadGroups","existingGroups","allowDisableGroups","grp","handleSaveGroup","getKpis","kpis","removeKpi","saveKpi","kpi","saveUpdatedKpi","updateKpi","loadKpis","handleLoadKpis","kpisLoaded","AddKpiPage","onHandleSaveKpi","onHandleLoadKpis","existingKpis","allowDisableKpis","handleSaveKpi","getPredicates","predicates","removePredicate","savePredicate","isKpiGrouping","predicate","saveUpdatedPredicate","updatePredicate","loadPredicates","handleLoadPredicates","predicatesLoaded","isKpiGroupingChange","onHandleSavePredicate","onHandleLoadPredicates","existingPredicates","allowDisablePredicates","pred","handleSavePredicate","getReports","reports","removeReport","saveReport","sqlReportingServerUrl","allowAlternateSqlReportingServerUrl","allowAlternateSqlReportingViewerUrl","saveUpdatedReport","updateReport","loadReports","handleLoadReports","reportsLoaded","AddReportPage","onHandleSaveReport","defaultZoomModeChange","onHandleLoadReports","existingReports","allowDisableReports","p","params","zm","key","zpct","handleSaveReport","getUserProfiles","userProfiles","removeUserProfile","saveUpdatedUserProfile","userProfile","emailAddress","saveUserProfile","setEditUserDetails","user","addUserProfile","updateUserProfile","loadUserProfiles","handleSaveUserProfile","handleLoadUserProfiles","usersLoaded","AddUserPage","email","emailAlertVisible","emailChange","emailFocus","emailIsValid","onHandleSaveUser","checkAllInputValid","onDismissEmailAlert","allowDisableUsers","Alert","color","isOpen","toggle","CardTitle","striped","DashboardDetailsTable","readOnly","EditDashboardPage","editModeOn","showDeleteModal","onHandleUpdateDashboard","updatedDashboard","delete","onHandleDeleteDashboard","toggleEdit","toggleDeleteModal","Modal","ModalHeader","ModalBody","ModalFooter","ownProps","match","filter","dsh","handleUpdateDashboard","deleteDashboard","handleDeleteDashboard","GroupDetailsTable","EditGroupPage","onHandleUpdateGroup","updatedGroup","onHandleDeleteGroup","handleUpdateGroup","deleteGroup","handleDeleteGroup","KpiDetailsTable","EditKpiPage","onHandleUpdateKpi","onHandleDeleteKpi","k","loadingKpis","handleUpdateKpi","deleteKpi","handleDeleteKpi","PredicateDetailsTable","EditPredicatePage","onHandleUpdatePredicate","updatedPredicate","onHandleDeletePredicate","handleUpdatePredicate","deletePredicate","handleDeletePredicate","ReportDetailsTable","EditReportPage","onHandleUpdateReport","onHandleDeleteReport","handleUpdateReport","deleteReport","handleDeleteReport","getRoleDashboards","roleId","roleDashboards","removeRoleDashboard","dashboardId","saveRoleDashboard","roleDashboard","setEditRoleDashboardsLoaded","editRoleDashboardsLoaded","setEditRoleDetails","role","getRolePredicates","rolePredicates","removeRolePredicate","predicateId","saveRolePredicate","rolePredicate","saveUpdatedRolePredicate","setEditRolePredicatesLoaded","editRolePredicatesLoaded","addEditRolePredicate","updateEditRolePredicate","removeEditRolePredicate","loadEditRolePredicates","getRoleReports","roleReports","removeRoleReport","saveRoleReport","roleReport","setEditRoleReportsLoaded","editRoleReportsLoaded","getRoleUsers","roleUsers","removeRoleUser","userId","saveRoleUser","roleUser","setEditRoleUsersLoaded","editRoleUsersLoaded","getRoles","roles","saveRole","currencyCodeId","fyStartMonthId","saveUpdatedRole","removeRole","updateRole","loadRoles","handleLoadRoles","rolesLoaded","AddCurrencyCode","currencyCodeIdChange","currencyCodes","cc","code","AddFYStartMonth","fyStartMonthIdChange","fyStartMonths","fys","AddRoleDetails","onHandleSaveRole","fysm","currenyCodeId","handleSaveRole","DashboardsBadge","dashboardIds","Badge","DataLoading","dataTitle","Spinner","AssignRoleDashboards","editRoleDashboardIds","filteredDashboards","txtFilterChange","includes","dashboardCheckboxChange","onHandleSaveEditRoleDashboardId","onHandleDeleteEditRoleDashboardId","onHandleLoadEditRoleDashboardIds","editRoleDashboardIdsLoaded","ListGroup","ListGroupItem","check","onSave","loadingDashboards","editRoleDetails","loadingEditRoleDashboards","ids","handleLoadEditRoleDashboardIds","onClearEditRoleDashboardIds","handleSaveEditRoleDashboardId","handleDeleteEditRoleDashboardId","AssignRolePredicates","activePredicateId","activePredicateValue","editRolePredicates","predicateIdChange","predicateValueChange","onHandleRemoveRolePredicate","readyToAdd","onAddClick","onHandleSaveRolePredicate","onHandleUpdateRolePredicate","rp","updatedValue","onHandleLoadRolePredicates","onClearRolePredicates","sp","disabled","width","height","fluid","loadingEditRolePredicates","loadingPredicates","handleLoadEditRolePredicates","handleSaveRolePredicate","handleUpdateRolePredicate","deleteRolePredicate","handleDeleteRolePredicate","ReportsBadge","reportIds","AssignRoleReports","editRoleReportIds","filteredReports","reportCheckboxChange","onHandleSaveEditRoleReportId","onHandleDeleteEditRoleReportId","onHandleLoadEditRoleReportIds","editRoleReportIdsLoaded","loadingReports","loadingEditRoleReports","handleLoadEditRoleReportIds","onClearEditRoleReportIds","handleSaveEditRoleReportId","handleDeleteEditRoleReportId","UsersBadge","userIds","users","AssignRoleUsers","editRoleUserIds","filteredUsers","userCheckboxChange","onHandleSaveEditRoleUserId","onHandleDeleteEditRoleUserId","onHandleLoadUsers","onHandleLoadEditRoleUserIds","editRoleUserIdsLoaded","profiles","loadingUsers","loadingEditRoleUsers","handleLoadEditRoleUserIds","onClearEditRoleUserIds","handleSaveEditRoleUserId","handleDeleteEditRoleUserId","allowDisableRoles","EditRoleDetails","onHandleDeleteRole","onHandleUpdateRole","existingRoles","r","handleUpdateRole","deleteRole","handleDeleteRole","RolePredicatesTable","RoleSummary","tag","RoleWizardProgress","currentStage","Progress","multi","bar","animated","RoleWizardPage","incrementStage","decrementStage","renderCurrentStage","onHandleLoadRoles","onHandleLoadEditRole","onHandleClearEditRole","onHandleClearEditReports","onHandleClearEditDashboards","onHandleClearEditUsers","onHandleClearEditPredicates","backgroundColor","SearchDashboardsPage","matchedNameExact","noMatchingNames","handleInputChange","searchDashboardDisplayName","valid","to","SearchGroupsPage","filteredGroups","searchGroupName","loadingGroups","SearchKpisPage","filteredKpis","searchKpiName","SearchPredicatesPage","filteredPredicates","searchPredicateName","SearchReportsPage","searchReportDisplayName","SearchRolesPage","filteredRoles","searchRoleDisplayName","loadingRoles","SearchUsersPage","matchedEmailExact","noMatchingEmails","searchEmail","getUserGroups","userGroups","removeUserGroup","saveUserGroup","userGroup","setEditUserGroupsLoaded","editUserGroupsLoaded","handleLoadEditUserGroupIds","getUserRoles","userRoles","setEditUserRolesLoaded","editUserRolesLoaded","handleLoadEditUserRoleIds","handleDeleteEditUserRoleId","setEditUserDetailsLoaded","editUserDetailsLoaded","UserWizardProgress","AddUserDetails","GroupsBadge","groupIds","AssignUserGroups","editUserGroupIds","groupCheckboxChange","onHandleSaveEditUserGroupId","onHandleDeleteEditUserGroupId","onHandleLoadEditUserGroupIds","editUserDetails","onClearEditUserGroupIds","handleSaveEditUserGroupId","handleDeleteEditUserGroupId","RolesBadge","removeUserRole","onHandleDeleteEditUserRoleId","roleIds","pill","href","fontSize","AssignUserRoles","editUserRoleIds","roleCheckboxChange","onHandleSaveEditUserRoleId","onHandleLoadEditUserRoleIds","onClearEditUserRoleIds","handleSaveEditUserRoleId","UserDetailsTable","loaded","roleIdsLoaded","groupIdsLoaded","loadingEditUserRoles","loadingEditUserGroups","EditUserDetails","onHandleDeleteUser","onHandleUpdateUser","existingUsers","usr","handleUpdateUserProfile","deleteUserProfile","handleRemoveUserProfile","UserSummary","UserWizardPage","loadUserData","onHandleLoadEditUser","onHandleClearEditUser","onHandleClearEditUserRoleIds","onHandleClearEditUserGroupIds","loadingEditUserDetails","getRoleClients","setRoleClientsLoaded","roleClientsLoaded","loadActiveRoleClients","clients","KpiClientSelector","selectedClientId","selectedClientChange","onHandleSetActiveClientId","clientsLoaded","onHandleLoadClients","onHandleClearActiveClientId","onHandleClearLoadedClients","client","activeRoleId","activeKpiPredicateId","activeRoleClients","loadingRoleClients","handleLoadActiveRoleClients","getKpiEntriesForPredicateClientKpiYear","clientId","kpiId","kpiEntries","saveKpiEntry","monthId","measuredValue","thresholdValue","kpiEntry","saveUpdatedKpiEntry","setKpiEntriesLoaded","kpiEntriesLoaded","addActiveKpiEntry","removeActiveKpiEntry","loadActiveKpiEntries","handleLoadActiveKpiEntries","handleClearActiveKpiEntries","getFyStartMonths","loadFyStartMonths","handleLoadFyStartMonths","fyStartMonthsLoaded","KpiEntriesEditTable","editedKpiEntries","copyToAllEditedKpiEntries","i","kpiEntryIndex","findIndex","kpie","onKpiEntryValueChange","index","onHandleSaveKpiEntry","onHandleUpdateKpiEntry","newKpiEntry","splice","onKpiEntryThresholdChange","updatedThreshold","createTable","start","end","addAutofillButton","months","table","month","val","onHandleClearLoadedKpiEntries","onHandleLoadKpiEntries","monthsLoaded","onHandleLoadMonths","startMonthId","className","activeKpiFinancialYearId","activeKpiEntries","loadingKpiEntries","loadingFyStartMonths","activeKpiClientId","activeKpiId","handleSaveKpiEntry","updatedKpiEntry","handleUpdateKpiEntry","KpiEntriesTable","KpiEntriesContainer","loadingFinancialYears","KpiFinancialYearSelector","selectedFinancialYearId","selectedFinancialYearChange","onHandleSetActiveFinancialYearId","fysLoaded","onHandleClearActiveFinancialYearId","getRoleKpiGroupingPredicates","roleKpiGroupingPredicates","setRoleKpiGroupingPredicatesLoaded","roleKpiGroupingPredicatesLoaded","loadActiveRoleKpiGroupingPredicates","KpiGroupingSelector","selectedPredicateId","selectedPredicateChange","onHandleSetActiveKpiPredicateId","onHandleClearActiveKpiPredicateId","onHandleClearLoadedPredicates","activeRoleKpiGroupingPredicates","loadingRoleKpiGroupingPredicates","handleLoadActiveRoleKpiGroupingPredicates","KpiSelector","selectedKpiId","selectedKpiChange","onHandleSetActiveKpiId","onHandleClearActiveKpiId","KpiTargetsPage","predicateSelected","clientSelected","fySelected","kpiSelected","KpiFYSelector","getClient","getAccessToken","getUser","getInitialData","tokenData","getDefaultRolePredicateClient","rolePredicateClient","setActiveDashboardDefaultClient","setActiveDashboardDefaultPredicateId","setActiveUserProfile","getCurrencyCodes","loadCurrencyCodes","handleLoadCurrencyCodes","currencyCodesLoaded","refreshAccessToken","refreshToken","setPbiAccessToken","handleRefreshToken","getUserDashboards","userDashboards","setActiveDashboard","handleLoadUserDashboards","userDashboardsLoaded","loadUserGroups","handleLoadUserGroups","userGroupsLoaded","getUserReports","userReports","setActiveReport","handleLoadUserReports","userReportsLoaded","handleLoadUserRoles","handleSetActiveRolePredicateClient","userRolesLoaded","error","Callback","auth","onHandleAuthentication","handleAuthentication","then","authResult","expiresIn","Date","getTime","idToken","getProfile","catch","err","expiresAt","updateAuth0","dataLoaded","handleLoadInitialData","CallbackSaml","loginSAML","CallbackSamlNA","loginSAMLNA","CallbackSamlProdAu","loginSAMLProdAU","CallbackSamlProdNA","loginSAMLProdNA","CallbackSamlProdAsia","loginSAMLProdAsia","CallbackSamlPrtlDevAu","loginSAMLPrtlDevAU","CallbackSamlPrtlQaAu","loginSAMLPrtlQaAU","CallbackSamlPrtlProdAu","loginSAMLPrtlProdAU","Jumbotron","availableRoles","ResetSizeToWindowButton","isVisible","size","display","float","DashboardView","currency","embedUrl","fetched","fetching","fitToWindowVisible","fystart","intervalId","pbiToken","expiration","token","tokenId","handleDataSelected","handleReportLoad","filterCurrency","$schema","column","logicalOperator","conditions","operator","filterFYStart","values","filterDebtor","getFilters","filters","setFilters","on","handlePageChange","setFullscreen","fullscreen","printReport","print","tokenRefresh","apiAccessToken","onHandleRefreshToken","refresh_token","getPbiReportAccessToken","activeUserRole","getReportInGroup","dashboardInfo","append","init","cache","mode","datasetId","request","Request","onSetActiveDashboard","window","setInterval","Error","nextProps","nextState","access_token","setAccessToken","clearInterval","roleCount","reportStyle","embedType","tokenType","embedId","extraSettings","filterPanelEnabled","navContentPaneEnabled","permissions","onLoad","onSelectData","onPageChange","DashboardViewPage","dash","onClearActiveDashboard","valuesLoaded","getCurrentFinancialYear","fyStart","getFullYear","fyEnd","today","getDate","now","configureKpiPageFilters","page","defaultClientName","defaultPredicateDisplayName","filterClient","substring","filterPredicate","configureSimulationPageFilters","getPages","pages","kpiPage","simulationPage","filterFinYearName","filterFinYearFirstMonth","setActive","setRefresh","refresh","info","DashboardViewPageV2","defaultPredicate","activeDashboardDefaultPredicateId","activeDashboardDefaultClient","DashboardSelectionPage","ReportViewPage","iFrameUrl","goFull","document","getElementById","requestFullscreen","exitHandler","addEventListener","onSetActiveReport","removeEventListener","src","allowFullScreen","seamless","sandbox","rep","onClearActiveReport","Span","Text","smallText","LoginButton","login","outline","isAuthenticated","ListGroupItemHeading","action","variant","activeRole","activeRoleDisplayName","lastDashboard","activeDashboardId","lastPaginatedReport","lastReport","activeReportId","CardText","loading","loadingCurrencyCodes","loadingUserRoles","loadingUserDashboards","loadingUserReports","loadingUserGroups","Navbar","NavLink","active","NavListItem","NavListLeft","NavListRight","Image","alt","ToolTip","placement","Tooltip","Icon","icon","KpiIcon","Manage","NavbarBrand","Link","Logo","paddingRight","LogoutIcon","Logout","LogoutButton","logout","cursor","AdminIcon","ActiveRoleDropDownMenu","dropdownOpen","activeRoleIdChange","newRoleId","onHandleSelectActiveRoleId","selectableRoles","Dropdown","DropdownToggle","data-toggle","aria-expanded","DropdownMenu","DropdownItem","header","withRouter","AdminDropDownMenu","divider","isSuperAdministrator","isKpiAdministrator","ug","DashboardIcon","Dashboard","DashboardDropDownMenu","photo","picture","textAlign","borderRadius","Avatar","split","ProfileModal","modal","ReportIcon","Graph","ReportDropDownMenu","HelpdeskCard","HelpIcon","Help","PrivacyPolicyCard","UserManualCard","SupportModal","adminGroup","kpiAdminGroup","isAdministrator","hasMultipleRoles","routes","exact","main","topbar","secureRoutes","secureAdminRoutes","AddPredicatePage","ErrorPage","SecureRoute","Component","component","render","pathname","from","location","SecureAdminRoute","PageBodyRoutes","route","Container","PageContainer","backgroundImage","bgImage","backgroundRepeat","backgroundSize","minHeight","PageHeader","background","PageHeaderRoutes","TopNavBar","createHistory","App","AUTH_CONFIG","Auth","loginSAMLDevAU","setSession","arr","redirectUri","audience","clientID","domain","responseType","Promise","resolve","reject","parseHash","authorize","connection","returnTo","origin","idTokenPayload","applyMiddleware","thunk","activeDashboard","activePaginatedReport","activeKpi","activeKpiClient","newState","slice","Object","assign","activeKpiFinancialYear","activeKpiPredicate","activeReport","activeUserGroup","currencyCode","dshbd","paginatedReports","paginatedReport","fyStartMonth","loadingPaginatedReports","paginatedReportsLoaded","loadingUserPaginatedReports","userPaginatedReportsLoaded","rpt","userDashboard","userPaginatedReports","userPaginatedReport","userReport","allReducers","combineReducers","activePaginatedReportId","activeUserGroupId","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","store","createStore","middleware","ReactDOM","module","exports"],"mappings":"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","file":"static/js/main.1b41d830.chunk.js","sourcesContent":["import * as React from \"react\";\r\nimport { Col as BootstrapCol } from \"reactstrap\";\r\n\r\nexport interface IColProps {\r\n xs?: string;\r\n sm?: string;\r\n md?: string;\r\n lg?: string;\r\n children: React.ReactNode;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst Col: React.SFC = (props: IColProps) => {\r\n const { children, id, xs, sm, md, lg, style } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default Col;\r\n","import * as React from \"react\";\r\nimport { Row as BootstrapRow } from \"reactstrap\";\r\n\r\nexport interface IRowProps {\r\n style?: React.CSSProperties;\r\n id?: string;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst Row: React.SFC = (props: IRowProps) => {\r\n const { children, id, style } = props;\r\n return {children} ;\r\n};\r\n\r\nexport default Row;\r\n","import * as React from \"react\";\r\nimport Col from \"../atoms/Col\";\r\nimport Row from \"../atoms/Row\";\r\n\r\nexport interface IPageBodyProps {\r\n children: React.ReactNode;\r\n rowStyle?: React.CSSProperties;\r\n colStyle?: React.CSSProperties;\r\n rowId?: string;\r\n colId?: string;\r\n}\r\n\r\nconst PageBody: React.SFC = (props: IPageBodyProps) => {\r\n const { children, rowStyle, colStyle, rowId, colId } = props;\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default PageBody;\r\n","/* eslint-disable no-useless-escape */\r\nimport { IRole } from \"../models/IRole\";\r\nimport ISqlReport from \"../models/ISqlReport\";\r\n\r\nexport const validateText = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\|\\:\\,]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateTextOrWhitespace = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateGuid = (text: string) => {\r\n const re = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateUrl = (text: string) => {\r\n const re = /^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$/i;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateEmail = (text: string) => {\r\n const re = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validatePathText = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\/\\%\\?\\=\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateParametersText = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\/\\%\\?\\=\\:\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateZoomPercent = (text: string) => {\r\n const value = Number(text);\r\n if (isNaN(value)) {\r\n return false;\r\n }\r\n if (value < 0 || value > 500) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const validateRoleDisplayName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\|\\:\\,\\!\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\nexport const validateRoleName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\!]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateDashboardDisplayName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\nexport const validateDashboardName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateGroupName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\nexport const validateReportDisplayName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\nexport const validateReportName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\nexport const validateFinancialYearDisplayName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateFinancialYearEndYear = (text: string) => {\r\n const year = Number(text);\r\n if (year > 2000 || year < 2050) {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const validatePredicateName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validatePredicateDisplayName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateKpiDisplayName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\%\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateKpiName = (text: string) => {\r\n const re = /^[a-zA-Z0-9\\_\\.\\-\\(\\)\\%\\s]*$/;\r\n return re.test(String(text.trim()).toLowerCase());\r\n};\r\n\r\nexport const validateNumber = (text: string) => {\r\n // const re = /^-?\\d(\\.\\d+)?$/;\r\n // return re.test(String(text.trim()).toLowerCase());\r\n const value = Number(text);\r\n if (isNaN(value)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const fetchSecureData = async (\r\n method: string,\r\n url: string,\r\n accessToken: string,\r\n data?: object\r\n) => {\r\n if (data !== undefined) {\r\n return await fetch(url, {\r\n method,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n headers: new Headers({\r\n Authorization: `Bearer ${accessToken}`,\r\n \"Content-Type\": `application/json`,\r\n ContentType: `application/json`\r\n }),\r\n body: JSON.stringify(data)\r\n });\r\n } else {\r\n return await fetch(url, {\r\n method,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n headers: new Headers({\r\n Authorization: `Bearer ${accessToken}`\r\n })\r\n });\r\n }\r\n};\r\n\r\nexport const getDefaultSqlReportServerViewUrl = () => {\r\n // const url =\r\n // \"https://projectriverside-sqlreporting-production.azurewebsites.net/SqlReport.aspx\";\r\n // const url =\r\n // \"https://localhost:44325/SqlReport.aspx\";\r\n // const url =\r\n // \"https://ctmsmartdatapbiserverreportviewerwestus.azurewebsites.net/SqlReport\";\r\n const url = \"https://reports.ctmsmartdata.com/SqlReport\";\r\n return url;\r\n};\r\n\r\nexport const buildIframeUrl = async (report: ISqlReport) => {\r\n let iframeUrl = \"\";\r\n if (report.sqlReportingViewerUrl) {\r\n iframeUrl = iframeUrl.concat(report.sqlReportingViewerUrl);\r\n } else {\r\n iframeUrl = iframeUrl.concat(getDefaultSqlReportServerViewUrl());\r\n }\r\n iframeUrl = iframeUrl.concat(\r\n `?serverReportPath=/${report.path}/${report.name}`\r\n );\r\n if (report.parameters) {\r\n iframeUrl = iframeUrl.concat(`&${report.parameters}`);\r\n }\r\n if (report.defaultZoomMode) {\r\n iframeUrl = iframeUrl.concat(`&defaultZoomMode=${report.defaultZoomMode}`);\r\n }\r\n if (report.defaultZoomPercent) {\r\n iframeUrl = iframeUrl.concat(\r\n `&defaultZoomPercent=${report.defaultZoomPercent}`\r\n );\r\n }\r\n return iframeUrl;\r\n};\r\n\r\nexport const buildRolesParams = (userRole: IRole) => {\r\n const roles = userRole !== undefined ? `&Roles=${userRole.name}` : \"\";\r\n return roles;\r\n};\r\n","import IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getDashboards = async (accessToken: string) => {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/PbiDashboard/GetPbiDashboards`,\r\n accessToken\r\n );\r\n const dashboards = ((await data.json()) as any).value as IPbiDashboard[];\r\n if (dashboards !== undefined) {\r\n return dashboards;\r\n } else {\r\n return [] as IPbiDashboard[];\r\n }\r\n};\r\n\r\nexport default getDashboards;\r\n","import IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveDashboard = async (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n groupId: string,\r\n reportId: string,\r\n dashboardViewerVersion:number,\r\n isEnabled: boolean\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/PbiDashboard/Add?name=${name}&displayName=${displayName}&groupId=${groupId}&reportId=${reportId}&dashboardViewerVersion=${dashboardViewerVersion}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const dashboard = ((await data.json()) as any).value as IPbiDashboard;\r\n return dashboard;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/PbiDashboard/Add?name=${name}&displayName=${displayName}&groupId=${groupId}&reportId=${reportId}&dashboardViewerVersion=${dashboardViewerVersion}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IPbiDashboard;\r\n};\r\n\r\nexport default saveDashboard;\r\n","import IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedDashboard = async (\r\n accessToken: string,\r\n dashboard: IPbiDashboard\r\n) => {\r\n const payload = {\r\n id: dashboard.id,\r\n name: dashboard.name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: dashboard.displayName,\r\n groupId: dashboard.groupId,\r\n reportId: dashboard.reportId,\r\n dashboardViewerVersion: dashboard.dashboardViewerVersion,\r\n isEnabled: dashboard.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/PbiDashboard/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IPbiDashboard;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/PbiDashboard/Edit`, err);\r\n }\r\n return {} as IPbiDashboard;\r\n};\r\n\r\nexport default saveUpdatedDashboard;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeDashboard = async (accessToken: string, id: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/PbiDashboard/Remove?id=${id}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/PbiDashboard/Remove?id=${id}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeDashboard;\r\n","import * as Redux from \"redux\";\r\nimport getDashboards from \"../api/getDashboards\";\r\nimport saveDashboard from \"../api/saveDashboard\";\r\nimport saveUpdatedDashboard from \"../api/saveUpdatedDashboard\";\r\nimport { removeDashboard as deleteDashboard } from \"../api/removeDashboard\";\r\nimport IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { setDashboardsLoaded } from \"./loadingDashboards\";\r\n\r\nexport const ADD_DASHBOARD = \"ADD_DASHBOARD\";\r\nexport const REMOVE_DASHBOARD = \"REMOVE_DASHBOARD\";\r\nexport const UPDATE_DASHBOARD = \"UPDATE_DASHBOARD\";\r\nexport const LOAD_DASHBOARDS = \"LOAD_DASHBOARDS\";\r\n\r\nexport const addDashboard = (dashboard: IPbiDashboard) => {\r\n return {\r\n dashboard,\r\n type: ADD_DASHBOARD\r\n };\r\n};\r\n\r\nexport const removeDashboard = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_DASHBOARD\r\n };\r\n};\r\n\r\nexport const updateDashboard = (dashboard: IPbiDashboard) => {\r\n return {\r\n dashboard,\r\n type: UPDATE_DASHBOARD\r\n };\r\n};\r\n\r\nexport const loadDashboards = (dashboards: IPbiDashboard[]) => {\r\n return {\r\n dashboards,\r\n type: LOAD_DASHBOARDS\r\n };\r\n};\r\n\r\nexport const handleSaveDashboard = (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n groupId: string,\r\n reportId: string,\r\n dashboardViewerVersion:number,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const dashboard = await saveDashboard(\r\n accessToken,\r\n name,\r\n displayName,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n );\r\n if (dashboard !== null && dashboard !== undefined) {\r\n dispatch(addDashboard(dashboard));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateDashboard = (\r\n accessToken: string,\r\n dashboard: IPbiDashboard\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const dsh = await saveUpdatedDashboard(accessToken, dashboard);\r\n if (dsh !== null && dsh !== undefined) {\r\n dispatch(updateDashboard(dashboard));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteDashboard = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteDashboard(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removeDashboard(id));\r\n }\r\n };\r\n};\r\n\r\nexport const handleLoadDashboards = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const dashboards = await getDashboards(accessToken);\r\n if (dashboards !== undefined) {\r\n if (dashboards.length > 0) {\r\n dashboards.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadDashboards(dashboards));\r\n }\r\n dispatch(setDashboardsLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_DASHBOARDS_LOADED = \"SET_DASHBOARDS_LOADED\";\r\n\r\nexport const setDashboardsLoaded = (dashboardsLoaded: boolean) => {\r\n return {\r\n dashboardsLoaded,\r\n type: SET_DASHBOARDS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { FormFeedback, FormGroup, Input, Label } from \"reactstrap\";\r\n\r\nexport interface IAddTextFieldProps {\r\n allowEmptyValues?:boolean;\r\n noDuplicates: boolean;\r\n value: string;\r\n existingValues: string[];\r\n callback: (value: string) => void;\r\n isValid: (value: string) => boolean;\r\n title: string;\r\n}\r\n\r\nexport interface IAddTextFieldState {\r\n value: string;\r\n valueHasInvalidChars: boolean;\r\n duplicateValue: boolean;\r\n}\r\nclass AddTextField extends React.Component<\r\n IAddTextFieldProps,\r\n IAddTextFieldState\r\n> {\r\n public state = {\r\n duplicateValue: false,\r\n value: \"\",\r\n valueHasInvalidChars: false\r\n };\r\n constructor(props: IAddTextFieldProps) {\r\n super(props);\r\n this.valueChange = this.valueChange.bind(this);\r\n this.valueFocus = this.valueFocus.bind(this);\r\n this.valueBlur = this.valueBlur.bind(this);\r\n this.valueIsValid = this.valueIsValid.bind(this);\r\n }\r\n public valueChange = (e: React.ChangeEvent) => {\r\n e.preventDefault();\r\n const value =\r\n e.target.value === undefined ? \"\" : (e.target.value as string);\r\n this.setState(() => ({ value }));\r\n };\r\n public valueFocus = () => {\r\n this.setState({\r\n duplicateValue: false,\r\n valueHasInvalidChars: false\r\n });\r\n };\r\n public valueBlur = async (e: React.ChangeEvent) => {\r\n const { callback } = this.props;\r\n e.preventDefault();\r\n const value =\r\n e.target.value === undefined ? \"\" : (e.target.value as string).trim();\r\n await this.setState(() => ({\r\n value\r\n }));\r\n if (this.valueIsValid()) {\r\n callback(value);\r\n } else {\r\n this.setState(() => ({ value: this.props.value }));\r\n }\r\n };\r\n public valueIsValid = () => {\r\n const { isValid, noDuplicates, allowEmptyValues } = this.props;\r\n const { value } = this.state;\r\n if ((!allowEmptyValues && value === \"\") || value === undefined || !isValid(value)) {\r\n this.setState(() => ({ valueHasInvalidChars: true }));\r\n return false;\r\n }\r\n if (noDuplicates) {\r\n const { existingValues } = this.props;\r\n if (\r\n existingValues.find(\r\n dn => dn.trim().toLowerCase() === value.trim().toLowerCase()\r\n ) !== undefined\r\n ) {\r\n this.setState(() => ({ duplicateValue: true }));\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n public async componentDidUpdate(prevProps: IAddTextFieldProps) {\r\n const { value } = this.props;\r\n if (value !== prevProps.value) {\r\n await this.setState(() => ({ value }));\r\n }\r\n }\r\n public async componentDidMount() {\r\n const { value } = this.props;\r\n if (value !== undefined) {\r\n await this.setState(() => ({ value }));\r\n }\r\n }\r\n public render() {\r\n const { title, noDuplicates } = this.props;\r\n const { value, valueHasInvalidChars, duplicateValue } = this.state;\r\n return (\r\n \r\n {title!==\"\" && ()}\r\n \r\n \r\n {this.state.valueHasInvalidChars && (\r\n Invalid characters were present in {title}. The value of {title} was reset.\r\n )}\r\n {this.state.duplicateValue && (\r\n \r\n {title} value entered is already used. Duplicates not allowed. The value of {title} was reset.\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default AddTextField;\r\n","export const paths = {\r\n addDashboard: \"/admin/dashboards/add/\",\r\n addGroup: \"/admin/groups/add/\",\r\n addKpi: \"/admin/kpis/add/\",\r\n addPredicate: \"/admin/predicates/add/\",\r\n addReport: \"/admin/reports/add/\",\r\n addRole: \"/admin/roles/add/\",\r\n addRoleWizard: \"/admin/roles/addWizard/\",\r\n addUser: \"/admin/users/add/\",\r\n admin: \"/admin/\",\r\n callback: \"/callback/\",\r\n editDashboard: \"/admin/dashboards/edit/\",\r\n editGroup: \"/admin/groups/edit/\",\r\n editKpi: \"/admin/kpis/edit/\",\r\n editPredicate: \"/admin/predicates/edit/\",\r\n editReport: \"/admin/reports/edit/\",\r\n editRole: \"/admin/roles/edit/\",\r\n editUser: \"/admin/users/edit/\",\r\n home: \"/home/\",\r\n\r\n pbiDashboards: \"/dashboards/\",\r\n pbiPaginatedReports: \"/paginatedReports/\",\r\n\r\n\r\n profile: \"/profile/\",\r\n quickAddUser: \"/admin/users/quick-add\",\r\n root: \"/\",\r\n searchDashboards: \"/admin/dashboards/search/\",\r\n searchGroups: \"/admin/groups/search/\",\r\n searchKpis: \"/admin/kpis/search/\",\r\n searchPredicates: \"/admin/predicates/search\",\r\n searchReports: \"/admin/reports/search\",\r\n searchRoles: \"/admin/roles/search/\",\r\n searchUsers: \"/admin/users/search/\",\r\n\r\n ssosaml: \"/ssosaml/\",\r\n ssosamldevau: \"/ssosamldevau\",\r\n ssosamlqaau: \"/ssosamlqaau\", \r\n ssosamlqana: \"/ssosamlqana\", \r\n ssosamlprodna: \"/ssosamlprodna\",\r\n ssosamlstagingau: \"/ssosamlstagingau\",\r\n ssosamlprodas: \"/ssosamlprodas\",\r\n\r\n ssosamlprodau: \"/ssosamlprodau\",\r\n ssosamlqa: \"/ssosamlqa\",\r\n\r\n //For new CTM portal AU:\r\n ssosamlprodprtlau: \"/ssosamlprtlau\",\r\n ssosamlqaprtlau: \"/ssosamlqaprtlau\",\r\n ssosamldevprtlau: \"/ssosamldevprtlau\",\r\n\r\n sqlReports: \"/reports/\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n kpitargets: \"/kpi/\",\r\n addKpiTargets: \"/admin/kpis/add/\",\r\n addFinancialYear: \"/admin/kpis/financialYears/add/\"\r\n};\r\n\r\nexport const settings = {\r\n allowAlternateSqlReportingServerUrl: false,\r\n allowAlternateSqlReportingViewerUrl: false,\r\n allowDisableDashboards: false,\r\n allowDisableGroups: false,\r\n allowDisableReports: false,\r\n allowDisableRoles: false,\r\n allowDisableUsers: false,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n allowDisableFinancialYears: false,\r\n allowDisablePredicates: false,\r\n allowDisableKpis: false,\r\n maxDashboardViewerVersion: 2,\r\n kpiDashboardPageName: \"KPIs\",\r\n simulationDashboardPageName: \"Simulation\",\r\n allowDisablePaginatedReports: false\r\n};\r\n\r\nexport const zoomModes = [\r\n \"Whole Page\",\r\n \"Page Width\",\r\n \"Percent\",\r\n \"500%\",\r\n \"200%\",\r\n \"150%\",\r\n \"100%\",\r\n \"75%\",\r\n \"50%\",\r\n \"25%\",\r\n \"10%\"\r\n];\r\n\r\nexport const editModes = {\r\n add: 0,\r\n view: 1,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n edit: 2\r\n};\r\nexport const roleWizardStages = {\r\n addInitialRoleDetails: 0,\r\n addPredicateParameters: 1,\r\n assignDashboards: 2,\r\n assignReports: 3,\r\n assignUsers: 4,\r\n reviewAndComplete: 5\r\n};\r\n\r\nexport const userWizardStages = {\r\n addInitialUserDetails: 0,\r\n assignRoles: 1,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n assignGroups: 2,\r\n reviewAndComplete: 3\r\n};\r\n\r\nexport const adminGroupName = \"Company Administrator\";\r\nexport const kpiAdminGroupName = \"Client KPI Administrator\";\r\nexport const superAdminGroupName = \"Super Administrator\";\r\n\r\nexport default paths;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardHeader,\r\n Form,\r\n Input,\r\n Table\r\n} from \"reactstrap\";\r\nimport {\r\n handleLoadDashboards,\r\n handleSaveDashboard\r\n} from \"../../../actions/dashboards\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IPbiDashboard from \"../../../models/IPbiDashboard\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport {\r\n validateDashboardDisplayName,\r\n validateDashboardName,\r\n validateGuid,\r\n validateNumber\r\n} from \"../../../utils\";\r\nexport interface IAddDashboardPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n existingDashboards: IPbiDashboard[];\r\n onHandleLoadDashboards: (accessToken: string) => void;\r\n onHandleSaveDashboard: (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n groupId: string,\r\n reportId: string,\r\n dashboardViewerVersion: number,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddDashboardPageState {\r\n displayName: string;\r\n name: string;\r\n groupId: string;\r\n reportId: string;\r\n dashboardViewerVersion: number;\r\n isEnabled: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nexport class AddDashboardPage extends React.Component<\r\n IAddDashboardPageProps,\r\n IAddDashboardPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n displayName: \"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n groupId: \"\",\r\n reportId: \"\",\r\n dashboardViewerVersion: 0,\r\n isEnabled: true,\r\n isReadyToSave: false\r\n };\r\n\r\n constructor(props: IAddDashboardPageProps) {\r\n super(props);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public readyToSave = () => {\r\n const {\r\n displayName,\r\n name,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion\r\n } = this.state;\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateDashboardDisplayName(displayName)\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (name === undefined || name === \"\" || !validateDashboardName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (groupId === undefined || groupId === \"\" || !validateGuid(groupId)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (reportId === undefined || reportId === \"\" || !validateGuid(reportId)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (dashboardViewerVersion === undefined || dashboardViewerVersion < 1) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n }\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public save = (addMore: boolean = false) => {\r\n const { accessToken, onHandleSaveDashboard, history } = this.props;\r\n const {\r\n name,\r\n displayName,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n } = this.state;\r\n if (this.readyToSave()) {\r\n onHandleSaveDashboard(\r\n accessToken,\r\n name,\r\n displayName,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n );\r\n if (!addMore) {\r\n history.push(paths.home);\r\n } else {\r\n this.setState(() => ({\r\n displayName: \"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n groupId: \"\",\r\n reportId: \"\",\r\n dashboardViewerVersion: 0,\r\n isEnabled: true\r\n }));\r\n }\r\n }\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadDashboards,\r\n existingDashboards\r\n } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingDashboards.length === 0) {\r\n onHandleLoadDashboards(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { existingDashboards } = this.props;\r\n const {\r\n displayName,\r\n name,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n } = this.state;\r\n const { allowDisableDashboards } = settings;\r\n return (\r\n
\r\n \r\n Add New Dashboard Details\r\n \r\n \r\n d.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n d.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.groupId)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (gId: string) => {\r\n await this.setState(() => ({ groupId: gId }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.reportId)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (rId: string) => {\r\n await this.setState(() => ({ reportId: rId }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n d.reportId)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dvver: string) => {\r\n await this.setState(() => ({ dashboardViewerVersion: parseInt(dvver) }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n {allowDisableDashboards && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n this.save()}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save Changes\r\n \r\n this.save(true)}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save And Add Another\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingDashboards: state.dashboards\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadDashboards: (accessToken: string) => {\r\n dispatch(handleLoadDashboards(accessToken));\r\n },\r\n onHandleSaveDashboard: (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n groupId: string,\r\n reportId: string,\r\n dashboardViewerVersion: number,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(\r\n handleSaveDashboard(\r\n accessToken,\r\n name,\r\n displayName,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n )\r\n );\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddDashboardPage);\r\n","import IFinancialYear from \"../models/IFinancialYear\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getFinancialYears = async (accessToken: string) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/FinancialYear/GetFinancialYears`,\r\n accessToken\r\n );\r\n const financialYears = ((await data.json()) as any)\r\n .value as IFinancialYear[];\r\n if (financialYears !== undefined) {\r\n return financialYears;\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"Error occured: \", err);\r\n return [] as IFinancialYear[];\r\n }\r\n return [] as IFinancialYear[];\r\n};\r\n\r\nexport default getFinancialYears;\r\n\r\n// const defaultFinancialYears: IFinancialYear[] = [\r\n// {\r\n// id: 1,\r\n// // tslint:disable-next-line:object-literal-sort-keys\r\n// displayName: \"FY2018\",\r\n// endYear: 2018,\r\n// isEnabled: true\r\n// },\r\n// {\r\n// id: 1,\r\n// // tslint:disable-next-line:object-literal-sort-keys\r\n// displayName: \"FY2019\",\r\n// endYear: 2019,\r\n// isEnabled: true\r\n// },\r\n// {\r\n// id: 1,\r\n// // tslint:disable-next-line:object-literal-sort-keys\r\n// displayName: \"FY2020\",\r\n// endYear: 2020,\r\n// isEnabled: true\r\n// }\r\n// ];\r\n","import IFinancialYear from \"../models/IFinancialYear\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveFinancialYear = async (\r\n accessToken: string,\r\n displayName: string,\r\n endYear: number,\r\n isEnabled: boolean\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/FinancialYear/Add?displayName=${displayName}&endYear=${endYear}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const financialYear = ((await data.json()) as any).value as IFinancialYear;\r\n return financialYear;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/FinancialYear/Add?displayName=${displayName}&endYear=${endYear}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IFinancialYear;\r\n};\r\n\r\nexport default saveFinancialYear;\r\n","import * as Redux from \"redux\";\r\nimport getFinancialYears from \"../api/getFinancialYears\";\r\nimport { removeFinancialYear as deleteFinancialYear } from \"../api/removeFinancialYear\";\r\nimport saveFinancialYear from \"../api/saveFinancialYear\";\r\nimport saveUpdatedFinancialYear from \"../api/saveUpdatedFinancialYear\";\r\nimport IFinancialYear from \"../models/IFinancialYear\";\r\nimport { setFinancialYearsLoaded } from \"./loadingFinancialYears\";\r\n\r\nexport const ADD_FINANCIAL_YEAR = \"ADD_FINANCIAL_YEAR\";\r\nexport const REMOVE_FINANCIAL_YEAR = \"REMOVE_FINANCIAL_YEAR\";\r\nexport const UPDATE_FINANCIAL_YEAR = \"UPDATE_FINANCIAL_YEAR\";\r\nexport const LOAD_FINANCIAL_YEARS = \"LOAD_FINANCIAL_YEARS\";\r\n\r\nexport const addFinancialYear = (financialYear: IFinancialYear) => {\r\n return {\r\n financialYear,\r\n type: ADD_FINANCIAL_YEAR\r\n };\r\n};\r\n\r\nexport const removeFinancialYear = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_FINANCIAL_YEAR\r\n };\r\n};\r\n\r\nexport const updateFinancialYear = (financialYear: IFinancialYear) => {\r\n return {\r\n financialYear,\r\n type: UPDATE_FINANCIAL_YEAR\r\n };\r\n};\r\n\r\nconst loadFinancialYears = (financialYears: IFinancialYear[]) => {\r\n return {\r\n financialYears,\r\n type: LOAD_FINANCIAL_YEARS\r\n };\r\n};\r\n\r\nexport const handleLoadFinancialYears = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const financialYears = await getFinancialYears(accessToken);\r\n if (financialYears !== undefined) {\r\n if (financialYears.length > 0) {\r\n financialYears.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadFinancialYears(financialYears));\r\n }\r\n dispatch(setFinancialYearsLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveFinancialYear = (\r\n accessToken: string,\r\n displayName: string,\r\n endYear: number,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const financialYear = await saveFinancialYear(\r\n accessToken,\r\n displayName,\r\n endYear,\r\n isEnabled\r\n );\r\n if (financialYear !== null && financialYear !== undefined) {\r\n dispatch(addFinancialYear(financialYear));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateFinancialYear = (\r\n accessToken: string,\r\n financialYear: IFinancialYear\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const fy = await saveUpdatedFinancialYear(accessToken, financialYear);\r\n if (fy !== null && fy !== undefined) {\r\n dispatch(updateFinancialYear(financialYear));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteFinancialYear = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteFinancialYear(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removeFinancialYear(id));\r\n }\r\n };\r\n};\r\n","export const SET_FINANCIAL_YEARS_LOADED = \"SET_FINANCIAL_YEARS_LOADED\";\r\n\r\nexport const setFinancialYearsLoaded = (financialYearsLoaded: boolean) => {\r\n return {\r\n financialYearsLoaded,\r\n type: SET_FINANCIAL_YEARS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardHeader,\r\n Form,\r\n Input,\r\n Table\r\n} from \"reactstrap\";\r\nimport {\r\n handleLoadFinancialYears,\r\n handleSaveFinancialYear\r\n} from \"../../../actions/financialYears\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IFinancialYear from \"../../../models/IFinancialYear\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport {\r\n validateFinancialYearDisplayName,\r\n validateFinancialYearEndYear\r\n} from \"../../../utils\";\r\n\r\nexport interface IAddFinancialYearPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n existingFinancialYears: IFinancialYear[];\r\n onHandleLoadFinancialYears: (accessToken: string) => void;\r\n onHandleSaveFinancialYear: (\r\n accessToken: string,\r\n displayName: string,\r\n endYear: number,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddFinancialYearPageState {\r\n displayName: string;\r\n endYear: number;\r\n isEnabled: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nclass AddFinancialYearPage extends React.Component<\r\n IAddFinancialYearPageProps,\r\n IAddFinancialYearPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n displayName: \"\",\r\n endYear: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true,\r\n isReadyToSave: false\r\n };\r\n\r\n constructor(props: IAddFinancialYearPageProps) {\r\n super(props);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public readyToSave = () => {\r\n const { displayName, endYear } = this.state;\r\n\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateFinancialYearDisplayName(displayName)\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n\r\n if (endYear === undefined || endYear === 0 || isNaN(endYear)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public save = (addMore: boolean = false) => {\r\n const { accessToken, onHandleSaveFinancialYear, history } = this.props;\r\n const { displayName, endYear, isEnabled } = this.state;\r\n if (this.readyToSave()) {\r\n onHandleSaveFinancialYear(accessToken, displayName, endYear, isEnabled);\r\n if (!addMore) {\r\n history.push(paths.home);\r\n } else {\r\n this.setState(() => ({\r\n displayName: \"\",\r\n endYear: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true\r\n }));\r\n }\r\n }\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadFinancialYears,\r\n existingFinancialYears\r\n } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingFinancialYears.length === 0) {\r\n onHandleLoadFinancialYears(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { existingFinancialYears } = this.props;\r\n const { displayName, endYear, isEnabled } = this.state;\r\n const { allowDisableFinancialYears } = settings;\r\n return (\r\n
\r\n \r\n Add New Financial Year\r\n \r\n \r\n fy.displayName\r\n )}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ displayName: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n \r\n fy.endYear.toString()\r\n )}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (ey: string) => {\r\n await this.setState(() => ({ endYear: Number(ey) }));\r\n this.readyToSave();\r\n }}\r\n />\r\n {allowDisableFinancialYears && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n this.save()}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save Changes\r\n \r\n this.save(true)}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save And Add Another\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingFinancialYears: state.financialYears\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadFinancialYears: (accessToken: string) => {\r\n dispatch(handleLoadFinancialYears(accessToken));\r\n },\r\n onHandleSaveFinancialYear: (\r\n accessToken: string,\r\n displayName: string,\r\n endYear: number,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(\r\n handleSaveFinancialYear(accessToken, displayName, endYear, isEnabled)\r\n );\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddFinancialYearPage);\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nimport IGroup from \"../models/IGroup\";\r\n\r\nexport const getGroups = async (accessToken: string) => {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Group/GetGroups`,\r\n accessToken\r\n );\r\n const groups = ((await data.json()) as any).value as IGroup[];\r\n if (groups !== undefined) {\r\n return groups;\r\n } else {\r\n return [] as IGroup[];\r\n }\r\n};\r\n\r\nexport default getGroups;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeGroup = async (accessToken: string, id: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/Group/Remove?id=${id}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Group/Remove?id=${id}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeGroup;\r\n","import IGroup from \"../models/IGroup\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveGroup = async (\r\n accessToken: string,\r\n name: string,\r\n isEnabled: boolean\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/Group/Add?name=${name}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const group = ((await data.json()) as any).value as IGroup;\r\n return group;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Group/Add?name=${name}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IGroup;\r\n};\r\n\r\nexport default saveGroup;\r\n","import IGroup from \"../models/IGroup\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedGroup = async (\r\n accessToken: string,\r\n group: IGroup\r\n) => {\r\n const payload = {\r\n id: group.id,\r\n name: group.name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: group.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/Group/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IGroup;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Group/Edit`, err);\r\n }\r\n return {} as IGroup;\r\n};\r\n\r\nexport default saveUpdatedGroup;\r\n","import * as Redux from \"redux\";\r\nimport getGroups from \"../api/getGroups\";\r\nimport { removeGroup as deleteGroup } from \"../api/removeGroup\";\r\nimport saveGroup from \"../api/saveGroup\";\r\nimport saveUpdatedGroup from \"../api/saveUpdatedGroup\";\r\nimport IUserGroup from \"../models/IGroup\";\r\nimport { setGroupsLoaded } from \"./loadingGroups\";\r\nexport const ADD_GROUP = \"ADD_GROUP\";\r\nexport const REMOVE_GROUP = \"REMOVE_GROUP\";\r\nexport const UPDATE_GROUP = \"UPDATE_GROUP\";\r\nexport const LOAD_GROUPS = \"LOAD_GROUPS\";\r\n\r\nexport const addGroup = (group: IUserGroup) => {\r\n return {\r\n group,\r\n type: ADD_GROUP\r\n };\r\n};\r\n\r\nexport const removeGroup = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_GROUP\r\n };\r\n};\r\n\r\nexport const updateGroup = (group: IUserGroup) => {\r\n return {\r\n group,\r\n type: UPDATE_GROUP\r\n };\r\n};\r\n\r\nexport const loadGroups = (groups: IUserGroup[]) => {\r\n return {\r\n groups,\r\n type: LOAD_GROUPS\r\n };\r\n};\r\n\r\nexport const handleSaveGroup = (\r\n accessToken: string,\r\n name: string,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const group = await saveGroup(accessToken, name, isEnabled);\r\n if (group !== null && group !== undefined) {\r\n dispatch(addGroup(group));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateGroup = (accessToken: string, group: IUserGroup) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const grp = await saveUpdatedGroup(accessToken, group);\r\n if (grp !== null && grp !== undefined) {\r\n dispatch(updateGroup(grp));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteGroup = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteGroup(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removeGroup(id));\r\n }\r\n };\r\n};\r\n\r\nexport const handleLoadGroups = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const groups = await getGroups(accessToken);\r\n if (groups !== undefined) {\r\n if (groups.length > 0) {\r\n groups.sort((a, b) =>\r\n a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadGroups(groups));\r\n }\r\n dispatch(setGroupsLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_GROUPS_LOADED = \"SET_GROUPS_LOADED\";\r\n\r\nexport const setGroupsLoaded = (groupsLoaded: boolean) => {\r\n return {\r\n groupsLoaded,\r\n type: SET_GROUPS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardHeader,\r\n Form,\r\n Input,\r\n Table\r\n} from \"reactstrap\";\r\nimport { handleLoadGroups, handleSaveGroup } from \"../../../actions/groups\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IGroup from \"../../../models/IGroup\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateGroupName } from \"../../../utils\";\r\nexport interface IAddGroupPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n existingGroups: IGroup[];\r\n onHandleLoadGroups: (accessToken: string) => void;\r\n onHandleSaveGroup: (\r\n accessToken: string,\r\n name: string,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddGroupPageState {\r\n name: string;\r\n isEnabled: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nexport class AddGroupPage extends React.Component<\r\n IAddGroupPageProps,\r\n IAddGroupPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true,\r\n isReadyToSave: false\r\n };\r\n\r\n constructor(props: IAddGroupPageProps) {\r\n super(props);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public readyToSave = () => {\r\n const { name } = this.state;\r\n\r\n if (name === undefined || name === \"\" || !validateGroupName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public save = (addMore: boolean = false) => {\r\n const { accessToken, onHandleSaveGroup, history } = this.props;\r\n const { name, isEnabled } = this.state;\r\n if (this.readyToSave()) {\r\n onHandleSaveGroup(accessToken, name, isEnabled);\r\n if (!addMore) {\r\n history.push(paths.home);\r\n } else {\r\n this.setState(() => ({\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true\r\n }));\r\n }\r\n }\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n\r\n public async componentDidMount() {\r\n const { accessToken, onHandleLoadGroups, existingGroups } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingGroups.length === 0) {\r\n onHandleLoadGroups(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { existingGroups } = this.props;\r\n const { name, isEnabled } = this.state;\r\n const { allowDisableGroups } = settings;\r\n return (\r\n
\r\n \r\n Add New Group\r\n \r\n \r\n grp.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n {allowDisableGroups && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n this.save()}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save Changes\r\n \r\n this.save(true)}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save And Add Another\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingGroups: state.groups\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadGroups: (accessToken: string) => {\r\n dispatch(handleLoadGroups(accessToken));\r\n },\r\n onHandleSaveGroup: (\r\n accessToken: string,\r\n name: string,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(handleSaveGroup(accessToken, name, isEnabled));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddGroupPage);\r\n","import IKpi from \"../models/IKpi\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getKpis = async (accessToken: string) => {\r\n const data = await fetchSecureData(\"GET\", `/api/Kpi/GetKpis`, accessToken);\r\n const kpis = ((await data.json()) as any).value as IKpi[];\r\n if (kpis !== undefined) {\r\n return kpis;\r\n } else {\r\n return [] as IKpi[];\r\n }\r\n};\r\n\r\nexport default getKpis;","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeKpi = async (accessToken: string, id: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/Kpi/Remove?id=${id}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Kpi/Remove?id=${id}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeKpi;\r\n","import IKpi from \"../models/IKpi\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveKpi = async (\r\n accessToken: string,\r\n displayName: string,\r\n name: string,\r\n isEnabled: boolean\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/Kpi/Add?displayName=${displayName}&name=${name}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const kpi = ((await data.json()) as any).value as IKpi;\r\n return kpi;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Kpi/Add?displayName=${displayName}&name=${name}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IKpi;\r\n};\r\n\r\nexport default saveKpi;\r\n","import IKpi from \"../models/IKpi\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedKpi = async (accessToken: string, kpi: IKpi) => {\r\n const payload = {\r\n id: kpi.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: kpi.displayName,\r\n name: kpi.name,\r\n isEnabled: kpi.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/Kpi/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IKpi;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Kpi/Edit`, err);\r\n }\r\n return {} as IKpi;\r\n};\r\n\r\nexport default saveUpdatedKpi;\r\n","import * as Redux from \"redux\";\r\nimport getKpis from \"../api/getKpis\";\r\nimport { removeKpi as deleteKpi } from \"../api/removeKpi\";\r\nimport saveKpi from \"../api/saveKpi\";\r\nimport saveUpdatedKpi from \"../api/saveUpdatedKpi\";\r\nimport IKpi from \"../models/IKpi\";\r\nimport { setKpisLoaded } from \"./loadingKpis\";\r\nexport const ADD_KPI = \"ADD_KPI\";\r\nexport const REMOVE_KPI = \"REMOVE_KPI\";\r\nexport const UPDATE_KPI = \"UPDATE_KPI\";\r\nexport const LOAD_KPIS = \"LOAD_KPIS\";\r\n\r\nexport const addKpi = (kpi: IKpi) => {\r\n return {\r\n kpi,\r\n type: ADD_KPI\r\n };\r\n};\r\n\r\nexport const removeKpi = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_KPI\r\n };\r\n};\r\n\r\nexport const updateKpi = (kpi: IKpi) => {\r\n return {\r\n kpi,\r\n type: UPDATE_KPI\r\n };\r\n};\r\n\r\nexport const loadKpis = (kpis: IKpi[]) => {\r\n return {\r\n kpis,\r\n type: LOAD_KPIS\r\n };\r\n};\r\n\r\nexport const handleSaveKpi = (\r\n accessToken: string,\r\n displayName: string,\r\n name: string,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const kpi = await saveKpi(accessToken, displayName, name, isEnabled);\r\n if (kpi !== null && kpi !== undefined) {\r\n dispatch(addKpi(kpi));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateKpi = (accessToken: string, kpi: IKpi) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const k = await saveUpdatedKpi(accessToken, kpi);\r\n if (k !== null && k !== undefined) {\r\n dispatch(updateKpi(k));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteKpi = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteKpi(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removeKpi(id));\r\n }\r\n };\r\n};\r\n\r\nexport const handleLoadKpis = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const kpis = await getKpis(accessToken);\r\n if (kpis !== undefined) {\r\n if (kpis.length > 0) {\r\n kpis.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadKpis(kpis));\r\n }\r\n dispatch(setKpisLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_KPIS_LOADED = \"SET_KPIS_LOADED\";\r\n\r\nexport const setKpisLoaded = (kpisLoaded: boolean) => {\r\n return {\r\n kpisLoaded,\r\n type: SET_KPIS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Card, CardBody, CardFooter, CardHeader, Form, Input, Table } from \"reactstrap\";\r\nimport { handleLoadKpis, handleSaveKpi } from \"../../../actions/kpis\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IKpi from \"../../../models/IKpi\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateKpiDisplayName, validateKpiName } from \"../../../utils\";\r\nexport interface IAddKpiPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n existingKpis: IKpi[];\r\n onHandleLoadKpis: (accessToken: string) => void;\r\n onHandleSaveKpi: (\r\n accessToken: string,\r\n displayName: string,\r\n name: string,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddKpiPageState {\r\n displayName: string;\r\n name: string;\r\n isEnabled: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nexport class AddKpiPage extends React.Component<\r\n IAddKpiPageProps,\r\n IAddKpiPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n displayName: \"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true,\r\n isReadyToSave: false\r\n };\r\n\r\n constructor(props: IAddKpiPageProps) {\r\n super(props);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public readyToSave = () => {\r\n const { displayName, name } = this.state;\r\n\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateKpiDisplayName(displayName) ||\r\n name === undefined ||\r\n name === \"\" ||\r\n !validateKpiName(name)\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public save = (addMore: boolean = false) => {\r\n const { accessToken, onHandleSaveKpi, history } = this.props;\r\n const { displayName, name, isEnabled } = this.state;\r\n if (this.readyToSave()) {\r\n onHandleSaveKpi(accessToken, displayName, name, isEnabled);\r\n if (!addMore) {\r\n history.push(paths.home);\r\n } else {\r\n this.setState(() => ({\r\n displayName: \"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true\r\n }));\r\n }\r\n }\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n\r\n public async componentDidMount() {\r\n const { accessToken, onHandleLoadKpis, existingKpis } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingKpis.length === 0) {\r\n onHandleLoadKpis(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { existingKpis } = this.props;\r\n const { displayName, name, isEnabled } = this.state;\r\n const { allowDisableKpis } = settings;\r\n return (\r\n
\r\n \r\n Add New KPI\r\n \r\n \r\n kpi.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n kpi.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n {allowDisableKpis && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n this.save()}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save Changes\r\n \r\n this.save(true)}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save And Add Another\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingKpis: state.kpis\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadKpis: (accessToken: string) => {\r\n dispatch(handleLoadKpis(accessToken));\r\n },\r\n onHandleSaveKpi: (\r\n accessToken: string,\r\n displayName: string,\r\n name: string,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(handleSaveKpi(accessToken, displayName, name, isEnabled));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddKpiPage);\r\n","import IPredicate from \"../models/IPredicate\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getPredicates = async (accessToken: string) => {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Predicate/GetPredicates`,\r\n accessToken\r\n );\r\n const predicates = ((await data.json()) as any).value as IPredicate[];\r\n if (predicates !== undefined) {\r\n return predicates;\r\n } else {\r\n return [] as IPredicate[];\r\n }\r\n};\r\n\r\nexport default getPredicates;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removePredicate = async (accessToken: string, id: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/Predicate/Remove?id=${id}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Predicate/Remove?id=${id}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removePredicate;\r\n","import IPredicate from \"../models/IPredicate\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const savePredicate = async (\r\n accessToken: string,\r\n displayName: string,\r\n name: string,\r\n isKpiGrouping: boolean,\r\n isEnabled: boolean\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/Predicate/Add?displayName=${displayName}&name=${name}&isKpiGrouping=${isKpiGrouping}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const predicate = ((await data.json()) as any).value as IPredicate;\r\n return predicate;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Predicate/Add?displayName=${displayName}&name=${name}&isKpiGrouping=${isKpiGrouping}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IPredicate;\r\n};\r\n\r\nexport default savePredicate;\r\n","import IPredicate from \"../models/IPredicate\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedPredicate = async (\r\n accessToken: string,\r\n predicate: IPredicate\r\n) => {\r\n const payload = {\r\n id: predicate.id,\r\n displayName: predicate.displayName,\r\n name: predicate.name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isKpiGrouping: predicate.isKpiGrouping,\r\n isEnabled: predicate.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/Predicate/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IPredicate;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Predicate/Edit`, err);\r\n }\r\n return {} as IPredicate;\r\n};\r\n\r\nexport default saveUpdatedPredicate;\r\n","import * as Redux from \"redux\";\r\nimport getPredicates from \"../api/getPredicates\";\r\nimport { removePredicate as deletePredicate } from \"../api/removePredicate\";\r\nimport savePredicate from \"../api/savePredicate\";\r\nimport saveUpdatedPredicate from \"../api/saveUpdatedPredicate\";\r\nimport IPredicate from \"../models/IPredicate\";\r\nimport { setPredicatesLoaded } from \"./loadingPredicates\";\r\n\r\nexport const ADD_PREDICATE = \"ADD_PREDICATE\";\r\nexport const REMOVE_PREDICATE = \"REMOVE_PREDICATE\";\r\nexport const UPDATE_PREDICATE = \"UPDATE_PREDICATE\";\r\nexport const LOAD_PREDICATES = \"LOAD_PREDICATES\";\r\n\r\nexport const addPredicate = (predicate: IPredicate) => {\r\n return {\r\n predicate,\r\n type: ADD_PREDICATE\r\n };\r\n};\r\n\r\nexport const removePredicate = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_PREDICATE\r\n };\r\n};\r\n\r\nexport const updatePredicate = (predicate: IPredicate) => {\r\n return {\r\n predicate,\r\n type: UPDATE_PREDICATE\r\n };\r\n};\r\n\r\nexport const loadPredicates = (predicates: IPredicate[]) => {\r\n return {\r\n predicates,\r\n type: LOAD_PREDICATES\r\n };\r\n};\r\n\r\nexport const handleLoadPredicates = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const predicates = await getPredicates(accessToken);\r\n if (predicates !== undefined) {\r\n if (predicates.length > 0) {\r\n predicates.sort((a, b) =>\r\n a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadPredicates(predicates));\r\n }\r\n dispatch(setPredicatesLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSavePredicate = (\r\n accessToken: string,\r\n displayName:string,\r\n name: string,\r\n isKpiGrouping: boolean,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const predicate = await savePredicate(\r\n accessToken,\r\n displayName,\r\n name,\r\n isKpiGrouping,\r\n isEnabled\r\n );\r\n if (predicate !== null && predicate !== undefined) {\r\n dispatch(addPredicate(predicate));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdatePredicate = (\r\n accessToken: string,\r\n predicate: IPredicate\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const pred = await saveUpdatedPredicate(accessToken, predicate);\r\n if (pred !== null && pred !== undefined) {\r\n dispatch(updatePredicate(pred));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeletePredicate = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deletePredicate(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removePredicate(id));\r\n }\r\n };\r\n};\r\n","export const SET_PREDICATES_LOADED = \"SET_PREDICATES_LOADED\";\r\n\r\nexport const setPredicatesLoaded = (predicatesLoaded: boolean) => {\r\n return {\r\n predicatesLoaded,\r\n type: SET_PREDICATES_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardHeader,\r\n Form,\r\n Input,\r\n Table\r\n} from \"reactstrap\";\r\nimport {\r\n handleLoadPredicates,\r\n handleSavePredicate\r\n} from \"../../../actions/predicates\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IPredicate from \"../../../models/IPredicate\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateGroupName, validatePredicateName, validatePredicateDisplayName } from \"../../../utils\";\r\nexport interface IAddGroupPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n existingPredicates: IPredicate[];\r\n onHandleLoadPredicates: (accessToken: string) => void;\r\n onHandleSavePredicate: (\r\n accessToken: string,\r\n displayName:string,\r\n name: string,\r\n isKpiGrouping: boolean,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddGroupPageState {\r\n displayName:string;\r\n name: string;\r\n isKpiGrouping: boolean;\r\n isEnabled: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nexport class AddGroupPage extends React.Component<\r\n IAddGroupPageProps,\r\n IAddGroupPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n displayName:\"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true,\r\n isKpiGrouping: false,\r\n isReadyToSave: false\r\n };\r\n\r\n constructor(props: IAddGroupPageProps) {\r\n super(props);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n this.isKpiGroupingChange = this.isKpiGroupingChange.bind(this);\r\n }\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public isKpiGroupingChange = (e: React.ChangeEvent) => {\r\n const isKpiGrouping = e.target.checked;\r\n this.setState(() => ({ isKpiGrouping }));\r\n };\r\n public readyToSave = () => {\r\n const { name } = this.state;\r\n\r\n if (name === undefined || name === \"\" || !validateGroupName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public save = (addMore: boolean = false) => {\r\n const { accessToken, onHandleSavePredicate, history } = this.props;\r\n const { displayName, name, isKpiGrouping, isEnabled } = this.state;\r\n if (this.readyToSave()) {\r\n onHandleSavePredicate(accessToken, displayName, name, isKpiGrouping, isEnabled);\r\n if (!addMore) {\r\n history.push(paths.home);\r\n } else {\r\n this.setState(() => ({\r\n displayName:\"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isKpiGrouping: false,\r\n isEnabled: true\r\n }));\r\n }\r\n }\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadPredicates,\r\n existingPredicates\r\n } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingPredicates.length === 0) {\r\n onHandleLoadPredicates(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { existingPredicates } = this.props;\r\n const { displayName, name, isKpiGrouping, isEnabled } = this.state;\r\n const { allowDisablePredicates } = settings;\r\n return (\r\n
\r\n \r\n Add New Predicate\r\n \r\n \r\n pred.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n pred.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n
Is KPI Grouping\r\n \r\n {isKpiGrouping}\r\n
\r\n {allowDisablePredicates && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n this.save()}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save Changes\r\n \r\n this.save(true)}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save And Add Another\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingPredicates: state.predicates\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadPredicates: (accessToken: string) => {\r\n dispatch(handleLoadPredicates(accessToken));\r\n },\r\n onHandleSavePredicate: (\r\n accessToken: string,\r\n displayName: string,\r\n name: string,\r\n isKpiGrouping: boolean,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(handleSavePredicate(accessToken, displayName, name, isKpiGrouping, isEnabled));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddGroupPage);\r\n","import ISqlReport from \"../models/ISqlReport\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getReports = async (accessToken: string) => {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/SqlReport/GetSqlReports`,\r\n accessToken\r\n );\r\n const reports = ((await data.json()) as any).value as ISqlReport[];\r\n if (reports !== undefined) {\r\n return reports;\r\n } else {\r\n return [] as ISqlReport[];\r\n }\r\n};\r\n\r\nexport default getReports;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeReport = async (accessToken: string, id: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/SqlReport/Remove?id=${id}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/SqlReport/Remove?id=${id}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeReport;\r\n","import { settings } from \"../constants\";\r\nimport ISqlReport from \"../models/ISqlReport\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveReport = async (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n defaultZoomMode: string,\r\n defaultZoomPercent: number,\r\n parameters: string,\r\n path: string,\r\n sqlReportingServerUrl: string,\r\n sqlReportingViewerUrl: string,\r\n isEnabled: boolean\r\n) => {\r\n const {\r\n allowAlternateSqlReportingServerUrl,\r\n allowAlternateSqlReportingViewerUrl\r\n } = settings;\r\n\r\n let data;\r\n try {\r\n if (\r\n allowAlternateSqlReportingServerUrl &&\r\n allowAlternateSqlReportingViewerUrl\r\n ) {\r\n data = await fetchSecureData(\r\n \"POST\",\r\n `/api/SqlReport/Add?name=${name}&displayName=${displayName}&defaultZoomMode=${defaultZoomMode}&defaultZoomPercent=${defaultZoomPercent}¶meters=${parameters}&path=${path}&sqlReportingServerUrl=${sqlReportingServerUrl}&sqlReportingViewerUrl=${sqlReportingViewerUrl}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n } else {\r\n data = await fetchSecureData(\r\n \"POST\",\r\n `/api/SqlReport/Add?name=${name}&displayName=${displayName}&defaultZoomMode=${defaultZoomMode}&defaultZoomPercent=${defaultZoomPercent}¶meters=${parameters}&path=${path}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n }\r\n const report = ((await data.json()) as any).value as ISqlReport;\r\n return report;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/SqlReport/Add?name=${name}&displayName=${displayName}&defaultZoomMode=${defaultZoomMode}&defaultZoomPercent=${defaultZoomPercent}¶meters=${parameters}&path=${path}&sqlReportingServerUrl=${sqlReportingServerUrl}&sqlReportingViewerUrl=${sqlReportingViewerUrl}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as ISqlReport;\r\n};\r\n\r\nexport default saveReport;\r\n","import ISqlReport from \"../models/ISqlReport\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedReport = async (\r\n accessToken: string,\r\n report: ISqlReport\r\n) => {\r\n const payload = {\r\n id: report.id,\r\n name: report.name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: report.displayName,\r\n defaultZoomMode: report.defaultZoomMode,\r\n defaultZoomPercent: report.defaultZoomPercent,\r\n parameters: report.parameters,\r\n path: report.path,\r\n sqlReportingServerUrl: report.sqlReportingServerUrl,\r\n sqlReportingViewerUrl: report.sqlReportingViewerUrl,\r\n isEnabled: report.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/SqlReport/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as ISqlReport;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/SqlReport/Edit`, err);\r\n }\r\n return {} as ISqlReport;\r\n};\r\n\r\nexport default saveUpdatedReport;\r\n","import * as Redux from \"redux\";\r\nimport getReports from \"../api/getReports\";\r\nimport { removeReport as deleteReport } from \"../api/removeReport\";\r\nimport saveReport from \"../api/saveReport\";\r\nimport saveUpdatedReport from \"../api/saveUpdatedReport\";\r\nimport ISqlReport from \"../models/ISqlReport\";\r\nimport { setReportsLoaded } from \"./loadingReports\";\r\nexport const ADD_REPORT = \"ADD_REPORT\";\r\nexport const REMOVE_REPORT = \"REMOVE_REPORT\";\r\nexport const UPDATE_REPORT = \"UPDATE_REPORT\";\r\nexport const LOAD_REPORTS = \"LOAD_REPORTS\";\r\n\r\nexport const addReport = (report: ISqlReport) => {\r\n return {\r\n report,\r\n type: ADD_REPORT\r\n };\r\n};\r\n\r\nexport const removeReport = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_REPORT\r\n };\r\n};\r\n\r\nexport const updateReport = (report: ISqlReport) => {\r\n return {\r\n report,\r\n type: UPDATE_REPORT\r\n };\r\n};\r\n\r\nexport const loadReports = (reports: ISqlReport[]) => {\r\n return {\r\n reports,\r\n type: LOAD_REPORTS\r\n };\r\n};\r\n\r\nexport const handleSaveReport = (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n defaultZoomMode: string,\r\n defaultZoomPercent: number,\r\n parameters: string,\r\n path: string,\r\n sqlReportingServerUrl: string,\r\n sqlReportingViewerUrl: string,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const report = await saveReport(\r\n accessToken,\r\n name,\r\n displayName,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n parameters,\r\n path,\r\n sqlReportingServerUrl,\r\n sqlReportingViewerUrl,\r\n isEnabled\r\n );\r\n if (report !== null && report !== undefined) {\r\n dispatch(addReport(report));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateReport = (accessToken: string, report: ISqlReport) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const dsh = await saveUpdatedReport(accessToken, report);\r\n if (dsh !== null && dsh !== undefined) {\r\n dispatch(updateReport(report));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteReport = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteReport(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removeReport(id));\r\n }\r\n };\r\n};\r\n\r\nexport const handleLoadReports = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const reports = await getReports(accessToken);\r\n if (reports !== undefined) {\r\n if (reports.length > 0) {\r\n reports.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadReports(reports));\r\n }\r\n dispatch(setReportsLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_REPORTS_LOADED = \"SET_REPORTS_LOADED\";\r\n\r\nexport const setReportsLoaded = (reportsLoaded: boolean) => {\r\n return {\r\n reportsLoaded,\r\n type: SET_REPORTS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardHeader,\r\n Form,\r\n FormGroup,\r\n Input,\r\n Label,\r\n Table\r\n} from \"reactstrap\";\r\nimport { handleLoadReports, handleSaveReport } from \"../../../actions/reports\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport { paths, settings, zoomModes } from \"../../../constants\";\r\nimport ISqlReport from \"../../../models/ISqlReport\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport {\r\n validateParametersText,\r\n validatePathText,\r\n validateReportDisplayName,\r\n validateReportName,\r\n validateZoomPercent\r\n} from \"../../../utils\";\r\nexport interface IAddReportPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n existingReports: ISqlReport[];\r\n onHandleLoadReports: (accessToken: string) => void;\r\n onHandleSaveReport: (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n path: string,\r\n parameters: string,\r\n defaultZoomMode: string,\r\n defaultZoomPercent: number,\r\n sqlReportingServerUrl: string,\r\n sqlReportingViewerUrl: string,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddReportPageState {\r\n displayName: string;\r\n name: string;\r\n path: string;\r\n parameters: string;\r\n defaultZoomMode: string;\r\n defaultZoomPercent: number;\r\n sqlReportingServerUrl: string;\r\n sqlReportingViewerUrl: string;\r\n isEnabled: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nexport class AddReportPage extends React.Component<\r\n IAddReportPageProps,\r\n IAddReportPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n displayName: \"\",\r\n name: \"\",\r\n path: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n parameters: \"\",\r\n defaultZoomMode: \"Whole Page\",\r\n defaultZoomPercent: 100,\r\n sqlReportingServerUrl: \"\",\r\n sqlReportingViewerUrl: \"\",\r\n isEnabled: true,\r\n isReadyToSave: false\r\n };\r\n\r\n constructor(props: IAddReportPageProps) {\r\n super(props);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n this.defaultZoomModeChange = this.defaultZoomModeChange.bind(this);\r\n }\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public readyToSave = () => {\r\n const {\r\n displayName,\r\n name,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent\r\n } = this.state;\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateReportDisplayName(displayName)\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (name === undefined || name === \"\" || !validateReportName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (path === undefined || path === \"\" || !validatePathText(path)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (parameters === undefined || !validateParametersText(parameters)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (\r\n defaultZoomMode === \"Percent\" &&\r\n (defaultZoomPercent === undefined ||\r\n !validateZoomPercent(defaultZoomPercent.toString()))\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public save = (addMore: boolean = false) => {\r\n const { accessToken, onHandleSaveReport, history } = this.props;\r\n const {\r\n name,\r\n displayName,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n sqlReportingServerUrl,\r\n sqlReportingViewerUrl,\r\n isEnabled\r\n } = this.state;\r\n if (this.readyToSave()) {\r\n onHandleSaveReport(\r\n accessToken,\r\n name,\r\n displayName,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n sqlReportingServerUrl,\r\n sqlReportingViewerUrl,\r\n isEnabled\r\n );\r\n if (!addMore) {\r\n history.push(paths.home);\r\n } else {\r\n this.setState(() => ({\r\n displayName: \"\",\r\n name: \"\",\r\n path: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n parameters: \"\",\r\n defaultZoomMode: \"Whole Page\",\r\n defaultZoomPercent: 100,\r\n sqlReportingServerUrl: \"\",\r\n sqlReportingViewerUrl: \"\",\r\n isEnabled: true,\r\n isReadyToSave: false\r\n }));\r\n }\r\n }\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public defaultZoomModeChange = (e: React.ChangeEvent) => {\r\n e.preventDefault();\r\n this.setState(() => ({ isReadyToSave: true }));\r\n const defaultZoomMode =\r\n e.target.value === undefined ? \"\" : (e.target.value as string);\r\n switch (defaultZoomMode) {\r\n case \"Whole Page\":\r\n this.setState(() => ({ defaultZoomMode, defaultZoomPercent: 100 }));\r\n break;\r\n case \"Page Width\":\r\n this.setState(() => ({ defaultZoomMode, defaultZoomPercent: 100 }));\r\n break;\r\n case \"Percent\":\r\n this.setState(() => ({ defaultZoomMode, defaultZoomPercent: 100 }));\r\n break;\r\n case \"500%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 500\r\n }));\r\n break;\r\n case \"200%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 200\r\n }));\r\n break;\r\n case \"150%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 150\r\n }));\r\n break;\r\n case \"100%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 100\r\n }));\r\n break;\r\n case \"75%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 75\r\n }));\r\n break;\r\n case \"50%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 50\r\n }));\r\n break;\r\n case \"25%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 25\r\n }));\r\n break;\r\n case \"10%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 10\r\n }));\r\n break;\r\n default:\r\n this.setState(() => ({ defaultZoomMode }));\r\n break;\r\n }\r\n };\r\n\r\n public async componentDidMount() {\r\n const { accessToken, onHandleLoadReports, existingReports } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingReports.length === 0) {\r\n onHandleLoadReports(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { existingReports } = this.props;\r\n const {\r\n displayName,\r\n name,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n isEnabled,\r\n isReadyToSave\r\n } = this.state;\r\n const { allowDisableReports } = settings;\r\n return (\r\n
\r\n \r\n Add New Dashboard Details\r\n \r\n \r\n d.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n d.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.path)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (p: string) => {\r\n await this.setState(() => ({ path: p }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.parameters)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (params: string) => {\r\n await this.setState(() => ({ parameters: params }));\r\n this.readyToSave();\r\n }}\r\n />\r\n \r\n \r\n \r\n {zoomModes.map(zm => (\r\n \r\n ))}\r\n \r\n \r\n {defaultZoomMode === \"Percent\" && (\r\n d.path)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (zpct: string) => {\r\n await this.setState(() => ({\r\n defaultZoomPercent: Number(zpct)\r\n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n )}\r\n {allowDisableReports && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n {isReadyToSave && (\r\n \r\n this.save()}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save Changes\r\n \r\n this.save(true)}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save And Add Another\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingReports: state.reports\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadReports: (accessToken: string) => {\r\n dispatch(handleLoadReports(accessToken));\r\n },\r\n onHandleSaveReport: (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n path: string,\r\n parameters: string,\r\n defaultZoomMode: string,\r\n defaultZoomPercent: number,\r\n sqlReportingServerUrl: string,\r\n sqlReportingViewerUrl: string,\r\n isEnabled: boolean\r\n ) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"parameters is:[\",parameters,\"]\")\r\n dispatch(\r\n handleSaveReport(\r\n accessToken,\r\n name,\r\n displayName,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n parameters,\r\n path,\r\n sqlReportingServerUrl,\r\n sqlReportingViewerUrl,\r\n isEnabled\r\n )\r\n );\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddReportPage);\r\n","import IUserProfile from \"../models/IUserProfile\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getUserProfiles = async (accessToken: string) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/UserProfile/GetUserProfiles`,\r\n accessToken\r\n );\r\n const userProfiles = ((await data.json()) as any).value as IUserProfile[];\r\n if (userProfiles !== undefined) {\r\n return userProfiles;\r\n } else {\r\n return [] as IUserProfile[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/UserProfile/GetUserProfiles`, err);\r\n }\r\n return [] as IUserProfile[];\r\n};\r\n\r\nexport default getUserProfiles;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeUserProfile = async (accessToken: string, id: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/UserProfile/Remove?id=${id}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/UserProfile/Remove?id=${id}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeUserProfile;\r\n","import IUserProfile from \"../models/IUserProfile\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedUserProfile = async (\r\n accessToken: string,\r\n userProfile: IUserProfile\r\n) => {\r\n const payload = {\r\n id: userProfile.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n emailAddress: userProfile.emailAddress,\r\n isEnabled: userProfile.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/UserProfile/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IUserProfile;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/UserProfile/Edit`, err);\r\n }\r\n return {} as IUserProfile;\r\n};\r\n\r\nexport default saveUpdatedUserProfile;\r\n","import IUserProfile from \"../models/IUserProfile\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUserProfile = async (\r\n accessToken: string,\r\n emailAddress: string,\r\n isEnabled: boolean\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/UserProfile/Add?emailAddress=${emailAddress}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const userProfile = ((await data.json()) as any).value as IUserProfile;\r\n return userProfile;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/UserProfile/Add?emailAddress=${emailAddress}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IUserProfile;\r\n};\r\n\r\nexport default saveUserProfile;\r\n","import IUserProfile from \"../models/IUserProfile\";\r\n\r\nexport const SET_EDIT_USER_DETAILS = \"SET_EDIT_USER_DETAILS\";\r\nexport const CLEAR_EDIT_USER_DETAILS = \"CLEAR_EDIT_USER_DETAILS\";\r\n\r\nexport const setEditUserDetails = (user: IUserProfile) => {\r\n return {\r\n user,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: SET_EDIT_USER_DETAILS\r\n };\r\n};\r\n\r\nexport const clearEditUserDetails = () => {\r\n return {\r\n type: CLEAR_EDIT_USER_DETAILS\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getUserProfiles from \"../api/getUserProfiles\";\r\nimport { removeUserProfile as deleteUserProfile } from \"../api/removeUserProfile\";\r\nimport saveUpdatedUserProfile from \"../api/saveUpdatedUserProfile\";\r\nimport saveUserProfile from \"../api/saveUserProfile\";\r\nimport IUserProfile from \"../models/IUserProfile\";\r\nimport { setEditUserDetails } from \"./editUserDetails\";\r\nimport { setUsersLoaded } from \"./loadingUsers\";\r\nexport const ADD_USER_PROFILE = \"ADD_USER_PROFILE\";\r\nexport const REMOVE_USER_PROFILE = \"REMOVE_USER_PROFILE\";\r\nexport const UPDATE_USER_PROFILE = \"UPDATE_USER_PROFILE\";\r\nexport const LOAD_USER_PROFILES = \"LOAD_USER_PROFILES\";\r\n\r\nexport const addUserProfile = (userProfile: IUserProfile) => {\r\n return {\r\n type: ADD_USER_PROFILE,\r\n userProfile\r\n };\r\n};\r\n\r\nexport const removeUserProfile = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_USER_PROFILE\r\n };\r\n};\r\n\r\nexport const updateUserProfile = (userProfile: IUserProfile) => {\r\n return {\r\n type: UPDATE_USER_PROFILE,\r\n userProfile\r\n };\r\n};\r\n\r\nexport const loadUserProfiles = (userProfiles: IUserProfile[]) => {\r\n return {\r\n type: LOAD_USER_PROFILES,\r\n userProfiles\r\n };\r\n};\r\n\r\nexport const handleSaveUserProfile = (\r\n accessToken: string,\r\n emailAddress: string,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const userProfile = await saveUserProfile(\r\n accessToken,\r\n emailAddress,\r\n isEnabled\r\n );\r\n if (userProfile !== null && userProfile !== undefined) {\r\n dispatch(addUserProfile(userProfile));\r\n dispatch(setEditUserDetails(userProfile));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateUserProfile = (\r\n accessToken: string,\r\n userProfile: IUserProfile\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const usr = await saveUpdatedUserProfile(accessToken, userProfile);\r\n if (usr !== null && usr !== undefined) {\r\n dispatch(updateUserProfile(usr));\r\n dispatch(setEditUserDetails(usr));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteUserProfile = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteUserProfile(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removeUserProfile(id));\r\n }\r\n };\r\n};\r\n\r\nexport const handleLoadUserProfiles = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const userProfiles = await getUserProfiles(accessToken);\r\n if (userProfiles !== undefined) {\r\n if (userProfiles.length > 0) {\r\n userProfiles.sort((a, b) =>\r\n a.emailAddress.toLowerCase() > b.emailAddress.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadUserProfiles(userProfiles));\r\n }\r\n dispatch(setUsersLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_USERS_LOADED = \"SET_USERS_LOADED\";\r\n\r\nexport const setUsersLoaded = (usersLoaded: boolean) => {\r\n return {\r\n usersLoaded,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: SET_USERS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Alert,\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardTitle,\r\n Form,\r\n Input,\r\n Table\r\n} from \"reactstrap\";\r\nimport { handleSaveUserProfile } from \"../../../actions/profiles\";\r\nimport paths, { settings } from \"../../../constants\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateEmail } from \"../../../utils\";\r\n\r\nexport interface IAddUserPageState {\r\n email: string;\r\n isEnabled: boolean;\r\n emailAlertVisible: boolean;\r\n}\r\n\r\nexport interface IAddUserPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n onHandleSaveUser: (\r\n accessToken: string,\r\n email: string,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\n\r\nexport class AddUserPage extends React.Component<\r\n IAddUserPageProps,\r\n IAddUserPageState\r\n> {\r\n public state = {\r\n email: \"\",\r\n isEnabled: true,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n emailAlertVisible: false\r\n };\r\n\r\n constructor(props: IAddUserPageProps) {\r\n super(props);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.emailChange = this.emailChange.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n this.onDismissEmailAlert = this.onDismissEmailAlert.bind(this);\r\n this.emailFocus = this.emailFocus.bind(this);\r\n this.emailIsValid = this.emailIsValid.bind(this);\r\n this.checkAllInputValid = this.checkAllInputValid.bind(this);\r\n }\r\n\r\n public emailChange = (e: React.ChangeEvent) => {\r\n e.preventDefault();\r\n const email =\r\n e.target.value === undefined ? \"\" : (e.target.value as string);\r\n this.setState(() => ({ email }));\r\n };\r\n public emailFocus = () => {\r\n this.setState({ emailAlertVisible: false });\r\n };\r\n public emailIsValid = () => {\r\n const { email } = this.state;\r\n if (email === \"\" || email === undefined || !validateEmail(email)) {\r\n this.setState(() => ({ emailAlertVisible: true }));\r\n return false;\r\n }\r\n return true;\r\n };\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public save = (addMore: boolean = false) => {\r\n const { accessToken, onHandleSaveUser, history } = this.props;\r\n const { email, isEnabled } = this.state;\r\n if (this.checkAllInputValid()) {\r\n onHandleSaveUser(accessToken, email, isEnabled);\r\n if (!addMore) {\r\n history.push(paths.home);\r\n } else {\r\n this.setState(() => ({\r\n email: \"\",\r\n isEnabled: true,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n emailAlertVisible: false\r\n }));\r\n }\r\n }\r\n };\r\n public cancel(e: React.MouseEvent) {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n }\r\n public checkAllInputValid() {\r\n let isValid = true;\r\n if (!this.emailIsValid()) {\r\n isValid = false;\r\n }\r\n return isValid;\r\n }\r\n public onDismissEmailAlert() {\r\n this.setState(() => ({ emailAlertVisible: false }));\r\n }\r\n public render() {\r\n const { email, isEnabled } = this.state;\r\n const { allowDisableUsers } = settings;\r\n return (\r\n
\r\n \r\n Email not valid\r\n \r\n \r\n Add New User Details\r\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 {allowDisableUsers && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
FieldValue
Email Address\r\n {\" \"}\r\n ) => {\r\n await this.setState(() => ({ email: email.trim() }));\r\n this.emailIsValid();\r\n }\r\n }\r\n />\r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n
\r\n \r\n \r\n this.save()}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save Changes\r\n \r\n this.save(true)}\r\n style={{ margin: 4, padding: 4 }}\r\n >\r\n Save And Add Another\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleSaveUser: (\r\n accessToken: string,\r\n emailAddress: string,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(handleSaveUserProfile(accessToken, emailAddress, isEnabled));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddUserPage);\r\n","import * as React from \"react\";\r\nimport { Input, Table } from \"reactstrap\";\r\nimport { settings } from \"../../constants\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\n\r\nexport interface IDashboardDetailsTableProps {\r\n dashboard: IPbiDashboard;\r\n}\r\n\r\nconst DashboardDetailsTable: React.SFC = (\r\n props: IDashboardDetailsTableProps\r\n) => {\r\n const { dashboard } = props;\r\n const {\r\n displayName,\r\n name,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n } = dashboard;\r\n const { allowDisableDashboards } = settings;\r\n return (\r\n \r\n {/* \r\n \r\n \r\n \r\n \r\n */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {allowDisableDashboards && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
FieldValue
Display Name {displayName}
Name {name}
Group ID {groupId}
Report Id {reportId}
Dashboard Viewer Version Number {dashboardViewerVersion}
Enabled\r\n \r\n {isEnabled}\r\n
\r\n );\r\n};\r\n\r\nexport default DashboardDetailsTable;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardTitle,\r\n Form,\r\n Input,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n Table\r\n} from \"reactstrap\";\r\nimport {\r\n handleDeleteDashboard,\r\n handleLoadDashboards,\r\n handleUpdateDashboard\r\n} from \"../../../actions/dashboards\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport DashboardDetailsTable from \"../../../components/molecules/DashboardDetailsTable\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IPbiDashboard from \"../../../models/IPbiDashboard\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport {\r\n validateDashboardDisplayName,\r\n validateDashboardName,\r\n validateGuid,\r\n validateNumber\r\n} from \"../../../utils\";\r\nexport interface IDashboardPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n dashboard: IPbiDashboard;\r\n existingDashboards: IPbiDashboard[];\r\n onHandleLoadDashboards: (accessToken: string) => void;\r\n onHandleUpdateDashboard: (\r\n accessToken: string,\r\n dashboard: IPbiDashboard\r\n ) => void;\r\n onHandleDeleteDashboard: (accessToken: string, id: number) => void;\r\n}\r\nexport interface IDashboardPageState {\r\n editModeOn: boolean;\r\n displayName: string;\r\n name: string;\r\n groupId: string;\r\n reportId: string;\r\n dashboardViewerVersion: number;\r\n isEnabled: boolean;\r\n showDeleteModal: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nclass EditDashboardPage extends React.Component<\r\n IDashboardPageProps,\r\n IDashboardPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n editModeOn: false,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n name: \"\",\r\n groupId: \"\",\r\n reportId: \"\",\r\n dashboardViewerVersion: 0,\r\n isEnabled: true,\r\n showDeleteModal: false,\r\n isReadyToSave: false\r\n };\r\n constructor(props: IDashboardPageProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n this.toggleDeleteModal = this.toggleDeleteModal.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n const {\r\n accessToken,\r\n onHandleUpdateDashboard,\r\n history,\r\n dashboard\r\n } = this.props;\r\n const {\r\n name,\r\n displayName,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled,\r\n isReadyToSave\r\n } = this.state;\r\n const updatedDashboard = {\r\n id: dashboard.id,\r\n name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n } as IPbiDashboard;\r\n if (this.readyToSave() && isReadyToSave) {\r\n onHandleUpdateDashboard(accessToken, updatedDashboard);\r\n history.push(paths.home);\r\n }\r\n };\r\n public delete = (e: React.MouseEvent) => {\r\n const {\r\n accessToken,\r\n dashboard,\r\n history,\r\n onHandleDeleteDashboard\r\n } = this.props;\r\n onHandleDeleteDashboard(accessToken, dashboard.id);\r\n history.push(paths.home);\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public toggleEdit() {\r\n this.setState({ editModeOn: !this.state.editModeOn });\r\n }\r\n public toggleDeleteModal() {\r\n this.setState({ showDeleteModal: !this.state.showDeleteModal });\r\n }\r\n public readyToSave = () => {\r\n const {\r\n displayName,\r\n name,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion\r\n } = this.state;\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateDashboardDisplayName(displayName)\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (name === undefined || name === \"\" || !validateDashboardName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (groupId === undefined || groupId === \"\" || !validateGuid(groupId)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (reportId === undefined || reportId === \"\" || !validateGuid(reportId)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n\r\n if (\r\n dashboardViewerVersion === undefined ||\r\n dashboardViewerVersion < 1 \r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n }\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadDashboards,\r\n existingDashboards,\r\n dashboard\r\n } = this.props;\r\n const {\r\n displayName,\r\n name,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n } = dashboard;\r\n this.setState(() => ({\r\n displayName,\r\n name,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled\r\n }));\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingDashboards.length === 0) {\r\n onHandleLoadDashboards(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { dashboard, existingDashboards } = this.props;\r\n const {\r\n editModeOn,\r\n displayName,\r\n name,\r\n groupId,\r\n reportId,\r\n dashboardViewerVersion,\r\n isEnabled,\r\n isReadyToSave\r\n } = this.state;\r\n const { allowDisableDashboards } = settings;\r\n return (\r\n
\r\n \r\n \r\n Delete Dashboard {displayName}\r\n \r\n \r\n Are you sure you want to delete Dashboard: {displayName}{\" \"}\r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n \r\n Dashboard Details for {displayName}\r\n \r\n {!editModeOn && }\r\n {editModeOn && (\r\n \r\n d.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n d.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.groupId)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (gId: string) => {\r\n await this.setState(() => ({ groupId: gId }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.reportId)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (rId: string) => {\r\n await this.setState(() => ({ reportId: rId }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.reportId)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dvver: string) => {\r\n await this.setState(() => ({ dashboardViewerVersion: parseInt(dvver) }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n {allowDisableDashboards && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {!editModeOn && (\r\n \r\n \r\n Edit\r\n \r\n \r\n Delete Dashboard\r\n \r\n \r\n )}\r\n {editModeOn && (\r\n \r\n {isReadyToSave && (\r\n \r\n )}\r\n \r\n Cancel\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let dashboard: IPbiDashboard = {} as IPbiDashboard;\r\n const existingDashboards = state.dashboards.filter(\r\n dsh => dsh.id !== parseInt((match.params as any).id as string, 10)\r\n ) as IPbiDashboard[];\r\n if (match !== null) {\r\n dashboard = state.dashboards.find(dsh => {\r\n return dsh.id === parseInt((match.params as any).id as string, 10);\r\n }) as IPbiDashboard;\r\n }\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n dashboard,\r\n existingDashboards\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadDashboards: (accessToken: string) => {\r\n dispatch(handleLoadDashboards(accessToken));\r\n },\r\n onHandleUpdateDashboard: (accessToken: string, dashboard: IPbiDashboard) => {\r\n dispatch(handleUpdateDashboard(accessToken, dashboard));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleDeleteDashboard: (accessToken: string, id: number) => {\r\n dispatch(handleDeleteDashboard(accessToken, id));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EditDashboardPage);\r\n","import * as React from \"react\";\r\nimport { Input, Table } from \"reactstrap\";\r\nimport { settings } from \"../../constants\";\r\nimport IUserGroup from \"../../models/IGroup\";\r\n\r\nexport interface IGroupDetailsTableProps {\r\n group: IUserGroup;\r\n}\r\n\r\nconst GroupDetailsTable: React.SFC = (\r\n props: IGroupDetailsTableProps\r\n) => {\r\n const { group } = props;\r\n const { name, isEnabled } = group;\r\n const { allowDisableGroups } = settings;\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 {allowDisableGroups && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
FieldValue
Name {name}
Enabled\r\n \r\n {isEnabled}\r\n
\r\n );\r\n};\r\n\r\nexport default GroupDetailsTable;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Card, CardBody, CardFooter, Form, Input, Modal, ModalBody, ModalFooter, ModalHeader, Table } from \"reactstrap\";\r\nimport CardHeader from \"reactstrap/lib/CardHeader\";\r\nimport { handleDeleteGroup, handleLoadGroups, handleUpdateGroup } from \"../../../actions/groups\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport GroupDetailsTable from \"../../../components/molecules/GroupDetailsTable\";\r\nimport { adminGroupName, paths, settings } from \"../../../constants\";\r\nimport IGroup from \"../../../models/IGroup\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateGroupName } from \"../../../utils\";\r\nexport interface IEditGroupPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n group: IGroup;\r\n existingGroups: IGroup[];\r\n onHandleLoadGroups: (accessToken: string) => void;\r\n onHandleUpdateGroup: (accessToken: string, group: IGroup) => void;\r\n onHandleDeleteGroup: (accessToken: string, id: number) => void;\r\n}\r\nexport interface IEditGroupPageState {\r\n editModeOn: boolean;\r\n name: string;\r\n isEnabled: boolean;\r\n showDeleteModal: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nclass EditGroupPage extends React.Component<\r\n IEditGroupPageProps,\r\n IEditGroupPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n editModeOn: false,\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true,\r\n showDeleteModal: false,\r\n isReadyToSave: false\r\n };\r\n constructor(props: IEditGroupPageProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n this.toggleDeleteModal = this.toggleDeleteModal.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n const { accessToken, onHandleUpdateGroup, history, group } = this.props;\r\n const { name, isEnabled, isReadyToSave } = this.state;\r\n const updatedGroup = {\r\n id: group.id,\r\n name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled\r\n } as IGroup;\r\n if (this.readyToSave() && isReadyToSave) {\r\n onHandleUpdateGroup(accessToken, updatedGroup);\r\n history.push(paths.home);\r\n }\r\n };\r\n public delete = (e: React.MouseEvent) => {\r\n const { accessToken, group, history, onHandleDeleteGroup } = this.props;\r\n onHandleDeleteGroup(accessToken, group.id);\r\n history.push(paths.home);\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public toggleEdit() {\r\n this.setState({ editModeOn: !this.state.editModeOn });\r\n }\r\n public toggleDeleteModal() {\r\n this.setState({ showDeleteModal: !this.state.showDeleteModal });\r\n }\r\n public readyToSave = () => {\r\n const { name } = this.state;\r\n if (name === undefined || name === \"\" || !validateGroupName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadGroups,\r\n existingGroups,\r\n group\r\n } = this.props;\r\n const { name, isEnabled } = group;\r\n this.setState(() => ({ name, isEnabled }));\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingGroups.length === 0) {\r\n onHandleLoadGroups(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { group, existingGroups } = this.props;\r\n const { editModeOn, name, isEnabled, isReadyToSave } = this.state;\r\n const { allowDisableGroups } = settings;\r\n return (\r\n
\r\n \r\n \r\n Delete Group {name}\r\n \r\n \r\n Are you sure you want to delete Group: {name}\r\n {\"?\"}\r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n \r\n Group Details for {name}\r\n \r\n {!editModeOn && }\r\n {editModeOn && (\r\n \r\n grp.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n {allowDisableGroups && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {!editModeOn && name !== adminGroupName && (\r\n \r\n \r\n Edit\r\n \r\n \r\n Delete Group\r\n \r\n \r\n )}\r\n {editModeOn && name !== adminGroupName && (\r\n \r\n {isReadyToSave && (\r\n \r\n )}\r\n \r\n Cancel\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let group = {} as IGroup;\r\n const existingGroups = state.groups.filter(\r\n grp => grp.id !== parseInt((match.params as any).id as string, 10)\r\n );\r\n if (match !== null) {\r\n group = state.groups.find(grp => {\r\n return grp.id === parseInt((match.params as any).id as string, 10);\r\n }) as IGroup;\r\n // if (group === undefined) {\r\n // // tslint:disable-next-line:no-console\r\n // console.log(\"didn't find the group\");\r\n // return { group: {} as IGroup };\r\n // }\r\n }\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingGroups,\r\n group\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadGroups: (accessToken: string) => {\r\n dispatch(handleLoadGroups(accessToken));\r\n },\r\n onHandleUpdateGroup: (accessToken: string, group: IGroup) => {\r\n dispatch(handleUpdateGroup(accessToken, group));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleDeleteGroup: (accessToken: string, id: number) => {\r\n dispatch(handleDeleteGroup(accessToken, id));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EditGroupPage);\r\n","import * as React from \"react\";\r\nimport { Input, Table } from \"reactstrap\";\r\nimport { settings } from \"../../constants\";\r\nimport IKpi from \"../../models/IKpi\";\r\n\r\nexport interface IKpiDetailsTableProps {\r\n kpi: IKpi;\r\n}\r\n\r\nconst KpiDetailsTable: React.SFC = (\r\n props: IKpiDetailsTableProps\r\n) => {\r\n const { kpi } = props;\r\n const { displayName, name, isEnabled } = kpi;\r\n const { allowDisableKpis } = settings;\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 {allowDisableKpis && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
Name {name}
Display Name {displayName}
Enabled\r\n \r\n {isEnabled}\r\n
\r\n );\r\n};\r\n\r\nexport default KpiDetailsTable;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n CardHeader,\r\n Form,\r\n Input,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n Table\r\n} from \"reactstrap\";\r\nimport {\r\n handleDeleteKpi,\r\n handleLoadKpis,\r\n handleUpdateKpi\r\n} from \"../../../actions/kpis\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport KpiDetailsTable from \"../../../components/molecules/KpiDetailsTable\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IKpi from \"../../../models/IKpi\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateKpiDisplayName, validateKpiName } from \"../../../utils\";\r\nexport interface IEditKpiPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n kpi: IKpi;\r\n existingKpis: IKpi[];\r\n kpisLoaded: boolean;\r\n onHandleLoadKpis: (accessToken: string) => void;\r\n onHandleUpdateKpi: (accessToken: string, kpi: IKpi) => void;\r\n onHandleDeleteKpi: (accessToken: string, id: number) => void;\r\n}\r\nexport interface IEditKpiPageState {\r\n editModeOn: boolean;\r\n displayName: string;\r\n name: string;\r\n isEnabled: boolean;\r\n showDeleteModal: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nclass EditKpiPage extends React.Component<\r\n IEditKpiPageProps,\r\n IEditKpiPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n editModeOn: false,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n name: \"\",\r\n isEnabled: true,\r\n showDeleteModal: false,\r\n isReadyToSave: false\r\n };\r\n constructor(props: IEditKpiPageProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n this.toggleDeleteModal = this.toggleDeleteModal.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n const { accessToken, onHandleUpdateKpi, history, kpi } = this.props;\r\n const { displayName, name, isEnabled, isReadyToSave } = this.state;\r\n const updatedGroup = {\r\n id: kpi.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName,\r\n name,\r\n isEnabled\r\n } as IKpi;\r\n if (this.readyToSave() && isReadyToSave) {\r\n onHandleUpdateKpi(accessToken, updatedGroup);\r\n history.push(paths.home);\r\n }\r\n };\r\n public delete = (e: React.MouseEvent) => {\r\n const { accessToken, kpi, history, onHandleDeleteKpi } = this.props;\r\n onHandleDeleteKpi(accessToken, kpi.id);\r\n history.push(paths.home);\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public toggleEdit() {\r\n this.setState({ editModeOn: !this.state.editModeOn });\r\n }\r\n public toggleDeleteModal() {\r\n this.setState({ showDeleteModal: !this.state.showDeleteModal });\r\n }\r\n public readyToSave = () => {\r\n const { displayName, name } = this.state;\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateKpiDisplayName(displayName) ||\r\n name === undefined ||\r\n name === \"\" ||\r\n !validateKpiName(name)\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public async componentDidMount() {\r\n const { accessToken, onHandleLoadKpis, kpi, kpisLoaded } = this.props;\r\n const { displayName, name, isEnabled } = kpi;\r\n this.setState(() => ({ displayName, name, isEnabled }));\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!kpisLoaded) {\r\n onHandleLoadKpis(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { kpi, existingKpis } = this.props;\r\n const {\r\n editModeOn,\r\n displayName,\r\n name,\r\n isEnabled,\r\n isReadyToSave\r\n } = this.state;\r\n const { allowDisableKpis } = settings;\r\n return (\r\n
\r\n \r\n \r\n Delete KPI: {displayName}\r\n \r\n \r\n Are you sure you want to delete KPI: {displayName}\r\n {\"?\"}\r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n \r\n KPI Details for {displayName}\r\n \r\n {!editModeOn && }\r\n {editModeOn && (\r\n \r\n k.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n k.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n {allowDisableKpis && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {!editModeOn && (\r\n \r\n \r\n Edit\r\n \r\n \r\n Delete KPI\r\n \r\n \r\n )}\r\n {editModeOn && (\r\n \r\n {isReadyToSave && (\r\n \r\n )}\r\n \r\n Cancel\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let kpi = {} as IKpi;\r\n const existingKpis = state.kpis.filter(\r\n k => k.id !== parseInt((match.params as any).id as string, 10)\r\n );\r\n if (match !== null) {\r\n kpi = state.kpis.find(k => {\r\n return k.id === parseInt((match.params as any).id as string, 10);\r\n }) as IKpi;\r\n // if (kpi === undefined) {\r\n // // tslint:disable-next-line:no-console\r\n // console.log(\"didn't find the KPI\");\r\n // return { kpi: {} as IKpi };\r\n // }\r\n }\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingKpis,\r\n kpi,\r\n kpisLoaded: state.loadingKpis\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadKpis: (accessToken: string) => {\r\n dispatch(handleLoadKpis(accessToken));\r\n },\r\n onHandleUpdateKpi: (accessToken: string, kpi: IKpi) => {\r\n dispatch(handleUpdateKpi(accessToken, kpi));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleDeleteKpi: (accessToken: string, id: number) => {\r\n dispatch(handleDeleteKpi(accessToken, id));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EditKpiPage);\r\n","import * as React from \"react\";\r\nimport { Input, Table } from \"reactstrap\";\r\nimport { settings } from \"../../constants\";\r\nimport IPredicate from \"../../models/IPredicate\";\r\n\r\nexport interface IPredicateDetailsTableProps {\r\n predicate: IPredicate;\r\n}\r\n\r\nconst PredicateDetailsTable: React.SFC = (\r\n props: IPredicateDetailsTableProps\r\n) => {\r\n const { predicate } = props;\r\n const { displayName, name, isKpiGrouping, isEnabled } = predicate;\r\n const { allowDisableGroups } = settings;\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 {allowDisableGroups && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
Name {name}
Display Name {displayName}
Is KPI Grouping\r\n \r\n {isKpiGrouping}\r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n );\r\n};\r\n\r\nexport default PredicateDetailsTable;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n Form,\r\n Input,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n Table\r\n} from \"reactstrap\";\r\nimport CardHeader from \"reactstrap/lib/CardHeader\";\r\nimport {\r\n handleDeletePredicate,\r\n handleLoadPredicates,\r\n handleUpdatePredicate\r\n} from \"../../../actions/predicates\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport PredicateDetailsTable from \"../../../components/molecules/PredicateDetailsTable\";\r\nimport { paths, settings } from \"../../../constants\";\r\nimport IPredicate from \"../../../models/IPredicate\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validatePredicateName, validatePredicateDisplayName } from \"../../../utils\";\r\nexport interface IEditPredicatePageProps extends RouteComponentProps {\r\n accessToken: string;\r\n predicate: IPredicate;\r\n existingPredicates: IPredicate[];\r\n onHandleLoadPredicates: (accessToken: string) => void;\r\n onHandleUpdatePredicate: (accessToken: string, predicate: IPredicate) => void;\r\n onHandleDeletePredicate: (accessToken: string, id: number) => void;\r\n}\r\nexport interface IEditPredicatePageState {\r\n editModeOn: boolean;\r\n displayName: string;\r\n name: string;\r\n isKpiGrouping: boolean;\r\n isEnabled: boolean;\r\n showDeleteModal: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nclass EditPredicatePage extends React.Component<\r\n IEditPredicatePageProps,\r\n IEditPredicatePageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n editModeOn: false,\r\n displayName: \"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isKpiGrouping: false,\r\n isEnabled: true,\r\n showDeleteModal: false,\r\n isReadyToSave: false\r\n };\r\n constructor(props: IEditPredicatePageProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n this.toggleDeleteModal = this.toggleDeleteModal.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n this.isKpiGroupingChange = this.isKpiGroupingChange.bind(this);\r\n }\r\n public isKpiGroupingChange = (e: React.ChangeEvent) => {\r\n const isKpiGrouping = e.target.checked;\r\n this.setState(() => ({ isKpiGrouping, isReadyToSave: true }));\r\n };\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n const {\r\n accessToken,\r\n onHandleUpdatePredicate,\r\n history,\r\n predicate\r\n } = this.props;\r\n const { displayName, name, isEnabled, isKpiGrouping, isReadyToSave } = this.state;\r\n const updatedPredicate = {\r\n id: predicate.id,\r\n displayName,\r\n name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isKpiGrouping,\r\n isEnabled\r\n } as IPredicate;\r\n if (this.readyToSave() && isReadyToSave) {\r\n onHandleUpdatePredicate(accessToken, updatedPredicate);\r\n history.push(paths.home);\r\n }\r\n };\r\n public delete = (e: React.MouseEvent) => {\r\n const {\r\n accessToken,\r\n predicate,\r\n history,\r\n onHandleDeletePredicate\r\n } = this.props;\r\n onHandleDeletePredicate(accessToken, predicate.id);\r\n history.push(paths.home);\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public toggleEdit() {\r\n this.setState({ editModeOn: !this.state.editModeOn });\r\n }\r\n public toggleDeleteModal() {\r\n this.setState({ showDeleteModal: !this.state.showDeleteModal });\r\n }\r\n public readyToSave = () => {\r\n const { displayName, name } = this.state;\r\n if (name === undefined || name === \"\" || !validatePredicateName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (displayName===undefined || displayName===\"\" || !validatePredicateDisplayName(displayName)){\r\n this.setState(()=> ({isReadyToSave:false}))\r\n return false;\r\n }\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadPredicates,\r\n existingPredicates,\r\n predicate\r\n } = this.props;\r\n const { displayName, name, isKpiGrouping, isEnabled } = predicate;\r\n this.setState(() => ({ displayName, name, isKpiGrouping, isEnabled }));\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingPredicates.length === 0) {\r\n onHandleLoadPredicates(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { predicate, existingPredicates } = this.props;\r\n const {\r\n editModeOn,\r\n displayName,\r\n name,\r\n isKpiGrouping,\r\n isEnabled,\r\n isReadyToSave\r\n } = this.state;\r\n const { allowDisablePredicates } = settings;\r\n return (\r\n
\r\n \r\n \r\n Delete Predicate {name}\r\n \r\n \r\n Are you sure you want to delete Predicate: {name}\r\n {\"?\"}\r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n \r\n Predicate Details for {name}\r\n \r\n {!editModeOn && }\r\n {editModeOn && (\r\n \r\n pred.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n pred.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Is KPI Grouping\r\n \r\n {isKpiGrouping}\r\n
\r\n {allowDisablePredicates && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {!editModeOn && (\r\n \r\n \r\n Edit\r\n \r\n \r\n Delete Predicate\r\n \r\n \r\n )}\r\n {editModeOn && (\r\n \r\n {isReadyToSave && (\r\n \r\n )}\r\n \r\n Cancel\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let predicate = {} as IPredicate;\r\n const existingPredicates = state.predicates.filter(\r\n pred => pred.id !== parseInt((match.params as any).id as string, 10)\r\n );\r\n if (match !== null) {\r\n predicate = state.predicates.find(pred => {\r\n return pred.id === parseInt((match.params as any).id as string, 10);\r\n }) as IPredicate;\r\n }\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingPredicates,\r\n predicate\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadPredicates: (accessToken: string) => {\r\n dispatch(handleLoadPredicates(accessToken));\r\n },\r\n onHandleUpdatePredicate: (accessToken: string, predicate: IPredicate) => {\r\n dispatch(handleUpdatePredicate(accessToken, predicate));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleDeletePredicate: (accessToken: string, id: number) => {\r\n dispatch(handleDeletePredicate(accessToken, id));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EditPredicatePage);\r\n","import * as React from \"react\";\r\nimport { Input, Table } from \"reactstrap\";\r\nimport ISqlReport from \"../../models/ISqlReport\";\r\nimport { settings } from \"../../constants\";\r\n\r\nexport interface IReportDetailsTableProps {\r\n report: ISqlReport;\r\n}\r\n\r\nconst ReportDetailsTable: React.SFC = (\r\n props: IReportDetailsTableProps\r\n) => {\r\n const { report } = props;\r\n const {\r\n displayName,\r\n name,\r\n sqlReportingViewerUrl,\r\n sqlReportingServerUrl,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n isEnabled\r\n } = report;\r\n const {\r\n allowAlternateSqlReportingServerUrl,\r\n allowAlternateSqlReportingViewerUrl,\r\n allowDisableReports\r\n } = settings;\r\n return (\r\n \r\n {/* \r\n \r\n \r\n \r\n \r\n */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {defaultZoomMode === \"Percent\" && (\r\n \r\n \r\n \r\n \r\n )}\r\n {allowAlternateSqlReportingViewerUrl && (\r\n \r\n \r\n \r\n \r\n )}\r\n {allowAlternateSqlReportingServerUrl && (\r\n \r\n \r\n \r\n \r\n )}\r\n {allowDisableReports && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
FieldValue
Display Name {displayName}
Name {name}
Path {path}
Parameters {parameters}
Default Zoom Mode {defaultZoomMode}
Default Zoom Percent {defaultZoomPercent}
SQL Reporting Viewer URL\r\n {\" \"}\r\n {sqlReportingViewerUrl === \"\" ||\r\n sqlReportingServerUrl === undefined\r\n ? \"DEFAULT\"\r\n : sqlReportingViewerUrl}\r\n
SQL Reporting Server URL\r\n {\" \"}\r\n {sqlReportingServerUrl === \"\" ||\r\n sqlReportingServerUrl === undefined\r\n ? \"DEFAULT\"\r\n : sqlReportingServerUrl}\r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n );\r\n};\r\n\r\nexport default ReportDetailsTable;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n Form,\r\n Input,\r\n Label,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n Table\r\n} from \"reactstrap\";\r\nimport CardHeader from \"reactstrap/lib/CardHeader\";\r\nimport FormGroup from \"reactstrap/lib/FormGroup\";\r\nimport {\r\n handleDeleteReport,\r\n handleLoadReports,\r\n handleUpdateReport\r\n} from \"../../../actions/reports\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport ReportDetailsTable from \"../../../components/molecules/ReportDetailsTable\";\r\nimport { paths, settings, zoomModes } from \"../../../constants\";\r\nimport ISqlReport from \"../../../models/ISqlReport\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport {\r\n validateParametersText,\r\n validatePathText,\r\n validateReportDisplayName,\r\n validateReportName,\r\n validateZoomPercent\r\n} from \"../../../utils\";\r\nexport interface IEditReportPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n report: ISqlReport;\r\n existingReports: ISqlReport[];\r\n onHandleLoadReports: (accessToken: string) => void;\r\n onHandleUpdateReport: (accessToken: string, report: ISqlReport) => void;\r\n onHandleDeleteReport: (accessToken: string, id: number) => void;\r\n}\r\nexport interface IEditReportPageState {\r\n editModeOn: boolean;\r\n displayName: string;\r\n name: string;\r\n path: string;\r\n parameters: string;\r\n defaultZoomMode: string;\r\n defaultZoomPercent: number;\r\n sqlReportingServerUrl: string;\r\n sqlReportingViewerUrl: string;\r\n isEnabled: boolean;\r\n showDeleteModal: boolean;\r\n isReadyToSave: boolean;\r\n}\r\n\r\nclass EditReportPage extends React.Component<\r\n IEditReportPageProps,\r\n IEditReportPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n editModeOn: false,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n name: \"\",\r\n path: \"\",\r\n parameters: \"\",\r\n defaultZoomMode: \"\",\r\n defaultZoomPercent: 100,\r\n sqlReportingServerUrl: \"\",\r\n sqlReportingViewerUrl: \"\",\r\n isEnabled: true,\r\n showDeleteModal: false,\r\n isReadyToSave: false\r\n };\r\n constructor(props: IEditReportPageProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n this.toggleDeleteModal = this.toggleDeleteModal.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n this.defaultZoomModeChange = this.defaultZoomModeChange.bind(this);\r\n }\r\n\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n const { accessToken, onHandleUpdateReport, history, report } = this.props;\r\n const {\r\n name,\r\n displayName,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n sqlReportingServerUrl,\r\n sqlReportingViewerUrl,\r\n isEnabled,\r\n isReadyToSave\r\n } = this.state;\r\n const updatedDashboard = {\r\n id: report.id,\r\n name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n sqlReportingServerUrl,\r\n sqlReportingViewerUrl,\r\n isEnabled\r\n } as ISqlReport;\r\n if (this.readyToSave() && isReadyToSave) {\r\n onHandleUpdateReport(accessToken, updatedDashboard);\r\n history.push(paths.home);\r\n }\r\n };\r\n public delete = (e: React.MouseEvent) => {\r\n const { accessToken, report, history, onHandleDeleteReport } = this.props;\r\n onHandleDeleteReport(accessToken, report.id);\r\n history.push(paths.home);\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public toggleEdit() {\r\n this.setState({ editModeOn: !this.state.editModeOn });\r\n }\r\n public toggleDeleteModal() {\r\n this.setState({ showDeleteModal: !this.state.showDeleteModal });\r\n }\r\n public readyToSave = () => {\r\n const {\r\n displayName,\r\n name,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent\r\n } = this.state;\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateReportDisplayName(displayName)\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (name === undefined || name === \"\" || !validateReportName(name)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (path === undefined || path === \"\" || !validatePathText(path)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (parameters === undefined || !validateParametersText(parameters)) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n if (\r\n defaultZoomMode === \"Percent\" &&\r\n (defaultZoomPercent === undefined ||\r\n !validateZoomPercent(defaultZoomPercent.toString()))\r\n ) {\r\n this.setState(() => ({ isReadyToSave: false }));\r\n return false;\r\n }\r\n this.setState(() => ({ isReadyToSave: true }));\r\n return true;\r\n };\r\n public defaultZoomModeChange = (e: React.ChangeEvent) => {\r\n e.preventDefault();\r\n this.setState(() => ({ isReadyToSave: true }));\r\n const defaultZoomMode =\r\n e.target.value === undefined ? \"\" : (e.target.value as string);\r\n switch (defaultZoomMode) {\r\n case \"Whole Page\":\r\n this.setState(() => ({ defaultZoomMode, defaultZoomPercent: 100 }));\r\n break;\r\n case \"Page Width\":\r\n this.setState(() => ({ defaultZoomMode, defaultZoomPercent: 100 }));\r\n break;\r\n case \"Percent\":\r\n this.setState(() => ({ defaultZoomMode, defaultZoomPercent: 100 }));\r\n break;\r\n case \"500%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 500\r\n }));\r\n break;\r\n case \"200%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 200\r\n }));\r\n break;\r\n case \"150%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 150\r\n }));\r\n break;\r\n case \"100%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 100\r\n }));\r\n break;\r\n case \"75%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 75\r\n }));\r\n break;\r\n case \"50%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 50\r\n }));\r\n break;\r\n case \"25%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 25\r\n }));\r\n break;\r\n case \"10%\":\r\n this.setState(() => ({\r\n defaultZoomMode: \"Percent\",\r\n defaultZoomPercent: 10\r\n }));\r\n break;\r\n default:\r\n this.setState(() => ({ defaultZoomMode }));\r\n break;\r\n }\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadReports,\r\n existingReports,\r\n report\r\n } = this.props;\r\n const {\r\n displayName,\r\n name,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n isEnabled\r\n } = report;\r\n this.setState(() => ({\r\n displayName,\r\n name,\r\n path,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n isEnabled\r\n }));\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (existingReports.length === 0) {\r\n onHandleLoadReports(accessToken);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { report, existingReports } = this.props;\r\n const {\r\n editModeOn,\r\n displayName,\r\n name,\r\n path,\r\n parameters,\r\n defaultZoomMode,\r\n defaultZoomPercent,\r\n isEnabled,\r\n isReadyToSave\r\n } = this.state;\r\n const { allowDisableReports } = settings;\r\n return (\r\n
\r\n \r\n \r\n Delete Report {displayName}\r\n \r\n \r\n Are you sure you want to delete Report: {displayName}\r\n {\"?\"}\r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n \r\n Report Details for {displayName}\r\n \r\n {!editModeOn && }\r\n {editModeOn && (\r\n \r\n d.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (dn: string) => {\r\n await this.setState(() => ({ displayName: dn }));\r\n this.readyToSave();\r\n }}\r\n />\r\n\r\n d.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (n: string) => {\r\n await this.setState(() => ({ name: n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.path)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (p: string) => {\r\n await this.setState(() => ({ path: p }));\r\n this.readyToSave();\r\n }}\r\n />\r\n d.parameters)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (params: string) => {\r\n await this.setState(() => ({ parameters: params }));\r\n this.readyToSave();\r\n }}\r\n />\r\n \r\n \r\n \r\n {zoomModes.map(zm => (\r\n \r\n ))}\r\n \r\n \r\n {defaultZoomMode === \"Percent\" && (\r\n d.path)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={async (zpct: string) => {\r\n await this.setState(() => ({\r\n defaultZoomPercent: Number(zpct)\r\n }));\r\n this.readyToSave();\r\n }}\r\n />\r\n )}\r\n {allowDisableReports && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n \r\n {!editModeOn && (\r\n \r\n \r\n Edit\r\n \r\n \r\n Delete Report\r\n \r\n \r\n )}\r\n {editModeOn && (\r\n \r\n {isReadyToSave && (\r\n \r\n )}\r\n \r\n Cancel\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let report = {} as ISqlReport;\r\n const existingReports = state.reports.filter(\r\n dsh => dsh.id !== parseInt((match.params as any).id as string, 10)\r\n );\r\n if (match !== null) {\r\n report = state.reports.find(dsh => {\r\n return dsh.id === parseInt((match.params as any).id as string, 10);\r\n }) as ISqlReport;\r\n // if (report === undefined) {\r\n // // tslint:disable-next-line:no-console\r\n // console.log(\"didn't find the report\");\r\n // return { report: {} as ISqlReport };\r\n // }\r\n }\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingReports,\r\n report\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadReports: (accessToken: string) => {\r\n dispatch(handleLoadReports(accessToken));\r\n },\r\n onHandleUpdateReport: (accessToken: string, report: ISqlReport) => {\r\n dispatch(handleUpdateReport(accessToken, report));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleDeleteReport: (accessToken: string, id: number) => {\r\n dispatch(handleDeleteReport(accessToken, id));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EditReportPage);\r\n","import IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getRoleDashboards = async (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/PbiDashboard/GetPbiDashboardsForRoleId?roleId=${roleId}`,\r\n accessToken\r\n );\r\n const roleDashboards = ((await data.json()) as any)\r\n .value as IPbiDashboard[];\r\n if (roleDashboards !== undefined) {\r\n return roleDashboards;\r\n } else {\r\n return [] as IPbiDashboard[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/PbiDashboard/GetPbiDashboardsForRoleId?roleId=${roleId}`,\r\n err\r\n );\r\n }\r\n return [] as IPbiDashboard[];\r\n};\r\n\r\nexport default getRoleDashboards;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeRoleDashboard = async (accessToken: string, roleId: number, dashboardId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/RoleDashboard/Remove?roleId=${roleId}&dashboardId=${dashboardId}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/RoleDashboard/Remove?roleId=${roleId}&dashboardId=${dashboardId}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeRoleDashboard;\r\n","import IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveRoleDashboard = async (\r\n accessToken: string,\r\n roleId: number,\r\n dashboardId: number,\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/RoleDashboard/Add?roleId=${roleId}&dashboardId=${dashboardId}`,\r\n accessToken\r\n );\r\n const roleDashboard = ((await data.json()) as any).value as IPbiDashboard;\r\n return roleDashboard;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/RoleDashboard/Add?roleId=${roleId}&&dashboardId=${dashboardId}`\r\n );\r\n }\r\n return {} as IPbiDashboard;\r\n};\r\n\r\nexport default saveRoleDashboard;\r\n","export const SET_EDIT_ROLE_DASHBOARDS_LOADED = \"SET_EDIT_ROLE_DASHBOARDS_LOADED\";\r\n\r\nexport const setEditRoleDashboardsLoaded = (editRoleDashboardsLoaded: boolean) => {\r\n return {\r\n editRoleDashboardsLoaded,\r\n type: SET_EDIT_ROLE_DASHBOARDS_LOADED\r\n };\r\n};\r\n","import IRole from \"../models/IRole\";\r\n\r\nexport const SET_EDIT_ROLE_DETAILS = \"SET_EDIT_ROLE_DETAILS\";\r\nexport const CLEAR_EDIT_ROLE_DETAILS = \"CLEAR_EDIT_ROLE_DETAILS\";\r\n\r\nexport const setEditRoleDetails = (role: IRole) => {\r\n return {\r\n role,\r\n type: SET_EDIT_ROLE_DETAILS\r\n };\r\n};\r\n\r\nexport const clearEditRoleDetails = () => {\r\n return {\r\n type: CLEAR_EDIT_ROLE_DETAILS\r\n };\r\n};\r\n","import IRolePredicate from \"../models/IRolePredicate\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getRolePredicates = async (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/RolePredicate/GetRolePredicatesForRole?roleId=${roleId}`,\r\n accessToken\r\n );\r\n const rolePredicates = ((await data.json()) as any)\r\n .value as IRolePredicate[];\r\n if (rolePredicates !== undefined) {\r\n return rolePredicates;\r\n } else {\r\n return [] as IRolePredicate[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/RolePredicate/GetRolePredicatesForRole?roleId=${roleId}`,\r\n err\r\n );\r\n }\r\n return [] as IRolePredicate[];\r\n};\r\n\r\nexport default getRolePredicates;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeRolePredicate = async (accessToken: string, roleId: number, predicateId:number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/RolePredicate/Remove?roleId=${roleId}&predicateId=${predicateId}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/RolePredicate/Remove?roleId=${roleId}&predicateId=${predicateId}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeRolePredicate;\r\n","import IRolePredicate from \"../models/IRolePredicate\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveRolePredicate = async (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number,\r\n value: string\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/RolePredicate/Add?roleId=${roleId}&predicateId=${predicateId}&value=${value}`,\r\n accessToken\r\n );\r\n const rolePredicate = ((await data.json()) as any).value as IRolePredicate;\r\n return rolePredicate;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/RolePredicate/Add?roleId=${roleId}&predicateId=${predicateId}&value=${value}`,\r\n err\r\n );\r\n }\r\n return {} as IRolePredicate;\r\n};\r\n\r\nexport default saveRolePredicate;\r\n","import IRolePredicate from \"../models/IRolePredicate\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedRolePredicate = async (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n) => {\r\n const payload = {\r\n roleId: rolePredicate.roleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId: rolePredicate.predicateId,\r\n value: rolePredicate.value,\r\n isEnabled: rolePredicate.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/RolePredicate/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IRolePredicate;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/RolePredicate/Edit`, err);\r\n }\r\n return {} as IRolePredicate;\r\n};\r\n\r\nexport default saveUpdatedRolePredicate;\r\n","export const SET_EDIT_ROLE_PREDICATES_LOADED =\r\n \"SET_EDIT_ROLE_PREDICATES_LOADED\";\r\n\r\nexport const setEditRolePredicatesLoaded = (\r\n editRolePredicatesLoaded: boolean\r\n) => {\r\n return {\r\n editRolePredicatesLoaded,\r\n type: SET_EDIT_ROLE_PREDICATES_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getRolePredicates from \"../api/getRolePredicates\";\r\nimport { removeRolePredicate as deleteRolePredicate } from \"../api/removeRolePredicate\";\r\nimport saveRolePredicate from \"../api/saveRolePredicate\";\r\nimport saveUpdatedRolePredicate from \"../api/saveUpdatedRolePredicate\";\r\nimport IRolePredicate from \"../models/IRolePredicate\";\r\nimport { setEditRolePredicatesLoaded } from \"./loadingEditRolePredicates\";\r\n\r\nexport const ADD_EDIT_ROLE_PREDICATE = \"ADD_EDIT_ROLE_PREDICATE\";\r\nexport const UPDATE_EDIT_ROLE_PREDICATE = \"UPDATE_EDIT_ROLE_PREDICATE\";\r\nexport const REMOVE_EDIT_ROLE_PREDICATE = \"REMOVE_EDIT_ROLE_PREDICATE\";\r\nexport const LOAD_EDIT_ROLE_PREDICATES = \"LOAD_EDIT_ROLE_PREDICATES\";\r\nexport const CLEAR_EDIT_ROLE_PREDICATES = \"CLEAR_EDIT_ROLE_PREDICATES\";\r\n\r\nexport const addEditRolePredicate = (rolePredicate: IRolePredicate) => {\r\n return {\r\n rolePredicate,\r\n type: ADD_EDIT_ROLE_PREDICATE\r\n };\r\n};\r\n\r\nexport const updateEditRolePredicate = (rolePredicate: IRolePredicate) => {\r\n return {\r\n rolePredicate,\r\n type: UPDATE_EDIT_ROLE_PREDICATE\r\n };\r\n};\r\n\r\nexport const removeEditRolePredicate = (\r\n roleId: number,\r\n predicateId: number\r\n) => {\r\n return {\r\n roleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId,\r\n type: REMOVE_EDIT_ROLE_PREDICATE\r\n };\r\n};\r\n\r\nexport const loadEditRolePredicates = (rolePredicates: IRolePredicate[]) => {\r\n return {\r\n rolePredicates,\r\n type: LOAD_EDIT_ROLE_PREDICATES\r\n };\r\n};\r\n\r\nexport const clearEditRolePredicates = () => {\r\n return {\r\n type: CLEAR_EDIT_ROLE_PREDICATES\r\n };\r\n};\r\n\r\nexport const handleLoadEditRolePredicates = (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const rolePredicates = await getRolePredicates(accessToken, roleId);\r\n if (rolePredicates === undefined) {\r\n // tslint:disable-next-line:no-console\r\n // console.log(\r\n // \"No Role Predicates found, or user does not have access to edit these role predicates\"\r\n // );\r\n dispatch(clearEditRolePredicates());\r\n dispatch(setEditRolePredicatesLoaded(false));\r\n } else {\r\n if (rolePredicates.length > 0) {\r\n dispatch(loadEditRolePredicates(rolePredicates));\r\n }\r\n dispatch(setEditRolePredicatesLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveRolePredicate = (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const rp = await saveRolePredicate(\r\n accessToken,\r\n rolePredicate.roleId,\r\n rolePredicate.predicateId,\r\n rolePredicate.value\r\n );\r\n dispatch(addEditRolePredicate(rp));\r\n };\r\n};\r\n\r\nexport const handleUpdateRolePredicate = (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await saveUpdatedRolePredicate(accessToken, rolePredicate);\r\n dispatch(updateEditRolePredicate(rolePredicate));\r\n };\r\n};\r\n\r\nexport const handleDeleteRolePredicate = (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await deleteRolePredicate(accessToken, roleId, predicateId);\r\n dispatch(removeEditRolePredicate(roleId, predicateId));\r\n };\r\n};\r\n","import ISqlReport from \"../models/ISqlReport\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getRoleReports = async (accessToken: string, roleId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/SqlReport/GetSqlReportsForRoleId?roleId=${roleId}`,\r\n accessToken\r\n );\r\n const roleReports = ((await data.json()) as any).value as ISqlReport[];\r\n if (roleReports !== undefined) {\r\n return roleReports;\r\n } else {\r\n return [] as ISqlReport[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/SqlReport/GetSqlReportsForRoleId?roleId=${roleId}`,\r\n err\r\n );\r\n }\r\n return [] as ISqlReport[];\r\n};\r\n\r\nexport default getRoleReports;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeRoleReport = async (accessToken: string, roleId: number, reportId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/RoleReport/Remove?roleId=${roleId}&reportId=${reportId}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/RoleReport/Remove?roleId=${roleId}&reportId=${reportId}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeRoleReport;\r\n","import ISqlReport from \"../models/ISqlReport\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveRoleReport = async (\r\n accessToken: string,\r\n roleId: number,\r\n reportId: number,\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/RoleReport/Add?roleId=${roleId}&reportId=${reportId}`,\r\n accessToken\r\n );\r\n const roleReport = ((await data.json()) as any).value as ISqlReport;\r\n return roleReport;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/RoleReport/Add?roleId=${roleId}&reportId=${reportId}`\r\n );\r\n }\r\n return {} as ISqlReport;\r\n};\r\n\r\nexport default saveRoleReport;\r\n","export const SET_EDIT_ROLE_REPORTS_LOADED = \"SET_EDIT_ROLE_REPORTS_LOADED\";\r\n\r\nexport const setEditRoleReportsLoaded = (editRoleReportsLoaded: boolean) => {\r\n return {\r\n editRoleReportsLoaded,\r\n type: SET_EDIT_ROLE_REPORTS_LOADED\r\n };\r\n};\r\n","import IUserProfile from \"../models/IUserProfile\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getRoleUsers = async (accessToken: string, roleId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/UserProfile/GetUserProfilesForRoleId?roleId=${roleId}`,\r\n accessToken\r\n );\r\n const roleUsers = ((await data.json()) as any).value as IUserProfile[];\r\n if (roleUsers !== undefined) {\r\n return roleUsers;\r\n } else {\r\n return [] as IUserProfile[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/UserProfile/GetUserProfilesForRoleId?roleId=${roleId}`,\r\n err\r\n );\r\n }\r\n return [] as IUserProfile[];\r\n};\r\n\r\nexport default getRoleUsers;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeRoleUser = async (accessToken: string, roleId: number, userId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/RoleUser/Remove?roleId=${roleId}&userId=${userId}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/RoleUser/Remove?roleId=${roleId}&userId=${userId}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeRoleUser;\r\n","import IUserProfile from \"../models/IUserProfile\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveRoleUser = async (\r\n accessToken: string,\r\n roleId: number,\r\n userId: number,\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/RoleUser/Add?roleId=${roleId}&userId=${userId}`,\r\n accessToken\r\n );\r\n const roleUser = ((await data.json()) as any).value as IUserProfile;\r\n return roleUser;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/roleUser/Add?roleId=${roleId}&&userId=${userId}`\r\n );\r\n }\r\n return {} as IUserProfile;\r\n};\r\n\r\nexport default saveRoleUser;\r\n","export const SET_EDIT_ROLE_USERS_LOADED = \"SET_EDIT_ROLE_USERS_LOADED\";\r\n\r\nexport const setEditRoleUsersLoaded = (editRoleUsersLoaded: boolean) => {\r\n return {\r\n editRoleUsersLoaded,\r\n type: SET_EDIT_ROLE_USERS_LOADED\r\n };\r\n};\r\n","import IRole from \"../models/IRole\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getRoles = async (accessToken: string) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Role/GetRoles`,\r\n accessToken\r\n );\r\n const roles = ((await data.json()) as any).value as IRole[];\r\n if (roles !== undefined) {\r\n return roles;\r\n } else {\r\n return [] as IRole[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Role/GetRoles`, err);\r\n }\r\n return [] as IRole[];\r\n};\r\n\r\nexport default getRoles;\r\n","import IRole from \"../models/IRole\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveRole = async (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n currencyCodeId: number,\r\n fyStartMonthId: number,\r\n isEnabled: boolean\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/Role/Add?name=${name}&displayName=${displayName}¤cyCodeId=${currencyCodeId}&fyStartMonthId=${fyStartMonthId}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const role = ((await data.json()) as any).value as IRole;\r\n return role;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Role/Add?name=${name}&displayName=${displayName}¤cyCodeId=${currencyCodeId}&fyStartMonthId=${fyStartMonthId}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IRole;\r\n};\r\n\r\nexport default saveRole;\r\n","import IRole from \"../models/IRole\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedRole = async (\r\n accessToken: string,\r\n role: IRole\r\n) => {\r\n const payload = {\r\n id: role.id,\r\n name: role.name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: role.displayName,\r\n currencyCodeId: role.currencyCodeId,\r\n fyStartMonthId: role.fyStartMonthId,\r\n isEnabled: role.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/Role/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IRole;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Role/Edit`, err);\r\n }\r\n return {} as IRole;\r\n};\r\n\r\nexport default saveUpdatedRole;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeRole = async (accessToken: string, id: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/Role/Remove?id=${id}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/Role/Remove?id=${id}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeRole;\r\n","import * as Redux from \"redux\";\r\nimport getRoles from \"../api/getRoles\";\r\nimport saveRole from \"../api/saveRole\";\r\nimport saveUpdatedRole from \"../api/saveUpdatedRole\";\r\nimport { removeRole as deleteRole } from \"../api/removeRole\";\r\nimport IRole from \"../models/IRole\";\r\nimport { clearEditRoleDetails, setEditRoleDetails } from \"./editRoleDetails\";\r\nimport { setRolesLoaded } from \"./loadingRoles\";\r\nexport const ADD_ROLE = \"ADD_ROLE\";\r\nexport const REMOVE_ROLE = \"REMOVE_ROLE\";\r\nexport const UPDATE_ROLE = \"UPDATE_ROLE\";\r\nexport const LOAD_ROLES = \"LOAD_ROLES\";\r\n\r\nexport const addRole = (role: IRole) => {\r\n return {\r\n role,\r\n type: ADD_ROLE\r\n };\r\n};\r\n\r\nexport const removeRole = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_ROLE\r\n };\r\n};\r\n\r\nexport const updateRole = (role: IRole) => {\r\n return {\r\n role,\r\n type: UPDATE_ROLE\r\n };\r\n};\r\n\r\nexport const loadRoles = (roles: IRole[]) => {\r\n return {\r\n roles,\r\n type: LOAD_ROLES\r\n };\r\n};\r\n\r\nexport const handleSaveRole = (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n currenyCodeId: number,\r\n fyStartMonthId: number,\r\n isEnabled: boolean\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const role = await saveRole(\r\n accessToken,\r\n name,\r\n displayName,\r\n currenyCodeId,\r\n fyStartMonthId,\r\n isEnabled\r\n );\r\n if (role !== null && role !== undefined) {\r\n dispatch(addRole(role));\r\n dispatch(setEditRoleDetails(role));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateRole = (accessToken: string, role: IRole) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const dsh = await saveUpdatedRole(accessToken, role);\r\n if (dsh !== null && dsh !== undefined) {\r\n dispatch(updateRole(role));\r\n dispatch(setEditRoleDetails(role));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteRole = (accessToken: string, id: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteRole(accessToken, id);\r\n if (result === 200) {\r\n dispatch(removeRole(id));\r\n dispatch(clearEditRoleDetails());\r\n }\r\n };\r\n};\r\n\r\nexport const handleLoadRoles = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const roles = await getRoles(accessToken);\r\n if (roles !== undefined) {\r\n if (roles.length > 0) {\r\n roles.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadRoles(roles));\r\n }\r\n dispatch(setRolesLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_ROLES_LOADED = \"SET_ROLES_LOADED\";\r\n\r\nexport const setRolesLoaded = (rolesLoaded: boolean) => {\r\n return {\r\n rolesLoaded,\r\n type: SET_ROLES_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { FormGroup, Input, Label } from \"reactstrap\";\r\nimport ICurrencyCode from \"../../models/ICurrencyCode\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface IAddCurrencyCodeProps {\r\n currencyCodes: ICurrencyCode[];\r\n currencyCodeId: number;\r\n callback: (currencyCodeId: number) => void;\r\n}\r\n\r\nexport interface IAddCurrencyCodeState {\r\n currencyCodeId: number;\r\n}\r\n\r\nclass AddCurrencyCode extends React.Component {\r\n public state = {\r\n currencyCodeId: 1\r\n };\r\n constructor(props: IAddCurrencyCodeProps) {\r\n super(props);\r\n this.currencyCodeIdChange = this.currencyCodeIdChange.bind(this);\r\n }\r\n public currencyCodeIdChange = (e: React.ChangeEvent) => {\r\n const { callback } = this.props;\r\n e.preventDefault();\r\n const currencyCodeId =\r\n e.target.value === undefined ? 1 : Number(e.target.value as string);\r\n this.setState(() => ({ currencyCodeId }));\r\n callback(currencyCodeId);\r\n };\r\n public async componentDidUpdate(prevProps: IAddCurrencyCodeProps) {\r\n const { currencyCodeId } = this.props;\r\n if (\r\n currencyCodeId !== prevProps.currencyCodeId &&\r\n currencyCodeId !== undefined &&\r\n currencyCodeId !== 0\r\n ) {\r\n await this.setState(() => ({ currencyCodeId }));\r\n }\r\n }\r\n public async componentDidMount() {\r\n const { currencyCodeId } = this.props;\r\n if (currencyCodeId !== undefined && currencyCodeId !== 0) {\r\n await this.setState(() => ({ currencyCodeId }));\r\n }\r\n }\r\n public render() {\r\n const { currencyCodes } = this.props;\r\n const { currencyCodeId } = this.state;\r\n return (\r\n \r\n \r\n \r\n {currencyCodes.map(cc => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n return {\r\n callback: ownProps.callback,\r\n currencyCodeId: ownProps.currencyCodeId,\r\n currencyCodes: state.currencyCodes\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(AddCurrencyCode);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { FormGroup, Input, Label } from \"reactstrap\";\r\nimport IFYStartMonth from \"../../models/IFYStartMonth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface IAddFYStartMonthProps {\r\n fyStartMonthId: number;\r\n fyStartMonths: IFYStartMonth[];\r\n callback: (currencyCodeId: number) => void;\r\n}\r\nexport interface IAddFYStartMonthState {\r\n fyStartMonthId: number;\r\n}\r\nclass AddFYStartMonth extends React.Component<\r\n IAddFYStartMonthProps,\r\n IAddFYStartMonthState\r\n> {\r\n public state = {\r\n fyStartMonthId: 1\r\n };\r\n constructor(props: IAddFYStartMonthProps) {\r\n super(props);\r\n this.fyStartMonthIdChange = this.fyStartMonthIdChange.bind(this);\r\n }\r\n public fyStartMonthIdChange = (e: React.ChangeEvent) => {\r\n e.preventDefault();\r\n const { callback } = this.props;\r\n const fyStartMonthId =\r\n e.target.value === undefined ? 1 : Number(e.target.value as string);\r\n this.setState(() => ({ fyStartMonthId }));\r\n callback(fyStartMonthId);\r\n };\r\n public async componentDidUpdate(prevProps: IAddFYStartMonthProps) {\r\n const { fyStartMonthId } = this.props;\r\n if (\r\n fyStartMonthId !== prevProps.fyStartMonthId &&\r\n fyStartMonthId !== undefined &&\r\n fyStartMonthId !== 0\r\n ) {\r\n await this.setState(() => ({ fyStartMonthId }));\r\n }\r\n }\r\n public async componentDidMount() {\r\n const { fyStartMonthId } = this.props;\r\n if (fyStartMonthId !== undefined && fyStartMonthId !== 0) {\r\n await this.setState(() => ({ fyStartMonthId }));\r\n }\r\n }\r\n public render() {\r\n const { fyStartMonths } = this.props;\r\n const { fyStartMonthId } = this.state;\r\n return (\r\n \r\n \r\n \r\n {fyStartMonths.map(fys => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n return {\r\n callback: ownProps.callback,\r\n fyStartMonthId: ownProps.fyStartMonthId,\r\n fyStartMonths: state.fyStartMonths\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(AddFYStartMonth);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Button, Card, CardBody, CardFooter } from \"reactstrap\";\r\nimport CardTitle from \"reactstrap/lib/CardTitle\";\r\nimport { handleSaveRole } from \"../../../actions/roles\";\r\nimport AddCurrencyCode from \"../../../components/molecules/AddCurrencyCode\";\r\nimport AddFYStartMonth from \"../../../components/molecules/AddFYStartMonth\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport IRole from \"../../../models/IRole\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateRoleDisplayName, validateRoleName } from \"../../../utils\";\r\n\r\nexport interface IAddRoleDetailsProps {\r\n accessToken: string;\r\n roles: IRole[];\r\n onHandleSaveRole: (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n currencyCodeId: number,\r\n fyStartMonthId: number,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddRoleDetailsState {\r\n displayName: string;\r\n name: string;\r\n currencyCodeId: number;\r\n fyStartMonthId: number;\r\n}\r\n\r\nclass AddRoleDetails extends React.Component<\r\n IAddRoleDetailsProps,\r\n IAddRoleDetailsState\r\n> {\r\n public state = {\r\n displayName: \"\",\r\n name: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n currencyCodeId: 1,\r\n fyStartMonthId: 1\r\n };\r\n constructor(props: IAddRoleDetailsProps) {\r\n super(props);\r\n this.save = this.save.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n }\r\n public readyToSave = () => {\r\n const { displayName, name } = this.state;\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateRoleDisplayName(displayName)\r\n ) {\r\n return false;\r\n }\r\n if (name === undefined || name === \"\" || !validateRoleName(name)) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n const { accessToken } = this.props;\r\n const { displayName, name, currencyCodeId, fyStartMonthId } = this.state;\r\n // do save\r\n if (this.readyToSave()) {\r\n this.props.onHandleSaveRole(\r\n accessToken,\r\n name,\r\n displayName,\r\n currencyCodeId,\r\n fyStartMonthId,\r\n true\r\n );\r\n }\r\n\r\n // callback and do next\r\n };\r\n public render() {\r\n const { roles } = this.props;\r\n const { displayName, name, currencyCodeId, fyStartMonthId } = this.state;\r\n return (\r\n \r\n Add New Role\r\n \r\n role.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={(dn: string) =>\r\n this.setState(() => ({ displayName: dn }))\r\n }\r\n />\r\n role.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={(n: string) => this.setState(() => ({ name: n }))}\r\n />\r\n \r\n this.setState(() => ({ currencyCodeId: cc }))\r\n }\r\n />\r\n \r\n this.setState(() => ({ fyStartMonthId: fysm }))\r\n }\r\n />\r\n \r\n \r\n {this.readyToSave() && (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n roles: state.roles\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleSaveRole: (\r\n accessToken: string,\r\n name: string,\r\n displayName: string,\r\n currencyCodeId: number,\r\n fyStartMonthId: number,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(\r\n handleSaveRole(\r\n accessToken,\r\n name,\r\n displayName,\r\n currencyCodeId,\r\n fyStartMonthId,\r\n isEnabled\r\n )\r\n );\r\n }\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AddRoleDetails);\r\n","import * as React from \"react\";\r\nimport { Badge, Label } from \"reactstrap\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\n\r\nexport interface IDashboardsBadgeProps {\r\n dashboardIds: number[];\r\n dashboards: IPbiDashboard[];\r\n}\r\n\r\nconst DashboardsBadge = (props: IDashboardsBadgeProps) => {\r\n const { dashboardIds, dashboards } = props;\r\n return (\r\n \r\n \r\n
\r\n {dashboardIds.map(id => (\r\n \r\n {\r\n (dashboards.find(dashboard => dashboard.id === id) as IPbiDashboard)\r\n .displayName\r\n }\r\n \r\n ))}\r\n
\r\n {dashboardIds.length === 0 &&
None
}\r\n
\r\n );\r\n};\r\n\r\nexport default DashboardsBadge;\r\n","import * as React from \"react\";\r\nimport { Card, CardFooter, CardTitle, Spinner } from \"reactstrap\";\r\n\r\nexport interface IDataLoadingProps{\r\n dataTitle?: string;\r\n}\r\n\r\nconst DataLoading:React.SFC = (props:IDataLoadingProps) => {\r\n const {dataTitle} = props;\r\n return (\r\n \r\n {dataTitle===undefined?\"\":dataTitle} {\" \"} Data is loading...please wait...\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DataLoading;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n Col,\r\n Container,\r\n FormGroup,\r\n Input,\r\n Label,\r\n ListGroup,\r\n ListGroupItem,\r\n Row\r\n} from \"reactstrap\";\r\nimport { handleLoadDashboards } from \"../../../actions/dashboards\";\r\nimport {\r\n clearEditRoleDashboardIds,\r\n handleDeleteEditRoleDashboardId,\r\n handleLoadEditRoleDashboardIds,\r\n handleSaveEditRoleDashboardId\r\n} from \"../../../actions/editRoleDashboardIds\";\r\nimport DashboardsBadge from \"../../../components/molecules/DashboardsBadge\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport IPbiDashboard from \"../../../models/IPbiDashboard\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface IAssignRoleDashboardsState {\r\n editRoleDashboardIds: number[];\r\n filteredDashboards: IPbiDashboard[];\r\n}\r\n\r\nexport interface IAssignRoleDashboardsProps {\r\n accessToken: string;\r\n dashboards: IPbiDashboard[];\r\n dashboardsLoaded: boolean;\r\n editRoleDashboardIds: number[];\r\n editRoleDashboardIdsLoaded: boolean;\r\n roleId: number;\r\n onHandleLoadDashboards: (accessToken: string) => void;\r\n onHandleLoadEditRoleDashboardIds: (\r\n accessToken: string,\r\n roleId: number\r\n ) => void;\r\n onClearEditRoleDashboardIds: () => void;\r\n onHandleSaveEditRoleDashboardId: (\r\n accessToken: string,\r\n roleId: number,\r\n dashboardId: number\r\n ) => void;\r\n onHandleDeleteEditRoleDashboardId: (\r\n accessToken: string,\r\n roleId: number,\r\n dashboardId: number\r\n ) => void;\r\n}\r\n\r\nclass AssignRoleDashboards extends React.Component<\r\n IAssignRoleDashboardsProps,\r\n IAssignRoleDashboardsState\r\n> {\r\n public state = {\r\n editRoleDashboardIds: [] as number[],\r\n filteredDashboards: [] as IPbiDashboard[]\r\n };\r\n constructor(props: IAssignRoleDashboardsProps) {\r\n super(props);\r\n this.dashboardCheckboxChange = this.dashboardCheckboxChange.bind(this);\r\n this.txtFilterChange = this.txtFilterChange.bind(this);\r\n }\r\n public txtFilterChange = async (e: React.ChangeEvent) => {\r\n const { dashboards } = this.props;\r\n const filteredDashboards = dashboards.filter(dashboard =>\r\n dashboard.displayName.toLowerCase().includes(e.target.value.toLowerCase())\r\n );\r\n await this.setState(() => ({ filteredDashboards }));\r\n };\r\n public dashboardCheckboxChange = async (\r\n e: React.ChangeEvent\r\n ) => {\r\n const {\r\n accessToken,\r\n roleId,\r\n onHandleSaveEditRoleDashboardId,\r\n onHandleDeleteEditRoleDashboardId\r\n } = this.props;\r\n e.preventDefault();\r\n if (e.target.checked) {\r\n await onHandleSaveEditRoleDashboardId(\r\n accessToken,\r\n roleId,\r\n Number(e.target.value)\r\n );\r\n } else {\r\n await onHandleDeleteEditRoleDashboardId(\r\n accessToken,\r\n roleId,\r\n Number(e.target.value)\r\n );\r\n }\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n dashboards,\r\n dashboardsLoaded,\r\n editRoleDashboardIds,\r\n onHandleLoadDashboards,\r\n onHandleLoadEditRoleDashboardIds,\r\n roleId\r\n } = this.props;\r\n if (!dashboardsLoaded) {\r\n await onHandleLoadDashboards(accessToken);\r\n }\r\n await onHandleLoadEditRoleDashboardIds(accessToken, roleId);\r\n this.setState({ editRoleDashboardIds });\r\n this.setState({ filteredDashboards: dashboards });\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IAssignRoleDashboardsProps) {\r\n const { editRoleDashboardIds, dashboards } = this.props;\r\n if (prevProps.dashboards !== dashboards) {\r\n await this.setState(() => ({ filteredDashboards: dashboards }));\r\n }\r\n if (prevProps.editRoleDashboardIds !== editRoleDashboardIds) {\r\n await this.setState(() => ({ editRoleDashboardIds }));\r\n }\r\n }\r\n\r\n public render() {\r\n const { filteredDashboards, editRoleDashboardIds } = this.state;\r\n const {\r\n dashboards,\r\n dashboardsLoaded,\r\n editRoleDashboardIdsLoaded\r\n } = this.props;\r\n return (\r\n \r\n {!dashboardsLoaded && }\r\n {!editRoleDashboardIdsLoaded && (\r\n \r\n )}\r\n {dashboardsLoaded && editRoleDashboardIdsLoaded && (\r\n \r\n \r\n \r\n

Assign Dashboards

\r\n \r\n
\r\n \r\n \r\n {dashboardsLoaded && (\r\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 {filteredDashboards.map(dashboard => (\r\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\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n const { onSave } = ownProps;\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n dashboards: state.dashboards,\r\n dashboardsLoaded: state.loadingDashboards,\r\n roleId: state.editRoleDetails.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n editRoleDashboardIds: state.editRoleDashboardIds,\r\n editRoleDashboardIdsLoaded: state.loadingEditRoleDashboards,\r\n onSave\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadDashboards: (accessToken: string) => {\r\n dispatch(handleLoadDashboards(accessToken));\r\n },\r\n onHandleLoadEditRoleDashboardIds: (accessToken: string, roleId: number) => {\r\n dispatch(handleLoadEditRoleDashboardIds(accessToken, roleId));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onClearEditRoleDashboardIds: () => {\r\n dispatch(clearEditRoleDashboardIds());\r\n },\r\n onHandleSaveEditRoleDashboardId: (\r\n accessToken: string,\r\n roleId: number,\r\n dashboardId: number\r\n ) => {\r\n dispatch(handleSaveEditRoleDashboardId(accessToken, roleId, dashboardId));\r\n },\r\n onHandleDeleteEditRoleDashboardId: (\r\n accessToken: string,\r\n roleId: number,\r\n dashboardId: number\r\n ) => {\r\n dispatch(handleDeleteEditRoleDashboardId(accessToken, roleId, dashboardId));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AssignRoleDashboards);\r\n","import * as Redux from \"redux\";\r\nimport getRoleDashboards from \"../api/getRoleDashboards\";\r\nimport removeRoleDashboard from \"../api/removeRoleDashboard\";\r\nimport saveRoleDashboard from \"../api/saveRoleDashboard\";\r\nimport { setEditRoleDashboardsLoaded } from \"./loadingEditRoleDashboards\";\r\nexport const ADD_EDIT_ROLE_DASHBOARD_ID = \"ADD_EDIT_ROLE_DASHBOARD_ID\";\r\nexport const REMOVE_EDIT_ROLE_DASHBOARD_ID = \"REMOVE_EDIT_ROLE_DASHBOARD_ID\";\r\nexport const LOAD_EDIT_ROLE_DASHBOARD_IDS = \"LOAD_EDIT_ROLE_DASHBOARD_IDS\";\r\nexport const CLEAR_EDIT_ROLE_DASHBOARD_IDS = \"CLEAR_EDIT_ROLE_DASHBOARD_IDS\";\r\n\r\nexport const addEditRoleDashboardId = (id: number) => {\r\n return {\r\n id,\r\n type: ADD_EDIT_ROLE_DASHBOARD_ID\r\n };\r\n};\r\n\r\nexport const removeEditRoleDashboardId = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_EDIT_ROLE_DASHBOARD_ID\r\n };\r\n};\r\n\r\nexport const loadEditRoleDashboardIds = (ids: number[]) => {\r\n return {\r\n ids,\r\n type: LOAD_EDIT_ROLE_DASHBOARD_IDS\r\n };\r\n};\r\n\r\nexport const clearEditRoleDashboardIds = () => {\r\n return {\r\n type: CLEAR_EDIT_ROLE_DASHBOARD_IDS\r\n };\r\n};\r\n\r\nexport const handleLoadEditRoleDashboardIds = (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const roleDashboards = await getRoleDashboards(accessToken, roleId);\r\n if (roleDashboards === undefined) {\r\n dispatch(clearEditRoleDashboardIds());\r\n dispatch(setEditRoleDashboardsLoaded(false));\r\n } else {\r\n if (roleDashboards.length > 0) {\r\n dispatch(\r\n loadEditRoleDashboardIds(\r\n roleDashboards.map(dashboard => dashboard.id)\r\n )\r\n );\r\n }\r\n dispatch(setEditRoleDashboardsLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveEditRoleDashboardId = (\r\n accessToken: string,\r\n roleId: number,\r\n dashboardId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await saveRoleDashboard(accessToken, roleId, dashboardId);\r\n dispatch(addEditRoleDashboardId(dashboardId));\r\n };\r\n};\r\n\r\nexport const handleDeleteEditRoleDashboardId = (\r\n accessToken: string,\r\n roleId: number,\r\n dashboardId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await removeRoleDashboard(accessToken, roleId, dashboardId);\r\n dispatch(removeEditRoleDashboardId(dashboardId));\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n Button,\r\n Col,\r\n Container,\r\n Form,\r\n FormGroup,\r\n Input,\r\n Row,\r\n Table\r\n} from \"reactstrap\";\r\nimport {\r\n clearEditRolePredicates,\r\n handleDeleteRolePredicate,\r\n handleLoadEditRolePredicates,\r\n handleSaveRolePredicate,\r\n handleUpdateRolePredicate\r\n} from \"../../../actions/editRolePredicates\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport IPredicate from \"../../../models/IPredicate\";\r\nimport IRolePredicate from \"../../../models/IRolePredicate\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface IAssignRolePredicatesState {\r\n activePredicateId: number;\r\n activePredicateValue: string;\r\n editRolePredicates: IRolePredicate[];\r\n}\r\n\r\nexport interface IAssignRolePredicatesProps {\r\n accessToken: string;\r\n editRolePredicates: IRolePredicate[];\r\n editRolePredicatesLoaded: boolean;\r\n predicates: IPredicate[];\r\n predicatesLoaded: boolean;\r\n roleId: number;\r\n onHandleSaveRolePredicate: (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n ) => void;\r\n onHandleUpdateRolePredicate: (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n ) => void;\r\n onHandleLoadRolePredicates: (accessToken: string, roleId: number) => void;\r\n onHandleRemoveRolePredicate: (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n ) => void;\r\n onClearRolePredicates: () => void;\r\n}\r\n\r\nexport class AssignRolePredicates extends React.Component<\r\n IAssignRolePredicatesProps,\r\n IAssignRolePredicatesState\r\n> {\r\n public state = {\r\n activePredicateId: 1,\r\n activePredicateValue: \"\",\r\n editRolePredicates: [] as IRolePredicate[]\r\n };\r\n constructor(props: IAssignRolePredicatesProps) {\r\n super(props);\r\n this.predicateIdChange = this.predicateIdChange.bind(this);\r\n this.predicateValueChange = this.predicateValueChange.bind(this);\r\n this.removeRolePredicate = this.removeRolePredicate.bind(this);\r\n this.onAddClick = this.onAddClick.bind(this);\r\n this.readyToAdd = this.readyToAdd.bind(this);\r\n }\r\n\r\n public predicateIdChange = (e: React.ChangeEvent) => {\r\n e.preventDefault();\r\n const activePredicateId =\r\n e.target.value === undefined ? 1 : Number(e.target.value as string);\r\n this.setState(() => ({ activePredicateId }));\r\n };\r\n\r\n public predicateValueChange = (e: React.ChangeEvent) => {\r\n e.preventDefault();\r\n const activePredicateValue =\r\n e.target.value === undefined ? \"\" : e.target.value;\r\n this.setState(() => ({ activePredicateValue }));\r\n };\r\n\r\n public removeRolePredicate = (predicateId: number) => {\r\n const { accessToken, roleId, onHandleRemoveRolePredicate } = this.props;\r\n onHandleRemoveRolePredicate(accessToken, roleId, predicateId);\r\n };\r\n\r\n public readyToAdd = () => {\r\n const { activePredicateValue } = this.state;\r\n if (activePredicateValue === undefined || activePredicateValue === \"\") {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n public onAddClick = async (e: React.MouseEvent) => {\r\n const {\r\n activePredicateId,\r\n activePredicateValue,\r\n editRolePredicates\r\n } = this.state;\r\n const {\r\n accessToken,\r\n roleId,\r\n onHandleSaveRolePredicate,\r\n onHandleUpdateRolePredicate\r\n } = this.props;\r\n e.preventDefault();\r\n if (this.readyToAdd()) {\r\n const rolePredicate = editRolePredicates.find(\r\n rp => rp.predicateId === activePredicateId\r\n );\r\n if (rolePredicate === undefined) {\r\n onHandleSaveRolePredicate(accessToken, {\r\n roleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId: activePredicateId,\r\n value: activePredicateValue\r\n } as IRolePredicate);\r\n } else {\r\n const updatedValue = rolePredicate.value.concat(\r\n `,${activePredicateValue}`\r\n );\r\n onHandleUpdateRolePredicate(accessToken, {\r\n roleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId: activePredicateId,\r\n value: updatedValue,\r\n isEnabled: rolePredicate.isEnabled\r\n } as IRolePredicate);\r\n }\r\n await this.setState(() => ({\r\n activePredicateId: 1,\r\n activePredicateValue: \"\"\r\n }));\r\n }\r\n };\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n roleId,\r\n onHandleLoadRolePredicates,\r\n onClearRolePredicates,\r\n editRolePredicates\r\n } = this.props;\r\n await onClearRolePredicates();\r\n await onHandleLoadRolePredicates(accessToken, roleId);\r\n await this.setState(() => ({ editRolePredicates }));\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IAssignRolePredicatesProps) {\r\n const { editRolePredicates } = this.props;\r\n if (prevProps.editRolePredicates !== editRolePredicates) {\r\n await this.setState(() => ({ editRolePredicates }));\r\n }\r\n }\r\n\r\n public render() {\r\n const {\r\n predicates,\r\n predicatesLoaded,\r\n editRolePredicatesLoaded\r\n } = this.props;\r\n const {\r\n editRolePredicates,\r\n activePredicateId,\r\n activePredicateValue\r\n } = this.state;\r\n return (\r\n \r\n

Add Predicate Values

\r\n {!predicatesLoaded && }\r\n {!editRolePredicatesLoaded && (\r\n \r\n )}\r\n {predicatesLoaded && editRolePredicatesLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {editRolePredicates.map(sp => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
Predicate NamePredicate ValueActions
\r\n {\r\n (predicates.find(\r\n pred => pred.id === sp.predicateId\r\n ) as IPredicate).displayName\r\n }\r\n \r\n {sp.value.length > 25 ? (\r\n \r\n ) : (\r\n sp.value\r\n )}\r\n \r\n {\r\n this.removeRolePredicate(sp.predicateId);\r\n }}\r\n >\r\n Remove\r\n \r\n
\r\n )}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n {predicates.map(pred => (\r\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\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n editRolePredicates: state.editRolePredicates,\r\n editRolePredicatesLoaded: state.loadingEditRolePredicates,\r\n predicates: state.predicates,\r\n predicatesLoaded: state.loadingPredicates,\r\n roleId: state.editRoleDetails.id\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadRolePredicates: (accessToken: string, roleId: number) => {\r\n dispatch(handleLoadEditRolePredicates(accessToken, roleId));\r\n },\r\n onHandleSaveRolePredicate: (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n ) => {\r\n dispatch(handleSaveRolePredicate(accessToken, rolePredicate));\r\n },\r\n onHandleUpdateRolePredicate: (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n ) => {\r\n dispatch(handleUpdateRolePredicate(accessToken, rolePredicate));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onClearRolePredicates: () => {\r\n dispatch(clearEditRolePredicates());\r\n },\r\n onHandleRemoveRolePredicate: (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n ) => {\r\n dispatch(handleDeleteRolePredicate(accessToken, roleId, predicateId));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AssignRolePredicates);\r\n","import * as React from \"react\";\r\nimport { Badge, Label } from \"reactstrap\";\r\nimport ISqlReport from \"../../models/ISqlReport\";\r\n\r\nexport interface IReportsBadgeProps {\r\n reportIds: number[];\r\n reports: ISqlReport[];\r\n}\r\n\r\nconst ReportsBadge = (props: IReportsBadgeProps) => {\r\n const { reportIds, reports } = props;\r\n return (\r\n \r\n \r\n
\r\n {reportIds.map(id => (\r\n \r\n {(reports.find(report => report.id === id) as ISqlReport).name}\r\n \r\n ))}\r\n
\r\n {reportIds.length === 0 &&
None
}\r\n
\r\n );\r\n};\r\n\r\nexport default ReportsBadge;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n Col,\r\n Container,\r\n FormGroup,\r\n Input,\r\n Label,\r\n ListGroup,\r\n ListGroupItem,\r\n Row\r\n} from \"reactstrap\";\r\nimport {\r\n clearEditRoleReportIds,\r\n handleDeleteEditRoleReportId,\r\n handleLoadEditRoleReportIds,\r\n handleSaveEditRoleReportId\r\n} from \"../../../actions/editRoleReportIds\";\r\nimport { handleLoadReports } from \"../../../actions/reports\";\r\nimport ReportsBadge from \"../../../components/molecules/ReportsBadge\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport ISqlReport from \"../../../models/ISqlReport\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface IAssignRoleReportsState {\r\n editRoleReportIds: number[];\r\n filteredReports: ISqlReport[];\r\n}\r\n\r\nexport interface IAssignRoleReportsProps {\r\n accessToken: string;\r\n reports: ISqlReport[];\r\n reportsLoaded: boolean;\r\n editRoleReportIds: number[];\r\n editRoleReportIdsLoaded: boolean;\r\n roleId: number;\r\n onHandleLoadReports: (accessToken: string) => void;\r\n onHandleLoadEditRoleReportIds: (accessToken: string, roleId: number) => void;\r\n onClearEditRoleReportIds: () => void;\r\n onHandleSaveEditRoleReportId: (\r\n accessToken: string,\r\n roleId: number,\r\n reportId: number\r\n ) => void;\r\n onHandleDeleteEditRoleReportId: (\r\n accessToken: string,\r\n roleId: number,\r\n reportId: number\r\n ) => void;\r\n}\r\n\r\nclass AssignRoleReports extends React.Component<\r\n IAssignRoleReportsProps,\r\n IAssignRoleReportsState\r\n> {\r\n public state = {\r\n editRoleReportIds: [] as number[],\r\n filteredReports: [] as ISqlReport[]\r\n };\r\n constructor(props: IAssignRoleReportsProps) {\r\n super(props);\r\n this.reportCheckboxChange = this.reportCheckboxChange.bind(this);\r\n this.txtFilterChange = this.txtFilterChange.bind(this);\r\n }\r\n public txtFilterChange = async (e: React.ChangeEvent) => {\r\n const { reports } = this.props;\r\n const filteredReports = reports.filter(report =>\r\n report.displayName.toLowerCase().includes(e.target.value.toLowerCase())\r\n );\r\n await this.setState(() => ({ filteredReports }));\r\n };\r\n public reportCheckboxChange = async (\r\n e: React.ChangeEvent\r\n ) => {\r\n const {\r\n accessToken,\r\n roleId,\r\n onHandleSaveEditRoleReportId,\r\n onHandleDeleteEditRoleReportId\r\n } = this.props;\r\n e.preventDefault();\r\n if (e.target.checked) {\r\n await onHandleSaveEditRoleReportId(\r\n accessToken,\r\n roleId,\r\n Number(e.target.value)\r\n );\r\n } else {\r\n await onHandleDeleteEditRoleReportId(\r\n accessToken,\r\n roleId,\r\n Number(e.target.value)\r\n );\r\n }\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n reports,\r\n reportsLoaded,\r\n editRoleReportIds,\r\n onHandleLoadReports,\r\n onHandleLoadEditRoleReportIds,\r\n roleId\r\n } = this.props;\r\n if (!reportsLoaded) {\r\n await onHandleLoadReports(accessToken);\r\n }\r\n await onHandleLoadEditRoleReportIds(accessToken, roleId);\r\n this.setState({ editRoleReportIds });\r\n this.setState({ filteredReports: reports });\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IAssignRoleReportsProps) {\r\n const { editRoleReportIds, reports } = this.props;\r\n if (prevProps.reports !== reports) {\r\n await this.setState(() => ({ filteredReports: reports }));\r\n }\r\n if (prevProps.editRoleReportIds !== editRoleReportIds) {\r\n await this.setState(() => ({ editRoleReportIds }));\r\n }\r\n }\r\n\r\n public render() {\r\n const { filteredReports, editRoleReportIds } = this.state;\r\n const { reports, reportsLoaded, editRoleReportIdsLoaded } = this.props;\r\n return (\r\n \r\n {!reportsLoaded && }\r\n {!editRoleReportIdsLoaded && }\r\n {reportsLoaded && editRoleReportIdsLoaded && (\r\n \r\n \r\n \r\n

Assign Reports

\r\n \r\n
\r\n \r\n \r\n {reportsLoaded && (\r\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 {filteredReports.map(report => (\r\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\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n const { onSave } = ownProps;\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n reports: state.reports,\r\n reportsLoaded: state.loadingReports,\r\n roleId: state.editRoleDetails.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n editRoleReportIds: state.editRoleReportIds,\r\n editRoleReportIdsLoaded: state.loadingEditRoleReports,\r\n onSave\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadReports: (accessToken: string) => {\r\n dispatch(handleLoadReports(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleLoadEditRoleReportIds: (accessToken: string, roleId: number) => {\r\n dispatch(handleLoadEditRoleReportIds(accessToken, roleId));\r\n },\r\n onClearEditRoleReportIds: () => {\r\n dispatch(clearEditRoleReportIds());\r\n },\r\n onHandleSaveEditRoleReportId: (\r\n accessToken: string,\r\n roleId: number,\r\n reportId: number\r\n ) => {\r\n dispatch(handleSaveEditRoleReportId(accessToken, roleId, reportId));\r\n },\r\n onHandleDeleteEditRoleReportId: (\r\n accessToken: string,\r\n roleId: number,\r\n reportId: number\r\n ) => {\r\n dispatch(handleDeleteEditRoleReportId(accessToken, roleId, reportId));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AssignRoleReports);\r\n","import * as Redux from \"redux\";\r\nimport getRoleReports from \"../api/getRoleReports\";\r\nimport removeRoleReport from \"../api/removeRoleReport\";\r\nimport saveRoleReport from \"../api/saveRoleReport\";\r\nimport { setEditRoleReportsLoaded } from \"./loadingEditRoleReports\";\r\nexport const ADD_EDIT_ROLE_REPORT_ID = \"ADD_EDIT_ROLE_REPORT_ID\";\r\nexport const REMOVE_EDIT_ROLE_REPORT_ID = \"REMOVE_EDIT_ROLE_REPORT_ID\";\r\nexport const LOAD_EDIT_ROLE_REPORT_IDS = \"LOAD_EDIT_ROLE_REPORT_IDS\";\r\nexport const CLEAR_EDIT_ROLE_REPORT_IDS = \"CLEAR_EDIT_ROLE_REPORT_IDS\";\r\n\r\nexport const addEditRoleReportId = (id: number) => {\r\n return {\r\n id,\r\n type: ADD_EDIT_ROLE_REPORT_ID\r\n };\r\n};\r\n\r\nexport const removeEditRoleReportId = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_EDIT_ROLE_REPORT_ID\r\n };\r\n};\r\n\r\nexport const loadEditRoleReportIds = (ids: number[]) => {\r\n return {\r\n ids,\r\n type: LOAD_EDIT_ROLE_REPORT_IDS\r\n };\r\n};\r\n\r\nexport const clearEditRoleReportIds = () => {\r\n return {\r\n type: CLEAR_EDIT_ROLE_REPORT_IDS\r\n };\r\n};\r\n\r\nexport const handleLoadEditRoleReportIds = (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const roleReports = await getRoleReports(accessToken, roleId);\r\n if (roleReports === undefined) {\r\n dispatch(clearEditRoleReportIds());\r\n dispatch(setEditRoleReportsLoaded(false));\r\n } else {\r\n if (roleReports.length > 0) {\r\n dispatch(loadEditRoleReportIds(roleReports.map(report => report.id)));\r\n }\r\n dispatch(setEditRoleReportsLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveEditRoleReportId = (\r\n accessToken: string,\r\n roleId: number,\r\n reportId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await saveRoleReport(accessToken, roleId, reportId);\r\n dispatch(addEditRoleReportId(reportId));\r\n };\r\n};\r\n\r\nexport const handleDeleteEditRoleReportId = (\r\n accessToken: string,\r\n roleId: number,\r\n reportId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await removeRoleReport(accessToken, roleId, reportId);\r\n dispatch(removeEditRoleReportId(reportId));\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { Badge, Label } from \"reactstrap\";\r\nimport IUserProfile from \"../../models/IUserProfile\";\r\n\r\nexport interface IUsersBadgeProps {\r\n userIds: number[];\r\n users: IUserProfile[];\r\n}\r\n\r\nconst UsersBadge = (props: IUsersBadgeProps) => {\r\n const { userIds, users } = props;\r\n return (\r\n \r\n \r\n
\r\n {users.length > 0 &&\r\n userIds.map(id => (\r\n \r\n {\r\n (users.find(user => user.id === id) as IUserProfile)\r\n .emailAddress\r\n }\r\n \r\n ))}\r\n
\r\n {userIds.length === 0 &&
None
}\r\n
\r\n );\r\n};\r\n\r\nexport default UsersBadge;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n Col,\r\n Container,\r\n FormGroup,\r\n Input,\r\n Label,\r\n ListGroup,\r\n ListGroupItem,\r\n Row\r\n} from \"reactstrap\";\r\nimport {\r\n clearEditRoleUserIds,\r\n handleDeleteEditRoleUserId,\r\n handleLoadEditRoleUserIds,\r\n handleSaveEditRoleUserId\r\n} from \"../../../actions/editRoleUserIds\";\r\nimport { handleLoadUserProfiles } from \"../../../actions/profiles\";\r\nimport UsersBadge from \"../../../components/molecules/UsersBadge\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport IUserProfile from \"../../../models/IUserProfile\";\r\n\r\nexport interface IAssignRoleUsersState {\r\n editRoleUserIds: number[];\r\n filteredUsers: IUserProfile[];\r\n}\r\n\r\nexport interface IAssignRoleUsersProps {\r\n accessToken: string;\r\n users: IUserProfile[];\r\n usersLoaded: boolean;\r\n editRoleUserIds: number[];\r\n editRoleUserIdsLoaded: boolean;\r\n roleId: number;\r\n onHandleLoadUsers: (accessToken: string) => void;\r\n onHandleLoadEditRoleUserIds: (accessToken: string, roleId: number) => void;\r\n onClearEditRoleUserIds: () => void;\r\n onHandleSaveEditRoleUserId: (\r\n accessToken: string,\r\n roleId: number,\r\n userId: number\r\n ) => void;\r\n onHandleDeleteEditRoleUserId: (\r\n accessToken: string,\r\n roleId: number,\r\n userId: number\r\n ) => void;\r\n}\r\n\r\nclass AssignRoleUsers extends React.Component<\r\n IAssignRoleUsersProps,\r\n IAssignRoleUsersState\r\n> {\r\n public state = {\r\n editRoleUserIds: [] as number[],\r\n filteredUsers: [] as IUserProfile[]\r\n };\r\n constructor(props: IAssignRoleUsersProps) {\r\n super(props);\r\n this.userCheckboxChange = this.userCheckboxChange.bind(this);\r\n this.txtFilterChange = this.txtFilterChange.bind(this);\r\n }\r\n public txtFilterChange = async (e: React.ChangeEvent) => {\r\n const { users } = this.props;\r\n const filteredUsers = users.filter(user =>\r\n user.emailAddress.toLowerCase().includes(e.target.value.toLowerCase())\r\n );\r\n await this.setState(() => ({ filteredUsers }));\r\n };\r\n public userCheckboxChange = async (\r\n e: React.ChangeEvent\r\n ) => {\r\n const {\r\n accessToken,\r\n roleId,\r\n onHandleSaveEditRoleUserId,\r\n onHandleDeleteEditRoleUserId\r\n } = this.props;\r\n e.preventDefault();\r\n if (e.target.checked) {\r\n await onHandleSaveEditRoleUserId(\r\n accessToken,\r\n roleId,\r\n Number(e.target.value)\r\n );\r\n } else {\r\n await onHandleDeleteEditRoleUserId(\r\n accessToken,\r\n roleId,\r\n Number(e.target.value)\r\n );\r\n }\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n users,\r\n usersLoaded,\r\n editRoleUserIds,\r\n onHandleLoadUsers,\r\n onHandleLoadEditRoleUserIds,\r\n roleId\r\n } = this.props;\r\n if (!usersLoaded) {\r\n await onHandleLoadUsers(accessToken);\r\n }\r\n await onHandleLoadEditRoleUserIds(accessToken, roleId);\r\n this.setState({ editRoleUserIds });\r\n this.setState({ filteredUsers: users });\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IAssignRoleUsersProps) {\r\n const { editRoleUserIds, users } = this.props;\r\n if (prevProps.users !== users) {\r\n await this.setState(() => ({ filteredUsers: users }));\r\n }\r\n if (prevProps.editRoleUserIds !== editRoleUserIds) {\r\n await this.setState(() => ({ editRoleUserIds }));\r\n }\r\n }\r\n\r\n public render() {\r\n const { filteredUsers, editRoleUserIds } = this.state;\r\n const { users, usersLoaded, editRoleUserIdsLoaded } = this.props;\r\n return (\r\n \r\n {!usersLoaded && }\r\n {!editRoleUserIdsLoaded && }\r\n {usersLoaded && editRoleUserIdsLoaded && (\r\n \r\n \r\n \r\n

Assign Users

\r\n \r\n
\r\n \r\n \r\n {usersLoaded && (\r\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 {filteredUsers.map(user => (\r\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\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n const { onSave } = ownProps;\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n users: state.profiles,\r\n usersLoaded: state.loadingUsers,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n roleId: state.editRoleDetails.id,\r\n editRoleUserIds: state.editRoleUserIds,\r\n editRoleUserIdsLoaded: state.loadingEditRoleUsers,\r\n onSave\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadUsers: (accessToken: string) => {\r\n dispatch(handleLoadUserProfiles(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleLoadEditRoleUserIds: (accessToken: string, roleId: number) => {\r\n dispatch(handleLoadEditRoleUserIds(accessToken, roleId));\r\n },\r\n onClearEditRoleUserIds: () => {\r\n dispatch(clearEditRoleUserIds());\r\n },\r\n onHandleSaveEditRoleUserId: (\r\n accessToken: string,\r\n roleId: number,\r\n userId: number\r\n ) => {\r\n dispatch(handleSaveEditRoleUserId(accessToken, roleId, userId));\r\n },\r\n onHandleDeleteEditRoleUserId: (\r\n accessToken: string,\r\n roleId: number,\r\n userId: number\r\n ) => {\r\n dispatch(handleDeleteEditRoleUserId(accessToken, roleId, userId));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AssignRoleUsers);\r\n","import * as Redux from \"redux\";\r\nimport getRoleUsers from \"../api/getRoleUsers\";\r\nimport removeRoleUser from \"../api/removeRoleUser\";\r\nimport saveRoleUser from \"../api/saveRoleUser\";\r\nimport { setEditRoleUsersLoaded } from \"./loadingEditRoleUsers\";\r\nexport const ADD_EDIT_ROLE_USER_ID = \"ADD_EDIT_ROLE_USER_ID\";\r\nexport const REMOVE_EDIT_ROLE_USER_ID = \"REMOVE_EDIT_ROLE_USER_ID\";\r\nexport const LOAD_EDIT_ROLE_USER_IDS = \"LOAD_EDIT_ROLE_USER_IDS\";\r\nexport const CLEAR_EDIT_ROLE_USER_IDS = \"CLEAR_EDIT_ROLE_USER_IDS\";\r\n\r\nexport const addEditRoleUserId = (id: number) => {\r\n return {\r\n id,\r\n type: ADD_EDIT_ROLE_USER_ID\r\n };\r\n};\r\n\r\nexport const removeEditRoleUserId = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_EDIT_ROLE_USER_ID\r\n };\r\n};\r\n\r\nexport const loadEditRoleUserIds = (ids: number[]) => {\r\n return {\r\n ids,\r\n type: LOAD_EDIT_ROLE_USER_IDS\r\n };\r\n};\r\n\r\nexport const clearEditRoleUserIds = () => {\r\n return {\r\n type: CLEAR_EDIT_ROLE_USER_IDS\r\n };\r\n};\r\n\r\nexport const handleLoadEditRoleUserIds = (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const roleUsers = await getRoleUsers(accessToken, roleId);\r\n if (roleUsers === undefined) {\r\n dispatch(clearEditRoleUserIds());\r\n dispatch(setEditRoleUsersLoaded(false));\r\n } else {\r\n if (roleUsers.length > 0) {\r\n dispatch(loadEditRoleUserIds(roleUsers.map(user => user.id)));\r\n }\r\n dispatch(setEditRoleUsersLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveEditRoleUserId = (\r\n accessToken: string,\r\n roleId: number,\r\n userId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await saveRoleUser(accessToken, roleId, userId);\r\n dispatch(addEditRoleUserId(userId));\r\n };\r\n};\r\n\r\nexport const handleDeleteEditRoleUserId = (\r\n accessToken: string,\r\n roleId: number,\r\n userId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await removeRoleUser(accessToken, roleId, userId);\r\n dispatch(removeEditRoleUserId(userId));\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Input, Table } from \"reactstrap\";\r\nimport { settings } from \"../../constants\";\r\nimport ICurrencyCode from \"../../models/ICurrencyCode\";\r\nimport IFYStartMonth from \"../../models/IFYStartMonth\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface IRoleDetailsTableProps {\r\n role: IRole;\r\n currencyCodes: ICurrencyCode[];\r\n fyStartMonths: IFYStartMonth[];\r\n}\r\n\r\nconst RoleDetailsTable: React.SFC = (\r\n props: IRoleDetailsTableProps\r\n) => {\r\n const { currencyCodes, fyStartMonths, role } = props;\r\n const { displayName, name, currencyCodeId, fyStartMonthId, isEnabled } = role;\r\n const { allowDisableRoles } = settings;\r\n return (\r\n \r\n {/* \r\n \r\n \r\n \r\n \r\n */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {allowDisableRoles && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
FieldValue
Display Name {displayName}
Name {name}
Currency\r\n {\" \"}\r\n {\r\n (currencyCodes.find(\r\n cc => cc.id === currencyCodeId\r\n ) as ICurrencyCode).code\r\n }\r\n
Financial Year Start Month\r\n {\r\n (fyStartMonths.find(\r\n fys => fys.id === fyStartMonthId\r\n ) as IFYStartMonth).name\r\n }\r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n currencyCodes: state.currencyCodes,\r\n fyStartMonths: state.fyStartMonths\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(RoleDetailsTable);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n Input,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n Table\r\n} from \"reactstrap\";\r\nimport { handleDeleteRole, handleUpdateRole } from \"../../../actions/roles\";\r\nimport AddCurrencyCode from \"../../../components/molecules/AddCurrencyCode\";\r\nimport AddFYStartMonth from \"../../../components/molecules/AddFYStartMonth\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport RoleDetailsTable from \"../../../components/molecules/RoleDetailsTable\";\r\nimport paths, { settings } from \"../../../constants\";\r\nimport IRole from \"../../../models/IRole\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { validateRoleDisplayName, validateRoleName } from \"../../../utils\";\r\n\r\nexport interface IEditRoleDetailsProps extends RouteComponentProps {\r\n accessToken: string;\r\n role: IRole;\r\n existingRoles: IRole[];\r\n onHandleUpdateRole: (accessToken: string, role: IRole) => void;\r\n onHandleDeleteRole: (accessToken: string, id: number) => void;\r\n}\r\n\r\nexport interface IEditRoleDetailsState {\r\n editModeOn: boolean;\r\n displayName: string;\r\n name: string;\r\n currencyCodeId: number;\r\n fyStartMonthId: number;\r\n isEnabled: boolean;\r\n showDeleteModal: boolean;\r\n}\r\n\r\nclass EditRoleDetails extends React.Component<\r\n IEditRoleDetailsProps,\r\n IEditRoleDetailsState\r\n> {\r\n public state = {\r\n editModeOn: false,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: this.props.role.displayName,\r\n name: this.props.role.name,\r\n currencyCodeId: this.props.role.currencyCodeId,\r\n fyStartMonthId: this.props.role.fyStartMonthId,\r\n isEnabled: true,\r\n showDeleteModal: false\r\n };\r\n constructor(props: IEditRoleDetailsProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n this.toggleDeleteModal = this.toggleDeleteModal.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n public toggleEdit() {\r\n this.setState({ editModeOn: !this.state.editModeOn });\r\n }\r\n public toggleDeleteModal() {\r\n this.setState({ showDeleteModal: !this.state.showDeleteModal });\r\n }\r\n public delete = (e: React.MouseEvent) => {\r\n const { history, accessToken, role, onHandleDeleteRole } = this.props;\r\n // do delete\r\n onHandleDeleteRole(accessToken, role.id);\r\n history.push(paths.home);\r\n };\r\n public readyToSave = () => {\r\n const { displayName, name } = this.state;\r\n if (\r\n displayName === undefined ||\r\n displayName === \"\" ||\r\n !validateRoleDisplayName(displayName)\r\n ) {\r\n return false;\r\n }\r\n if (name === undefined || name === \"\" || !validateRoleName(name)) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n const { accessToken, role, onHandleUpdateRole } = this.props;\r\n const {\r\n displayName,\r\n name,\r\n currencyCodeId,\r\n fyStartMonthId,\r\n isEnabled\r\n } = this.state;\r\n if (this.readyToSave()) {\r\n // do save\r\n onHandleUpdateRole(accessToken, {\r\n id: role.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName,\r\n name,\r\n currencyCodeId,\r\n fyStartMonthId,\r\n isEnabled\r\n } as IRole);\r\n }\r\n this.toggleEdit();\r\n };\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public render() {\r\n const { allowDisableRoles } = settings;\r\n const { role, existingRoles } = this.props;\r\n const {\r\n editModeOn,\r\n displayName,\r\n name,\r\n currencyCodeId,\r\n fyStartMonthId,\r\n isEnabled\r\n } = this.state;\r\n return (\r\n \r\n \r\n \r\n Delete Role: {displayName}\r\n \r\n \r\n Are you sure you want to delete Role: {displayName}{\" \"}\r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {!editModeOn && }\r\n {editModeOn && (\r\n \r\n r.displayName)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={(dn: string) =>\r\n this.setState(() => ({ displayName: dn }))\r\n }\r\n />\r\n r.name)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={(n: string) => this.setState(() => ({ name: n }))}\r\n />\r\n \r\n this.setState(() => ({ currencyCodeId: cc }))\r\n }\r\n />\r\n \r\n this.setState(() => ({ fyStartMonthId: fysm }))\r\n }\r\n />\r\n {allowDisableRoles && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n )}\r\n \r\n {!editModeOn && (\r\n \r\n \r\n Edit\r\n \r\n \r\n Delete Role\r\n \r\n \r\n )}\r\n {editModeOn && (\r\n \r\n {this.readyToSave() && (\r\n \r\n Save Changes\r\n \r\n )}\r\n \r\n Cancel\r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingRoles: state.roles.filter(\r\n role => role.id !== state.editRoleDetails.id\r\n ),\r\n role: state.editRoleDetails\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleUpdateRole: (accessToken: string, role: IRole) => {\r\n dispatch(handleUpdateRole(accessToken, role));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleDeleteRole: (accessToken: string, id: number) => {\r\n dispatch(handleDeleteRole(accessToken, id));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EditRoleDetails);\r\n","import * as React from \"react\";\r\nimport { Table } from \"reactstrap\";\r\nimport IPredicate from \"../../models/IPredicate\";\r\nimport IRolePredicate from \"../../models/IRolePredicate\";\r\n\r\nexport interface IRolePredicatesTableProps {\r\n rolePredicates: IRolePredicate[];\r\n predicates: IPredicate[];\r\n}\r\n\r\nconst RolePredicatesTable: React.SFC = (\r\n props: IRolePredicatesTableProps\r\n) => {\r\n const { predicates, rolePredicates } = props;\r\n return (\r\n \r\n {rolePredicates.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {rolePredicates.map(sp => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
Predicate NamePredicate Value
{(predicates.find(predicate=>predicate.id===sp.predicateId) as IPredicate).name}\r\n {sp.value.length > 25 ? (\r\n \r\n ) : (\r\n sp.value\r\n )}\r\n
\r\n )}\r\n {rolePredicates.length === 0 &&
None defined
}\r\n
\r\n );\r\n};\r\n\r\nexport default RolePredicatesTable;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Card, CardBody, CardFooter, CardTitle } from \"reactstrap\";\r\nimport DashboardsBadge from \"../../../components/molecules/DashboardsBadge\";\r\nimport ReportsBadge from \"../../../components/molecules/ReportsBadge\";\r\nimport RoleDetailsTable from \"../../../components/molecules/RoleDetailsTable\";\r\nimport RolePredicatesTable from \"../../../components/molecules/RolePredicatesTable\";\r\nimport UsersBadge from \"../../../components/molecules/UsersBadge\";\r\nimport paths from \"../../../constants\";\r\nimport IPbiDashboard from \"../../../models/IPbiDashboard\";\r\nimport IPredicate from \"../../../models/IPredicate\";\r\nimport IRole from \"../../../models/IRole\";\r\nimport IRolePredicate from \"../../../models/IRolePredicate\";\r\nimport ISqlReport from \"../../../models/ISqlReport\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport IUserProfile from \"../../../models/IUserProfile\";\r\n\r\nexport interface IRoleSummaryState {\r\n activeEditRoleUsers: IUserProfile[];\r\n}\r\n\r\nexport interface IRoleSummaryProps extends RouteComponentProps {\r\n role: IRole;\r\n dashboards: IPbiDashboard[];\r\n dashboardIds: number[];\r\n reports: ISqlReport[];\r\n reportIds: number[];\r\n users: IUserProfile[];\r\n userIds: number[];\r\n predicates: IPredicate[];\r\n rolePredicates: IRolePredicate[];\r\n}\r\n\r\nclass RoleSummary extends React.Component {\r\n public render() {\r\n const {\r\n history,\r\n role,\r\n predicates,\r\n rolePredicates,\r\n dashboards,\r\n dashboardIds,\r\n reports,\r\n reportIds,\r\n users,\r\n userIds\r\n } = this.props;\r\n return (\r\n \r\n Review and Complete\r\n \r\n

Role Details:

\r\n \r\n

Role Predicates:

\r\n {\" \"}\r\n
\r\n

Role Dashboards

\r\n \r\n

Role Reports

\r\n \r\n

Role Users

\r\n \r\n
\r\n \r\n ) =>\r\n history.push(paths.home)\r\n }\r\n >\r\n Complete\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n return {\r\n users: state.profiles,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n userIds: state.editRoleUserIds,\r\n role: state.editRoleDetails,\r\n reports: state.reports,\r\n reportIds: state.editRoleReportIds,\r\n dashboards: state.dashboards,\r\n dashboardIds: state.editRoleDashboardIds,\r\n predicates: state.predicates,\r\n rolePredicates: state.editRolePredicates\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(RoleSummary);\r\n","import * as React from \"react\";\r\nimport { Progress } from \"reactstrap\";\r\nimport { roleWizardStages } from \"../../constants\";\r\n\r\nexport interface IRoleWizardProgressProps {\r\n currentStage: number;\r\n}\r\nconst RoleWizardProgress: React.SFC = (\r\n props: IRoleWizardProgressProps\r\n) => {\r\n const { currentStage } = props;\r\n return (\r\n \r\n {currentStage >= roleWizardStages.addInitialRoleDetails && (\r\n \r\n {currentStage === roleWizardStages.addInitialRoleDetails && (\r\n Initial Role Details\r\n )}\r\n \r\n )}\r\n {currentStage >= roleWizardStages.addPredicateParameters && (\r\n \r\n {currentStage === roleWizardStages.addPredicateParameters && (\r\n Add Predicate Values\r\n )}\r\n \r\n )}\r\n {currentStage >= roleWizardStages.assignDashboards && (\r\n \r\n {currentStage === roleWizardStages.assignDashboards && (\r\n Assign Dashboards\r\n )}\r\n \r\n )}\r\n {currentStage >= roleWizardStages.assignReports && (\r\n \r\n {currentStage === roleWizardStages.assignReports && Assign Reports}\r\n \r\n )}\r\n {currentStage >= roleWizardStages.assignUsers && (\r\n \r\n {currentStage === roleWizardStages.assignUsers && Assign Users}\r\n \r\n )}\r\n {currentStage >= roleWizardStages.reviewAndComplete && (\r\n \r\n {currentStage === roleWizardStages.reviewAndComplete && (\r\n Review and Complete\r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default RoleWizardProgress;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Card, CardBody, Col, Container, Row } from \"reactstrap\";\r\nimport { clearEditRoleDashboardIds } from \"../../../actions/editRoleDashboardIds\";\r\nimport {\r\n clearEditRoleDetails,\r\n setEditRoleDetails\r\n} from \"../../../actions/editRoleDetails\";\r\nimport { clearEditRolePredicates } from \"../../../actions/editRolePredicates\";\r\nimport { clearEditRoleReportIds } from \"../../../actions/editRoleReportIds\";\r\nimport { clearEditRoleUserIds } from \"../../../actions/editRoleUserIds\";\r\nimport { handleLoadRoles } from \"../../../actions/roles\";\r\nimport AddRoleDetails from \"../../../components/templates/admin/AddRoleDetails\";\r\nimport AssignRoleDashboards from \"../../../components/templates/admin/AssignRoleDashboards\";\r\nimport AssignRolePredicates from \"../../../components/templates/admin/AssignRolePredicates\";\r\nimport AssignRoleReports from \"../../../components/templates/admin/AssignRoleReports\";\r\nimport AssignRoleUsers from \"../../../components/templates/admin/AssignRoleUsers\";\r\nimport EditRoleDetails from \"../../../components/templates/admin/EditRoleDetails\";\r\nimport RoleSummary from \"../../../components/templates/admin/RoleSummary\";\r\nimport paths, { roleWizardStages } from \"../../../constants\";\r\nimport IRole from \"../../../models/IRole\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport RoleWizardProgress from \"../../molecules/RoleWizardProgress\";\r\n\r\nexport interface IRoleWizardPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n roles: IRole[];\r\n roleId: number;\r\n onHandleLoadEditRole: (role: IRole) => void;\r\n onHandleLoadRoles: (accessToken: string) => void;\r\n onHandleClearEditRole: () => void;\r\n onHandleClearEditDashboards: () => void;\r\n onHandleClearEditReports: () => void;\r\n onHandleClearEditUsers: () => void;\r\n onHandleClearEditPredicates: () => void;\r\n}\r\n\r\nexport interface IRoleWizardPageState {\r\n currentStage: number;\r\n role: IRole;\r\n}\r\n\r\nclass RoleWizardPage extends React.Component<\r\n IRoleWizardPageProps,\r\n IRoleWizardPageState\r\n> {\r\n public state = {\r\n currentStage: 0,\r\n role: {\r\n id: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n name: \"\",\r\n currencyCodeId: 1,\r\n fyStartMonthId: 1\r\n } as IRole\r\n };\r\n constructor(props: IRoleWizardPageProps) {\r\n super(props);\r\n this.incrementStage = this.incrementStage.bind(this);\r\n this.decrementStage = this.decrementStage.bind(this);\r\n this.renderCurrentStage = this.renderCurrentStage.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n }\r\n\r\n public incrementStage = (e: React.MouseEvent) => {\r\n const { currentStage } = this.state;\r\n this.setState(() => ({ currentStage: currentStage + 1 }));\r\n };\r\n\r\n public decrementStage = (e: React.MouseEvent) => {\r\n const { currentStage } = this.state;\r\n this.setState(() => ({ currentStage: currentStage - 1 }));\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public renderCurrentStage = (currentStage: number) => {\r\n switch (currentStage) {\r\n case roleWizardStages.addInitialRoleDetails:\r\n if (this.state.role.id === 0) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n\r\n case roleWizardStages.addPredicateParameters:\r\n return ;\r\n case roleWizardStages.assignDashboards:\r\n return ;\r\n case roleWizardStages.assignReports:\r\n return ;\r\n case roleWizardStages.assignUsers:\r\n return ;\r\n case roleWizardStages.reviewAndComplete:\r\n return ;\r\n default:\r\n return (\r\n \r\n Not sure what stage we're at\r\n \r\n );\r\n }\r\n };\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n roles,\r\n onHandleLoadRoles,\r\n onHandleLoadEditRole,\r\n onHandleClearEditRole,\r\n roleId\r\n } = this.props;\r\n if (roles.length === 0) {\r\n await onHandleLoadRoles(accessToken);\r\n }\r\n if (roleId !== 0) {\r\n const role = roles.find(r => r.id === roleId);\r\n if (role !== undefined) {\r\n this.setState(() => ({ role }));\r\n await onHandleLoadEditRole(role);\r\n }\r\n } else {\r\n await onHandleClearEditRole();\r\n this.setState(() => ({\r\n role: {\r\n id: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n name: \"\",\r\n currencyCodeId: 1,\r\n fyStartMonthId: 1\r\n } as IRole\r\n }));\r\n }\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IRoleWizardPageProps) {\r\n const {\r\n roleId,\r\n onHandleLoadEditRole,\r\n onHandleClearEditRole,\r\n roles\r\n } = this.props;\r\n if (roleId !== prevProps.roleId) {\r\n if (roleId !== 0) {\r\n const role = roles.find(r => r.id === roleId);\r\n if (role !== undefined) {\r\n this.setState(() => ({ role }));\r\n await onHandleLoadEditRole(role);\r\n } else {\r\n await onHandleClearEditRole();\r\n }\r\n } else {\r\n await onHandleClearEditRole();\r\n this.setState(() => ({\r\n role: {\r\n id: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n name: \"\",\r\n currencyCodeId: 1,\r\n fyStartMonthId: 1\r\n } as IRole\r\n }));\r\n }\r\n }\r\n }\r\n public componentWillUnmount() {\r\n this.props.onHandleClearEditRole();\r\n this.props.onHandleClearEditReports();\r\n this.props.onHandleClearEditDashboards();\r\n this.props.onHandleClearEditUsers();\r\n this.props.onHandleClearEditPredicates();\r\n this.setState(() => ({\r\n role: {\r\n id: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n name: \"\",\r\n currencyCodeId: 1,\r\n fyStartMonthId: 1\r\n } as IRole\r\n }));\r\n }\r\n public render() {\r\n const { currentStage } = this.state;\r\n const { roles, roleId } = this.props;\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n Client Role Wizard{\" \"}\r\n {(roles.find(role => role.id === roleId) as IRole) === undefined\r\n ? \"\"\r\n : \": \" +\r\n (roles.find(role => role.id === roleId) as IRole)\r\n .displayName}\r\n

\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {currentStage > roleWizardStages.addInitialRoleDetails && (\r\n \r\n Previous\r\n \r\n )}\r\n {currentStage < roleWizardStages.reviewAndComplete && (\r\n \r\n {this.props.roleId !== 0 && (\r\n \r\n Next\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* */}\r\n \r\n \r\n \r\n {this.renderCurrentStage(currentStage)}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n const roleId =\r\n (match.params as any).id !== undefined\r\n ? parseInt((match.params as any).id as string, 10) // we're editing an existing role\r\n : // we're adding a new role\r\n state.editRoleDetails.id === undefined\r\n ? 0 // we haven't saved the role yet so not yet in store\r\n : state.editRoleDetails.id;\r\n\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n roleId,\r\n roles: state.roles\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadEditRole: (role: IRole) => {\r\n dispatch(setEditRoleDetails(role));\r\n },\r\n onHandleLoadRoles: (accessToken: string) => {\r\n dispatch(handleLoadRoles(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleClearEditRole: () => {\r\n dispatch(clearEditRoleDetails());\r\n },\r\n onHandleClearEditDashboards: () => {\r\n dispatch(clearEditRoleDashboardIds());\r\n },\r\n onHandleClearEditReports: () => {\r\n dispatch(clearEditRoleReportIds());\r\n },\r\n onHandleClearEditUsers: () => {\r\n dispatch(clearEditRoleUserIds());\r\n },\r\n onHandleClearEditPredicates: () => {\r\n dispatch(clearEditRolePredicates());\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(RoleWizardPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n CardBody,\r\n CardTitle,\r\n FormFeedback,\r\n FormGroup,\r\n Input,\r\n Label\r\n} from \"reactstrap\";\r\nimport { handleLoadDashboards } from \"../../../actions/dashboards\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport paths from \"../../../constants\";\r\nimport IPbiDashboard from \"../../../models/IPbiDashboard\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface ISearchDashboardsPageProps {\r\n accessToken: string;\r\n onHandleLoadDashboards: (accessToken: string) => void;\r\n dashboards: IPbiDashboard[];\r\n dashboardsLoaded: boolean;\r\n}\r\n\r\nexport interface ISearchDashboardsPageState {\r\n filteredDashboards: IPbiDashboard[];\r\n matchedNameExact: boolean;\r\n name: string;\r\n noMatchingNames: boolean;\r\n}\r\nclass SearchDashboardsPage extends React.Component<\r\n ISearchDashboardsPageProps,\r\n ISearchDashboardsPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n filteredDashboards: [] as IPbiDashboard[],\r\n matchedNameExact: false,\r\n name: \"\",\r\n noMatchingNames: false\r\n };\r\n constructor(props: ISearchDashboardsPageProps) {\r\n super(props);\r\n this.handleInputChange = this.handleInputChange.bind(this);\r\n }\r\n public handleInputChange(e: any): void {\r\n e.preventDefault();\r\n const { dashboards } = this.props;\r\n\r\n const searchDashboardDisplayName = e.target.value.toLowerCase();\r\n if (!searchDashboardDisplayName) {\r\n this.setState({\r\n filteredDashboards: dashboards\r\n });\r\n } else {\r\n const filteredDashboards: IPbiDashboard[] = dashboards.filter(\r\n (dashboard: IPbiDashboard) =>\r\n dashboard.displayName\r\n .toLowerCase()\r\n .includes(searchDashboardDisplayName)\r\n );\r\n if (filteredDashboards.length === 1) {\r\n this.setState({ matchedNameExact: true, noMatchingNames: false });\r\n } else if (filteredDashboards.length === 0) {\r\n this.setState({ noMatchingNames: true, matchedNameExact: false });\r\n } else {\r\n this.setState({ matchedNameExact: false, noMatchingNames: false });\r\n }\r\n this.setState({\r\n filteredDashboards\r\n });\r\n }\r\n }\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadDashboards,\r\n dashboards,\r\n dashboardsLoaded\r\n } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!dashboardsLoaded) {\r\n onHandleLoadDashboards(accessToken);\r\n }\r\n this.setState({ filteredDashboards: dashboards });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ISearchDashboardsPageProps) {\r\n const { dashboards } = this.props;\r\n if (prevProps.dashboards !== dashboards) {\r\n this.setState({\r\n filteredDashboards: dashboards\r\n });\r\n }\r\n }\r\n\r\n public render() {\r\n const { dashboards, dashboardsLoaded } = this.props;\r\n const {\r\n noMatchingNames,\r\n matchedNameExact,\r\n name,\r\n filteredDashboards\r\n } = this.state;\r\n return (\r\n \r\n

Dashboard Administration

\r\n {!dashboardsLoaded && }\r\n {dashboardsLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {matchedNameExact && (\r\n \r\n Dashboard found! Select to edit\r\n {name}\r\n \r\n )}\r\n \r\n \r\n {noMatchingNames && (\r\n No dashboards match name entered \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {dashboards.length > 0 &&\r\n filteredDashboards.map((dashboard: IPbiDashboard) => (\r\n
\r\n \r\n {dashboard.displayName}\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n dashboards: state.dashboards,\r\n dashboardsLoaded: state.loadingDashboards\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadDashboards: (accessToken: string) => {\r\n dispatch(handleLoadDashboards(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SearchDashboardsPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n CardBody,\r\n CardTitle,\r\n FormFeedback,\r\n FormGroup,\r\n Input,\r\n Label\r\n} from \"reactstrap\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport paths from \"../../../constants\";\r\nimport IGroup from \"../../../models/IGroup\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { handleLoadGroups } from \"../../../actions/groups\";\r\n\r\nexport interface ISearchGroupsPageProps {\r\n accessToken: string;\r\n onHandleLoadGroups: (accessToken: string) => void;\r\n groups: IGroup[];\r\n groupsLoaded: boolean;\r\n}\r\n\r\nexport interface ISearchGroupsPageState {\r\n filteredGroups: IGroup[];\r\n matchedNameExact: boolean;\r\n name: string;\r\n noMatchingNames: boolean;\r\n}\r\nclass SearchGroupsPage extends React.Component<\r\n ISearchGroupsPageProps,\r\n ISearchGroupsPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n filteredGroups: [] as IGroup[],\r\n matchedNameExact: false,\r\n name: \"\",\r\n noMatchingNames: false\r\n };\r\n constructor(props: ISearchGroupsPageProps) {\r\n super(props);\r\n this.handleInputChange = this.handleInputChange.bind(this);\r\n }\r\n public handleInputChange(e: any): void {\r\n e.preventDefault();\r\n const { groups } = this.props;\r\n\r\n const searchGroupName = e.target.value.toLowerCase();\r\n if (!searchGroupName) {\r\n this.setState({\r\n filteredGroups: groups\r\n });\r\n } else {\r\n const filteredGroups: IGroup[] = groups.filter((group: IGroup) =>\r\n group.name.toLowerCase().includes(searchGroupName)\r\n );\r\n if (filteredGroups.length === 1) {\r\n this.setState({ matchedNameExact: true, noMatchingNames: false });\r\n } else if (filteredGroups.length === 0) {\r\n this.setState({ noMatchingNames: true, matchedNameExact: false });\r\n } else {\r\n this.setState({ matchedNameExact: false, noMatchingNames: false });\r\n }\r\n this.setState({\r\n filteredGroups\r\n });\r\n }\r\n }\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadGroups,\r\n groups,\r\n groupsLoaded\r\n } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!groupsLoaded) {\r\n onHandleLoadGroups(accessToken);\r\n }\r\n this.setState({ filteredGroups: groups });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ISearchGroupsPageProps) {\r\n const { groups } = this.props;\r\n if (prevProps.groups !== groups) {\r\n this.setState({\r\n filteredGroups: groups\r\n });\r\n }\r\n }\r\n\r\n public render() {\r\n const { groups, groupsLoaded } = this.props;\r\n const {\r\n noMatchingNames,\r\n matchedNameExact,\r\n name,\r\n filteredGroups\r\n } = this.state;\r\n return (\r\n \r\n

User Group Administration

\r\n {!groupsLoaded && }\r\n {groupsLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {matchedNameExact && (\r\n \r\n Group found! Select to edit\r\n {name}\r\n \r\n )}\r\n \r\n \r\n {noMatchingNames && (\r\n No Groups match name entered \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {groups.length > 0 &&\r\n filteredGroups.map((group: IGroup) => (\r\n
\r\n \r\n {group.name}\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n groups: state.groups,\r\n groupsLoaded: state.loadingGroups\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadGroups: (accessToken: string) => {\r\n dispatch(handleLoadGroups(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SearchGroupsPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n CardBody,\r\n CardTitle,\r\n FormFeedback,\r\n FormGroup,\r\n Input,\r\n Label\r\n} from \"reactstrap\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport paths from \"../../../constants\";\r\nimport IKpi from \"../../../models/IKpi\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { handleLoadKpis } from \"../../../actions/kpis\";\r\n\r\nexport interface ISearchKpisPageProps {\r\n accessToken: string;\r\n onHandleLoadKpis: (accessToken: string) => void;\r\n kpis: IKpi[];\r\n kpisLoaded: boolean;\r\n}\r\n\r\nexport interface ISearchKpisPageState {\r\n filteredKpis: IKpi[];\r\n matchedNameExact: boolean;\r\n displayName: string;\r\n noMatchingNames: boolean;\r\n}\r\nclass SearchKpisPage extends React.Component<\r\n ISearchKpisPageProps,\r\n ISearchKpisPageState\r\n > {\r\n public isLoaded = false;\r\n public state = {\r\n filteredKpis: [] as IKpi[],\r\n matchedNameExact: false,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n displayName: \"\",\r\n noMatchingNames: false\r\n };\r\n constructor(props: ISearchKpisPageProps) {\r\n super(props);\r\n this.handleInputChange = this.handleInputChange.bind(this);\r\n }\r\n public handleInputChange(e: any): void {\r\n e.preventDefault();\r\n const { kpis } = this.props;\r\n\r\n const searchKpiName = e.target.value.toLowerCase();\r\n if (!searchKpiName) {\r\n this.setState({\r\n filteredKpis: kpis\r\n });\r\n } else {\r\n const filteredKpis: IKpi[] = kpis.filter((kpi: IKpi) =>\r\n kpi.displayName.toLowerCase().includes(searchKpiName)\r\n );\r\n if (filteredKpis.length === 1) {\r\n this.setState({ matchedNameExact: true, noMatchingNames: false });\r\n } else if (filteredKpis.length === 0) {\r\n this.setState({ noMatchingNames: true, matchedNameExact: false });\r\n } else {\r\n this.setState({ matchedNameExact: false, noMatchingNames: false });\r\n }\r\n this.setState({\r\n filteredKpis\r\n });\r\n }\r\n }\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadKpis,\r\n kpis,\r\n kpisLoaded\r\n } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!kpisLoaded) {\r\n onHandleLoadKpis(accessToken);\r\n }\r\n this.setState({ filteredKpis: kpis });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ISearchKpisPageProps) {\r\n const { kpis } = this.props;\r\n if (prevProps.kpis !== kpis) {\r\n this.setState({\r\n filteredKpis: kpis\r\n });\r\n }\r\n }\r\n\r\n public render() {\r\n const { kpis, kpisLoaded } = this.props;\r\n const {\r\n noMatchingNames,\r\n matchedNameExact,\r\n displayName,\r\n filteredKpis\r\n } = this.state;\r\n return (\r\n \r\n

Kpi Administration

\r\n {!kpisLoaded && }\r\n {kpisLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {matchedNameExact && (\r\n \r\n Kpi found! Select to edit\r\n {displayName}\r\n \r\n )}\r\n \r\n \r\n {noMatchingNames && (\r\n No Kpis match displayName entered \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {kpis.length > 0 &&\r\n filteredKpis.map((kpi: IKpi) => (\r\n
\r\n \r\n {kpi.displayName}\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n kpis: state.kpis,\r\n kpisLoaded: state.loadingKpis\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadKpis: (accessToken: string) => {\r\n dispatch(handleLoadKpis(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SearchKpisPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n CardBody,\r\n CardTitle,\r\n FormFeedback,\r\n FormGroup,\r\n Input,\r\n Label\r\n} from \"reactstrap\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport paths from \"../../../constants\";\r\nimport IPredicate from \"../../../models/IPredicate\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport { handleLoadPredicates } from \"../../../actions/predicates\";\r\n\r\nexport interface ISearchPredicatesPageProps {\r\n accessToken: string;\r\n onHandleLoadPredicates: (accessToken: string) => void;\r\n predicates: IPredicate[];\r\n predicatesLoaded: boolean;\r\n}\r\n\r\nexport interface ISearchPredicatesPageState {\r\n filteredPredicates: IPredicate[];\r\n matchedNameExact: boolean;\r\n name: string;\r\n noMatchingNames: boolean;\r\n}\r\nclass SearchPredicatesPage extends React.Component<\r\n ISearchPredicatesPageProps,\r\n ISearchPredicatesPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n filteredPredicates: [] as IPredicate[],\r\n matchedNameExact: false,\r\n name: \"\",\r\n noMatchingNames: false\r\n };\r\n constructor(props: ISearchPredicatesPageProps) {\r\n super(props);\r\n this.handleInputChange = this.handleInputChange.bind(this);\r\n }\r\n public handleInputChange(e: any): void {\r\n e.preventDefault();\r\n const { predicates } = this.props;\r\n\r\n const searchPredicateName = e.target.value.toLowerCase();\r\n if (!searchPredicateName) {\r\n this.setState({\r\n filteredPredicates: predicates\r\n });\r\n } else {\r\n const filteredPredicates: IPredicate[] = predicates.filter(\r\n (predicate: IPredicate) =>\r\n (predicate.name.toLowerCase().includes(searchPredicateName) ||\r\n predicate.displayName.toLowerCase().includes(searchPredicateName))\r\n );\r\n if (filteredPredicates.length === 1) {\r\n this.setState({ matchedNameExact: true, noMatchingNames: false });\r\n } else if (filteredPredicates.length === 0) {\r\n this.setState({ noMatchingNames: true, matchedNameExact: false });\r\n } else {\r\n this.setState({ matchedNameExact: false, noMatchingNames: false });\r\n }\r\n this.setState({\r\n filteredPredicates\r\n });\r\n }\r\n }\r\n\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n onHandleLoadPredicates,\r\n predicates,\r\n predicatesLoaded\r\n } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!predicatesLoaded) {\r\n onHandleLoadPredicates(accessToken);\r\n }\r\n this.setState({ filteredPredicates: predicates });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ISearchPredicatesPageProps) {\r\n const { predicates } = this.props;\r\n if (prevProps.predicates !== predicates) {\r\n this.setState({\r\n filteredPredicates: predicates\r\n });\r\n }\r\n }\r\n\r\n public render() {\r\n const { predicates, predicatesLoaded } = this.props;\r\n const {\r\n noMatchingNames,\r\n matchedNameExact,\r\n name,\r\n filteredPredicates\r\n } = this.state;\r\n return (\r\n \r\n

Predicate Administration

\r\n {!predicatesLoaded && }\r\n {predicatesLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {matchedNameExact && (\r\n \r\n Predicate found! Select to edit\r\n {name}\r\n \r\n )}\r\n \r\n \r\n {noMatchingNames && (\r\n No Predicates match name entered \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {predicates.length > 0 &&\r\n filteredPredicates.map((predicate: IPredicate) => (\r\n
\r\n \r\n {predicate.displayName}\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n predicates: state.predicates,\r\n predicatesLoaded: state.loadingPredicates\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadPredicates: (accessToken: string) => {\r\n dispatch(handleLoadPredicates(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SearchPredicatesPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n CardBody,\r\n CardTitle,\r\n FormFeedback,\r\n FormGroup,\r\n Input,\r\n Label\r\n} from \"reactstrap\";\r\nimport { handleLoadReports } from \"../../../actions/reports\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport paths from \"../../../constants\";\r\nimport ISqlReport from \"../../../models/ISqlReport\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface ISearchReportsPageProps {\r\n accessToken: string;\r\n onHandleLoadReports: (accessToken: string) => void;\r\n reports: ISqlReport[];\r\n reportsLoaded: boolean;\r\n}\r\n\r\nexport interface ISearchReportsPageState {\r\n filteredReports: ISqlReport[];\r\n matchedNameExact: boolean;\r\n name: string;\r\n noMatchingNames: boolean;\r\n}\r\nclass SearchReportsPage extends React.Component<\r\n ISearchReportsPageProps,\r\n ISearchReportsPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n filteredReports: [] as ISqlReport[],\r\n matchedNameExact: false,\r\n name: \"\",\r\n noMatchingNames: false\r\n };\r\n constructor(props: ISearchReportsPageProps) {\r\n super(props);\r\n this.handleInputChange = this.handleInputChange.bind(this);\r\n }\r\n public handleInputChange(e: any): void {\r\n e.preventDefault();\r\n const { reports } = this.props;\r\n\r\n const searchReportDisplayName = e.target.value.toLowerCase();\r\n if (!searchReportDisplayName) {\r\n this.setState({\r\n filteredReports: reports\r\n });\r\n } else {\r\n const filteredReports: ISqlReport[] = reports.filter(\r\n (report: ISqlReport) =>\r\n report.displayName.toLowerCase().includes(searchReportDisplayName)\r\n );\r\n if (filteredReports.length === 1) {\r\n this.setState({ matchedNameExact: true, noMatchingNames: false });\r\n } else if (filteredReports.length === 0) {\r\n this.setState({ noMatchingNames: true, matchedNameExact: false });\r\n } else {\r\n this.setState({ matchedNameExact: false, noMatchingNames: false });\r\n }\r\n this.setState({\r\n filteredReports\r\n });\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n const { accessToken, onHandleLoadReports, reports, reportsLoaded } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!reportsLoaded) {\r\n onHandleLoadReports(accessToken);\r\n }\r\n this.setState({\r\n filteredReports: reports\r\n });\r\n }\r\n }\r\n public componentDidUpdate(prevProps: ISearchReportsPageProps) {\r\n const { reports } = this.props;\r\n if (prevProps.reports !== reports) {\r\n this.setState({\r\n filteredReports: reports\r\n });\r\n }\r\n }\r\n public render() {\r\n const { reports, reportsLoaded } = this.props;\r\n const {\r\n noMatchingNames,\r\n matchedNameExact,\r\n name,\r\n filteredReports\r\n } = this.state;\r\n return (\r\n \r\n

Report Administration

\r\n {!reportsLoaded && }\r\n {reportsLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {matchedNameExact && (\r\n \r\n report found! Select to edit\r\n {name}\r\n \r\n )}\r\n \r\n \r\n {noMatchingNames && (\r\n No reports match name entered \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {reports.length > 0 &&\r\n filteredReports.map((report: ISqlReport) => (\r\n
\r\n \r\n {report.displayName}\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n reports: state.reports,\r\n reportsLoaded: state.loadingReports\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadReports: (accessToken: string) => {\r\n dispatch(handleLoadReports(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SearchReportsPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n CardBody,\r\n CardTitle,\r\n FormFeedback,\r\n FormGroup,\r\n Input,\r\n Label\r\n} from \"reactstrap\";\r\nimport { handleLoadRoles } from \"../../../actions/roles\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport paths from \"../../../constants\";\r\nimport IRole from \"../../../models/IRole\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface ISearchRolesPageProps {\r\n accessToken: string;\r\n onHandleLoadRoles: (accessToken: string) => void;\r\n roles: IRole[];\r\n rolesLoaded: boolean;\r\n}\r\n\r\nexport interface ISearchRolesPageState {\r\n filteredRoles: IRole[];\r\n matchedNameExact: boolean;\r\n name: string;\r\n noMatchingNames: boolean;\r\n}\r\nclass SearchRolesPage extends React.Component<\r\n ISearchRolesPageProps,\r\n ISearchRolesPageState\r\n> {\r\n public isLoaded = false;\r\n public state = {\r\n filteredRoles: [] as IRole[],\r\n matchedNameExact: false,\r\n name: \"\",\r\n noMatchingNames: false\r\n };\r\n constructor(props: ISearchRolesPageProps) {\r\n super(props);\r\n this.handleInputChange = this.handleInputChange.bind(this);\r\n }\r\n public handleInputChange(e: any): void {\r\n e.preventDefault();\r\n const { roles } = this.props;\r\n\r\n const searchRoleDisplayName = e.target.value.toLowerCase();\r\n if (!searchRoleDisplayName) {\r\n this.setState({\r\n filteredRoles: roles\r\n });\r\n } else {\r\n const filteredRoles: IRole[] = roles.filter((role: IRole) =>\r\n role.displayName.toLowerCase().includes(searchRoleDisplayName)\r\n );\r\n if (filteredRoles.length === 1) {\r\n this.setState({ matchedNameExact: true, noMatchingNames: false });\r\n } else if (filteredRoles.length === 0) {\r\n this.setState({ noMatchingNames: true, matchedNameExact: false });\r\n } else {\r\n this.setState({ matchedNameExact: false, noMatchingNames: false });\r\n }\r\n this.setState({\r\n filteredRoles\r\n });\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n const { accessToken, onHandleLoadRoles, roles, rolesLoaded } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!rolesLoaded) {\r\n onHandleLoadRoles(accessToken);\r\n }\r\n this.setState({ filteredRoles: roles });\r\n }\r\n }\r\n public componentDidUpdate(prevProps: ISearchRolesPageProps) {\r\n // const { roles } = this.props;\r\n // if (prevProps.roles !== roles) {\r\n // this.setState({ filteredRoles: roles });\r\n // }\r\n }\r\n public render() {\r\n const { roles, rolesLoaded } = this.props;\r\n const {\r\n noMatchingNames,\r\n matchedNameExact,\r\n name,\r\n filteredRoles\r\n } = this.state;\r\n return (\r\n \r\n

Role Administration

\r\n {!rolesLoaded && }\r\n {rolesLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {matchedNameExact && (\r\n \r\n Role found! Select to edit\r\n {name}\r\n \r\n )}\r\n \r\n \r\n {noMatchingNames && (\r\n No roles match name entered \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {roles.length > 0 &&\r\n filteredRoles.map((role: IRole) => (\r\n
\r\n \r\n {role.displayName}\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n roles: state.roles,\r\n rolesLoaded: state.loadingRoles\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadRoles: (accessToken: string) => {\r\n dispatch(handleLoadRoles(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SearchRolesPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n CardBody,\r\n CardTitle,\r\n FormFeedback,\r\n FormGroup,\r\n Input,\r\n Label\r\n} from \"reactstrap\";\r\nimport Card from \"reactstrap/lib/Card\";\r\nimport { handleLoadUserProfiles } from \"../../../actions/profiles\";\r\nimport DataLoading from \"../../../components/organisms/DataLoading\";\r\nimport paths from \"../../../constants\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport IUserProfile from \"../../../models/IUserProfile\";\r\n\r\nexport interface ISearchUsersPageProps {\r\n accessToken: string;\r\n onHandleLoadUsers: (accessToken: string) => void;\r\n users: IUserProfile[];\r\n usersLoaded: boolean;\r\n}\r\n\r\nexport interface ISearchUsersPageState {\r\n emailAddress: string;\r\n filteredUsers: IUserProfile[];\r\n matchedEmailExact: boolean;\r\n noMatchingEmails: boolean;\r\n}\r\n\r\nclass SearchUsersPage extends React.Component<\r\n ISearchUsersPageProps,\r\n ISearchUsersPageState\r\n> {\r\n public isLoaded = false;\r\n public state: ISearchUsersPageState = {\r\n emailAddress: \"\",\r\n filteredUsers: [] as IUserProfile[],\r\n matchedEmailExact: false,\r\n noMatchingEmails: false\r\n };\r\n constructor(props: ISearchUsersPageProps) {\r\n super(props);\r\n this.handleInputChange = this.handleInputChange.bind(this);\r\n }\r\n public handleInputChange(e: any): void {\r\n e.preventDefault();\r\n const { users } = this.props;\r\n\r\n const searchEmail = e.target.value.toLowerCase();\r\n if (!searchEmail) {\r\n this.setState({\r\n filteredUsers: users\r\n });\r\n } else {\r\n const filteredUsers: IUserProfile[] = users.filter((user: IUserProfile) =>\r\n user.emailAddress.toLowerCase().includes(searchEmail)\r\n );\r\n if (filteredUsers.length === 1) {\r\n this.setState({ matchedEmailExact: true, noMatchingEmails: false });\r\n } else if (filteredUsers.length === 0) {\r\n this.setState({ noMatchingEmails: true, matchedEmailExact: false });\r\n } else {\r\n this.setState({ matchedEmailExact: false, noMatchingEmails: false });\r\n }\r\n this.setState({\r\n filteredUsers\r\n });\r\n }\r\n }\r\n public componentDidMount() {\r\n const { accessToken, onHandleLoadUsers, users, usersLoaded } = this.props;\r\n this.isLoaded = true;\r\n if (this.isLoaded) {\r\n if (!usersLoaded) {\r\n onHandleLoadUsers(accessToken);\r\n }\r\n this.setState({ filteredUsers: users });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ISearchUsersPageProps) {\r\n // const { users } = this.props;\r\n // if (prevProps.users !== users) {\r\n // this.setState({ filteredUsers: users });\r\n // }\r\n }\r\n public render() {\r\n const { users, usersLoaded } = this.props;\r\n const {\r\n noMatchingEmails,\r\n matchedEmailExact,\r\n emailAddress,\r\n filteredUsers\r\n } = this.state;\r\n\r\n return (\r\n \r\n

User Administration

\r\n {!usersLoaded && }\r\n {usersLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {matchedEmailExact && (\r\n \r\n User Found! Click to edit\r\n {emailAddress}\r\n \r\n )}\r\n \r\n \r\n {noMatchingEmails && (\r\n No users match email entered \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {users.length > 0 &&\r\n filteredUsers.map((user: IUserProfile) => (\r\n
\r\n \r\n {user.emailAddress}\r\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 mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n users: state.profiles,\r\n usersLoaded: state.loadingUsers\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadUsers: (accessToken: string) => {\r\n dispatch(handleLoadUserProfiles(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(SearchUsersPage);\r\n","import IGroup from \"../models/IGroup\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getUserGroups = async (accessToken: string, userId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Group/GetGroupsForUserId?userId=${userId}`,\r\n accessToken\r\n );\r\n const userGroups = ((await data.json()) as any).value as IGroup[];\r\n if (userGroups !== undefined) {\r\n return userGroups;\r\n } else {\r\n return [] as IGroup[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Group/GetGroupsForUserId?userId=${userId}`,\r\n err\r\n );\r\n }\r\n return [] as IGroup[];\r\n};\r\n\r\nexport default getUserGroups;\r\n","import { fetchSecureData } from \"../utils\";\r\n\r\nexport const removeUserGroup = async (accessToken: string, userId: number, groupId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"DELETE\",\r\n `/api/UserProfileGroup/Remove?userId=${userId}&groupId=${groupId}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result.statusCode;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/UserProfileGroup/Remove?userId=${userId}&groupId=${groupId}`, err);\r\n }\r\n return 404;\r\n};\r\n\r\nexport default removeUserGroup;\r\n","import IGroup from \"../models/IGroup\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUserGroup = async (\r\n accessToken: string,\r\n userId: number,\r\n groupId: number,\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/UserProfileGroup/Add?userId=${userId}&groupId=${groupId}`,\r\n accessToken\r\n );\r\n const userGroup = ((await data.json()) as any).value as IGroup;\r\n return userGroup;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/UserProfileGroup/Add?userId=${userId}&&groupId=${groupId}`\r\n );\r\n }\r\n return {} as IGroup;\r\n};\r\n\r\nexport default saveUserGroup;\r\n","export const SET_EDIT_USER_GROUPS_LOADED = \"SET_EDIT_USER_GROUPS_LOADED\";\r\n\r\nexport const setEditUserGroupsLoaded = (editUserGroupsLoaded: boolean) => {\r\n return {\r\n editUserGroupsLoaded,\r\n type: SET_EDIT_USER_GROUPS_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getUserGroups from \"../api/getUserGroups\";\r\nimport removeUserGroup from \"../api/removeUserGroup\";\r\nimport saveUserGroup from \"../api/saveUserGroup\";\r\nimport { setEditUserGroupsLoaded } from \"./loadingEditUserGroups\";\r\n\r\nexport const ADD_EDIT_USER_GROUP_ID = \"ADD_EDIT_USER_GROUP_ID\";\r\nexport const REMOVE_EDIT_USER_GROUP_ID = \"REMOVE_EDIT_USER_GROUP_ID\";\r\nexport const LOAD_EDIT_USER_GROUP_IDS = \"LOAD_EDIT_USER_GROUP_IDS\";\r\nexport const CLEAR_EDIT_USER_GROUP_IDS = \"CLEAR_EDIT_USER_GROUP_IDS\";\r\n\r\nexport const addEditUserGroupId = (id: number) => {\r\n return {\r\n id,\r\n type: ADD_EDIT_USER_GROUP_ID\r\n };\r\n};\r\n\r\nexport const removeEditUserGroupId = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_EDIT_USER_GROUP_ID\r\n };\r\n};\r\n\r\nexport const loadEditUserGroupIds = (ids: number[]) => {\r\n return {\r\n ids,\r\n type: LOAD_EDIT_USER_GROUP_IDS\r\n };\r\n};\r\n\r\nexport const clearEditUserGroupIds = () => {\r\n return {\r\n type: CLEAR_EDIT_USER_GROUP_IDS\r\n };\r\n};\r\n\r\nexport const handleLoadEditUserGroupIds = (\r\n accessToken: string,\r\n userId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const userGroups = await getUserGroups(accessToken, userId);\r\n if (userGroups === undefined) {\r\n dispatch(clearEditUserGroupIds());\r\n dispatch(setEditUserGroupsLoaded(false));\r\n } else {\r\n if (userGroups.length > 0) {\r\n dispatch(loadEditUserGroupIds(userGroups.map(group => group.id)));\r\n }\r\n dispatch(setEditUserGroupsLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveEditUserGroupId = (\r\n accessToken: string,\r\n userId: number,\r\n groupId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await saveUserGroup(accessToken, userId, groupId);\r\n dispatch(addEditUserGroupId(groupId));\r\n };\r\n};\r\n\r\nexport const handleDeleteEditUserGroupId = (\r\n accessToken: string,\r\n userId: number,\r\n groupId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await removeUserGroup(accessToken, userId, groupId);\r\n dispatch(removeEditUserGroupId(groupId));\r\n };\r\n};\r\n","import IRole from \"../models/IRole\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getUserRoles = async (accessToken: string, userId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Role/GetRolesForUserId?userId=${userId}`,\r\n accessToken\r\n );\r\n const userRoles = ((await data.json()) as any).value as IRole[];\r\n if (userRoles !== undefined) {\r\n return userRoles;\r\n } else {\r\n return [] as IRole[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Role/GetRolesForUserId?userId=${userId}`,\r\n err\r\n );\r\n }\r\n return [] as IRole[];\r\n};\r\n\r\nexport default getUserRoles;\r\n","export const SET_EDIT_USER_ROLES_LOADED = \"SET_EDIT_USER_ROLES_LOADED\";\r\n\r\nexport const setEditUserRolesLoaded = (editUserRolesLoaded: boolean) => {\r\n return {\r\n editUserRolesLoaded,\r\n type: SET_EDIT_USER_ROLES_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getUserRoles from \"../api/getUserRoles\";\r\nimport removeRoleUser from \"../api/removeRoleUser\";\r\nimport saveRoleUser from \"../api/saveRoleUser\";\r\nimport { setEditUserRolesLoaded } from \"./loadingEditUserRoles\";\r\nexport const ADD_EDIT_USER_ROLE_ID = \"ADD_EDIT_USER_ROLE_ID\";\r\nexport const REMOVE_EDIT_USER_ROLE_ID = \"REMOVE_EDIT_USER_ROLE_ID\";\r\nexport const LOAD_EDIT_USER_ROLE_IDS = \"LOAD_EDIT_USER_ROLE_IDS\";\r\nexport const CLEAR_EDIT_USER_ROLE_IDS = \"CLEAR_EDIT_USER_ROLE_IDS\";\r\n\r\nexport const addEditUserRoleId = (id: number) => {\r\n return {\r\n id,\r\n type: ADD_EDIT_USER_ROLE_ID\r\n };\r\n};\r\n\r\nexport const removeEditUserRoleId = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_EDIT_USER_ROLE_ID\r\n };\r\n};\r\n\r\nexport const loadEditUserRoleIds = (ids: number[]) => {\r\n return {\r\n ids,\r\n type: LOAD_EDIT_USER_ROLE_IDS\r\n };\r\n};\r\n\r\nexport const clearEditUserRoleIds = () => {\r\n return {\r\n type: CLEAR_EDIT_USER_ROLE_IDS\r\n };\r\n};\r\n\r\nexport const handleLoadEditUserRoleIds = (\r\n accessToken: string,\r\n userId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const userRoles = await getUserRoles(accessToken, userId);\r\n if (userRoles === undefined) {\r\n dispatch(clearEditUserRoleIds());\r\n dispatch(setEditUserRolesLoaded(false));\r\n } else {\r\n if (userRoles.length > 0) {\r\n dispatch(loadEditUserRoleIds(userRoles.map(role => role.id)));\r\n }\r\n dispatch(setEditUserRolesLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveEditUserRoleId = (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await saveRoleUser(accessToken, roleId, userId);\r\n dispatch(addEditUserRoleId(roleId));\r\n };\r\n};\r\n\r\nexport const handleDeleteEditUserRoleId = (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await removeRoleUser(accessToken, roleId, userId);\r\n dispatch(removeEditUserRoleId(roleId));\r\n };\r\n};\r\n","export const SET_EDIT_USER_DETAILS_LOADED = \"SET_EDIT_USER_DETAILS_LOADED\";\r\n\r\nexport const setEditUserDetailsLoaded = (editUserDetailsLoaded: boolean) => {\r\n return {\r\n editUserDetailsLoaded,\r\n type: SET_EDIT_USER_DETAILS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { Progress } from \"reactstrap\";\r\nimport { userWizardStages } from \"../../constants\";\r\n\r\nexport interface IUserWizardProgressProps {\r\n currentStage: number;\r\n}\r\nconst UserWizardProgress: React.SFC = (\r\n props: IUserWizardProgressProps\r\n) => {\r\n const { currentStage } = props;\r\n return (\r\n \r\n {currentStage >= userWizardStages.addInitialUserDetails && (\r\n \r\n {currentStage === userWizardStages.addInitialUserDetails && (\r\n Initial User Details\r\n )}\r\n \r\n )}\r\n {currentStage >= userWizardStages.assignRoles&& (\r\n \r\n {currentStage === userWizardStages.assignRoles && (\r\n Assign Roles\r\n )}\r\n \r\n )}\r\n {currentStage >= userWizardStages.assignGroups && (\r\n \r\n {currentStage === userWizardStages.assignGroups && (\r\n Assign Groups\r\n )}\r\n \r\n )}\r\n {currentStage >= userWizardStages.reviewAndComplete && (\r\n \r\n {currentStage === userWizardStages.reviewAndComplete && (\r\n Review and Complete\r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default UserWizardProgress;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Button, Card, CardBody, CardFooter, Input } from \"reactstrap\";\r\nimport CardTitle from \"reactstrap/lib/CardTitle\";\r\nimport { handleSaveUserProfile } from \"../../../actions/profiles\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport { settings } from \"../../../constants\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport IUserProfile from \"../../../models/IUserProfile\";\r\nimport { validateEmail } from \"../../../utils\";\r\n\r\nexport interface IAddUserDetailsProps {\r\n accessToken: string;\r\n users: IUserProfile[];\r\n onHandleSaveUser: (\r\n accessToken: string,\r\n emailAddress: string,\r\n isEnabled: boolean\r\n ) => void;\r\n}\r\nexport interface IAddUserDetailsState {\r\n emailAddress: string;\r\n isEnabled: boolean;\r\n}\r\n\r\nclass AddUserDetails extends React.Component<\r\n IAddUserDetailsProps,\r\n IAddUserDetailsState\r\n> {\r\n public state = {\r\n emailAddress: \"\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isEnabled: true\r\n };\r\n constructor(props: IAddUserDetailsProps) {\r\n super(props);\r\n this.save = this.save.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n public readyToSave = () => {\r\n const { emailAddress } = this.state;\r\n if (\r\n emailAddress === undefined ||\r\n emailAddress === \"\" ||\r\n !validateEmail(emailAddress)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n const { accessToken } = this.props;\r\n const { emailAddress, isEnabled } = this.state;\r\n // do save\r\n if (this.readyToSave()) {\r\n this.props.onHandleSaveUser(accessToken, emailAddress, isEnabled);\r\n }\r\n\r\n // callback and do next\r\n };\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n public render() {\r\n const { users } = this.props;\r\n const { allowDisableUsers } = settings;\r\n const { emailAddress, isEnabled } = this.state;\r\n return (\r\n \r\n Add New User\r\n \r\n user.emailAddress)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={(email: string) =>\r\n this.setState(() => ({ emailAddress: email }))\r\n }\r\n />\r\n {allowDisableUsers && (\r\n \r\n Enabled\r\n \r\n \r\n {isEnabled}\r\n \r\n \r\n )}\r\n \r\n \r\n {this.readyToSave() && (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n users: state.profiles\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleSaveUser: (\r\n accessToken: string,\r\n emailAddress: string,\r\n isEnabled: boolean\r\n ) => {\r\n dispatch(handleSaveUserProfile(accessToken, emailAddress, isEnabled));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AddUserDetails);\r\n","import * as React from \"react\";\r\nimport { Badge, Label } from \"reactstrap\";\r\nimport IUserGroup from \"../../models/IGroup\";\r\n\r\nexport interface IGroupsBadgeProps {\r\n groupIds: number[];\r\n groups: IUserGroup[];\r\n}\r\n\r\nconst GroupsBadge = (props: IGroupsBadgeProps) => {\r\n const { groupIds, groups } = props;\r\n return (\r\n \r\n \r\n
\r\n {groups.length > 0 &&\r\n groupIds.map(id => (\r\n \r\n {(groups.find(role => role.id === id) as IUserGroup).name}\r\n \r\n ))}\r\n
\r\n {groupIds.length === 0 &&
None
}\r\n
\r\n );\r\n};\r\n\r\nexport default GroupsBadge;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n Col,\r\n Container,\r\n FormGroup,\r\n Input,\r\n Label,\r\n ListGroup,\r\n ListGroupItem,\r\n Row\r\n} from \"reactstrap\";\r\nimport {\r\n clearEditUserGroupIds,\r\n handleDeleteEditUserGroupId,\r\n handleLoadEditUserGroupIds,\r\n handleSaveEditUserGroupId\r\n} from \"../../../actions/editUserGroupIds\";\r\nimport { handleLoadGroups } from \"../../../actions/groups\";\r\nimport GroupsBadge from \"../../../components/molecules/GroupsBadge\";\r\nimport IGroup from \"../../../models/IGroup\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface IAssignUserGroupsState {\r\n editUserGroupIds: number[];\r\n filteredGroups: IGroup[];\r\n}\r\n\r\nexport interface IAssignUserGroupsProps {\r\n accessToken: string;\r\n groups: IGroup[];\r\n groupsLoaded:boolean;\r\n editUserGroupIds: number[];\r\n userId: number;\r\n onHandleLoadGroups: (accessToken: string) => void;\r\n onHandleLoadEditUserGroupIds: (accessToken: string, userId: number) => void;\r\n onClearEditUserGroupIds: () => void;\r\n onHandleSaveEditUserGroupId: (\r\n accessToken: string,\r\n userId: number,\r\n groupId: number\r\n ) => void;\r\n onHandleDeleteEditUserGroupId: (\r\n accessToken: string,\r\n userId: number,\r\n groupId: number\r\n ) => void;\r\n}\r\n\r\nclass AssignUserGroups extends React.Component<\r\n IAssignUserGroupsProps,\r\n IAssignUserGroupsState\r\n> {\r\n public state = {\r\n editUserGroupIds: [] as number[],\r\n filteredGroups: [] as IGroup[]\r\n };\r\n constructor(props: IAssignUserGroupsProps) {\r\n super(props);\r\n this.groupCheckboxChange = this.groupCheckboxChange.bind(this);\r\n this.txtFilterChange = this.txtFilterChange.bind(this);\r\n }\r\n public txtFilterChange = async (e: React.ChangeEvent) => {\r\n const { groups } = this.props;\r\n const filteredGroups = groups.filter(group =>\r\n group.name.toLowerCase().includes(e.target.value.toLowerCase())\r\n );\r\n await this.setState(() => ({ filteredGroups }));\r\n };\r\n public groupCheckboxChange = async (\r\n e: React.ChangeEvent\r\n ) => {\r\n const {\r\n accessToken,\r\n userId,\r\n onHandleSaveEditUserGroupId,\r\n onHandleDeleteEditUserGroupId\r\n } = this.props;\r\n e.preventDefault();\r\n if (e.target.checked) {\r\n await onHandleSaveEditUserGroupId(\r\n accessToken,\r\n userId,\r\n Number(e.target.value)\r\n );\r\n } else {\r\n await onHandleDeleteEditUserGroupId(\r\n accessToken,\r\n userId,\r\n Number(e.target.value)\r\n );\r\n }\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n groups,\r\n groupsLoaded,\r\n editUserGroupIds,\r\n onHandleLoadGroups,\r\n onHandleLoadEditUserGroupIds,\r\n userId\r\n } = this.props;\r\n if (!groupsLoaded) {\r\n await onHandleLoadGroups(accessToken);\r\n }\r\n await onHandleLoadEditUserGroupIds(accessToken, userId);\r\n this.setState({ editUserGroupIds });\r\n this.setState({ filteredGroups: groups });\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IAssignUserGroupsProps) {\r\n const { editUserGroupIds, groups } = this.props;\r\n if (prevProps.groups !== groups) {\r\n await this.setState(() => ({ filteredGroups: groups }));\r\n }\r\n if (prevProps.editUserGroupIds !== editUserGroupIds) {\r\n await this.setState(() => ({ editUserGroupIds }));\r\n }\r\n }\r\n\r\n public render() {\r\n const { filteredGroups, editUserGroupIds } = this.state;\r\n const { groups } = this.props;\r\n return (\r\n \r\n \r\n \r\n

Assign Groups

\r\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 {filteredGroups.map(group => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n const { onSave } = ownProps;\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n groups: state.groups,\r\n groupsLoaded:state.loadingGroups,\r\n userId: state.editUserDetails.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n editUserGroupIds: state.editUserGroupIds,\r\n onSave\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadGroups: (accessToken: string) => {\r\n dispatch(handleLoadGroups(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleLoadEditUserGroupIds: (accessToken: string, userId: number) => {\r\n dispatch(handleLoadEditUserGroupIds(accessToken, userId));\r\n },\r\n onClearEditUserGroupIds: () => {\r\n dispatch(clearEditUserGroupIds());\r\n },\r\n onHandleSaveEditUserGroupId: (\r\n accessToken: string,\r\n userId: number,\r\n groupId: number\r\n ) => {\r\n dispatch(handleSaveEditUserGroupId(accessToken, userId, groupId));\r\n },\r\n onHandleDeleteEditUserGroupId: (\r\n accessToken: string,\r\n userId: number,\r\n groupId: number\r\n ) => {\r\n dispatch(handleDeleteEditUserGroupId(accessToken, userId, groupId));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AssignUserGroups);\r\n","import * as React from \"react\";\r\nimport { Badge, Label } from \"reactstrap\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"models/IStore\";\r\nimport { connect } from \"react-redux\";\r\nimport { handleDeleteEditUserRoleId } from \"actions/editUserRoleIds\";\r\n\r\nexport interface IRolesBadgeProps {\r\n accessToken: string;\r\n roleIds: number[];\r\n roles: IRole[];\r\n userId: number;\r\n onHandleDeleteEditUserRoleId: (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n ) => void;\r\n}\r\n\r\nclass RolesBadge extends React.Component {\r\n constructor(props: IRolesBadgeProps) {\r\n super(props);\r\n this.removeUserRole = this.removeUserRole.bind(this);\r\n }\r\n public removeUserRole = async(roleId: number) => {\r\n const { accessToken, userId, onHandleDeleteEditUserRoleId } = this.props;\r\n await onHandleDeleteEditUserRoleId(accessToken, userId, roleId);\r\n }\r\n public render() {\r\n const { roleIds, roles } = this.props;\r\n return (\r\n \r\n \r\n
\r\n {roles.length > 0 &&\r\n roleIds.map(id => (\r\n \r\n {(roles.find(role => role.id === id) as IRole).displayName}{\" \"}\r\n this.removeUserRole(id)}\r\n >\r\n X\r\n \r\n \r\n ))}\r\n
\r\n {roleIds.length === 0 &&
None
}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n userId: state.editUserDetails.id\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleDeleteEditUserRoleId: (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n ) => {\r\n dispatch(handleDeleteEditUserRoleId(accessToken, userId, roleId));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(RolesBadge);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport {\r\n Col,\r\n Container,\r\n FormGroup,\r\n Input,\r\n Label,\r\n ListGroup,\r\n ListGroupItem,\r\n Row\r\n} from \"reactstrap\";\r\nimport {\r\n clearEditUserRoleIds,\r\n handleDeleteEditUserRoleId,\r\n handleLoadEditUserRoleIds,\r\n handleSaveEditUserRoleId\r\n} from \"../../../actions/editUserRoleIds\";\r\nimport { handleLoadRoles } from \"../../../actions/roles\";\r\nimport RolesBadge from \"../../../components/molecules/RolesBadge\";\r\nimport IRole from \"../../../models/IRole\";\r\nimport { IStore } from \"../../../models/IStore\";\r\n\r\nexport interface IAssignUserRolesState {\r\n editUserRoleIds: number[];\r\n filteredRoles: IRole[];\r\n}\r\n\r\nexport interface IAssignUserRolesProps {\r\n accessToken: string;\r\n roles: IRole[];\r\n rolesLoaded:boolean;\r\n editUserRoleIds: number[];\r\n userId: number;\r\n onHandleLoadRoles: (accessToken: string) => void;\r\n onHandleLoadEditUserRoleIds: (accessToken: string, userId: number) => void;\r\n onClearEditUserRoleIds: () => void;\r\n onHandleSaveEditUserRoleId: (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n ) => void;\r\n onHandleDeleteEditUserRoleId: (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n ) => void;\r\n}\r\n\r\nclass AssignUserRoles extends React.Component<\r\n IAssignUserRolesProps,\r\n IAssignUserRolesState\r\n> {\r\n public state = {\r\n editUserRoleIds: [] as number[],\r\n filteredRoles: [] as IRole[]\r\n };\r\n constructor(props: IAssignUserRolesProps) {\r\n super(props);\r\n this.roleCheckboxChange = this.roleCheckboxChange.bind(this);\r\n this.txtFilterChange = this.txtFilterChange.bind(this);\r\n }\r\n public txtFilterChange = async (e: React.ChangeEvent) => {\r\n const { roles } = this.props;\r\n const filteredRoles = roles.filter(role =>\r\n role.displayName.toLowerCase().includes(e.target.value.toLowerCase())\r\n );\r\n await this.setState(() => ({ filteredRoles }));\r\n };\r\n public roleCheckboxChange = async (\r\n e: React.ChangeEvent\r\n ) => {\r\n const {\r\n accessToken,\r\n userId,\r\n onHandleSaveEditUserRoleId,\r\n onHandleDeleteEditUserRoleId\r\n } = this.props;\r\n e.preventDefault();\r\n if (e.target.checked) {\r\n await onHandleSaveEditUserRoleId(\r\n accessToken,\r\n userId,\r\n Number(e.target.value)\r\n );\r\n } else {\r\n await onHandleDeleteEditUserRoleId(\r\n accessToken,\r\n userId,\r\n Number(e.target.value)\r\n );\r\n }\r\n };\r\n public async componentDidMount() {\r\n const {\r\n accessToken,\r\n roles,\r\n rolesLoaded,\r\n editUserRoleIds,\r\n onHandleLoadRoles,\r\n onHandleLoadEditUserRoleIds,\r\n userId\r\n } = this.props;\r\n if (!rolesLoaded) {\r\n await onHandleLoadRoles(accessToken);\r\n }\r\n await onHandleLoadEditUserRoleIds(accessToken, userId);\r\n this.setState({ editUserRoleIds });\r\n this.setState({ filteredRoles: roles });\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IAssignUserRolesProps) {\r\n const { editUserRoleIds, roles } = this.props;\r\n if (prevProps.roles !== roles) {\r\n await this.setState(() => ({ filteredRoles: roles }));\r\n }\r\n if (prevProps.editUserRoleIds !== editUserRoleIds) {\r\n await this.setState(() => ({ editUserRoleIds }));\r\n }\r\n }\r\n\r\n public render() {\r\n const { filteredRoles, editUserRoleIds } = this.state;\r\n const { roles } = this.props;\r\n return (\r\n \r\n \r\n \r\n

Assign Roles

\r\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 {filteredRoles.map(role => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n const { onSave } = ownProps;\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n roles: state.roles,\r\n rolesLoaded: state.loadingRoles,\r\n userId: state.editUserDetails.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n editUserRoleIds: state.editUserRoleIds,\r\n onSave\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadRoles: (accessToken: string) => {\r\n dispatch(handleLoadRoles(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleLoadEditUserRoleIds: (accessToken: string, userId: number) => {\r\n dispatch(handleLoadEditUserRoleIds(accessToken, userId));\r\n },\r\n onClearEditUserRoleIds: () => {\r\n dispatch(clearEditUserRoleIds());\r\n },\r\n onHandleSaveEditUserRoleId: (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n ) => {\r\n dispatch(handleSaveEditUserRoleId(accessToken, userId, roleId));\r\n },\r\n onHandleDeleteEditUserRoleId: (\r\n accessToken: string,\r\n userId: number,\r\n roleId: number\r\n ) => {\r\n dispatch(handleDeleteEditUserRoleId(accessToken, userId, roleId));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(AssignUserRoles);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Input, Table } from \"reactstrap\";\r\nimport { handleLoadEditUserGroupIds } from \"../../actions/editUserGroupIds\";\r\nimport { handleLoadEditUserRoleIds } from \"../../actions/editUserRoleIds\";\r\nimport { handleLoadGroups } from \"../../actions/groups\";\r\nimport { handleLoadRoles } from \"../../actions/roles\";\r\nimport { settings } from \"../../constants\";\r\nimport IGroup from \"../../models/IGroup\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport IUserProfile from \"../../models/IUserProfile\";\r\nimport GroupsBadge from \"../molecules/GroupsBadge\";\r\nimport RolesBadge from \"../molecules/RolesBadge\";\r\n\r\nexport interface IUserDetailsTableProps {\r\n accessToken: string;\r\n user: IUserProfile;\r\n roles: IRole[];\r\n rolesLoaded: boolean;\r\n onHandleLoadRoles: (accessToken: string) => void;\r\n roleIds: number[];\r\n roleIdsLoaded: boolean;\r\n onHandleLoadEditUserRoleIds: (accessToken: string, userId: number) => void;\r\n groups: IGroup[];\r\n groupsLoaded: boolean;\r\n onHandleLoadGroups: (accessToken: string) => void;\r\n groupIds: number[];\r\n groupIdsLoaded: boolean;\r\n onHandleLoadEditUserGroupIds: (accessToken: string, userId: number) => void;\r\n}\r\n\r\nclass UserDetailsTable extends React.Component {\r\n public loaded = false;\r\n public constructor(props: IUserDetailsTableProps) {\r\n super(props);\r\n }\r\n public componentDidMount() {\r\n const {\r\n accessToken,\r\n user,\r\n rolesLoaded,\r\n onHandleLoadRoles,\r\n groupsLoaded,\r\n onHandleLoadGroups,\r\n roleIdsLoaded,\r\n onHandleLoadEditUserRoleIds,\r\n groupIdsLoaded,\r\n onHandleLoadEditUserGroupIds\r\n } = this.props;\r\n this.loaded = true;\r\n if (this.loaded) {\r\n if (!rolesLoaded) {\r\n onHandleLoadRoles(accessToken);\r\n }\r\n if (!groupsLoaded) {\r\n onHandleLoadGroups(accessToken);\r\n }\r\n if (!roleIdsLoaded) {\r\n onHandleLoadEditUserRoleIds(accessToken, user.id);\r\n }\r\n if (!groupIdsLoaded) {\r\n onHandleLoadEditUserGroupIds(accessToken, user.id);\r\n }\r\n }\r\n }\r\n public render() {\r\n const { user, roles, roleIds, groups, groupIds } = this.props;\r\n const { emailAddress, isEnabled } = user;\r\n const { allowDisableUsers } = settings;\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 {allowDisableUsers && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
Email Address {emailAddress}
Roles\r\n \r\n
Groups\r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n user: ownProps.user,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n roles: state.roles,\r\n rolesLoaded: state.loadingRoles,\r\n roleIds: state.editUserRoleIds,\r\n roleIdsLoaded: state.loadingEditUserRoles,\r\n groups: state.groups,\r\n groupsLoaded: state.loadingGroups,\r\n groupIds: state.editUserGroupIds,\r\n groupIdsLoaded: state.loadingEditUserGroups\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadRoles: (accessToken: string) => {\r\n dispatch(handleLoadRoles(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleLoadGroups: (accessToken: string) => {\r\n dispatch(handleLoadGroups(accessToken));\r\n },\r\n onHandleLoadEditUserRoleIds: (accessToken: string, userId: number) => {\r\n dispatch(handleLoadEditUserRoleIds(accessToken, userId));\r\n },\r\n onHandleLoadEditUserGroupIds: (accessToken: string, userId: number) => {\r\n dispatch(handleLoadEditUserGroupIds(accessToken, userId));\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(UserDetailsTable);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport {\r\n Button,\r\n Card,\r\n CardBody,\r\n CardFooter,\r\n Input,\r\n Modal,\r\n ModalBody,\r\n ModalFooter,\r\n ModalHeader,\r\n Table\r\n} from \"reactstrap\";\r\nimport {\r\n handleDeleteUserProfile as handleRemoveUserProfile,\r\n handleUpdateUserProfile\r\n} from \"../../../actions/profiles\";\r\nimport AddTextField from \"../../../components/molecules/AddTextField\";\r\nimport UserDetailsTable from \"../../../components/organisms/UserDetailsTable\";\r\nimport paths, { settings } from \"../../../constants\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport IUserProfile from \"../../../models/IUserProfile\";\r\nimport { validateEmail } from \"../../../utils\";\r\n\r\nexport interface IEditUserDetailsProps extends RouteComponentProps {\r\n accessToken: string;\r\n user: IUserProfile;\r\n existingUsers: IUserProfile[];\r\n onHandleUpdateUser: (accessToken: string, user: IUserProfile) => void;\r\n onHandleDeleteUser: (accessToken: string, id: number) => void;\r\n}\r\n\r\nexport interface IEditUserDetailsState {\r\n editModeOn: boolean;\r\n emailAddress: string;\r\n isEnabled: boolean;\r\n showDeleteModal: boolean;\r\n}\r\n\r\nclass EditUserDetails extends React.Component<\r\n IEditUserDetailsProps,\r\n IEditUserDetailsState\r\n> {\r\n public state = {\r\n editModeOn: false,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n emailAddress: this.props.user.emailAddress,\r\n isEnabled: true,\r\n showDeleteModal: false\r\n };\r\n constructor(props: IEditUserDetailsProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n this.toggleDeleteModal = this.toggleDeleteModal.bind(this);\r\n this.delete = this.delete.bind(this);\r\n this.readyToSave = this.readyToSave.bind(this);\r\n this.save = this.save.bind(this);\r\n this.isEnabledChange = this.isEnabledChange.bind(this);\r\n }\r\n public toggleEdit() {\r\n this.setState({ editModeOn: !this.state.editModeOn });\r\n }\r\n public toggleDeleteModal() {\r\n this.setState({ showDeleteModal: !this.state.showDeleteModal });\r\n }\r\n public delete = (e: React.MouseEvent) => {\r\n const { history, accessToken, user, onHandleDeleteUser } = this.props;\r\n // do delete\r\n onHandleDeleteUser(accessToken, user.id);\r\n history.push(paths.home);\r\n };\r\n public readyToSave = () => {\r\n const { emailAddress } = this.state;\r\n if (\r\n emailAddress === undefined ||\r\n emailAddress === \"\" ||\r\n !validateEmail(emailAddress)\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n public save = (e: React.MouseEvent) => {\r\n const { accessToken, user, onHandleUpdateUser } = this.props;\r\n const { emailAddress, isEnabled } = this.state;\r\n if (this.readyToSave()) {\r\n // do save\r\n onHandleUpdateUser(accessToken, {\r\n id: user.id,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n emailAddress,\r\n isEnabled\r\n } as IUserProfile);\r\n }\r\n this.toggleEdit();\r\n };\r\n public isEnabledChange = (e: React.ChangeEvent) => {\r\n const isEnabled = e.target.checked;\r\n this.setState(() => ({ isEnabled }));\r\n };\r\n\r\n public render() {\r\n const { allowDisableUsers } = settings;\r\n const { user, existingUsers } = this.props;\r\n const { editModeOn, emailAddress, isEnabled } = this.state;\r\n return (\r\n \r\n \r\n \r\n Delete User: {emailAddress}\r\n \r\n \r\n Are you sure you want to delete User: {emailAddress}{\" \"}\r\n \r\n \r\n {\" \"}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {!editModeOn && }\r\n {editModeOn && (\r\n \r\n usr.emailAddress)}\r\n // tslint:disable-next-line:jsx-no-lambda\r\n callback={(email: string) =>\r\n this.setState(() => ({ emailAddress: email }))\r\n }\r\n />\r\n\r\n {allowDisableUsers && (\r\n \r\n \r\n \r\n \r\n \r\n
Enabled\r\n \r\n {isEnabled}\r\n
\r\n )}\r\n
\r\n )}\r\n \r\n {!editModeOn && (\r\n \r\n \r\n Edit\r\n \r\n \r\n Delete User\r\n \r\n \r\n )}\r\n {editModeOn && (\r\n \r\n {this.readyToSave() && (\r\n \r\n Save Changes\r\n \r\n )}\r\n \r\n Cancel\r\n \r\n \r\n )}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n existingUsers: state.profiles.filter(\r\n user => user.id !== state.editUserDetails.id\r\n ),\r\n user: state.editUserDetails\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleUpdateUser: (accessToken: string, user: IUserProfile) => {\r\n dispatch(handleUpdateUserProfile(accessToken, user));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleDeleteUser: (accessToken: string, id: number) => {\r\n dispatch(handleRemoveUserProfile(accessToken, id));\r\n }\r\n});\r\nexport default connect(mapStateToProps, mapDispatchToProps)(EditUserDetails);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Card, CardBody, CardFooter, CardTitle } from \"reactstrap\";\r\nimport UserDetailsTable from \"../../../components/organisms/UserDetailsTable\";\r\nimport paths from \"../../../constants\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport IUserProfile from \"../../../models/IUserProfile\";\r\n\r\nexport interface IUserSummaryState {\r\n activeEditRoleUsers: IUserProfile[];\r\n}\r\n\r\nexport interface IUserSummaryProps extends RouteComponentProps {\r\n user: IUserProfile;\r\n}\r\n\r\nclass UserSummary extends React.Component {\r\n public render() {\r\n const { history, user /*, roles, roleIds, groups, groupIds */ } = this.props;\r\n return (\r\n \r\n Review and Complete\r\n \r\n

User Details:

\r\n \r\n
\r\n \r\n ) =>\r\n history.push(paths.home)\r\n }\r\n >\r\n Complete\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: any) => {\r\n return {\r\n user: state.editUserDetails,\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(UserSummary);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Card, CardBody, Col, Container, Row } from \"reactstrap\";\r\nimport {\r\n clearEditUserDetails,\r\n setEditUserDetails\r\n} from \"../../../actions/editUserDetails\";\r\nimport { clearEditUserGroupIds } from \"../../../actions/editUserGroupIds\";\r\nimport { clearEditUserRoleIds } from \"../../../actions/editUserRoleIds\";\r\nimport { setEditUserDetailsLoaded } from \"../../../actions/loadingEditUserDetails\";\r\nimport { setEditUserGroupsLoaded } from \"../../../actions/loadingEditUserGroups\";\r\nimport { setEditUserRolesLoaded } from \"../../../actions/loadingEditUserRoles\";\r\nimport { handleLoadUserProfiles } from \"../../../actions/profiles\";\r\nimport UserWizardProgress from \"../../../components/molecules/UserWizardProgress\";\r\nimport AddUserDetails from \"../../../components/templates/admin/AddUserDetails\";\r\nimport AssignUserGroups from \"../../../components/templates/admin/AssignUserGroups\";\r\nimport AssignUserRoles from \"../../../components/templates/admin/AssignUserRoles\";\r\nimport EditUserDetails from \"../../../components/templates/admin/EditUserDetails\";\r\nimport UserSummary from \"../../../components/templates/admin/UserSummary\";\r\nimport paths, { userWizardStages } from \"../../../constants\";\r\nimport { IStore } from \"../../../models/IStore\";\r\nimport IUserProfile from \"../../../models/IUserProfile\";\r\n\r\nexport interface IUserProfileWizardPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n users: IUserProfile[];\r\n usersLoaded: boolean;\r\n userId: number;\r\n editUserDetailsLoaded: boolean;\r\n onHandleLoadEditUser: (user: IUserProfile) => void;\r\n onHandleLoadUsers: (accessToken: string) => void;\r\n onHandleClearEditUser: () => void;\r\n onHandleClearEditUserRoleIds: () => void;\r\n onHandleClearEditUserGroupIds: () => void;\r\n}\r\n\r\nexport interface IUserProfileWizardPageState {\r\n currentStage: number;\r\n user: IUserProfile;\r\n}\r\n\r\nclass UserWizardPage extends React.Component<\r\n IUserProfileWizardPageProps,\r\n IUserProfileWizardPageState\r\n> {\r\n public state = {\r\n currentStage: 0,\r\n user: {\r\n id: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n emailAddress: \"\",\r\n isEnabled: true\r\n } as IUserProfile\r\n };\r\n constructor(props: IUserProfileWizardPageProps) {\r\n super(props);\r\n this.incrementStage = this.incrementStage.bind(this);\r\n this.decrementStage = this.decrementStage.bind(this);\r\n this.renderCurrentStage = this.renderCurrentStage.bind(this);\r\n this.cancel = this.cancel.bind(this);\r\n this.loadUserData = this.loadUserData.bind(this);\r\n }\r\n\r\n public incrementStage = (e: React.MouseEvent) => {\r\n const { currentStage } = this.state;\r\n this.setState(() => ({ currentStage: currentStage + 1 }));\r\n };\r\n\r\n public decrementStage = (e: React.MouseEvent) => {\r\n const { currentStage } = this.state;\r\n this.setState(() => ({ currentStage: currentStage - 1 }));\r\n };\r\n public cancel = (e: React.MouseEvent) => {\r\n const { history } = this.props;\r\n e.preventDefault();\r\n history.push(paths.home);\r\n };\r\n public renderCurrentStage = (currentStage: number) => {\r\n switch (currentStage) {\r\n case userWizardStages.addInitialUserDetails:\r\n if (this.state.user.id === 0) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n\r\n case userWizardStages.assignRoles:\r\n return ;\r\n case userWizardStages.assignGroups:\r\n return ;\r\n case userWizardStages.reviewAndComplete:\r\n return ;\r\n default:\r\n return (\r\n \r\n Not sure what stage we're at\r\n \r\n );\r\n }\r\n };\r\n\r\n public loadUserData = async () => {\r\n const {\r\n accessToken,\r\n users,\r\n usersLoaded,\r\n userId,\r\n onHandleLoadUsers,\r\n onHandleLoadEditUser,\r\n onHandleClearEditUser,\r\n onHandleClearEditUserRoleIds,\r\n onHandleClearEditUserGroupIds,\r\n editUserDetailsLoaded\r\n } = this.props;\r\n if (!usersLoaded) {\r\n await onHandleLoadUsers(accessToken);\r\n }\r\n if (!editUserDetailsLoaded && usersLoaded) {\r\n const user = users.find(r => r.id === userId);\r\n if (user !== undefined) {\r\n this.setState(() => ({ user }));\r\n await onHandleLoadEditUser(user);\r\n } else {\r\n await onHandleClearEditUser();\r\n await onHandleClearEditUserRoleIds();\r\n await onHandleClearEditUserGroupIds();\r\n this.setState(() => ({\r\n user: {\r\n id: 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n emailAddress: \"\",\r\n isEnabled: true\r\n } as IUserProfile\r\n }));\r\n }\r\n }\r\n };\r\n\r\n public async componentDidMount() {\r\n this.loadUserData();\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IUserProfileWizardPageProps) {\r\n const {\r\n userId,\r\n onHandleClearEditUser,\r\n onHandleClearEditUserRoleIds,\r\n onHandleClearEditUserGroupIds\r\n } = this.props;\r\n if (userId !== prevProps.userId) {\r\n onHandleClearEditUser();\r\n onHandleClearEditUserRoleIds();\r\n onHandleClearEditUserGroupIds();\r\n await this.loadUserData();\r\n }\r\n }\r\n public componentWillUnmount() {\r\n this.props.onHandleClearEditUser();\r\n this.props.onHandleClearEditUserRoleIds();\r\n this.props.onHandleClearEditUserGroupIds();\r\n }\r\n public render() {\r\n const { currentStage } = this.state;\r\n return (\r\n \r\n \r\n \r\n \r\n

Client User Wizard

\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {currentStage > userWizardStages.addInitialUserDetails && (\r\n \r\n Previous\r\n \r\n )}\r\n {currentStage < userWizardStages.reviewAndComplete && (\r\n \r\n {this.props.userId !== 0 && (\r\n \r\n Next\r\n \r\n )}\r\n \r\n )}\r\n\r\n {/* */}\r\n \r\n \r\n \r\n {this.renderCurrentStage(currentStage)}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n const userId =\r\n (match.params as any).id !== undefined\r\n ? parseInt((match.params as any).id as string, 10) // we're editing an existing user\r\n : // we're adding a new user\r\n state.editUserDetails.id === undefined\r\n ? 0 // we haven't saved the user yet so not yet in store\r\n : state.editUserDetails.id;\r\n\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n userId,\r\n users: state.profiles,\r\n usersLoaded: state.loadingUsers,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n editUserDetailsLoaded: state.loadingEditUserDetails\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadEditUser: (user: IUserProfile) => {\r\n dispatch(setEditUserDetails(user));\r\n dispatch(setEditUserDetailsLoaded(true));\r\n },\r\n onHandleLoadUsers: async (accessToken: string) => {\r\n await dispatch(handleLoadUserProfiles(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleClearEditUser: () => {\r\n dispatch(clearEditUserDetails());\r\n dispatch(setEditUserDetailsLoaded(false));\r\n },\r\n onHandleClearEditUserRoleIds: () => {\r\n dispatch(clearEditUserRoleIds());\r\n dispatch(setEditUserRolesLoaded(false));\r\n },\r\n onHandleClearEditUserGroupIds: () => {\r\n dispatch(clearEditUserGroupIds());\r\n dispatch(setEditUserGroupsLoaded(false));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(UserWizardPage);\r\n","import IClient from \"../models/IClient\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getRoleClients = async (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Client/GetClientsForRoleAndPredicate?roleId=${roleId}&predicateId=${predicateId}`,\r\n accessToken\r\n );\r\n const roleDashboards = ((await data.json()) as any).value as IClient[];\r\n if (roleDashboards !== undefined) {\r\n return roleDashboards;\r\n } else {\r\n return [] as IClient[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Client/GetClientsForRoleAndPredicate?roleId=${roleId}&predicateId=${predicateId}`,\r\n err\r\n );\r\n }\r\n return [] as IClient[];\r\n};\r\n\r\nexport default getRoleClients;\r\n","export const SET_ROLE_CLIENTS_LOADED = \"SET_ROLE_CLIENTS_LOADED\";\r\n\r\nexport const setRoleClientsLoaded = (roleClientsLoaded: boolean) => {\r\n return {\r\n roleClientsLoaded,\r\n type: SET_ROLE_CLIENTS_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getRoleClients from \"../api/getRoleClients\";\r\nimport IClient from \"../models/IClient\";\r\nimport { setRoleClientsLoaded } from \"./loadingRoleClients\";\r\n\r\nexport const ADD_ACTIVE_ROLE_CLIENT = \"ADD_ACTIVE_ROLE_CLIENT\";\r\nexport const REMOVE_ACTIVE_ROLE_CLIENT = \"REMOVE_ACTIVE_ROLE_CLIENT\";\r\nexport const LOAD_ACTIVE_ROLE_CLIENTS = \"LOAD_ACTIVE_ROLE_CLIENTS\";\r\nexport const CLEAR_ACTIVE_ROLE_CLIENTS = \"CLEAR_ACTIVE_ROLE_CLIENTS\";\r\n\r\nexport const addActiveRoleClient = (client: IClient) => {\r\n return {\r\n client,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: ADD_ACTIVE_ROLE_CLIENT\r\n };\r\n};\r\n\r\nexport const removeActiveRoleClient = (client: IClient) => {\r\n return {\r\n client,\r\n type: REMOVE_ACTIVE_ROLE_CLIENT\r\n };\r\n};\r\n\r\nconst loadActiveRoleClients = (clients: IClient[]) => {\r\n return {\r\n clients,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: LOAD_ACTIVE_ROLE_CLIENTS\r\n };\r\n};\r\n\r\nconst clearActiveRoleClients = () => {\r\n return {\r\n type: CLEAR_ACTIVE_ROLE_CLIENTS\r\n };\r\n};\r\n\r\nexport const handleLoadActiveRoleClients = (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const clients = await getRoleClients(accessToken, roleId, predicateId);\r\n if (clients !== undefined) {\r\n if (clients.length > 0) {\r\n clients.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadActiveRoleClients(clients));\r\n }\r\n dispatch(setRoleClientsLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleClearActiveRoleClients = () => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n dispatch(clearActiveRoleClients());\r\n dispatch(setRoleClientsLoaded(false));\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { FormGroup, Input, Label } from \"reactstrap\";\r\nimport {\r\n clearActiveKpiClientId,\r\n setActiveKpiClientId\r\n} from \"../../actions/activeKpiClient\";\r\nimport {\r\n handleClearActiveRoleClients,\r\n handleLoadActiveRoleClients\r\n} from \"../../actions/activeRoleClients\";\r\nimport IClient from \"../../models/IClient\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport DataLoading from \"../organisms/DataLoading\";\r\n\r\nexport interface IKpiClientSelectorProps {\r\n accessToken: string;\r\n roleId: number;\r\n predicateId: number;\r\n clients: IClient[];\r\n clientsLoaded: boolean;\r\n onHandleLoadClients: (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n ) => void;\r\n onHandleSetActiveClientId: (selectedClientId: number) => void;\r\n onHandleClearActiveClientId: () => void;\r\n onHandleClearLoadedClients: () => void;\r\n}\r\n\r\nexport interface IKpiClientSelectorState {\r\n selectedClientId: number;\r\n}\r\n\r\nclass KpiClientSelector extends React.Component<\r\n IKpiClientSelectorProps,\r\n IKpiClientSelectorState\r\n> {\r\n public state = {\r\n selectedClientId: 0\r\n };\r\n public constructor(props: IKpiClientSelectorProps) {\r\n super(props);\r\n }\r\n public selectedClientChange = (e: React.ChangeEvent) => {\r\n const { onHandleSetActiveClientId } = this.props;\r\n e.preventDefault();\r\n const selectedClientId =\r\n e.target.value === undefined ? 0 : Number(e.target.value as string);\r\n onHandleSetActiveClientId(selectedClientId);\r\n this.setState(() => ({ selectedClientId }));\r\n };\r\n public componentDidMount() {\r\n const {\r\n clientsLoaded,\r\n onHandleLoadClients,\r\n accessToken,\r\n roleId,\r\n predicateId\r\n } = this.props;\r\n if (!clientsLoaded) {\r\n onHandleLoadClients(accessToken, roleId, predicateId);\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: IKpiClientSelectorProps) {\r\n const {\r\n accessToken,\r\n roleId,\r\n predicateId,\r\n clientsLoaded,\r\n onHandleClearActiveClientId,\r\n onHandleClearLoadedClients,\r\n onHandleLoadClients\r\n } = this.props;\r\n if (!clientsLoaded) {\r\n onHandleLoadClients(accessToken, roleId, predicateId);\r\n }\r\n if (prevProps.roleId !== roleId || prevProps.predicateId !== predicateId) {\r\n onHandleClearLoadedClients();\r\n onHandleClearActiveClientId();\r\n this.setState({ selectedClientId: 0 });\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n const {\r\n onHandleClearActiveClientId,\r\n onHandleClearLoadedClients\r\n } = this.props;\r\n onHandleClearLoadedClients();\r\n onHandleClearActiveClientId();\r\n }\r\n public render() {\r\n const { clients, clientsLoaded } = this.props;\r\n const { selectedClientId } = this.state;\r\n return (\r\n \r\n {!clientsLoaded && }\r\n {clientsLoaded && (\r\n \r\n \r\n \r\n \r\n {clients.map(client => (\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n roleId: state.activeRoleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId: state.activeKpiPredicateId,\r\n clients: state.activeRoleClients,\r\n clientsLoaded: state.loadingRoleClients\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadClients: (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n ) => {\r\n dispatch(handleLoadActiveRoleClients(accessToken, roleId, predicateId));\r\n },\r\n onHandleSetActiveClientId: (selectedClientId: number) => {\r\n dispatch(setActiveKpiClientId(selectedClientId));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleClearActiveClientId: () => {\r\n dispatch(clearActiveKpiClientId());\r\n },\r\n onHandleClearLoadedClients: () => {\r\n dispatch(handleClearActiveRoleClients());\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(KpiClientSelector);\r\n","export const SET_ACTIVE_KPI_CLIENT_ID = \"SET_ACTIVE_KPI_CLIENT_ID\";\r\nexport const CLEAR_ACTIVE_KPI_CLIENT_ID = \"CLEAR_ACTIVE_KPI_CLIENT_ID\";\r\n\r\nexport const setActiveKpiClientId = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_KPI_CLIENT_ID\r\n };\r\n};\r\n\r\nexport const clearActiveKpiClientId = () => {\r\n return {\r\n type: CLEAR_ACTIVE_KPI_CLIENT_ID\r\n };\r\n};\r\n","import IKpiEntry from \"../models/IKpiEntry\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getKpiEntriesForPredicateClientKpiYear = async (\r\n accessToken: string,\r\n predicateId: number,\r\n clientId: number,\r\n fyStartMonthId: number,\r\n endYear: number,\r\n kpiId: number\r\n) => {\r\n // // tslint:disable-next-line:no-console\r\n // console.log(\r\n // \"predicateId:\",\r\n // predicateId,\r\n // \"clientId:\",\r\n // clientId,\r\n // \"fyStartMonthId:\",\r\n // fyStartMonthId,\r\n // \"endYear\",\r\n // endYear,\r\n // \"kpiId\",\r\n // kpiId\r\n // );\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/KpiEntry/GetKpiEntriesForPredicateAndClientForYearAndKpi?predicateId=${predicateId}&clientId=${clientId}&fyStartMonthId=${fyStartMonthId}&endYear=${endYear}&kpiId=${kpiId}`,\r\n accessToken\r\n );\r\n const kpiEntries = ((await data.json()) as any).value as IKpiEntry[];\r\n // // tslint:disable-next-line:no-console\r\n // console.log(\"kpiEntries:\", kpiEntries);\r\n if (kpiEntries !== undefined) {\r\n return kpiEntries;\r\n } else {\r\n return [] as IKpiEntry[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/KpiEntry/GetKpiEntriesForPredicateAndClientForYearAndKpi?predicateId=${predicateId}&clientId=${clientId}&fyStartMonthId=${fyStartMonthId}&endYear=${endYear}&kpiId=${kpiId}`,\r\n err\r\n );\r\n }\r\n return [] as IKpiEntry[];\r\n};\r\n\r\nexport default getKpiEntriesForPredicateClientKpiYear;\r\n","import IKpiEntry from \"../models/IKpiEntry\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveKpiEntry = async (\r\n accessToken: string,\r\n predicateId: number,\r\n clientId: number,\r\n year: number,\r\n monthId: number,\r\n kpiId: number,\r\n measuredValue: number,\r\n thresholdValue: number,\r\n isEnabled: boolean\r\n) => {\r\n // tslint:disable-next-line:no-console\r\n // console.log(\r\n // \"predicateId:\",\r\n // predicateId,\r\n // \"clientId:\",\r\n // clientId,\r\n // \"monthId:\",\r\n // monthId,\r\n // \"year\",\r\n // year,\r\n // \"kpiId\",\r\n // kpiId,\r\n // \"measuredValue\",\r\n // measuredValue,\r\n // \"thresholdValue\",\r\n // thresholdValue\r\n // );\r\n try {\r\n const data = await fetchSecureData(\r\n \"POST\",\r\n `/api/KpiEntry/Add?kpiId=${kpiId}&predicateId=${predicateId}&clientId=${clientId}&year=${year}&monthId=${monthId}&measuredValue=${measuredValue}&thresholdValue=${thresholdValue}&isEnabled=${isEnabled}`,\r\n accessToken\r\n );\r\n const kpiEntry = ((await data.json()) as any).value as IKpiEntry;\r\n return kpiEntry;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/KpiEntry/Add?kpiId=${kpiId}&predicateId=${predicateId}&clientId=${clientId}&year=${year}&monthId=${monthId}&measuredValue=${measuredValue}&thresholdValue=${thresholdValue}&isEnabled=${isEnabled}`,\r\n err\r\n );\r\n }\r\n return {} as IKpiEntry;\r\n};\r\n\r\nexport default saveKpiEntry;\r\n","import IKpiEntry from \"../models/IKpiEntry\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const saveUpdatedKpiEntry = async (\r\n accessToken: string,\r\n kpiEntry: IKpiEntry\r\n) => {\r\n const payload = {\r\n predicateId: kpiEntry.predicateId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n clientId: kpiEntry.clientId,\r\n year: kpiEntry.year,\r\n kpiId: kpiEntry.kpiId,\r\n monthId: kpiEntry.monthId,\r\n measuredValue: kpiEntry.measuredValue,\r\n thresholdValue: kpiEntry.thresholdValue,\r\n isEnabled: kpiEntry.isEnabled\r\n };\r\n try {\r\n const data = await fetchSecureData(\r\n \"PUT\",\r\n `/api/KpiEntry/Edit`,\r\n accessToken,\r\n payload\r\n );\r\n const result = ((await data.json()) as any).value as IKpiEntry;\r\n // tslint:disable-next-line:no-console\r\n return result;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for /api/KpiEntry/Edit`, err);\r\n }\r\n return {} as IKpiEntry;\r\n};\r\n\r\nexport default saveUpdatedKpiEntry;\r\n","export const SET_KPI_ENTRIES_LOADED = \"SET_KPI_ENTRIES_LOADED\";\r\n\r\nexport const setKpiEntriesLoaded = (kpiEntriesLoaded: boolean) => {\r\n return {\r\n kpiEntriesLoaded,\r\n type: SET_KPI_ENTRIES_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getKpiEntriesForPredicateClientKpiYear from \"../api/getKpiEntriesForPredicateClientKpiYear\";\r\nimport saveKpiEntry from \"../api/saveKpiEntry\";\r\nimport saveUpdatedKpiEntry from \"../api/saveUpdatedKpiEntry\";\r\nimport IKpiEntry from \"../models/IKpiEntry\";\r\nimport { setKpiEntriesLoaded } from \"./loadingKpiEntries\";\r\n\r\nexport const ADD_ACTIVE_KPI_ENTRY = \"ADD_ACTIVE_KPI_ENTRY\";\r\nexport const REMOVE_ACTIVE_KPI_ENTRY = \"REMOVE_ACTIVE_KPI_ENTRY\";\r\nexport const LOAD_ACTIVE_KPI_ENTRIES = \"LOAD_ACTIVE_KPI_ENTRIES\";\r\nexport const CLEAR_ACTIVE_KPI_ENTRIES = \"CLEAR_ACTIVE_KPI_ENTRIES\";\r\n\r\nexport const addActiveKpiEntry = (kpiEntry: IKpiEntry) => {\r\n return {\r\n kpiEntry,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: ADD_ACTIVE_KPI_ENTRY\r\n };\r\n};\r\n\r\nexport const removeActiveKpiEntry = (kpiEntry: IKpiEntry) => {\r\n return {\r\n kpiEntry,\r\n type: REMOVE_ACTIVE_KPI_ENTRY\r\n };\r\n};\r\n\r\nconst loadActiveKpiEntries = (kpiEntries: IKpiEntry[]) => {\r\n return {\r\n kpiEntries,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: LOAD_ACTIVE_KPI_ENTRIES\r\n };\r\n};\r\n\r\nconst clearActiveKpiEntries = () => {\r\n return {\r\n type: CLEAR_ACTIVE_KPI_ENTRIES\r\n };\r\n};\r\n\r\nexport const handleLoadActiveKpiEntries = (\r\n accessToken: string,\r\n predicateId: number,\r\n clientId: number,\r\n fyStartMonthId: number,\r\n endYear: number,\r\n kpiId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const kpiEntries = await getKpiEntriesForPredicateClientKpiYear(\r\n accessToken,\r\n predicateId,\r\n clientId,\r\n fyStartMonthId,\r\n endYear,\r\n kpiId\r\n );\r\n if (kpiEntries !== undefined) {\r\n if (kpiEntries.length > 0) {\r\n kpiEntries.sort((a, b) => (a.monthId > b.monthId ? 1 : -1));\r\n dispatch(loadActiveKpiEntries(kpiEntries));\r\n }\r\n dispatch(setKpiEntriesLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleClearActiveKpiEntries = () => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n dispatch(clearActiveKpiEntries());\r\n dispatch(setKpiEntriesLoaded(false));\r\n };\r\n};\r\n\r\nexport const handleSaveKpiEntry = (\r\n accessToken: string,\r\n kpiEntry: IKpiEntry\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const newKpiEntry = await saveKpiEntry(\r\n accessToken,\r\n kpiEntry.predicateId,\r\n kpiEntry.clientId,\r\n kpiEntry.year,\r\n kpiEntry.monthId,\r\n kpiEntry.kpiId,\r\n kpiEntry.measuredValue,\r\n kpiEntry.thresholdValue,\r\n true\r\n );\r\n if (newKpiEntry !== undefined) {\r\n dispatch(addActiveKpiEntry(kpiEntry));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateKpiEntry = (\r\n accessToken: string,\r\n kpiEntry: IKpiEntry,\r\n updatedKpiEntry: IKpiEntry\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n dispatch(removeActiveKpiEntry(kpiEntry));\r\n dispatch(addActiveKpiEntry(updatedKpiEntry));\r\n const validUpdatedKpiEntry = await saveUpdatedKpiEntry(\r\n accessToken,\r\n updatedKpiEntry\r\n );\r\n if (validUpdatedKpiEntry === undefined) {\r\n // rollback the change if not successful update to back end\r\n dispatch(removeActiveKpiEntry(updatedKpiEntry));\r\n dispatch(addActiveKpiEntry(kpiEntry));\r\n }\r\n };\r\n};\r\n","import IFYStartMonth from \"../models/IFYStartMonth\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getFyStartMonths = async (accessToken: string) => {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n \"/api/FYStartMonth/GetFinancialYearStartMonths\",\r\n accessToken\r\n );\r\n const fyStartMonths = ((await data.json()) as any).value as IFYStartMonth[];\r\n if (fyStartMonths !== undefined) {\r\n return fyStartMonths;\r\n } else {\r\n return [] as IFYStartMonth[];\r\n }\r\n};\r\n\r\nexport default getFyStartMonths;\r\n","import * as Redux from \"redux\";\r\nimport getFyStartMonths from \"../api/getFyStartMonths\";\r\nimport IFYStartMonth from \"../models/IFYStartMonth\";\r\nimport { setFyStartMonthsLoaded } from \"./loadingFyStartMonths\";\r\n\r\nexport const ADD_FY_START_MONTH = \"ADD_FY_START_MONTH\";\r\nexport const REMOVE_FY_START_MONTH = \"REMOVE_FY_START_MONTH\";\r\nexport const UPDATE_FY_START_MONTH = \"UPDATE_FY_START_MONTH\";\r\nexport const LOAD_FY_START_MONTHS = \"LOAD_FY_START_MONTHS\";\r\n\r\nexport const addFyStartMonth = (fyStartMonth: IFYStartMonth) => {\r\n return {\r\n fyStartMonth,\r\n type: ADD_FY_START_MONTH\r\n };\r\n};\r\n\r\nexport const removeFyStartMonth = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_FY_START_MONTH\r\n };\r\n};\r\n\r\nexport const updateFyStartMonth = (fyStartMonth: IFYStartMonth) => {\r\n return {\r\n fyStartMonth,\r\n type: UPDATE_FY_START_MONTH\r\n };\r\n};\r\n\r\nexport const loadFyStartMonths = (fyStartMonths: IFYStartMonth[]) => {\r\n return {\r\n fyStartMonths,\r\n type: LOAD_FY_START_MONTHS\r\n };\r\n};\r\n\r\nexport const handleLoadFyStartMonths = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const fyStartMonths = await getFyStartMonths(accessToken);\r\n if (fyStartMonths !== undefined) {\r\n if (fyStartMonths.length > 0) {\r\n fyStartMonths.sort((a, b) => (a.id > b.id ? 1 : -1));\r\n dispatch(loadFyStartMonths(fyStartMonths));\r\n }\r\n dispatch(setFyStartMonthsLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_FY_START_MONTHS_LOADED = \"SET_FY_START_MONTHS_LOADED\";\r\n\r\nexport const setFyStartMonthsLoaded = (fyStartMonthsLoaded: boolean) => {\r\n return {\r\n fyStartMonthsLoaded,\r\n type: SET_FY_START_MONTHS_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Button, Table } from \"reactstrap\";\r\nimport {\r\n handleClearActiveKpiEntries,\r\n handleLoadActiveKpiEntries,\r\n handleSaveKpiEntry,\r\n handleUpdateKpiEntry\r\n} from \"../../actions/activeKpiEntries\";\r\nimport { handleLoadFyStartMonths } from \"../../actions/fyStartMonths\";\r\nimport IFinancialYear from \"../../models/IFinancialYear\";\r\nimport IFYStartMonth from \"../../models/IFYStartMonth\";\r\nimport IKpiEntry from \"../../models/IKpiEntry\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport { validateNumber } from \"../../utils\";\r\nimport DataLoading from \"../organisms/DataLoading\";\r\nimport AddTextField from \"./AddTextField\";\r\n\r\nexport interface IKpiEntriesEditTableProps {\r\n accessToken: string;\r\n callback: () => void;\r\n role: IRole;\r\n financialYear: IFinancialYear;\r\n predicateId: number;\r\n clientId: number;\r\n kpiId: number;\r\n kpiEntries: IKpiEntry[];\r\n kpiEntriesLoaded: boolean;\r\n months: IFYStartMonth[];\r\n monthsLoaded: boolean;\r\n onHandleLoadMonths: (accessToken: string) => void;\r\n onHandleLoadKpiEntries: (\r\n accessToken: string,\r\n predicateId: number,\r\n clientId: number,\r\n fyStartMonthId: number,\r\n endYear: number,\r\n kpiId: number\r\n ) => void;\r\n onHandleClearLoadedKpiEntries: () => void;\r\n onHandleSaveKpiEntry: (accessToken: string, kpiEntry: IKpiEntry) => void;\r\n onHandleUpdateKpiEntry: (\r\n accessToken: string,\r\n kpiEntry: IKpiEntry,\r\n updatedKpiEntry: IKpiEntry\r\n ) => void;\r\n}\r\n\r\nexport interface IKpiEntriesEditTableState {\r\n editedKpiEntries: IKpiEntry[];\r\n}\r\n\r\nclass KpiEntriesEditTable extends React.Component<\r\n IKpiEntriesEditTableProps,\r\n IKpiEntriesEditTableState\r\n> {\r\n public state = {\r\n editedKpiEntries: [] as IKpiEntry[]\r\n };\r\n constructor(props: IKpiEntriesEditTableProps) {\r\n super(props);\r\n this.createTable = this.createTable.bind(this);\r\n this.onKpiEntryValueChange = this.onKpiEntryValueChange.bind(this);\r\n this.onKpiEntryThresholdChange = this.onKpiEntryThresholdChange.bind(this);\r\n this.copyToAllEditedKpiEntries = this.copyToAllEditedKpiEntries.bind(this);\r\n }\r\n public copyToAllEditedKpiEntries = (measuredValue: number) => {\r\n const { predicateId, clientId, kpiId, role, financialYear } = this.props;\r\n const { fyStartMonthId } = role;\r\n const { editedKpiEntries } = this.state;\r\n if (fyStartMonthId === 1) {\r\n // this.createTable(1, 13, financialYear.endYear, true);\r\n for (let i = fyStartMonthId; i < 13; i++) {\r\n const kpiEntryIndex = editedKpiEntries.findIndex(\r\n kpie => kpie.monthId === i && kpie.year === financialYear.endYear\r\n );\r\n const kpiEntry =\r\n kpiEntryIndex === -1\r\n ? ({\r\n predicateId,\r\n clientId,\r\n kpiId,\r\n year: financialYear.endYear,\r\n monthId: i,\r\n measuredValue,\r\n thresholdValue: 0,\r\n isEnabled: true\r\n } as IKpiEntry)\r\n : editedKpiEntries[kpiEntryIndex];\r\n this.onKpiEntryValueChange(kpiEntryIndex, kpiEntry, measuredValue);\r\n }\r\n } else {\r\n // {this.createTable(startMonthId, 13, financialYear.endYear - 1, true)}\r\n for (let i = fyStartMonthId; i < 13; i++) {\r\n const kpiEntryIndex = editedKpiEntries.findIndex(\r\n kpie => kpie.monthId === i && kpie.year === financialYear.endYear - 1\r\n );\r\n const kpiEntry =\r\n kpiEntryIndex === -1\r\n ? ({\r\n predicateId,\r\n clientId,\r\n kpiId,\r\n year: financialYear.endYear - 1,\r\n monthId: i,\r\n measuredValue,\r\n thresholdValue: 0,\r\n isEnabled: true\r\n } as IKpiEntry)\r\n : editedKpiEntries[kpiEntryIndex];\r\n this.onKpiEntryValueChange(kpiEntryIndex, kpiEntry, measuredValue);\r\n }\r\n // {this.createTable(1, startMonthId, financialYear.endYear)}\r\n for (let i = 1; i < fyStartMonthId; i++) {\r\n const kpiEntryIndex = editedKpiEntries.findIndex(\r\n kpie => kpie.monthId === i && kpie.year === financialYear.endYear\r\n );\r\n const kpiEntry =\r\n kpiEntryIndex === -1\r\n ? ({\r\n predicateId,\r\n clientId,\r\n kpiId,\r\n year: financialYear.endYear,\r\n monthId: i,\r\n measuredValue,\r\n thresholdValue: 0,\r\n isEnabled: true\r\n } as IKpiEntry)\r\n : editedKpiEntries[kpiEntryIndex];\r\n this.onKpiEntryValueChange(kpiEntryIndex, kpiEntry, measuredValue);\r\n }\r\n }\r\n this.props.callback();\r\n };\r\n public onKpiEntryValueChange = (\r\n index: number,\r\n kpiEntry: IKpiEntry,\r\n updatedValue: number\r\n ) => {\r\n const {\r\n accessToken,\r\n onHandleSaveKpiEntry,\r\n onHandleUpdateKpiEntry\r\n } = this.props;\r\n const { editedKpiEntries } = this.state;\r\n const newKpiEntry = {\r\n predicateId: kpiEntry.predicateId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n clientId: kpiEntry.clientId,\r\n year: kpiEntry.year,\r\n kpiId: kpiEntry.kpiId,\r\n monthId: kpiEntry.monthId,\r\n measuredValue: updatedValue,\r\n thresholdValue: kpiEntry.thresholdValue\r\n } as IKpiEntry;\r\n if (index === -1) {\r\n // new entry to add at end of array\r\n onHandleSaveKpiEntry(accessToken, newKpiEntry);\r\n editedKpiEntries.push(newKpiEntry);\r\n } else {\r\n // existing entry to update\r\n onHandleUpdateKpiEntry(accessToken, kpiEntry, newKpiEntry);\r\n editedKpiEntries.splice(index, 1, newKpiEntry);\r\n }\r\n this.setState(() => ({ editedKpiEntries }));\r\n };\r\n public onKpiEntryThresholdChange = (\r\n index: number,\r\n kpiEntry: IKpiEntry,\r\n updatedThreshold: number\r\n ) => {\r\n const {\r\n accessToken,\r\n onHandleSaveKpiEntry,\r\n onHandleUpdateKpiEntry\r\n } = this.props;\r\n const { editedKpiEntries } = this.state;\r\n const newKpiEntry = {\r\n predicateId: kpiEntry.predicateId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n clientId: kpiEntry.clientId,\r\n year: kpiEntry.year,\r\n kpiId: kpiEntry.kpiId,\r\n monthId: kpiEntry.monthId,\r\n measuredValue: kpiEntry.measuredValue,\r\n thresholdValue: updatedThreshold\r\n } as IKpiEntry;\r\n if (index === -1) {\r\n // new entry to add at end of array\r\n onHandleSaveKpiEntry(accessToken, newKpiEntry);\r\n editedKpiEntries.push(newKpiEntry);\r\n } else {\r\n // existing entry to update\r\n onHandleUpdateKpiEntry(accessToken, kpiEntry, newKpiEntry);\r\n editedKpiEntries.splice(index, 1, newKpiEntry);\r\n }\r\n this.setState(() => ({ editedKpiEntries }));\r\n };\r\n public createTable = (\r\n start: number,\r\n end: number,\r\n year: number,\r\n addAutofillButton: boolean = false\r\n ) => {\r\n const { months, predicateId, clientId, kpiId } = this.props;\r\n const { editedKpiEntries } = this.state;\r\n const table = [];\r\n for (let i = start; i < end; i++) {\r\n const kpiEntryIndex = editedKpiEntries.findIndex(\r\n kpie => kpie.monthId === i && kpie.year === year\r\n );\r\n const kpiEntry =\r\n kpiEntryIndex === -1\r\n ? ({\r\n predicateId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n clientId,\r\n kpiId,\r\n year,\r\n monthId: i,\r\n measuredValue: 0,\r\n thresholdValue: 0,\r\n isEnabled: true\r\n } as IKpiEntry)\r\n : editedKpiEntries[kpiEntryIndex];\r\n table.push(\r\n \r\n \r\n {(months.find(month => month.id === i) as IFYStartMonth).name}{\" \"}\r\n {year}\r\n \r\n \r\n {\r\n this.onKpiEntryValueChange(\r\n kpiEntryIndex,\r\n kpiEntry,\r\n Number(val)\r\n );\r\n }}\r\n />\r\n \r\n {/* Disable threshold input from UI */}\r\n {/* \r\n {\r\n this.onKpiEntryThresholdChange(\r\n kpiEntryIndex,\r\n kpiEntry,\r\n Number(threshold)\r\n );\r\n }}\r\n />\r\n */}\r\n \r\n {\" \"}\r\n {i === start && addAutofillButton && (\r\n \r\n this.copyToAllEditedKpiEntries(kpiEntry.measuredValue)\r\n }\r\n >\r\n Copy Value To All Months\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n return table;\r\n };\r\n\r\n public componentDidUpdate(prevProps: IKpiEntriesEditTableProps) {\r\n const {\r\n accessToken,\r\n role,\r\n predicateId,\r\n clientId,\r\n financialYear,\r\n kpiId,\r\n kpiEntries,\r\n kpiEntriesLoaded,\r\n onHandleClearLoadedKpiEntries,\r\n onHandleLoadKpiEntries\r\n } = this.props;\r\n if (\r\n prevProps.role.id !== role.id ||\r\n prevProps.predicateId !== predicateId ||\r\n prevProps.clientId !== clientId ||\r\n prevProps.financialYear.id !== financialYear.id ||\r\n prevProps.kpiId !== kpiId\r\n ) {\r\n onHandleClearLoadedKpiEntries();\r\n }\r\n if (!kpiEntriesLoaded) {\r\n onHandleLoadKpiEntries(\r\n accessToken,\r\n predicateId,\r\n clientId,\r\n role.fyStartMonthId,\r\n financialYear.endYear,\r\n kpiId\r\n );\r\n }\r\n if (prevProps.kpiEntries !== kpiEntries) {\r\n if (kpiEntriesLoaded) {\r\n this.setState(() => ({ editedKpiEntries: kpiEntries }));\r\n }\r\n }\r\n }\r\n public componentDidMount() {\r\n const {\r\n accessToken,\r\n monthsLoaded,\r\n onHandleLoadMonths,\r\n kpiEntries,\r\n kpiEntriesLoaded,\r\n onHandleLoadKpiEntries,\r\n role,\r\n predicateId,\r\n clientId,\r\n financialYear,\r\n kpiId\r\n } = this.props;\r\n if (!monthsLoaded) {\r\n onHandleLoadMonths(accessToken);\r\n }\r\n if (!kpiEntriesLoaded) {\r\n onHandleLoadKpiEntries(\r\n accessToken,\r\n predicateId,\r\n clientId,\r\n role.fyStartMonthId,\r\n financialYear.endYear,\r\n kpiId\r\n );\r\n }\r\n if (kpiEntriesLoaded) {\r\n this.setState(() => ({ editedKpiEntries: kpiEntries }));\r\n }\r\n }\r\n public componentWillUnmount() {\r\n const { onHandleClearLoadedKpiEntries } = this.props;\r\n onHandleClearLoadedKpiEntries();\r\n }\r\n public render() {\r\n const { role, financialYear, monthsLoaded, kpiEntriesLoaded } = this.props;\r\n const startMonthId = role.fyStartMonthId;\r\n return (\r\n \r\n {!monthsLoaded && }\r\n {!kpiEntriesLoaded && }\r\n {monthsLoaded && kpiEntriesLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n {startMonthId === 1 &&\r\n this.createTable(1, 13, financialYear.endYear, true)}\r\n {startMonthId !== 1 && (\r\n \r\n {this.createTable(\r\n startMonthId,\r\n 13,\r\n financialYear.endYear - 1,\r\n true\r\n )}\r\n {this.createTable(1, startMonthId, financialYear.endYear)}\r\n \r\n )}\r\n \r\n
MonthTarget ValueThreshold Value
\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n role: state.userRoles.find(role => role.id === state.activeRoleId) as IRole,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n financialYear: state.financialYears.find(\r\n fy => fy.id === state.activeKpiFinancialYearId\r\n ) as IFinancialYear,\r\n months: state.fyStartMonths,\r\n kpiEntries: state.activeKpiEntries,\r\n kpiEntriesLoaded: state.loadingKpiEntries,\r\n monthsLoaded: state.loadingFyStartMonths,\r\n predicateId: state.activeKpiPredicateId,\r\n clientId: state.activeKpiClientId,\r\n kpiId: state.activeKpiId\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadMonths: (accessToken: string) => {\r\n dispatch(handleLoadFyStartMonths(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleLoadKpiEntries: (\r\n accessToken: string,\r\n predicateId: number,\r\n clientId: number,\r\n fyStartMonthId: number,\r\n endYear: number,\r\n kpiId: number\r\n ) => {\r\n dispatch(\r\n handleLoadActiveKpiEntries(\r\n accessToken,\r\n predicateId,\r\n clientId,\r\n fyStartMonthId,\r\n endYear,\r\n kpiId\r\n )\r\n );\r\n },\r\n onHandleClearLoadedKpiEntries: () => {\r\n dispatch(handleClearActiveKpiEntries());\r\n },\r\n onHandleSaveKpiEntry: (accessToken: string, kpiEntry: IKpiEntry) => {\r\n dispatch(handleSaveKpiEntry(accessToken, kpiEntry));\r\n },\r\n onHandleUpdateKpiEntry: (\r\n accessToken: string,\r\n kpiEntry: IKpiEntry,\r\n updatedKpiEntry: IKpiEntry\r\n ) => {\r\n dispatch(handleUpdateKpiEntry(accessToken, kpiEntry, updatedKpiEntry));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(KpiEntriesEditTable);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Table } from \"reactstrap\";\r\nimport {\r\n handleClearActiveKpiEntries,\r\n handleLoadActiveKpiEntries\r\n} from \"../../actions/activeKpiEntries\";\r\nimport { handleLoadFyStartMonths } from \"../../actions/fyStartMonths\";\r\nimport IFinancialYear from \"../../models/IFinancialYear\";\r\nimport IFYStartMonth from \"../../models/IFYStartMonth\";\r\nimport IKpiEntry from \"../../models/IKpiEntry\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport DataLoading from \"../organisms/DataLoading\";\r\n\r\nexport interface IKpiEntriesTableProps {\r\n accessToken: string;\r\n role: IRole;\r\n financialYear: IFinancialYear;\r\n predicateId: number;\r\n clientId: number;\r\n kpiId: number;\r\n kpiEntries: IKpiEntry[];\r\n kpiEntriesLoaded: boolean;\r\n months: IFYStartMonth[];\r\n monthsLoaded: boolean;\r\n onHandleLoadMonths: (accessToken: string) => void;\r\n onHandleLoadKpiEntries: (\r\n accessToken: string,\r\n predicateId: number,\r\n clientId: number,\r\n fyStartMonthId: number,\r\n endYear: number,\r\n kpiId: number\r\n ) => void;\r\n onHandleClearLoadedKpiEntries: () => void;\r\n}\r\n\r\nclass KpiEntriesTable extends React.Component {\r\n constructor(props: IKpiEntriesTableProps) {\r\n super(props);\r\n this.createTable = this.createTable.bind(this);\r\n }\r\n public createTable = (start: number, end: number, year: number) => {\r\n const { months, kpiEntries } = this.props;\r\n const table = [];\r\n for (let i = start; i < end; i++) {\r\n const kpiEntry = kpiEntries.find(kpie => kpie.monthId === i) as IKpiEntry;\r\n table.push(\r\n \r\n \r\n {(months.find(month => month.id === i) as IFYStartMonth).name}{\" \"}\r\n {year}\r\n \r\n {kpiEntry === undefined ? 0 : kpiEntry.measuredValue}\r\n {/* Disable threshold value from UI */}\r\n {/* {kpiEntry === undefined ? 0 : kpiEntry.thresholdValue} */}\r\n \r\n );\r\n }\r\n return table;\r\n };\r\n\r\n public componentDidUpdate(prevProps: IKpiEntriesTableProps) {\r\n const {\r\n accessToken,\r\n role,\r\n predicateId,\r\n clientId,\r\n financialYear,\r\n kpiId,\r\n kpiEntriesLoaded,\r\n onHandleClearLoadedKpiEntries,\r\n onHandleLoadKpiEntries\r\n } = this.props;\r\n if (\r\n prevProps.role.id !== role.id ||\r\n prevProps.predicateId !== predicateId ||\r\n prevProps.clientId !== clientId ||\r\n prevProps.financialYear.id !== financialYear.id ||\r\n prevProps.kpiId !== kpiId\r\n ) {\r\n onHandleClearLoadedKpiEntries();\r\n }\r\n if (!kpiEntriesLoaded) {\r\n onHandleLoadKpiEntries(\r\n accessToken,\r\n predicateId,\r\n clientId,\r\n role.fyStartMonthId,\r\n financialYear.endYear,\r\n kpiId\r\n );\r\n }\r\n }\r\n public componentDidMount() {\r\n const {\r\n accessToken,\r\n role,\r\n monthsLoaded,\r\n onHandleLoadMonths,\r\n kpiEntriesLoaded,\r\n onHandleLoadKpiEntries,\r\n predicateId,\r\n clientId,\r\n financialYear,\r\n kpiId\r\n } = this.props;\r\n if (!monthsLoaded) {\r\n onHandleLoadMonths(accessToken);\r\n }\r\n if (!kpiEntriesLoaded) {\r\n onHandleLoadKpiEntries(\r\n accessToken,\r\n predicateId,\r\n clientId,\r\n role.fyStartMonthId,\r\n financialYear.endYear,\r\n kpiId\r\n );\r\n }\r\n }\r\n public componentWillUnmount() {\r\n const { onHandleClearLoadedKpiEntries } = this.props;\r\n onHandleClearLoadedKpiEntries();\r\n }\r\n public render() {\r\n const { role, financialYear, monthsLoaded, kpiEntriesLoaded } = this.props;\r\n const startMonthId = role.fyStartMonthId;\r\n return (\r\n \r\n {!monthsLoaded && }\r\n {!kpiEntriesLoaded && }\r\n {monthsLoaded && kpiEntriesLoaded && (\r\n \r\n \r\n \r\n \r\n \r\n {/* */}\r\n \r\n \r\n \r\n {this.createTable(\r\n startMonthId,\r\n 13,\r\n startMonthId === 1\r\n ? financialYear.endYear\r\n : financialYear.endYear - 1\r\n )}\r\n {this.createTable(1, startMonthId, financialYear.endYear)}\r\n \r\n
MonthTarget ValueThreshold Value
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n role: state.userRoles.find(role => role.id === state.activeRoleId) as IRole,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n financialYear: state.financialYears.find(\r\n fy => fy.id === state.activeKpiFinancialYearId\r\n ) as IFinancialYear,\r\n months: state.fyStartMonths,\r\n kpiEntries: state.activeKpiEntries,\r\n kpiEntriesLoaded: state.loadingKpiEntries,\r\n monthsLoaded: state.loadingFyStartMonths,\r\n predicateId: state.activeKpiPredicateId,\r\n clientId: state.activeKpiClientId,\r\n kpiId: state.activeKpiId\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadMonths: (accessToken: string) => {\r\n dispatch(handleLoadFyStartMonths(accessToken));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleLoadKpiEntries: (\r\n accessToken: string,\r\n predicateId: number,\r\n clientId: number,\r\n fyStartMonthId: number,\r\n endYear: number,\r\n kpiId: number\r\n ) => {\r\n dispatch(\r\n handleLoadActiveKpiEntries(\r\n accessToken,\r\n predicateId,\r\n clientId,\r\n fyStartMonthId,\r\n endYear,\r\n kpiId\r\n )\r\n );\r\n },\r\n onHandleClearLoadedKpiEntries: () => {\r\n dispatch(handleClearActiveKpiEntries());\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(KpiEntriesTable);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Button, Col, Container, Row } from \"reactstrap\";\r\nimport { handleLoadFinancialYears } from \"../../actions/financialYears\";\r\nimport { handleLoadKpis } from \"../../actions/kpis\";\r\nimport IFinancialYear from \"../../models/IFinancialYear\";\r\nimport IKpi from \"../../models/IKpi\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport KpiEntriesEditTable from \"./KpiEntriesEditTable\";\r\nimport KpiEntriesTable from \"./KpiEntriesTable\";\r\n\r\nexport interface IKpiEntriesContainerProps {\r\n accessToken: string;\r\n financialYear: IFinancialYear;\r\n kpi: IKpi;\r\n financialYearsLoaded: boolean;\r\n kpisLoaded: boolean;\r\n onHandleLoadFinancialYears: (accessToken: string) => void;\r\n onHandleLoadKpis: (accessToken: string) => void;\r\n}\r\n\r\nexport interface IKpiEntriesContainerState {\r\n editModeOn: boolean;\r\n}\r\n\r\nclass KpiEntriesContainer extends React.Component {\r\n public state = {\r\n editModeOn: false\r\n };\r\n constructor(props: IKpiEntriesContainerProps) {\r\n super(props);\r\n this.toggleEdit = this.toggleEdit.bind(this);\r\n }\r\n public toggleEdit() {\r\n this.setState(() => ({ editModeOn: !this.state.editModeOn }));\r\n }\r\n public componentDidMount() {\r\n const {\r\n accessToken,\r\n financialYearsLoaded,\r\n onHandleLoadFinancialYears,\r\n kpisLoaded,\r\n onHandleLoadKpis\r\n } = this.props;\r\n if (!financialYearsLoaded) {\r\n onHandleLoadFinancialYears(accessToken);\r\n }\r\n if (!kpisLoaded) {\r\n onHandleLoadKpis(accessToken);\r\n }\r\n }\r\n public render() {\r\n const { financialYear, kpi } = this.props;\r\n const { editModeOn } = this.state;\r\n return (\r\n \r\n \r\n \r\n

\r\n {kpi.displayName} Metrics for {financialYear.displayName}\r\n

\r\n \r\n
\r\n {!editModeOn && (\r\n \r\n \r\n \r\n \r\n Edit\r\n \r\n \r\n \r\n )}\r\n {editModeOn && (\r\n \r\n \r\n \r\n \r\n Close\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n financialYear: state.financialYears.find(\r\n fy => fy.id === state.activeKpiFinancialYearId\r\n ) as IFinancialYear,\r\n financialYearsLoaded: state.loadingFinancialYears,\r\n kpi: state.kpis.find(kpi => kpi.id === state.activeKpiId) as IKpi,\r\n kpisLoaded: state.loadingKpis\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadFinancialYears: (accessToken: string) => {\r\n dispatch(handleLoadFinancialYears(accessToken));\r\n },\r\n onHandleLoadKpis: (accessToken: string) => {\r\n dispatch(handleLoadKpis(accessToken));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(KpiEntriesContainer);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { FormGroup, Input, Label } from \"reactstrap\";\r\nimport {\r\n clearActiveKpiFinancialYearId,\r\n setActiveKpiFinancialYearId\r\n} from \"../../actions/activeKpiFinancialYear\";\r\nimport { handleLoadFinancialYears } from \"../../actions/financialYears\";\r\nimport IFinancialYear from \"../../models/IFinancialYear\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport DataLoading from \"../organisms/DataLoading\";\r\n\r\nexport interface IKpiFinancialYearSelectorProps {\r\n accessToken: string;\r\n fys: IFinancialYear[];\r\n fysLoaded: boolean;\r\n roleId: number;\r\n predicateId: number;\r\n clientId: number;\r\n onHandleLoadFinancialYears: (accessToken: string) => void;\r\n onHandleSetActiveFinancialYearId: (selectedFinancialYearId: number) => void;\r\n onHandleClearActiveFinancialYearId: () => void;\r\n}\r\n\r\nexport interface IKpiFinancialYearSelectorState {\r\n selectedFinancialYearId: number;\r\n}\r\n\r\nclass KpiFinancialYearSelector extends React.Component<\r\n IKpiFinancialYearSelectorProps,\r\n IKpiFinancialYearSelectorState\r\n> {\r\n public state = {\r\n selectedFinancialYearId: 0\r\n };\r\n public constructor(props: IKpiFinancialYearSelectorProps) {\r\n super(props);\r\n }\r\n public selectedFinancialYearChange = (\r\n e: React.ChangeEvent\r\n ) => {\r\n const { onHandleSetActiveFinancialYearId } = this.props;\r\n e.preventDefault();\r\n const selectedFinancialYearId =\r\n e.target.value === undefined ? 0 : Number(e.target.value as string);\r\n onHandleSetActiveFinancialYearId(selectedFinancialYearId);\r\n this.setState(() => ({ selectedFinancialYearId }));\r\n };\r\n public componentDidMount() {\r\n const { fysLoaded, onHandleLoadFinancialYears, accessToken } = this.props;\r\n if (!fysLoaded) {\r\n onHandleLoadFinancialYears(accessToken);\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: IKpiFinancialYearSelectorProps) {\r\n const {\r\n accessToken,\r\n fysLoaded,\r\n roleId,\r\n predicateId,\r\n clientId,\r\n onHandleClearActiveFinancialYearId,\r\n onHandleLoadFinancialYears\r\n } = this.props;\r\n if (!fysLoaded) {\r\n onHandleLoadFinancialYears(accessToken);\r\n }\r\n if (\r\n prevProps.roleId !== roleId ||\r\n prevProps.predicateId !== predicateId ||\r\n prevProps.clientId !== clientId\r\n ) {\r\n onHandleClearActiveFinancialYearId();\r\n this.setState({ selectedFinancialYearId: 0 });\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n const { onHandleClearActiveFinancialYearId } = this.props;\r\n onHandleClearActiveFinancialYearId();\r\n }\r\n public render() {\r\n const { fys, fysLoaded } = this.props;\r\n const { selectedFinancialYearId } = this.state;\r\n return (\r\n \r\n {!fysLoaded && }\r\n {fysLoaded && (\r\n \r\n \r\n \r\n \r\n {fys.map(financialYear => (\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n fys: state.financialYears,\r\n fysLoaded: state.loadingFinancialYears,\r\n roleId: state.activeRoleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId: state.activeKpiPredicateId,\r\n clientId: state.activeKpiClientId\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadFinancialYears: (accessToken: string) => {\r\n dispatch(handleLoadFinancialYears(accessToken));\r\n },\r\n onHandleSetActiveFinancialYearId: (selectedFinancialYearId: number) => {\r\n dispatch(setActiveKpiFinancialYearId(selectedFinancialYearId));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleClearActiveFinancialYearId: () => {\r\n dispatch(clearActiveKpiFinancialYearId());\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(KpiFinancialYearSelector);\r\n","export const SET_ACTIVE_KPI_FY_ID = \"SET_ACTIVE_KPI_FY_ID\";\r\nexport const CLEAR_ACTIVE_KPI_FY_ID = \"CLEAR_ACTIVE_KPI_FY_ID\";\r\n\r\nexport const setActiveKpiFinancialYearId = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_KPI_FY_ID\r\n };\r\n};\r\n\r\nexport const clearActiveKpiFinancialYearId = () => {\r\n return {\r\n type: CLEAR_ACTIVE_KPI_FY_ID\r\n };\r\n};\r\n","import IPredicate from \"../models/IPredicate\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getRoleKpiGroupingPredicates = async (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Predicate/GetKpiGroupingsForRole?roleId=${roleId}`,\r\n accessToken\r\n );\r\n // tslint:disable-next-line:no-console\r\n const roleKpiGroupingPredicates = ((await data.json()) as any)\r\n .value as IPredicate[];\r\n if (roleKpiGroupingPredicates !== undefined) {\r\n return roleKpiGroupingPredicates;\r\n } else {\r\n return [] as IPredicate[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/Predicate/GetKpiGroupingsForRole?roleId=${roleId}`,\r\n err\r\n );\r\n }\r\n return [] as IPredicate[];\r\n};\r\n\r\nexport default getRoleKpiGroupingPredicates;\r\n","export const SET_ROLE_KPI_GROUPING_PREDICATES_LOADED =\r\n \"SET_ROLE_KPI_GROUPING_PREDICATES_LOADED\";\r\n\r\nexport const setRoleKpiGroupingPredicatesLoaded = (\r\n roleKpiGroupingPredicatesLoaded: boolean\r\n) => {\r\n return {\r\n roleKpiGroupingPredicatesLoaded,\r\n type: SET_ROLE_KPI_GROUPING_PREDICATES_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getRoleKpiGroupingPredicates from \"../api/getRoleKpiGroupingPredicates\";\r\nimport IPredicate from \"../models/IPredicate\";\r\nimport { setRoleKpiGroupingPredicatesLoaded } from \"./loadingRoleKpiGroupingPredicates\";\r\n\r\nexport const ADD_ACTIVE_ROLE_KPI_GROUPING_PREDICATE =\r\n \"ADD_ACTIVE_ROLE_KPI_GROUPING_PREDICATE\";\r\nexport const REMOVE_ACTIVE_ROLE_KPI_GROUPING_PREDICATE =\r\n \"REMOVE_ACTIVE_ROLE_KPI_GROUPING_PREDICATE\";\r\nexport const LOAD_ACTIVE_ROLE_KPI_GROUPING_PREDICATES =\r\n \"LOAD_ACTIVE_ROLE_KPI_GROUPING_PREDICATES\";\r\nexport const CLEAR_ACTIVE_ROLE_KPI_GROUPING_PREDICATES =\r\n \"CLEAR_ACTIVE_ROLE_KPI_GROUPING_PREDICATES\";\r\n\r\nexport const addActiveRoleKpiGroupingPredicate = (predicate: IPredicate) => {\r\n return {\r\n predicate,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: ADD_ACTIVE_ROLE_KPI_GROUPING_PREDICATE\r\n };\r\n};\r\n\r\nexport const removeActiveRoleKpiGroupingPredicate = (predicate: IPredicate) => {\r\n return {\r\n predicate,\r\n type: REMOVE_ACTIVE_ROLE_KPI_GROUPING_PREDICATE\r\n };\r\n};\r\n\r\nconst loadActiveRoleKpiGroupingPredicates = (predicates: IPredicate[]) => {\r\n return {\r\n predicates,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: LOAD_ACTIVE_ROLE_KPI_GROUPING_PREDICATES\r\n };\r\n};\r\n\r\nconst clearActiveRoleKpiGroupingPredicates = () => {\r\n return {\r\n type: CLEAR_ACTIVE_ROLE_KPI_GROUPING_PREDICATES\r\n };\r\n};\r\n\r\nexport const handleLoadActiveRoleKpiGroupingPredicates = (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const predicates = await getRoleKpiGroupingPredicates(accessToken, roleId);\r\n if (predicates !== undefined) {\r\n if (predicates.length > 0) {\r\n predicates.sort((a, b) =>\r\n a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadActiveRoleKpiGroupingPredicates(predicates));\r\n }\r\n dispatch(setRoleKpiGroupingPredicatesLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleClearActiveRoleKpiGroupingPredicates = () => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n dispatch(clearActiveRoleKpiGroupingPredicates());\r\n dispatch(setRoleKpiGroupingPredicatesLoaded(false));\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { FormGroup, Input, Label } from \"reactstrap\";\r\nimport {\r\n clearActiveKpiPredicateId,\r\n setActiveKpiPredicateId\r\n} from \"../../actions/activeKpiPredicate\";\r\nimport {\r\n handleClearActiveRoleKpiGroupingPredicates,\r\n handleLoadActiveRoleKpiGroupingPredicates\r\n} from \"../../actions/activeRoleKpiGroupingPredicates\";\r\nimport IPredicate from \"../../models/IPredicate\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport DataLoading from \"../organisms/DataLoading\";\r\n\r\nexport interface IKpiGroupingSelectorProps {\r\n accessToken: string;\r\n predicates: IPredicate[];\r\n predicatesLoaded: boolean;\r\n roleId: number;\r\n onHandleLoadPredicates: (accessToken: string, roleId: number) => void;\r\n onHandleSetActiveKpiPredicateId: (selectedPredicateId: number) => void;\r\n onHandleClearActiveKpiPredicateId: () => void;\r\n onHandleClearLoadedPredicates: () => void;\r\n}\r\n\r\nexport interface IKpiGroupingSelectorState {\r\n selectedPredicateId: number;\r\n}\r\n\r\nclass KpiGroupingSelector extends React.Component<\r\n IKpiGroupingSelectorProps,\r\n IKpiGroupingSelectorState\r\n> {\r\n public state = {\r\n selectedPredicateId: 0\r\n };\r\n constructor(props: IKpiGroupingSelectorProps) {\r\n super(props);\r\n this.selectedPredicateChange = this.selectedPredicateChange.bind(this);\r\n }\r\n public selectedPredicateChange = (e: React.ChangeEvent) => {\r\n const { onHandleSetActiveKpiPredicateId } = this.props;\r\n e.preventDefault();\r\n const selectedPredicateId =\r\n e.target.value === undefined ? 0 : Number(e.target.value as string);\r\n onHandleSetActiveKpiPredicateId(selectedPredicateId);\r\n this.setState(() => ({ selectedPredicateId }));\r\n };\r\n public componentDidMount() {\r\n const {\r\n accessToken,\r\n predicatesLoaded,\r\n roleId,\r\n onHandleLoadPredicates\r\n } = this.props;\r\n if (!predicatesLoaded) {\r\n onHandleLoadPredicates(accessToken, roleId);\r\n }\r\n }\r\n public componentDidUpdate(prevProps: IKpiGroupingSelectorProps) {\r\n const {\r\n accessToken,\r\n roleId,\r\n predicatesLoaded,\r\n onHandleClearActiveKpiPredicateId,\r\n onHandleClearLoadedPredicates,\r\n onHandleLoadPredicates\r\n } = this.props;\r\n if (prevProps.roleId !== roleId) {\r\n onHandleClearLoadedPredicates();\r\n onHandleClearActiveKpiPredicateId();\r\n this.setState(() => ({ selectedPredicateId: 0 }));\r\n }\r\n if (!predicatesLoaded) {\r\n onHandleLoadPredicates(accessToken, roleId);\r\n }\r\n }\r\n public componentWillUnmount() {\r\n const {\r\n onHandleClearActiveKpiPredicateId,\r\n onHandleClearLoadedPredicates\r\n } = this.props;\r\n onHandleClearLoadedPredicates();\r\n onHandleClearActiveKpiPredicateId();\r\n }\r\n public render() {\r\n const { predicates, predicatesLoaded } = this.props;\r\n const { selectedPredicateId } = this.state;\r\n return (\r\n \r\n {!predicatesLoaded && }\r\n {predicatesLoaded && (\r\n \r\n \r\n \r\n \r\n {predicates.map(predicate => (\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n predicates: state.activeRoleKpiGroupingPredicates,\r\n predicatesLoaded: state.loadingRoleKpiGroupingPredicates,\r\n roleId: state.activeRoleId\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadPredicates: (accessToken: string, roleId: number) => {\r\n dispatch(handleLoadActiveRoleKpiGroupingPredicates(accessToken, roleId));\r\n },\r\n onHandleSetActiveKpiPredicateId: (selectedPredicateId: number) => {\r\n dispatch(setActiveKpiPredicateId(selectedPredicateId));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleClearActiveKpiPredicateId: () => {\r\n dispatch(clearActiveKpiPredicateId());\r\n },\r\n onHandleClearLoadedPredicates: () => {\r\n dispatch(handleClearActiveRoleKpiGroupingPredicates());\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(KpiGroupingSelector);\r\n","export const SET_ACTIVE_KPI_PREDICATE_ID = \"SET_ACTIVE_KPI_PREDICATE_ID\";\r\nexport const CLEAR_ACTIVE_KPI_PREDICATE_ID = \"CLEAR_ACTIVE_KPI_PREDICATE_ID\";\r\n\r\nexport const setActiveKpiPredicateId = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_KPI_PREDICATE_ID\r\n };\r\n};\r\n\r\nexport const clearActiveKpiPredicateId = () => {\r\n return {\r\n type: CLEAR_ACTIVE_KPI_PREDICATE_ID\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { FormGroup, Input, Label } from \"reactstrap\";\r\nimport { clearActiveKpiId, setActiveKpiId } from \"../../actions/activeKpi\";\r\nimport { handleLoadKpis } from \"../../actions/kpis\";\r\nimport IKpi from \"../../models/IKpi\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport DataLoading from \"../organisms/DataLoading\";\r\n\r\nexport interface IKpiSelectorProps {\r\n accessToken: string;\r\n kpis: IKpi[];\r\n kpisLoaded: boolean;\r\n roleId: number;\r\n predicateId: number;\r\n clientId: number;\r\n kpiId: number;\r\n onHandleLoadKpis: (accessToken: string) => void;\r\n onHandleSetActiveKpiId: (selectedKpiId: number) => void;\r\n onHandleClearActiveKpiId: () => void;\r\n}\r\n\r\nexport interface IKpiSelectorState {\r\n selectedKpiId: number;\r\n}\r\n\r\nclass KpiSelector extends React.Component<\r\n IKpiSelectorProps,\r\n IKpiSelectorState\r\n> {\r\n public state = {\r\n selectedKpiId: 0\r\n };\r\n public constructor(props: IKpiSelectorProps) {\r\n super(props);\r\n }\r\n public selectedKpiChange = (e: React.ChangeEvent) => {\r\n const { onHandleSetActiveKpiId } = this.props;\r\n e.preventDefault();\r\n const selectedKpiId =\r\n e.target.value === undefined ? 0 : Number(e.target.value as string);\r\n onHandleSetActiveKpiId(selectedKpiId);\r\n this.setState(() => ({ selectedKpiId }));\r\n };\r\n public componentDidMount() {\r\n const { kpisLoaded, onHandleLoadKpis, accessToken } = this.props;\r\n if (!kpisLoaded) {\r\n onHandleLoadKpis(accessToken);\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: IKpiSelectorProps) {\r\n const {\r\n accessToken,\r\n kpisLoaded,\r\n roleId,\r\n predicateId,\r\n clientId,\r\n kpiId,\r\n onHandleClearActiveKpiId,\r\n onHandleLoadKpis\r\n } = this.props;\r\n if (!kpisLoaded) {\r\n onHandleLoadKpis(accessToken);\r\n }\r\n if (\r\n prevProps.roleId !== roleId ||\r\n prevProps.predicateId !== predicateId ||\r\n prevProps.clientId !== clientId ||\r\n prevProps.kpiId !== kpiId\r\n ) {\r\n onHandleClearActiveKpiId();\r\n this.setState({ selectedKpiId: 0 });\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n const { onHandleClearActiveKpiId } = this.props;\r\n onHandleClearActiveKpiId();\r\n }\r\n public render() {\r\n const { kpis, kpisLoaded } = this.props;\r\n const { selectedKpiId } = this.state;\r\n return (\r\n \r\n {!kpisLoaded && }\r\n {kpisLoaded && (\r\n \r\n \r\n \r\n \r\n {kpis.map(kpi => (\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n kpis: state.kpis,\r\n kpisLoaded: state.loadingKpis,\r\n roleId: state.activeRoleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId: state.activeKpiPredicateId,\r\n clientId: state.activeKpiClientId,\r\n kpiId: state.activeKpiFinancialYearId\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleLoadKpis: (accessToken: string) => {\r\n dispatch(handleLoadKpis(accessToken));\r\n },\r\n onHandleSetActiveKpiId: (selectedKpiId: number) => {\r\n dispatch(setActiveKpiId(selectedKpiId));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleClearActiveKpiId: () => {\r\n dispatch(clearActiveKpiId());\r\n }\r\n});\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(KpiSelector);\r\n","export const SET_ACTIVE_KPI_ID = \"SET_ACTIVE_KPI_ID\";\r\nexport const CLEAR_ACTIVE_KPI_ID = \"CLEAR_ACTIVE_KPI_ID\";\r\n\r\nexport const setActiveKpiId = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_KPI_ID\r\n };\r\n};\r\n\r\nexport const clearActiveKpiId = () => {\r\n return {\r\n type: CLEAR_ACTIVE_KPI_ID\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Form, Jumbotron } from \"reactstrap\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport KpiClientSelector from \"../molecules/KpiClientSelector\";\r\nimport KpiEntriesContainer from \"../molecules/KpiEntriesContainer\";\r\nimport KpiFYSelector from \"../molecules/KpiFYSelector\";\r\nimport KpiGroupingSelector from \"../molecules/KpiGroupingSelector\";\r\nimport KpiSelector from \"../molecules/KpiSelector\";\r\nexport interface IKpiTargetsPageProps extends RouteComponentProps {\r\n accessToken: string;\r\n predicateSelected: boolean;\r\n clientSelected: boolean;\r\n fySelected: boolean;\r\n kpiSelected: boolean;\r\n}\r\nexport interface IKpiTargetsPageState {\r\n isLoaded: boolean;\r\n}\r\n\r\nexport class KpiTargetsPage extends React.Component {\r\n public isLoaded = false;\r\n public state = {\r\n isLoaded: false\r\n };\r\n\r\n public constructor(props: IKpiTargetsPageProps) {\r\n super(props);\r\n }\r\n\r\n public async componentDidUpdate() {\r\n // const { accessToken } = this.props;\r\n }\r\n\r\n public async componentDidMount() {\r\n // const { accessToken } = this.props;\r\n }\r\n public render() {\r\n const {\r\n predicateSelected,\r\n clientSelected,\r\n fySelected,\r\n kpiSelected\r\n } = this.props;\r\n return (\r\n \r\n
\r\n \r\n {predicateSelected && (\r\n \r\n \r\n {clientSelected && (\r\n \r\n \r\n {fySelected && (\r\n \r\n \r\n {kpiSelected && (\r\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\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n predicateSelected: state.activeKpiPredicateId !== 0,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n clientSelected: state.activeKpiClientId !== 0,\r\n fySelected: state.activeKpiFinancialYearId !== 0,\r\n kpiSelected: state.activeKpiId !== 0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(KpiTargetsPage);\r\n","import IClient from \"../models/IClient\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nconst getClient = async (accessToken: string, id: number) => {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/Client/GetClientById?id=${id}`,\r\n accessToken\r\n );\r\n const client = ((await data.json()) as any).value as IClient;\r\n if (client !== undefined) {\r\n return client;\r\n } else {\r\n return {} as IClient;\r\n }\r\n};\r\n\r\nexport default getClient;\r\n","import { ITokenData } from \"../models/ITokenData\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getAccessToken = async (accessToken: string) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/PowerBiService/GetAccessToken`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result as ITokenData;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"Fetch error for /api/PowerBiService/GetAccessToken\", err);\r\n }\r\n return {} as ITokenData;\r\n};\r\n\r\nexport default getAccessToken;\r\n","import IUserProfile from \"../models/IUserProfile\";\r\nimport { fetchSecureData } from \"../utils\";\r\nimport saveUserProfile from \"./saveUserProfile\";\r\n\r\nexport const getUser = async (accessToken: string, emailAddress: string) => {\r\n try {\r\n let data = await fetchSecureData(\r\n \"GET\",\r\n `/api/UserProfile/GetUserProfileByEmail?emailAddress=${emailAddress}`,\r\n accessToken\r\n );\r\n let user = ((await data.json()) as any).value as IUserProfile;\r\n if (user === undefined) {\r\n // email address is not in our database, so add it\r\n await saveUserProfile(accessToken, emailAddress, true);\r\n data = await fetchSecureData(\r\n \"GET\",\r\n `/api/UserProfile/GetUserProfileByEmail?emailAddress=${emailAddress}`,\r\n accessToken\r\n );\r\n user = ((await data.json()) as any).value as IUserProfile;\r\n }\r\n return user;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/UserProfile/GetUserProfileByEmail?emailAddress=${emailAddress}`,\r\n err\r\n );\r\n }\r\n return {} as IUserProfile;\r\n};\r\n\r\nexport default getUser;\r\n","import getAccessToken from \"./getAccessToken\";\r\nimport getUser from \"./getUser\";\r\n\r\nexport const getInitialData = async (\r\n accessToken: string,\r\n emailAddress: string\r\n) => {\r\n const user = await getUser(accessToken, emailAddress);\r\n const tokenData = await getAccessToken(accessToken);\r\n\r\n return {\r\n user,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n tokenData\r\n };\r\n};\r\n","import IRolePredicateClient from \"../models/IRolePredicateClient\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nconst getDefaultRolePredicateClient = async (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/RolePredicateClient/GetDefaultRolePredicateClientForRole?roleId=${roleId}`,\r\n accessToken\r\n );\r\n // tslint:disable-next-line:no-console\r\n const rolePredicateClient = ((await data.json()) as any)\r\n .value as IRolePredicateClient;\r\n if (rolePredicateClient !== undefined) {\r\n return rolePredicateClient;\r\n } else {\r\n return {} as IRolePredicateClient;\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/RolePredicateClient/GetDefaultRolePredicateClientForRole?roleId=${roleId}`,\r\n err\r\n );\r\n }\r\n return {} as IRolePredicateClient;\r\n};\r\n\r\nexport default getDefaultRolePredicateClient;\r\n","import IClient from \"models/IClient\";\r\n\r\nexport const SET_ACTIVE_DASHBOARD_DEFAULT_CLIENT = \"SET_ACTIVE_DASHBOARD_DEFAULT_CLIENT\";\r\nexport const CLEAR_ACTIVE_DASHBOARD_DEFAULT_CLIENT = \"CLEAR_ACTIVE_DASHBOARD_DEFAULT_CLIENT\";\r\n\r\nexport const setActiveDashboardDefaultClient = (client: IClient) => {\r\n return {\r\n client,\r\n type: SET_ACTIVE_DASHBOARD_DEFAULT_CLIENT\r\n };\r\n};\r\n\r\nexport const clearActiveDashboardDefaultClient = () => {\r\n return {\r\n type: CLEAR_ACTIVE_DASHBOARD_DEFAULT_CLIENT\r\n };\r\n};\r\n","export const SET_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID =\r\n \"SET_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID\";\r\nexport const CLEAR_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID =\r\n \"CLEAR_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID\";\r\n\r\nexport const setActiveDashboardDefaultPredicateId = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID\r\n };\r\n};\r\n\r\nexport const clearActiveDashboardDefaultPredicateId = () => {\r\n return {\r\n type: CLEAR_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID\r\n };\r\n};\r\n","import IUserProfile from \"../models/IUserProfile\";\r\n\r\nexport const SET_ACTIVE_USER_PROFILE = \"SET_ACTIVE_USER_PROFILE\";\r\n\r\nexport const setActiveUserProfile = (user: IUserProfile) => {\r\n return {\r\n type: SET_ACTIVE_USER_PROFILE,\r\n user\r\n };\r\n};\r\n\r\n","import ICurrencyCode from \"../models/ICurrencyCode\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getCurrencyCodes = async (accessToken: string) => {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n \"/api/CurrencyCode/GetCurrencyCodes\",\r\n accessToken\r\n );\r\n const currencyCodes = ((await data.json()) as any).value as ICurrencyCode[];\r\n if (currencyCodes !== undefined) {\r\n return currencyCodes;\r\n } else {\r\n return [] as ICurrencyCode[];\r\n }\r\n};\r\n\r\nexport default getCurrencyCodes;\r\n","import * as Redux from \"redux\";\r\nimport getCurrencyCodes from \"../api/getCurrencyCodes\";\r\nimport ICurrencyCode from \"../models/ICurrencyCode\";\r\nimport { setCurrencyCodesLoaded } from \"./loadingCurrencyCodes\";\r\n\r\nexport const ADD_CURRENCY_CODE = \"ADD_CURRENCY_CODE\";\r\nexport const REMOVE_CURRENCY_CODE = \"REMOVE_CURRENCY_CODE\";\r\nexport const UPDATE_CURRENCY_CODE = \"UPDATE_CURRENCY_CODE\";\r\nexport const LOAD_CURRENCY_CODES = \"LOAD_CURRENCY_CODES\";\r\n\r\nexport const addCurrencyCode = (currencyCode: ICurrencyCode) => {\r\n return {\r\n currencyCode,\r\n type: ADD_CURRENCY_CODE\r\n };\r\n};\r\n\r\nexport const removeCurrencyCode = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_CURRENCY_CODE\r\n };\r\n};\r\n\r\nexport const updateCurrencyCode = (currencyCode: ICurrencyCode) => {\r\n return {\r\n currencyCode,\r\n type: UPDATE_CURRENCY_CODE\r\n };\r\n};\r\n\r\nexport const loadCurrencyCodes = (currencyCodes: ICurrencyCode[]) => {\r\n return {\r\n currencyCodes,\r\n type: LOAD_CURRENCY_CODES\r\n };\r\n};\r\n\r\nexport const handleLoadCurrencyCodes = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const currencyCodes = await getCurrencyCodes(accessToken);\r\n if (currencyCodes !== undefined) {\r\n if (currencyCodes.length > 0) {\r\n currencyCodes.sort((a, b) =>\r\n a.code.toLowerCase() > b.code.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadCurrencyCodes(currencyCodes));\r\n }\r\n dispatch(setCurrencyCodesLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_CURRENCY_CODES_LOADED = \"SET_CURRENCY_CODES_LOADED\";\r\n\r\nexport const setCurrencyCodesLoaded = (currencyCodesLoaded: boolean) => {\r\n return {\r\n currencyCodesLoaded,\r\n type: SET_CURRENCY_CODES_LOADED\r\n };\r\n};\r\n","import { ITokenData } from \"../models/ITokenData\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const refreshAccessToken = async (\r\n accessToken: string,\r\n refreshToken: string\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/PowerBiService/RefreshAccessToken?refreshToken=${refreshToken}`,\r\n accessToken\r\n );\r\n const result = await data.json();\r\n return result as ITokenData;\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/PowerBiService/RefreshAccessToken?refreshToken=${refreshToken}`,\r\n err\r\n );\r\n }\r\n return {} as ITokenData;\r\n};\r\n\r\nexport default refreshAccessToken;\r\n","import refreshAccessToken from \"../api/refreshAccessToken\";\r\nimport { ITokenData } from \"../models/ITokenData\";\r\n\r\nexport const SET_PBI_ACCESS_TOKEN = \"SET_PBI_ACCESS_TOKEN\";\r\nexport const CLEAR_PBI_ACCESS_TOKEN = \"CLEAR_PBI_ACCESS_TOKEN\";\r\n\r\nexport const setPbiAccessToken = (tokenData: ITokenData) => {\r\n return {\r\n tokenData,\r\n type: SET_PBI_ACCESS_TOKEN\r\n };\r\n};\r\n\r\nexport const clearPbiAccessToken = () => {\r\n return {\r\n type: CLEAR_PBI_ACCESS_TOKEN\r\n };\r\n};\r\nexport const handleRefreshToken = (\r\n accessToken: string,\r\n refreshToken: string\r\n) => {\r\n return async (dispatch: any) => {\r\n const tokenData = await refreshAccessToken(accessToken, refreshToken);\r\n\r\n await dispatch(setPbiAccessToken(tokenData));\r\n };\r\n};\r\n","import IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getUserDashboards = async (\r\n accessToken: string,\r\n userId: number\r\n) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/PbiDashboard/GetPbiDashboardsForUserId?userId=${userId}`,\r\n accessToken\r\n );\r\n const userDashboards = ((await data.json()) as any)\r\n .value as IPbiDashboard[];\r\n if (userDashboards !== undefined) {\r\n return userDashboards;\r\n } else {\r\n return [] as IPbiDashboard[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/PbiDashboard/GetPbiDashboardsForUserId?userId=${userId}`,\r\n err\r\n );\r\n }\r\n return [] as IPbiDashboard[];\r\n};\r\n\r\nexport default getUserDashboards;\r\n","import * as Redux from \"redux\";\r\nimport IPbiDashboard from \"../models/IPbiDashboard\";\r\n\r\nexport const SET_ACTIVE_DASHBOARD_ID = \"SET_ACTIVE_DASHBOARD_ID\";\r\nexport const CLEAR_ACTIVE_DASHBOARD_ID = \"CLEAR_ACTIVE_DASHBOARD_ID\";\r\n\r\nexport const setActiveDashboard = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_DASHBOARD_ID\r\n };\r\n};\r\nexport const clearActiveDashboard = () => {\r\n return {\r\n type: CLEAR_ACTIVE_DASHBOARD_ID\r\n };\r\n};\r\n\r\nexport const handleLoadActiveDashboardData = (\r\n dashboardId: number,\r\n userDashboards: IPbiDashboard[]\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const dashboard = await userDashboards.find(\r\n dash => dash.id === dashboardId\r\n );\r\n if (dashboard === undefined) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n \"This dashboard not found, or user does not have access to this dashboard\"\r\n );\r\n } else {\r\n dispatch(setActiveDashboard(dashboard.id));\r\n }\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getUserDashboards from \"../api/getUserDashboards\";\r\nimport IPbiDashboard from \"../models/IPbiDashboard\";\r\nimport { setActiveDashboard } from \"./activeDashboard\";\r\nimport { setUserDashboardsLoaded } from \"./loadingUserDashboards\";\r\n\r\nexport const ADD_USER_DASHBOARD = \"ADD_USER_DASHBOARD\";\r\nexport const REMOVE_USER_DASHBOARD = \"REMOVE_USER_DASHBOARD\";\r\nexport const LOAD_USER_DASHBOARDS = \"LOAD_USER_DASHBOARDS\";\r\n\r\nexport const addUserDashboard = (userDashboard: IPbiDashboard) => {\r\n return {\r\n userDashboard,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: ADD_USER_DASHBOARD\r\n };\r\n};\r\n\r\nexport const removeUserDashboard = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_USER_DASHBOARD\r\n };\r\n};\r\n\r\nexport const loadUserDashboards = (userDashboards: IPbiDashboard[]) => {\r\n return {\r\n userDashboards,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: LOAD_USER_DASHBOARDS\r\n };\r\n};\r\n\r\nexport const handleLoadUserDashboards = (\r\n accessToken: string,\r\n userId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const dashboards = await getUserDashboards(accessToken, userId);\r\n if (dashboards !== undefined) {\r\n if (dashboards.length > 0) {\r\n dashboards.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadUserDashboards(dashboards));\r\n dispatch(setActiveDashboard(dashboards[0].id));\r\n }\r\n dispatch(setUserDashboardsLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_USER_DASHBOARDS_LOADED = \"SET_USER_DASHBOARDS_LOADED\";\r\n\r\nexport const setUserDashboardsLoaded = (userDashboardsLoaded: boolean) => {\r\n return {\r\n userDashboardsLoaded,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: SET_USER_DASHBOARDS_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getUserGroups from \"../api/getUserGroups\";\r\nimport IUserGroup from \"../models/IGroup\";\r\nimport { setActiveUserGroupId } from \"./activeUserGroup\";\r\nimport { setUserGroupsLoaded } from \"./loadingUserGroups\";\r\nexport const ADD_USER_GROUP = \"ADD_USER_GROUP\";\r\nexport const REMOVE_USER_GROUP = \"REMOVE_USER_GROUP\";\r\nexport const LOAD_USER_GROUPS = \"LOAD_USER_GROUPS\";\r\n\r\nexport const addUserGroup = (userGroup: IUserGroup) => {\r\n return {\r\n type: ADD_USER_GROUP,\r\n userGroup\r\n };\r\n};\r\n\r\nexport const removeUserGroup = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_USER_GROUP\r\n };\r\n};\r\n\r\nexport const loadUserGroups = (userGroups: IUserGroup[]) => {\r\n return {\r\n type: LOAD_USER_GROUPS,\r\n userGroups\r\n };\r\n};\r\n\r\nexport const handleLoadUserGroups = (accessToken: string, userId: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const userGroups = await getUserGroups(accessToken, userId);\r\n if (userGroups !== undefined) {\r\n if (userGroups.length > 0) {\r\n dispatch(loadUserGroups(userGroups));\r\n dispatch(setActiveUserGroupId(userGroups[0].id));\r\n }\r\n dispatch(setUserGroupsLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_ACTIVE_USER_GROUP_ID = \"SET_ACTIVE_USER_GROUP_ID\";\r\nexport const CLEAR_ACTIVE_USER_GROUP_ID = \"CLEAR_ACTIVE_USER_GROUP_ID\";\r\n\r\nexport const setActiveUserGroupId = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_USER_GROUP_ID\r\n };\r\n};\r\n\r\nexport const clearActiveUserGroupId = () => {\r\n return {\r\n type: CLEAR_ACTIVE_USER_GROUP_ID\r\n };\r\n};\r\n","export const SET_USER_GROUPS_LOADED = \"SET_USER_GROUPS_LOADED\";\r\n\r\nexport const setUserGroupsLoaded = (userGroupsLoaded: boolean) => {\r\n return {\r\n userGroupsLoaded,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: SET_USER_GROUPS_LOADED\r\n };\r\n};\r\n","import ISqlReport from \"../models/ISqlReport\";\r\nimport { fetchSecureData } from \"../utils\";\r\n\r\nexport const getUserReports = async (accessToken: string, userId: number) => {\r\n try {\r\n const data = await fetchSecureData(\r\n \"GET\",\r\n `/api/SqlReport/GetSqlReportsForUserId?userId=${userId}`,\r\n accessToken\r\n );\r\n const userReports = ((await data.json()) as any).value as ISqlReport[];\r\n if (userReports !== undefined) {\r\n return userReports;\r\n } else {\r\n return [] as ISqlReport[];\r\n }\r\n } catch (err) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n `Fetch error for /api/SqlReport/GetSqlReportsForUserId?userId=${userId}`,\r\n err\r\n );\r\n }\r\n return [] as ISqlReport[];\r\n};\r\n\r\nexport default getUserReports;\r\n","import * as Redux from \"redux\";\r\nimport ISqlReport from \"../models/ISqlReport\";\r\n\r\nexport const SET_ACTIVE_REPORT_ID = \"SET_ACTIVE_REPORT_ID\";\r\nexport const CLEAR_ACTIVE_REPORT_ID = \"CLEAR_ACTIVE_REPORT_ID\";\r\n\r\nexport const setActiveReport = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_REPORT_ID\r\n };\r\n};\r\n\r\nexport const clearActiveReport = () => {\r\n return {\r\n type: CLEAR_ACTIVE_REPORT_ID\r\n };\r\n};\r\n\r\nexport const handleLoadActiveReportData = (\r\n accessToken: string,\r\n reportId: number,\r\n userReports: ISqlReport[]\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const report = await userReports.find(rep => rep.id === reportId);\r\n if (report === undefined) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n \"This report not found, or user does not have access to edit this report\"\r\n );\r\n } else {\r\n dispatch(setActiveReport(report.id));\r\n }\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getUserReports from \"../api/getUserReports\";\r\nimport ISqlReport from \"../models/ISqlReport\";\r\nimport { setActiveReport } from \"./activeReport\";\r\nimport { setUserReportsLoaded } from \"./loadingUserReports\";\r\n\r\nexport const ADD_USER_REPORT = \"ADD_USER_REPORT\";\r\nexport const REMOVE_USER_REPORT = \"REMOVE_USER_REPORT\";\r\nexport const LOAD_USER_REPORTS = \"LOAD_USER_REPORTS\";\r\n\r\nexport const addUserReport = (userReport: ISqlReport) => {\r\n return {\r\n userReport,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: ADD_USER_REPORT\r\n };\r\n};\r\n\r\nexport const removeUserReport = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_USER_REPORT\r\n };\r\n};\r\n\r\nexport const loadUserReports = (userReports: ISqlReport[]) => {\r\n return {\r\n userReports,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: LOAD_USER_REPORTS\r\n };\r\n};\r\n\r\nexport const handleLoadUserReports = (accessToken: string, userId: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const reports = await getUserReports(accessToken, userId);\r\n if (reports !== undefined) {\r\n if (reports.length > 0) {\r\n reports.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadUserReports(reports));\r\n dispatch(setActiveReport(reports[0].id));\r\n }\r\n dispatch(setUserReportsLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_USER_REPORTS_LOADED = \"SET_USER_REPORTS_LOADED\";\r\n\r\nexport const setUserReportsLoaded = (userReportsLoaded: boolean) => {\r\n return {\r\n userReportsLoaded,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: SET_USER_REPORTS_LOADED\r\n };\r\n};\r\n","import * as Redux from \"redux\";\r\nimport getUserRoles from \"../api/getUserRoles\";\r\nimport IRole from \"../models/IRole\";\r\nimport { setUserRolesLoaded } from \"./loadingUserRoles\";\r\nimport { handleSetActiveRolePredicateClient } from \"./shared\";\r\n\r\nexport const ADD_USER_ROLE = \"ADD_USER_ROLE\";\r\nexport const REMOVE_USER_ROLE = \"REMOVE_USER_ROLE\";\r\nexport const LOAD_USER_ROLES = \"LOAD_USER_ROLES\";\r\n\r\nexport const addUserRole = (userRole: IRole) => {\r\n return {\r\n userRole,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: ADD_USER_ROLE\r\n };\r\n};\r\n\r\nexport const removeUserRole = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_USER_ROLE\r\n };\r\n};\r\n\r\nexport const loadUserRoles = (userRoles: IRole[]) => {\r\n return {\r\n userRoles,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: LOAD_USER_ROLES\r\n };\r\n};\r\n\r\nexport const handleLoadUserRoles = (accessToken: string, userId: number) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const roles = await getUserRoles(accessToken, userId);\r\n if (roles !== undefined) {\r\n if (roles.length > 0) {\r\n roles.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadUserRoles(roles));\r\n dispatch(handleSetActiveRolePredicateClient(accessToken, roles[0].id));\r\n }\r\n dispatch(setUserRolesLoaded(true));\r\n }\r\n };\r\n};\r\n","export const SET_USER_ROLES_LOADED = \"SET_USER_ROLES_LOADED\";\r\n\r\nexport const setUserRolesLoaded = (userRolesLoaded: boolean) => {\r\n return {\r\n userRolesLoaded,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: SET_USER_ROLES_LOADED\r\n };\r\n};\r\n","import getClient from \"api/getClient\";\r\nimport * as Redux from \"redux\";\r\nimport { getInitialData } from \"../api\";\r\nimport getDefaultRolePredicateClient from \"../api/getDefaultRolePredicateClient\";\r\nimport IUserProfile from \"../models/IUserProfile\";\r\nimport { setActiveDashboardDefaultClient } from \"./activeDashboardDefaultClient\";\r\nimport { setActiveDashboardDefaultPredicateId } from \"./activeDashboardDefaultPredicate\";\r\nimport { setActiveRoleId } from \"./activeRole\";\r\nimport { setActiveUserProfile } from \"./activeUserProfile\";\r\nimport { handleLoadCurrencyCodes } from \"./currencyCodes\";\r\nimport { handleLoadFyStartMonths } from \"./fyStartMonths\";\r\nimport { handleLoadGroups } from \"./groups\";\r\nimport { setDataLoaded } from \"./loading\";\r\nimport { handleLoadPredicates } from \"./predicates\";\r\nimport { setPbiAccessToken } from \"./tokenData\";\r\n\r\nimport { handleLoadUserDashboards } from \"./userDashboards\";\r\nimport { handleLoadUserPaginatedReports } from \"./userPaginatedReports\";\r\n\r\nimport { handleLoadUserGroups } from \"./userGroups\";\r\nimport { handleLoadUserReports } from \"./userReports\";\r\nimport { handleLoadUserRoles } from \"./userRoles\";\r\n\r\nexport const handleLoadUserData = (\r\n userId: number,\r\n userProfiles: IUserProfile[]\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const user = await userProfiles.find(usr => usr.id === userId);\r\n if (user === undefined) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n \"This user not found, or current user does not have access to edit this user\"\r\n );\r\n } else {\r\n dispatch(setActiveUserProfile(user));\r\n }\r\n };\r\n};\r\n\r\nexport const handleLoadInitialData = (\r\n accessToken: string,\r\n emailAddress: string\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const { user, tokenData } = await getInitialData(accessToken, emailAddress);\r\n\r\n await dispatch(handleLoadFyStartMonths(accessToken));\r\n await dispatch(handleLoadCurrencyCodes(accessToken));\r\n await dispatch(handleLoadGroups(accessToken));\r\n await dispatch(handleLoadPredicates(accessToken));\r\n\r\n await dispatch(setActiveUserProfile(user));\r\n\r\n await dispatch(handleLoadUserRoles(accessToken, user.id));\r\n await dispatch(handleLoadUserDashboards(accessToken, user.id));\r\n // await dispatch(handleLoadUserPaginatedReports(accessToken, user.id));\r\n\r\n await dispatch(handleLoadUserReports(accessToken, user.id));\r\n await dispatch(handleLoadUserGroups(accessToken, user.id));\r\n\r\n await dispatch(setPbiAccessToken(tokenData));\r\n\r\n await dispatch(setDataLoaded(true));\r\n };\r\n};\r\n\r\nexport const handleSetActiveRolePredicateClient = (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n await dispatch(setActiveRoleId(roleId));\r\n //\r\n // get the default RolePredicateClient mapping for the role\r\n const rolePredicateClient = await getDefaultRolePredicateClient(\r\n accessToken,\r\n roleId\r\n );\r\n if (rolePredicateClient) {\r\n // set the active Dashboard Default Client\r\n const client = await getClient(accessToken, rolePredicateClient.clientId);\r\n await dispatch(setActiveDashboardDefaultClient(client));\r\n // set the active Dashboard Default Predicate ID\r\n await dispatch(\r\n setActiveDashboardDefaultPredicateId(rolePredicateClient.predicateId)\r\n );\r\n } else {\r\n console.error(\r\n `Cannot find default predicate or default client values for currently selected roleId: ${roleId}`\r\n );\r\n }\r\n };\r\n};\r\n","export const SET_ACTIVE_ROLE_ID = \"SET_ACTIVE_ROLE_ID\";\r\nexport const CLEAR_ACTIVE_ROLE_ID = \"CLEAR_ACTIVE_ROLE_ID\";\r\n\r\nexport const setActiveRoleId = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_ROLE_ID\r\n };\r\n};\r\n\r\nexport const clearActiveRoleId = () => {\r\n return {\r\n type: CLEAR_ACTIVE_ROLE_ID\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { updateAuth0 } from \"../../actions/auth0\";\r\nimport { handleLoadInitialData } from \"../../actions/shared\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport paths from \"../../constants\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackProps extends RouteComponentProps {\r\n auth: Auth;\r\n onHandleAuthentication: (\r\n accessToken: string,\r\n expiresAt: number,\r\n idToken: string,\r\n email: string\r\n ) => void;\r\n}\r\n\r\nexport class Callback extends React.Component {\r\n public constructor(props: ICallbackProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth, history, onHandleAuthentication } = this.props;\r\n auth\r\n .handleAuthentication()\r\n // .then((authResult: auth0.Auth0DecodedHash) => {\r\n .then((authResult: any) => {\r\n history.push(paths.root);\r\n onHandleAuthentication(\r\n authResult.accessToken as string,\r\n (authResult.expiresIn as number) * 1000 + new Date().getTime(),\r\n authResult.idToken as string,\r\n auth.getProfile().email as string\r\n );\r\n })\r\n .catch((err: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"There was an error:\", err);\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleAuthentication: (\r\n accessToken: string,\r\n expiresAt: number,\r\n idToken: string,\r\n email: string\r\n ) => {\r\n dispatch(updateAuth0(accessToken, expiresAt, idToken));\r\n dispatch(handleLoadInitialData(accessToken, email));\r\n }\r\n});\r\n\r\nexport default connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(Callback);\r\n","import Auth from \"../auth/Auth\";\r\n\r\nexport const INITIALISE_AUTH0 = \"INITIALISE_AUTH0\";\r\nexport const UPDATE_AUTH0 = \"UPDATE_AUTH0\";\r\n\r\nexport const initialiseAuth0 = (auth: Auth) => {\r\n return {\r\n payload: auth,\r\n type: INITIALISE_AUTH0\r\n };\r\n};\r\n\r\nexport const updateAuth0 = (\r\n accessToken: string,\r\n expiresAt: number,\r\n idToken: string\r\n) => {\r\n return {\r\n payload: { accessToken, expiresAt, idToken },\r\n type: UPDATE_AUTH0\r\n };\r\n};\r\n","export const SET_DATA_LOADED = \"SET_DATA_LOADED\";\r\n\r\nexport const setDataLoaded = (dataLoaded: boolean) => {\r\n return {\r\n dataLoaded,\r\n type: SET_DATA_LOADED\r\n };\r\n};\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSaml extends React.Component {\r\n public constructor(props: ICallbackSamlProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAML().then(() => {\r\n console.log(\"Login via SAML\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSaml);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlNAProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSamlNA extends React.Component {\r\n public constructor(props: ICallbackSamlNAProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAMLNA().then(() => {\r\n console.log(\"Login via SAML NA\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSamlNA);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlProdAuProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSamlProdAu extends React.Component {\r\n public constructor(props: ICallbackSamlProdAuProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAMLProdAU().then(() => {\r\n console.log(\"Login via SAML Prod Au\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSamlProdAu);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlProdNAProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSamlProdNA extends React.Component<\r\n ICallbackSamlProdNAProps\r\n> {\r\n public constructor(props: ICallbackSamlProdNAProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAMLProdNA().then(() => {\r\n console.log(\"Login via SAML Prod NA\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSamlProdNA);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlProdAsiaProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSamlProdAsia extends React.Component {\r\n public constructor(props: ICallbackSamlProdAsiaProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAMLProdAsia().then(() => {\r\n console.log(\"Login via SAML Asia\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSamlProdAsia);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlPrtlDevAuProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSamlPrtlDevAu extends React.Component {\r\n public constructor(props: ICallbackSamlPrtlDevAuProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAMLPrtlDevAU().then(() => {\r\n console.log(\"Login via SAML Portal Dev Au\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSamlPrtlDevAu);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlPrtlQaAuProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSamlPrtlQaAu extends React.Component {\r\n public constructor(props: ICallbackSamlPrtlQaAuProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAMLPrtlQaAU().then(() => {\r\n console.log(\"Login via SAML Portal QA Au\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSamlPrtlQaAu);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ICallbackSamlPrtlProdAuProps extends RouteComponentProps {\r\n auth: Auth;\r\n}\r\n\r\nexport class CallbackSamlPrtlProdAu extends React.Component {\r\n public constructor(props: ICallbackSamlPrtlProdAuProps) {\r\n super(props);\r\n }\r\n\r\n public componentDidMount() {\r\n const { auth } = this.props;\r\n\r\n auth.loginSAMLPrtlProdAU().then(() => {\r\n console.log(\"Login via SAML Portal Prod Au\");\r\n });\r\n }\r\n\r\n public render() {\r\n return
Loading...
;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(CallbackSamlPrtlProdAu);\r\n","import * as React from \"react\";\r\n\r\nexport interface IJumbotronProps {\r\n fluid?: boolean;\r\n children: React.ReactNode;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst Jumbotron: React.SFC = (props: IJumbotronProps) => {\r\n const { children, fluid, style } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default Jumbotron;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Badge } from \"reactstrap\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface IActiveRoleBadgeProps {\r\n activeRoleId: number;\r\n availableRoles: IRole[];\r\n}\r\n\r\nconst ActiveRoleBadge: React.SFC = (\r\n props: IActiveRoleBadgeProps\r\n) => {\r\n const { activeRoleId, availableRoles } = props;\r\n return (\r\n \r\n {\r\n (availableRoles.find(role => role.id === activeRoleId) as IRole)\r\n .displayName\r\n }\r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n activeRoleId: state.activeRoleId,\r\n availableRoles: state.userRoles\r\n };\r\n};\r\nexport default connect(mapStateToProps)(ActiveRoleBadge);\r\n","import * as React from \"react\";\r\nimport { Button } from \"reactstrap\";\r\n\r\nexport interface IResetSizeToWindowButtonProps {\r\n onClick: () => void;\r\n isVisible: boolean;\r\n}\r\n\r\nconst ResetSizeToWindowButton: React.SFC = (\r\n props: IResetSizeToWindowButtonProps\r\n) => {\r\n const { isVisible, onClick } = props;\r\n return (\r\n \r\n Reset size to window\r\n \r\n );\r\n};\r\n\r\nexport default ResetSizeToWindowButton;\r\n","import Report from \"powerbi-report-component\";\r\nimport * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Spinner } from \"reactstrap\";\r\nimport {\r\n clearActiveDashboard,\r\n setActiveDashboard\r\n} from \"../../actions/activeDashboard\";\r\nimport { handleRefreshToken } from \"../../actions/tokenData\";\r\nimport ICurrencyCode from \"../../models/ICurrencyCode\";\r\nimport IFYStartMonth from \"../../models/IFYStartMonth\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\nimport { IPbiData } from \"../../models/IPbiData\";\r\nimport { IPbiTokenData } from \"../../models/IPbiTokenData\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport { ITokenData } from \"../../models/ITokenData\";\r\nimport Jumbotron from \"../atoms/Jumbotron\";\r\nimport ActiveRoleBadge from \"../molecules/ActiveRoleBadge\";\r\nimport ResetSizeToWindowButton from \"../molecules/ResetSizeToWindowButton\";\r\n\r\nexport interface IDashboardViewProps {\r\n apiAccessToken: string;\r\n currencyCodes: ICurrencyCode[];\r\n dashboard: IPbiDashboard;\r\n fyStartMonths: IFYStartMonth[];\r\n token: ITokenData;\r\n activeUserRole: IRole;\r\n onSetActiveDashboard: (id: number) => void;\r\n onClearActiveDashboard: () => void;\r\n onHandleRefreshToken: (accessToken: string, refreshToken: string) => void;\r\n roleCount: number;\r\n}\r\n\r\nexport interface IDashboardViewState {\r\n currency: string;\r\n embedUrl: string;\r\n fetched: boolean;\r\n fetching: boolean;\r\n fitToWindowVisible: boolean;\r\n fystart: number;\r\n height: string;\r\n intervalId: number;\r\n pbiToken: IPbiTokenData;\r\n // token: ITokenData;\r\n width: string;\r\n}\r\n\r\nexport class DashboardView extends React.Component<\r\n IDashboardViewProps,\r\n IDashboardViewState\r\n> {\r\n public state = {\r\n currency: \"\",\r\n embedUrl: \"\",\r\n fetched: false,\r\n fetching: true,\r\n fitToWindowVisible: false,\r\n fystart: 0,\r\n height: \"\",\r\n intervalId: 0,\r\n pbiToken: {\r\n expiration: \"\",\r\n token: \"\",\r\n tokenId: \"\"\r\n },\r\n // token: {\r\n // access_token: \"\",\r\n // expires_in: 0,\r\n // ext_expires_in: 0,\r\n // id_token: \"\",\r\n // not_before: 0,\r\n // refresh_token: \"\",\r\n // resource: \"\",\r\n // scope: \"\",\r\n // token_type: \"\"\r\n // },\r\n width: \"\"\r\n };\r\n public report: any;\r\n constructor(props: IDashboardViewProps) {\r\n super(props);\r\n this.getPbiReportAccessToken = this.getPbiReportAccessToken.bind(this);\r\n this.tokenRefresh = this.tokenRefresh.bind(this);\r\n this.handleDataSelected = this.handleDataSelected.bind(this);\r\n this.handleReportLoad = this.handleReportLoad.bind(this);\r\n this.handlePageChange = this.handlePageChange.bind(this);\r\n\r\n this.report = null; // to store the loaded report's object to perform operations like print, fullscreen etc...\r\n }\r\n\r\n public handleDataSelected = (data: any) => {\r\n // will be called when some chart or data element in your report clicked\r\n };\r\n\r\n public handleReportLoad = async (report: any) => {\r\n const { fyStartMonths } = this.props;\r\n // will be called when report loads\r\n this.report = report; // get the object from callback and store it. (optional)\r\n\r\n const filterCurrency = {\r\n $schema: \"http://powerbi.com/product/schema#advanced\",\r\n target: {\r\n table: \"Currency\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"Currency\"\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n logicalOperator: \"And\",\r\n conditions: [\r\n {\r\n operator: \"Is\",\r\n value: this.state.currency\r\n }\r\n ]\r\n };\r\n\r\n const filterFYStart = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"LkpPeriod\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"FYear First Month\"\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n operator: \"In\",\r\n values: [\r\n (fyStartMonths.find(\r\n month => month.id === this.state.fystart\r\n ) as IFYStartMonth).name\r\n ]\r\n };\r\n\r\n const filterDebtor = {\r\n $schema: \"http://powerbi.com/product/schema#advanced\",\r\n target: {\r\n table: \"DimClient\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"DebtorName\"\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n logicalOperator: \"And\",\r\n conditions: [\r\n {\r\n operator: \"IsNotBlank\",\r\n value: \"\"\r\n }\r\n ]\r\n };\r\n const filters = await report.getFilters();\r\n await filters.push(filterCurrency);\r\n await filters.push(filterFYStart);\r\n await filters.push(filterDebtor);\r\n await report.setFilters(filters);\r\n report.on(\"error\", (error: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"Error occurred\");\r\n console.table(error);\r\n });\r\n // all events for reports listed below. hook in as needed\r\n ///////////\r\n // report.on('loaded', async (e: any) => {\r\n // console.log('loaded called'); //<-- this wont ever fire since handleReportLoad fires when 'loaded' fires\r\n // });\r\n // report.on(\"saved\", async (e: any) => {\r\n // console.log(\"saved called\");\r\n // });\r\n // report.on(\"rendered\", async (e: any) => {\r\n // console.log(\"rendered called\");\r\n // });\r\n // report.on(\"saveAsTriggered\", async (e: any) => {\r\n // console.log(\"saveAsTriggered called\");\r\n // });\r\n // report.on(\"error\", async (e: any) => {\r\n // console.log(\"error called\");\r\n // });\r\n // report.on(\"dataSelected\", async (e: any) => {\r\n // console.log(\"dataSelected called\");\r\n // });\r\n // report.on(\"buttonClicked\", async (e: any) => {\r\n // console.log(\"buttonClicked called\");\r\n // });\r\n // report.on(\"pageChanged\", async (e: any) => {\r\n // console.log(\"pageChanged called\");\r\n // });\r\n // report.on(\"commandTriggered\", async (e: any) => {\r\n // console.log(\"commandTriggered called\");\r\n // });\r\n // report.on(\"swipeStart\", async (e: any) => {\r\n // console.log(\"swipeStart called\");\r\n // });\r\n // report.on(\"swipeEnd\", async (e: any) => {\r\n // console.log(\"swipeEnd called\");\r\n // });\r\n // report.on(\"bookmarkApplied\", async (e: any) => {\r\n // console.log(\"bookmarkApplied called\");\r\n // });\r\n // report.on(\"dataHyperlinkClicked\", async (e: any) => {\r\n // console.log(\"dataHyperlinkClicked called\");\r\n // });\r\n ///////////\r\n };\r\n\r\n public handlePageChange = (data: any) => {\r\n // will be called when pages in your report changes\r\n };\r\n\r\n public setFullscreen = () => {\r\n if (this.report) {\r\n this.setState({\r\n fitToWindowVisible: true,\r\n width: \"100vw\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n height: \"100vh\"\r\n });\r\n this.report.fullscreen();\r\n }\r\n };\r\n\r\n public printReport = () => {\r\n if (this.report) {\r\n this.report.print();\r\n }\r\n };\r\n\r\n public async getPbiReportAccessToken(accessToken: string) {\r\n const { dashboard, activeUserRole, apiAccessToken } = this.props;\r\n const { groupId, reportId } = dashboard;\r\n const dashboardInfo = (await this.getReportInGroup(\r\n accessToken\r\n )) as IPbiData;\r\n await this.setState({ embedUrl: dashboardInfo.embedUrl });\r\n const headers = new Headers();\r\n headers.append(\"Authorization\", `Bearer ${apiAccessToken}`);\r\n headers.append(\"AccessToken\", accessToken);\r\n const init: RequestInit = {\r\n cache: \"default\",\r\n headers,\r\n method: \"GET\",\r\n mode: \"cors\"\r\n };\r\n // if the user has no roles, it will return all data, so we set an 'unknown' role if no roles found so that no data will be returned\r\n const url = `/api/PowerBiService/GetPowerBiReportToken?roles=${\r\n activeUserRole !== undefined ? activeUserRole.name : \"Unknown\"\r\n }&datasetId=${\r\n dashboardInfo.datasetId\r\n }&reportId=${reportId}&groupId=${groupId}`;\r\n const request = new Request(url, init);\r\n return fetch(request)\r\n .then(result => result.json())\r\n .then(data => {\r\n return data as IPbiTokenData;\r\n })\r\n .catch(err => {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for ${url}`, err);\r\n return {} as IPbiTokenData;\r\n });\r\n }\r\n\r\n public getReportInGroup(accessToken: string) {\r\n const { dashboard, apiAccessToken } = this.props;\r\n const { groupId, reportId } = dashboard;\r\n const headers = new Headers();\r\n headers.append(\"Authorization\", `Bearer ${apiAccessToken}`);\r\n headers.append(\"AccessToken\", accessToken);\r\n const init: RequestInit = {\r\n cache: \"default\",\r\n headers,\r\n method: \"GET\",\r\n mode: \"cors\"\r\n };\r\n const url = `/api/PowerBiService/GetReportInGroup?groupId=${groupId}&reportId=${reportId}`;\r\n const request = new Request(url, init);\r\n return fetch(request)\r\n .then(result => result.json())\r\n .then(data => {\r\n return data as IPbiData;\r\n })\r\n .catch(err =>\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for ${url}`, err)\r\n );\r\n }\r\n public tokenRefresh = async () => {\r\n const { apiAccessToken, token, onHandleRefreshToken } = this.props;\r\n await onHandleRefreshToken(apiAccessToken, token.refresh_token);\r\n };\r\n public async componentDidUpdate(prevProps: IDashboardViewProps) {\r\n const { onSetActiveDashboard, dashboard } = this.props;\r\n if (prevProps.dashboard.id !== dashboard.id) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"props dashboard change detected, refreshing\");\r\n onSetActiveDashboard(dashboard.id);\r\n this.tokenRefresh();\r\n }\r\n }\r\n public async componentDidMount() {\r\n const {\r\n activeUserRole,\r\n currencyCodes,\r\n fyStartMonths,\r\n dashboard,\r\n onSetActiveDashboard\r\n } = this.props;\r\n onSetActiveDashboard(dashboard.id);\r\n await this.setState(() => ({ fetching: true, fetched: false }));\r\n await this.tokenRefresh();\r\n await this.setState(() => ({ fetching: false, fetched: true }));\r\n const intervalId = window.setInterval(this.tokenRefresh, 55 * 60 * 1000); // 55 minutes between refreshes of PBI token\r\n await this.setState(() => ({ intervalId }));\r\n\r\n if (activeUserRole === undefined) {\r\n this.setState({ currency: \"AUD\", fystart: 1 });\r\n throw new Error(\r\n \"At least one role has not been defined, so default CurrencyCode to AUD with a FYStartMonth of January\"\r\n );\r\n } else {\r\n const currency = (currencyCodes.find(\r\n cc => cc.id === activeUserRole.currencyCodeId\r\n ) as ICurrencyCode).code;\r\n const fystart = (fyStartMonths.find(\r\n fysm => fysm.id === activeUserRole.fyStartMonthId\r\n ) as IFYStartMonth).id;\r\n this.setState({\r\n currency,\r\n fystart\r\n });\r\n }\r\n this.setState({ width: \"calc(99vw)\", height: \"calc(85vh)\" });\r\n }\r\n\r\n public shouldComponentUpdate(\r\n nextProps: IDashboardViewProps,\r\n nextState: IDashboardViewState\r\n ) {\r\n if (this.props.token.access_token !== nextProps.token.access_token) {\r\n if (nextProps.token.access_token !== \"\") {\r\n this.getPbiReportAccessToken(nextProps.token.access_token).then(\r\n (pbiToken: IPbiTokenData) => {\r\n this.setState(() => ({ pbiToken }));\r\n if (this.report !== null) {\r\n this.report.setAccessToken(pbiToken.token);\r\n }\r\n }\r\n );\r\n }\r\n if (this.props.token.access_token === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n if (this.state.pbiToken.token !== nextState.pbiToken.token) {\r\n if (this.state.pbiToken.token === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (this.state.fitToWindowVisible !== nextState.fitToWindowVisible) {\r\n return false;\r\n }\r\n\r\n if (this.state.height !== nextState.height) {\r\n if (this.state.height === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n if (this.state.width !== nextState.width) {\r\n if (this.state.width === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n if (this.props.dashboard.id !== nextProps.dashboard.id) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public componentWillUnmount() {\r\n clearInterval(this.state.intervalId);\r\n }\r\n\r\n public render() {\r\n const { dashboard, roleCount } = this.props;\r\n const { reportId } = dashboard;\r\n const { fetching, fetched, pbiToken, embedUrl, height, width } = this.state;\r\n const reportStyle = {\r\n // style object for report component\r\n height,\r\n width\r\n };\r\n const extraSettings = {\r\n filterPanelEnabled: false, // true\r\n navContentPaneEnabled: true // false\r\n // any other custom settings\r\n };\r\n return (\r\n \r\n \r\n Dashboard: {dashboard.displayName} \r\n {roleCount > 1 && (\r\n \r\n {\" \"}\r\n using Role: \r\n \r\n )}\r\n \r\n\r\n \r\n Go Full Screen\r\n \r\n {\r\n this.setState({\r\n fitToWindowVisible: false,\r\n height: \"calc(85vh)\",\r\n width: \"calc(99vw)\"\r\n });\r\n }}\r\n isVisible={this.state.fitToWindowVisible}\r\n />\r\n \r\n Print\r\n \r\n {fetching && !fetched && (\r\n \r\n

Loading...

\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!fetching && fetched && (\r\n
\r\n {!pbiToken &&
Loading...
}\r\n {pbiToken && pbiToken.token && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\nconst matchStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let dashboard = {} as IPbiDashboard;\r\n if (match !== null) {\r\n const id = (match.params as any).id as string;\r\n dashboard = state.userDashboards.find(dash => {\r\n return dash.id === parseInt(id, 10);\r\n }) as IPbiDashboard;\r\n // if (dashboard === undefined) {\r\n // // tslint:disable-next-line:no-console\r\n // console.log(\"didn't find the dashboard\");\r\n // return { dashboard: {} as IPbiDashboard };\r\n // }\r\n }\r\n return {\r\n activeUserRole: state.userRoles.find(\r\n role => role.id === state.activeRoleId\r\n ) as IRole,\r\n roleCount: state.userRoles.length,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n apiAccessToken: state.auth0.accessToken,\r\n currencyCodes: state.currencyCodes,\r\n dashboard,\r\n fyStartMonths: state.fyStartMonths,\r\n token: state.tokenData\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onClearActiveDashboard: () => {\r\n dispatch(clearActiveDashboard());\r\n },\r\n onSetActiveDashboard: (id: number) => {\r\n dispatch(setActiveDashboard(id));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleRefreshToken: async (accessToken: string, refreshToken: string) => {\r\n await dispatch(handleRefreshToken(accessToken, refreshToken));\r\n }\r\n});\r\n\r\nconst DashboardViewPage = connect(\r\n matchStateToProps,\r\n mapDispatchToProps\r\n)(DashboardView);\r\n\r\nexport default DashboardViewPage;\r\n","import { handleLoadFinancialYears } from \"actions/financialYears\";\r\nimport IFinancialYear from \"models/IFinancialYear\";\r\nimport IPredicate from \"models/IPredicate\";\r\nimport Report from \"powerbi-report-component\";\r\nimport * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button, Spinner } from \"reactstrap\";\r\nimport {\r\n clearActiveDashboard,\r\n setActiveDashboard\r\n} from \"../../actions/activeDashboard\";\r\nimport { handleRefreshToken } from \"../../actions/tokenData\";\r\nimport { settings } from \"../../constants\";\r\nimport ICurrencyCode from \"../../models/ICurrencyCode\";\r\nimport IFYStartMonth from \"../../models/IFYStartMonth\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\nimport { IPbiData } from \"../../models/IPbiData\";\r\nimport { IPbiTokenData } from \"../../models/IPbiTokenData\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport { ITokenData } from \"../../models/ITokenData\";\r\nimport Jumbotron from \"../atoms/Jumbotron\";\r\nimport ActiveRoleBadge from \"../molecules/ActiveRoleBadge\";\r\nimport ResetSizeToWindowButton from \"../molecules/ResetSizeToWindowButton\";\r\n\r\nexport interface IDashboardViewProps {\r\n apiAccessToken: string;\r\n currencyCodes: ICurrencyCode[];\r\n dashboard: IPbiDashboard;\r\n fyStartMonths: IFYStartMonth[];\r\n token: ITokenData;\r\n activeUserRole: IRole;\r\n defaultClientName: string;\r\n defaultPredicateDisplayName: string;\r\n onSetActiveDashboard: (id: number) => void;\r\n onClearActiveDashboard: () => void;\r\n onHandleRefreshToken: (accessToken: string, refreshToken: string) => void;\r\n roleCount: number;\r\n fys: IFinancialYear[];\r\n fysLoaded: boolean;\r\n onHandleLoadFinancialYears: (accessToken: string) => void;\r\n}\r\n\r\nexport interface IDashboardViewState {\r\n currency: string;\r\n embedUrl: string;\r\n fetched: boolean;\r\n fetching: boolean;\r\n fitToWindowVisible: boolean;\r\n fystart: number;\r\n height: string;\r\n intervalId: number;\r\n valuesLoaded: boolean;\r\n pbiToken: IPbiTokenData;\r\n width: string;\r\n}\r\n\r\nexport class DashboardView extends React.Component<\r\n IDashboardViewProps,\r\n IDashboardViewState\r\n> {\r\n public state = {\r\n currency: \"\",\r\n embedUrl: \"\",\r\n fetched: false,\r\n fetching: true,\r\n fitToWindowVisible: false,\r\n fystart: 0,\r\n height: \"\",\r\n intervalId: 0,\r\n valuesLoaded: false,\r\n pbiToken: {\r\n expiration: \"\",\r\n token: \"\",\r\n tokenId: \"\"\r\n },\r\n width: \"\"\r\n };\r\n public report: any;\r\n constructor(props: IDashboardViewProps) {\r\n super(props);\r\n this.getCurrentFinancialYear = this.getCurrentFinancialYear.bind(this);\r\n this.configureKpiPageFilters = this.configureKpiPageFilters.bind(this);\r\n this.configureSimulationPageFilters = this.configureSimulationPageFilters.bind(\r\n this\r\n );\r\n this.handleDataSelected = this.handleDataSelected.bind(this);\r\n this.handleReportLoad = this.handleReportLoad.bind(this);\r\n this.handlePageChange = this.handlePageChange.bind(this);\r\n this.setFullscreen = this.setFullscreen.bind(this);\r\n this.setRefresh = this.setRefresh.bind(this);\r\n this.printReport = this.printReport.bind(this);\r\n this.getPbiReportAccessToken = this.getPbiReportAccessToken.bind(this);\r\n this.getReportInGroup = this.getReportInGroup.bind(this);\r\n this.tokenRefresh = this.tokenRefresh.bind(this);\r\n\r\n this.report = null; // to store the loaded report's object to perform operations like print, fullscreen etc...\r\n }\r\n\r\n public getCurrentFinancialYear = (fyStartMonthId: number) => {\r\n const { fys } = this.props;\r\n const fyStart = new Date(new Date().getFullYear(), fyStartMonthId - 1, 1);\r\n const fyEnd = new Date(\r\n new Date().getFullYear() + 1,\r\n fyStartMonthId - 1,\r\n 0,\r\n 23,\r\n 59,\r\n 59,\r\n 999\r\n );\r\n const today = new Date().getDate();\r\n const lastFinancialMonth = new Date(Date.now() - today * 864e5); //864e5 == 86500000 = 24(h)*60(m)*60(s)*1000(ms)\r\n\r\n // console.table(\"Financial Year Start ID: \", fyStartMonthId);\r\n // console.table(\"Financial Year Start Date\", fyStart);\r\n // console.table(\"Financial Year End Date\", fyEnd);\r\n // console.table(\"Today's Date: \", today);\r\n // console.table(\"Last Financial Month's last day: \", lastFinancialMonth);\r\n // console.table(\"Financial Year starts after the last financial month date\", fyStartlastFinancialMonth);\r\n\r\n if (fyStart < lastFinancialMonth) {\r\n //New financial Year has started already for this calendar year\r\n return (fys.find(\r\n fy => fy.endYear === fyEnd.getFullYear()\r\n ) as IFinancialYear).displayName;\r\n } else {\r\n // New financial year has not yet started for this calendar year\r\n return (fys.find(\r\n fy => fy.endYear === fyEnd.getFullYear() - 1\r\n ) as IFinancialYear).displayName;\r\n }\r\n };\r\n\r\n public configureKpiPageFilters = async (page: any) => {\r\n const { defaultClientName, defaultPredicateDisplayName } = this.props;\r\n const filters = await page.getFilters();\r\n const filterClient = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"KpiDimValue\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"DimValueName\"\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n logicalOperator: \"And\",\r\n conditions: [\r\n {\r\n operator: \"Is\",\r\n value: defaultClientName.substring(0, defaultClientName.length - 6) // To eliminate appended currency code e.g. (AUD)\r\n }\r\n ]\r\n };\r\n const filterPredicate = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"KpiDim\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"DimName\"\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n logicalOperator: \"And\",\r\n conditions: [\r\n {\r\n operator: \"Is\",\r\n value: defaultPredicateDisplayName\r\n }\r\n ]\r\n };\r\n filters.push(filterClient);\r\n filters.push(filterPredicate);\r\n page.setFilters(filters);\r\n };\r\n public configureSimulationPageFilters = async (page: any) => {\r\n const { defaultClientName, defaultPredicateDisplayName } = this.props;\r\n const filters = await page.getFilters();\r\n // const filterClient = {\r\n // $schema: \"http://powerbi.com/product/schema#basic\",\r\n // target: {\r\n // table: \"KpiDimValue\",\r\n // column: \"DimValueName\"\r\n // },\r\n // logicalOperator: \"And\",\r\n // conditions: [\r\n // {\r\n // operator: \"Is\",\r\n // value: defaultClientName.substring(0, defaultClientName.length - 6) // To eliminate appended currency code\r\n // }\r\n // ]\r\n // };\r\n const filterClient = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"KpiDimValue\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"DimValueName\"\r\n },\r\n operator: \"In\",\r\n values: [defaultClientName.substring(0, defaultClientName.length - 6)]\r\n };\r\n // const filterPredicate = {\r\n // $schema: \"http://powerbi.com/product/schema#basic\",\r\n // target: {\r\n // table: \"KpiDim\",\r\n // column: \"DimName\"\r\n // },\r\n // logicalOperator: \"And\",\r\n // conditions: [\r\n // {\r\n // operator: \"Is\",\r\n // value: defaultPredicateDisplayName\r\n // }\r\n // ]\r\n // };\r\n const filterPredicate = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"KpiDim\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"DimName\"\r\n },\r\n operator: \"In\",\r\n values: [defaultPredicateDisplayName]\r\n };\r\n filters.push(filterClient);\r\n filters.push(filterPredicate);\r\n page.setFilters(filters);\r\n };\r\n\r\n public handleDataSelected = (data: any) => {\r\n // will be called when some chart or data element in your report clicked\r\n };\r\n\r\n public handleReportLoad = async (report: any) => {\r\n // will be called when report loads\r\n this.report = report; // get the object from callback and store it. (optional)\r\n // console.log(\"handleReportLoad loaded\");\r\n const { fyStartMonths } = this.props;\r\n const pages = await report.getPages();\r\n\r\n // find the KPI Page and set the filters for it\r\n const kpiPage = pages.find(\r\n (page: any) => page.displayName === settings.kpiDashboardPageName\r\n );\r\n await this.configureKpiPageFilters(kpiPage);\r\n\r\n \r\n const simulationPage = pages.find(\r\n (page: any) => page.displayName === settings.simulationDashboardPageName\r\n );\r\n\r\n if (simulationPage != undefined) { \r\n await this.configureSimulationPageFilters(simulationPage);\r\n }\r\n //return focus to the Summary Page\r\n \r\n const filterCurrency = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"Currency\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"Currency\"\r\n },\r\n operator: \"In\",\r\n values: [this.state.currency]\r\n };\r\n\r\n const filterFinYearName = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"LkpClientFinYear\",\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n column: \"FinYearName\"\r\n },\r\n operator: \"In\",\r\n values: [this.getCurrentFinancialYear(this.state.fystart)]\r\n };\r\n const filterFinYearFirstMonth = {\r\n $schema: \"http://powerbi.com/product/schema#basic\",\r\n target: {\r\n table: \"LkpClientFinYear\",\r\n column: \"FinYearFirstMonth\"\r\n },\r\n operator: \"In\",\r\n values: [\r\n (fyStartMonths.find(\r\n month => month.id === this.state.fystart\r\n ) as IFYStartMonth).name\r\n ]\r\n };\r\n const filters = await report.getFilters();\r\n await filters.push(filterCurrency);\r\n await filters.push(filterFinYearName);\r\n await filters.push(filterFinYearFirstMonth);\r\n // console.table(filters);\r\n await report.setFilters(filters);\r\n pages[0].setActive();\r\n report.on(\"error\", (error: any) => {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"Error occurred\");\r\n console.table(error);\r\n });\r\n\r\n // all events for reports listed below. hook in as needed\r\n ///////////\r\n // report.on('loaded', async (e: any) => {\r\n // console.log('loaded called'); //<-- this wont ever fire since handleReportLoad fires when 'loaded' fires\r\n // });\r\n // report.on(\"saved\", async (e: any) => {\r\n // console.log(\"saved called\");\r\n // });\r\n // report.on(\"rendered\", async (e: any) => {\r\n // console.log(\"rendered called\");\r\n // });\r\n // report.on(\"saveAsTriggered\", async (e: any) => {\r\n // console.log(\"saveAsTriggered called\");\r\n // });\r\n // report.on(\"error\", async (e: any) => {\r\n // console.log(\"error called\");\r\n // });\r\n // report.on(\"dataSelected\", async (e: any) => {\r\n // console.log(\"dataSelected called\");\r\n // });\r\n // report.on(\"buttonClicked\", async (e: any) => {\r\n // console.log(\"buttonClicked called\");\r\n // });\r\n // report.on(\"pageChanged\", async (e: any) => {\r\n // console.log(\"pageChanged called\");\r\n // });\r\n // report.on(\"commandTriggered\", async (e: any) => {\r\n // console.log(\"commandTriggered called\");\r\n // });\r\n // report.on(\"swipeStart\", async (e: any) => {\r\n // console.log(\"swipeStart called\");\r\n // });\r\n // report.on(\"swipeEnd\", async (e: any) => {\r\n // console.log(\"swipeEnd called\");\r\n // });\r\n // report.on(\"bookmarkApplied\", async (e: any) => {\r\n // console.log(\"bookmarkApplied called\");\r\n // });\r\n // report.on(\"dataHyperlinkClicked\", async (e: any) => {\r\n // console.log(\"dataHyperlinkClicked called\");\r\n // });\r\n ///////////\r\n };\r\n\r\n public handlePageChange = (data: any) => {\r\n // will be called when pages in your report changes\r\n };\r\n\r\n public setFullscreen = () => {\r\n if (this.report) {\r\n this.setState({\r\n fitToWindowVisible: true,\r\n width: \"100vw\",\r\n height: \"100vh\"\r\n });\r\n this.report.fullscreen();\r\n }\r\n };\r\n\r\n public setRefresh = () => {\r\n if (this.report) {\r\n this.report.refresh().then((result: any) => {\r\n console.info(\"Report values refreshed\");\r\n });\r\n }\r\n };\r\n\r\n public printReport = () => {\r\n if (this.report) {\r\n this.report.print();\r\n }\r\n };\r\n\r\n public async getPbiReportAccessToken(accessToken: string) {\r\n const { dashboard, activeUserRole, apiAccessToken } = this.props;\r\n const { groupId, reportId } = dashboard;\r\n const dashboardInfo = (await this.getReportInGroup(\r\n accessToken\r\n )) as IPbiData;\r\n this.setState({ embedUrl: dashboardInfo.embedUrl });\r\n const headers = new Headers();\r\n headers.append(\"Authorization\", `Bearer ${apiAccessToken}`);\r\n headers.append(\"AccessToken\", accessToken);\r\n const init: RequestInit = {\r\n cache: \"default\",\r\n headers,\r\n method: \"GET\",\r\n mode: \"cors\"\r\n };\r\n // if the user has no roles, it will return all data, so we set an 'unknown' role if no roles found so that no data will be returned\r\n const url = `/api/PowerBiService/GetPowerBiReportToken?roles=${\r\n activeUserRole !== undefined ? activeUserRole.name : \"Unknown\"\r\n }&datasetId=${\r\n dashboardInfo.datasetId\r\n }&reportId=${reportId}&groupId=${groupId}`;\r\n const request = new Request(url, init);\r\n return fetch(request)\r\n .then(result => result.json())\r\n .then(data => {\r\n return data as IPbiTokenData;\r\n })\r\n .catch(err => {\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for ${url}`, err);\r\n return {} as IPbiTokenData;\r\n });\r\n }\r\n\r\n public getReportInGroup(accessToken: string) {\r\n const { dashboard, apiAccessToken } = this.props;\r\n const { groupId, reportId } = dashboard;\r\n const headers = new Headers();\r\n headers.append(\"Authorization\", `Bearer ${apiAccessToken}`);\r\n headers.append(\"AccessToken\", accessToken);\r\n const init: RequestInit = {\r\n cache: \"default\",\r\n headers,\r\n method: \"GET\",\r\n mode: \"cors\"\r\n };\r\n const url = `/api/PowerBiService/GetReportInGroup?groupId=${groupId}&reportId=${reportId}`;\r\n const request = new Request(url, init);\r\n return fetch(request)\r\n .then(result => result.json())\r\n .then(data => {\r\n return data as IPbiData;\r\n })\r\n .catch(err =>\r\n // tslint:disable-next-line:no-console\r\n console.log(`Fetch error for ${url}`, err)\r\n );\r\n }\r\n public tokenRefresh = async () => {\r\n const { apiAccessToken, token, onHandleRefreshToken } = this.props;\r\n onHandleRefreshToken(apiAccessToken, token.refresh_token);\r\n };\r\n public async componentDidUpdate(prevProps: IDashboardViewProps) {\r\n const { onSetActiveDashboard, dashboard } = this.props;\r\n if (prevProps.dashboard.id !== dashboard.id) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\"props dashboard change detected, refreshing\");\r\n onSetActiveDashboard(dashboard.id);\r\n await this.tokenRefresh();\r\n }\r\n }\r\n public async componentDidMount() {\r\n const {\r\n activeUserRole,\r\n currencyCodes,\r\n fyStartMonths,\r\n dashboard,\r\n onSetActiveDashboard,\r\n fysLoaded,\r\n onHandleLoadFinancialYears,\r\n apiAccessToken\r\n } = this.props;\r\n if (!fysLoaded) {\r\n onHandleLoadFinancialYears(apiAccessToken);\r\n }\r\n onSetActiveDashboard(dashboard.id);\r\n this.setState(() => ({ fetching: true, fetched: false }));\r\n await this.tokenRefresh();\r\n this.setState(() => ({ fetching: false, fetched: true }));\r\n const intervalId = window.setInterval(this.tokenRefresh, 55 * 60 * 1000); // 55 minutes between refreshes of PBI token\r\n this.setState(() => ({ intervalId }));\r\n\r\n if (activeUserRole === undefined) {\r\n this.setState({ currency: \"AUD\", fystart: 1 });\r\n throw new Error(\r\n \"At least one role has not been defined, so default CurrencyCode to AUD with a FYStartMonth of January\"\r\n );\r\n } else {\r\n const currency = (currencyCodes.find(\r\n cc => cc.id === activeUserRole.currencyCodeId\r\n ) as ICurrencyCode).code;\r\n const fystart = (fyStartMonths.find(\r\n fysm => fysm.id === activeUserRole.fyStartMonthId\r\n ) as IFYStartMonth).id;\r\n this.setState({\r\n currency,\r\n fystart\r\n });\r\n }\r\n this.setState({ width: \"calc(99vw)\", height: \"calc(85vh)\" });\r\n }\r\n\r\n public shouldComponentUpdate(\r\n nextProps: IDashboardViewProps,\r\n nextState: IDashboardViewState\r\n ) {\r\n if (this.props.token.access_token !== nextProps.token.access_token) {\r\n if (nextProps.token.access_token !== \"\") {\r\n this.getPbiReportAccessToken(nextProps.token.access_token).then(\r\n (pbiToken: IPbiTokenData) => {\r\n this.setState(() => ({ pbiToken }));\r\n if (this.report !== null) {\r\n this.report.setAccessToken(pbiToken.token);\r\n }\r\n }\r\n );\r\n }\r\n if (this.props.token.access_token === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n if (this.state.pbiToken.token !== nextState.pbiToken.token) {\r\n if (this.state.pbiToken.token === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (this.state.fitToWindowVisible !== nextState.fitToWindowVisible) {\r\n return false;\r\n }\r\n\r\n if (this.state.height !== nextState.height) {\r\n if (this.state.height === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n if (this.state.width !== nextState.width) {\r\n if (this.state.width === \"\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n if (this.props.dashboard.id !== nextProps.dashboard.id) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public componentWillUnmount() {\r\n clearInterval(this.state.intervalId);\r\n }\r\n\r\n public render() {\r\n const { dashboard, roleCount } = this.props;\r\n const { reportId } = dashboard;\r\n const { fetching, fetched, pbiToken, embedUrl, height, width } = this.state;\r\n const reportStyle = {\r\n // style object for report component\r\n height,\r\n width\r\n };\r\n const extraSettings = {\r\n filterPanelEnabled: false, // true\r\n navContentPaneEnabled: true // false\r\n // any other custom settings\r\n };\r\n return (\r\n \r\n \r\n Dashboard: {dashboard.displayName}\r\n {roleCount > 1 && (\r\n \r\n {\" \"}\r\n using Role: \r\n \r\n )}\r\n \r\n \r\n Go Full Screen\r\n \r\n {\r\n this.setState({\r\n fitToWindowVisible: false,\r\n height: \"calc(85vh)\",\r\n width: \"calc(99vw)\"\r\n });\r\n }}\r\n isVisible={this.state.fitToWindowVisible}\r\n />\r\n \r\n Print\r\n \r\n \r\n ↺\r\n \r\n\r\n {fetching && !fetched && (\r\n \r\n

Loading...

\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!fetching && fetched && (\r\n
\r\n {!pbiToken &&
Loading...
}\r\n {pbiToken && pbiToken.token && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\nconst matchStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let dashboard = {} as IPbiDashboard;\r\n if (match !== null) {\r\n const id = (match.params as any).id as string;\r\n dashboard = state.userDashboards.find(dash => {\r\n return dash.id === parseInt(id, 10);\r\n }) as IPbiDashboard;\r\n }\r\n const defaultPredicate = state.predicates.find(\r\n pred => pred.id === state.activeDashboardDefaultPredicateId\r\n ) as IPredicate;\r\n return {\r\n activeUserRole: state.userRoles.find(\r\n role => role.id === state.activeRoleId\r\n ) as IRole,\r\n roleCount: state.userRoles.length,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n apiAccessToken: state.auth0.accessToken,\r\n currencyCodes: state.currencyCodes,\r\n dashboard,\r\n defaultClientName: state.activeDashboardDefaultClient.displayName,\r\n defaultPredicateDisplayName: defaultPredicate\r\n ? defaultPredicate.displayName\r\n : \"\",\r\n fyStartMonths: state.fyStartMonths,\r\n token: state.tokenData,\r\n fys: state.financialYears,\r\n fysLoaded: state.loadingFinancialYears\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onClearActiveDashboard: () => {\r\n dispatch(clearActiveDashboard());\r\n },\r\n onSetActiveDashboard: (id: number) => {\r\n dispatch(setActiveDashboard(id));\r\n },\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleRefreshToken: async (accessToken: string, refreshToken: string) => {\r\n await dispatch(handleRefreshToken(accessToken, refreshToken));\r\n },\r\n onHandleLoadFinancialYears: (accessToken: string) => {\r\n dispatch(handleLoadFinancialYears(accessToken));\r\n }\r\n});\r\n\r\nconst DashboardViewPageV2 = connect(\r\n matchStateToProps,\r\n mapDispatchToProps\r\n)(DashboardView);\r\n\r\nexport default DashboardViewPageV2;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Card, CardBody, CardHeader } from \"reactstrap\";\r\nimport { settings } from \"../../constants\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport DashboardViewPage from \"./DashboardViewPage\";\r\nimport DashboardViewPageV2 from \"./DashboardViewPageV2\";\r\n\r\nexport interface IDashboardSelectionPageProps extends RouteComponentProps {\r\n dashboard: IPbiDashboard;\r\n ownProps: RouteComponentProps;\r\n}\r\n\r\nconst validDashboard = (dashboardViewerVersion: number) => {\r\n if (\r\n dashboardViewerVersion < 1 ||\r\n dashboardViewerVersion > settings.maxDashboardViewerVersion\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport class DashboardSelectionPage extends React.Component<\r\n IDashboardSelectionPageProps\r\n> {\r\n public render() {\r\n const { dashboard } = this.props;\r\n return (\r\n \r\n {dashboard.dashboardViewerVersion === 1 && (\r\n \r\n )}\r\n {dashboard.dashboardViewerVersion === 2 && (\r\n \r\n )}\r\n {!validDashboard(dashboard.dashboardViewerVersion) && (\r\n \r\n \r\n

Error

\r\n
\r\n \r\n Invalid viewer version number on Dashboard. Please report error to\r\n system administrator\r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\nconst matchStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let dashboard = {} as IPbiDashboard;\r\n if (match !== null) {\r\n const id = (match.params as any).id as string;\r\n dashboard = state.userDashboards.find(dash => {\r\n return dash.id === parseInt(id, 10);\r\n }) as IPbiDashboard;\r\n }\r\n return {\r\n dashboard,\r\n\r\n ownProps\r\n };\r\n};\r\n\r\nexport default connect(matchStateToProps)(DashboardSelectionPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Button } from \"reactstrap\";\r\nimport { clearActiveReport, setActiveReport } from \"../../actions/activeReport\";\r\nimport IRole from \"../../models/IRole\";\r\nimport ISqlReport from \"../../models/ISqlReport\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport { buildIframeUrl, buildRolesParams } from \"../../utils\";\r\nimport ActiveRoleBadge from \"../molecules/ActiveRoleBadge\";\r\n// import SubscriptionModal from \"../organisms/SubscriptionModal\";\r\nexport interface IReportViewPageProps {\r\n report: ISqlReport;\r\n activeUserRole: IRole;\r\n onSetActiveReport: (id: number) => void;\r\n onClearActiveReport: () => void;\r\n roleCount: number;\r\n}\r\n\r\nexport interface IReportViewPageState {\r\n height: string;\r\n iFrameUrl: string;\r\n width: string;\r\n}\r\n\r\nexport class ReportViewPage extends React.Component<\r\n IReportViewPageProps,\r\n IReportViewPageState\r\n> {\r\n public state: IReportViewPageState = {\r\n height: \"\",\r\n iFrameUrl: \"\",\r\n width: \"\",\r\n };\r\n constructor(props: IReportViewPageProps) {\r\n super(props);\r\n this.goFull = this.goFull.bind(this);\r\n this.exitHandler = this.exitHandler.bind(this);\r\n }\r\n public goFull = () => {\r\n const iframeContent = document.getElementById(\r\n \"iFrameContent\"\r\n ) as HTMLElement;\r\n iframeContent.requestFullscreen();\r\n this.setState({\r\n height: \"calc(100vh)\",\r\n width: \"calc(100vw)\",\r\n });\r\n };\r\n\r\n public exitHandler = () => {\r\n if (document.fullscreen !== null) {\r\n this.setState({\r\n height: \"calc(85vh)\",\r\n width: \"calc(99vw)\",\r\n });\r\n }\r\n };\r\n\r\n public async componentDidMount() {\r\n if (document.addEventListener) {\r\n document.addEventListener(\r\n \"webkitfullscreenchange\",\r\n this.exitHandler,\r\n false\r\n );\r\n document.addEventListener(\"mozfullscreenchange\", this.exitHandler, false);\r\n document.addEventListener(\"fullscreenchange\", this.exitHandler, false);\r\n document.addEventListener(\"MSFullscreenChange\", this.exitHandler, false);\r\n }\r\n const { report, activeUserRole, onSetActiveReport } = this.props;\r\n onSetActiveReport(report.id);\r\n const roles = buildRolesParams(activeUserRole);\r\n this.setState({\r\n iFrameUrl: (await buildIframeUrl(report)).concat(roles),\r\n });\r\n this.setState({ width: \"calc(99vw)\", height: \"calc(85vh)\" });\r\n }\r\n\r\n public async componentDidUpdate(prevProps: IReportViewPageProps) {\r\n const { report, activeUserRole, onSetActiveReport } = this.props;\r\n if (prevProps.report.id !== report.id) {\r\n onSetActiveReport(report.id);\r\n const roles = buildRolesParams(activeUserRole);\r\n this.setState({\r\n iFrameUrl: (await buildIframeUrl(report)).concat(roles),\r\n });\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n document.removeEventListener(\r\n \"webkitfullscreenchange\",\r\n this.exitHandler,\r\n false\r\n );\r\n document.removeEventListener(\r\n \"mozfullscreenchange\",\r\n this.exitHandler,\r\n false\r\n );\r\n document.removeEventListener(\"fullscreenchange\", this.exitHandler, false);\r\n document.removeEventListener(\"MSFullscreenChange\", this.exitHandler, false);\r\n }\r\n public render() {\r\n const { report, roleCount } = this.props;\r\n return (\r\n \r\n \r\n Report: {report.displayName} \r\n {roleCount > 1 && (\r\n \r\n {\" \"}\r\n using Role: \r\n \r\n )}\r\n \r\n {/*
\r\n \r\n
*/}\r\n \r\n Go Full Screen\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore, ownProps: RouteComponentProps) => {\r\n const { match } = ownProps;\r\n let report = {} as ISqlReport;\r\n if (match !== null) {\r\n report = state.userReports.find((rep) => {\r\n return rep.id === parseInt((match.params as any).id as string, 10);\r\n }) as ISqlReport;\r\n // if (report === undefined) {\r\n // // tslint:disable-next-line:no-console\r\n // console.log(\"didn't find the report\");\r\n // return { report: {} as ISqlReport };\r\n // }\r\n }\r\n return {\r\n activeUserRole: state.userRoles.find(\r\n (role) => role.id === state.activeRoleId\r\n ) as IRole,\r\n report,\r\n roleCount: state.userRoles.length,\r\n };\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onClearActiveReport: () => {\r\n dispatch(clearActiveReport());\r\n },\r\n onSetActiveReport: (id: number) => {\r\n dispatch(setActiveReport(id));\r\n },\r\n});\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ReportViewPage);\r\n","import * as React from \"react\";\r\n\r\nexport interface ISpanProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst Span: React.SFC = (props: ISpanProps) => {\r\n const { className, id, style, children } = props;\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Span;\r\n","import * as React from \"react\";\r\nimport Span from \"./Span\";\r\n\r\nexport interface IWhiteTextProps {\r\n children: React.ReactNode;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n smallText?: boolean;\r\n}\r\n\r\nconst Text: React.SFC = (props: IWhiteTextProps) => {\r\n const { children, id, smallText, style } = props;\r\n const fontSize = smallText ? \"0.8em\" : \"1em\";\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default Text;\r\n","import * as React from \"react\";\r\nimport Span from \"../atoms/Span\";\r\n\r\nexport interface ILoginButtonProps {\r\n login:()=> void;\r\n outline?: boolean;\r\n}\r\n\r\nconst LoginButton = (props: ILoginButtonProps) => {\r\n const { login, outline } = props;\r\n return (\r\n \r\n Login\r\n \r\n );\r\n};\r\n\r\nexport default LoginButton;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport paths from \"../../constants\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport Jumbotron from \"../atoms/Jumbotron\";\r\nimport Text from \"../atoms/Text\";\r\nimport LoginButton from \"../molecules/LoginButton\";\r\n\r\nexport interface ISplashPageProps extends RouteComponentProps {\r\n auth: Auth;\r\n isAuthenticated: boolean;\r\n}\r\n\r\nconst SplashPage = (props: ISplashPageProps) => \r\n{\r\n const { auth, isAuthenticated, history } = props;\r\n if (isAuthenticated) {\r\n history.push(paths.home);\r\n }\r\n return (\r\n
\r\n {!isAuthenticated && (\r\n \r\n \r\n To get started you must\r\n {\r\n auth.login();\r\n }\r\n }\r\n />\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n auth: state.auth0,\r\n isAuthenticated: state.auth0.isAuthenticated()\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(SplashPage);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Card,\r\n ListGroup,\r\n ListGroupItem,\r\n ListGroupItemHeading\r\n} from \"reactstrap\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport paths from \"../../constants\";\r\n\r\nexport interface IUserDashboardsCardProps {\r\n dashboards: IPbiDashboard[];\r\n}\r\n\r\nconst UserDashboardsCard: React.SFC = (\r\n props: IUserDashboardsCardProps\r\n) => {\r\n const { dashboards } = props;\r\n return (\r\n \r\n \r\n \r\n \r\n Your Dashboards\r\n \r\n {dashboards.map(dashboard => (\r\n \r\n \r\n {dashboard.displayName}\r\n \r\n \r\n ))}\r\n {(dashboards===undefined || (dashboards!==undefined && dashboards.length===0) )&&(You have no available dashboards)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n dashboards: state.userDashboards\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(UserDashboardsCard);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { Card, ListGroup, ListGroupItem } from \"reactstrap\";\r\nimport ListGroupItemHeading from \"reactstrap/lib/ListGroupItemHeading\";\r\nimport ISqlReport from \"../../models/ISqlReport\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport paths from \"../../constants\";\r\n\r\nexport interface IUserReportsCardProps {\r\n reports: ISqlReport[];\r\n}\r\n\r\nconst UserReportsCard: React.SFC = (\r\n props: IUserReportsCardProps\r\n) => {\r\n const { reports } = props;\r\n return (\r\n \r\n \r\n \r\n \r\n Your Reports\r\n \r\n {reports.map(report => (\r\n \r\n \r\n {report.displayName}\r\n \r\n \r\n ))}\r\n {(reports === undefined ||\r\n (reports !== undefined && reports.length === 0)) && (\r\n You have no available reports\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n reports: state.userReports\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(UserReportsCard);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Card, CardBody, CardText, CardTitle } from \"reactstrap\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\nimport IPbiPaginatedReport from \"../../models/IPbiPaginatedReport\";\r\nimport IRole from \"../../models/IRole\";\r\nimport ISqlReport from \"../../models/ISqlReport\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport ActiveRoleBadge from \"./ActiveRoleBadge\";\r\n\r\n\r\nexport interface IWelcomeCardProps {\r\n name: string;\r\n activeRoleDisplayName: string;\r\n lastDashboard: IPbiDashboard;\r\n // lastPaginatedReport: IPbiPaginatedReport;\r\n lastReport: ISqlReport;\r\n userRoles: IRole[];\r\n}\r\nconst WelcomeCard: React.SFC = (\r\n props: IWelcomeCardProps\r\n) => {\r\n const {\r\n activeRoleDisplayName,\r\n name,\r\n userRoles /*lastDashboard, lastReport*/\r\n } = props;\r\n return (\r\n \r\n \r\n \r\n

\r\n Welcome {name ? name : \"!\"}\r\n

\r\n
\r\n \r\n {activeRoleDisplayName !== \"\" && userRoles.length > 1 && (\r\n \r\n Your active role is .\r\n \r\n )}\r\n
\r\n {/*\r\n \r\n Your last accessed dashboard is{\" \"}\r\n \r\n {lastDashboard.name}\r\n \r\n \r\n
\r\n \r\n Your last accessed report is{\" \"}\r\n \r\n {lastReport.name}\r\n \r\n \r\n
*/}\r\n To get started select a report to view.\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n const activeRole = state.userRoles.find(\r\n role => role.id === state.activeRoleId\r\n ) as IRole;\r\n\r\n return {\r\n activeRoleDisplayName:\r\n activeRole === undefined ? \"\" : activeRole.displayName,\r\n name: state.auth0.getProfile().name,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n lastDashboard: state.userDashboards.find(\r\n dashboard => dashboard.id === state.activeDashboardId\r\n ) as IPbiDashboard,\r\n\r\n //todo\r\n lastPaginatedReport: state.userDashboards.find(\r\n dashboard => dashboard.id === state.activeDashboardId\r\n ) as IPbiDashboard,\r\n\r\n //lastPaginatedReport: state.userPaginatedReports.find(\r\n // paginatedReport => paginatedReport.id === state.activePaginatedReportId\r\n //) as IPbiPaginatedReport,\r\n lastReport: state.userReports.find(\r\n report => report.id === state.activeReportId\r\n ) as ISqlReport,\r\n userRoles: state.userRoles\r\n };\r\n};\r\nexport default connect(mapStateToProps)(WelcomeCard);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Col, Container, Row } from \"reactstrap\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport UserDashboardsCard from \"../molecules/UserDashboardsCard\";\r\nimport UserPaginatedReportsCard from \"../molecules/UserPaginatedReportsCard\";\r\nimport UserReportsCard from \"../molecules/UserReportsCard\";\r\nimport WelcomeCard from \"../molecules/WelcomeCard\";\r\nimport DataLoading from \"../organisms/DataLoading\";\r\n\r\nexport interface IWelcomePageProps {\r\n loaded: boolean;\r\n groupsLoaded: boolean;\r\n currencyCodesLoaded: boolean;\r\n fyStartMonthsLoaded: boolean;\r\n predicatesLoaded: boolean;\r\n userRolesLoaded: boolean;\r\n userDashboardsLoaded: boolean;\r\n //userPaginatedReportsLoaded: boolean;\r\n userReportsLoaded: boolean;\r\n userGroupsLoaded: boolean;\r\n}\r\n\r\nexport const WelcomePage: React.SFC = (\r\n props: IWelcomePageProps\r\n) => {\r\n const {\r\n loaded,\r\n groupsLoaded,\r\n currencyCodesLoaded,\r\n fyStartMonthsLoaded,\r\n predicatesLoaded,\r\n userRolesLoaded,\r\n userDashboardsLoaded,\r\n // userPaginatedReportsLoaded,\r\n userReportsLoaded,\r\n userGroupsLoaded\r\n } = props;\r\n return (\r\n \r\n \r\n {!userRolesLoaded && }\r\n \r\n \r\n \r\n {!userDashboardsLoaded && }\r\n \r\n \r\n \r\n \r\n {!userReportsLoaded && }\r\n \r\n \r\n \r\n \r\n {!userGroupsLoaded && }\r\n \r\n \r\n \r\n {!predicatesLoaded && }\r\n \r\n \r\n {!groupsLoaded && }\r\n \r\n \r\n \r\n {!currencyCodesLoaded && }\r\n \r\n \r\n \r\n \r\n {!fyStartMonthsLoaded && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {loaded && }{\" \"}\r\n {!loaded && }\r\n \r\n \r\n \r\n {userDashboardsLoaded && loaded && }\r\n \r\n {userReportsLoaded && loaded && } \r\n \r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n loaded: state.loading,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n groupsLoaded: state.loadingGroups,\r\n currencyCodesLoaded: state.loadingCurrencyCodes,\r\n fyStartMonthsLoaded: state.loadingFyStartMonths,\r\n predicatesLoaded: state.loadingPredicates,\r\n userRolesLoaded: state.loadingUserRoles,\r\n userDashboardsLoaded: state.loadingUserDashboards,\r\n \r\n userReportsLoaded: state.loadingUserReports,\r\n userGroupsLoaded: state.loadingUserGroups\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(WelcomePage);\r\n","import * as React from \"react\";\r\n\r\nexport interface INavbarProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst Navbar: React.SFC = (props: INavbarProps) => {\r\n const { children } = props;\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};\r\n\r\nexport default Navbar;\r\n","import * as React from \"react\";\r\n\r\nexport interface INavLinkProps {\r\n children: React.ReactNode;\r\n to: string;\r\n active?: boolean;\r\n}\r\n\r\nconst NavLink: React.SFC = (props: INavLinkProps) => {\r\n const { children, to, active } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default NavLink;\r\n","import * as React from \"react\";\r\n\r\nexport interface INavListItemProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nconst NavListItem: React.SFC = (\r\n props: INavListItemProps\r\n) => {\r\n const { children } = props;\r\n return
  • {children}
  • ;\r\n};\r\n\r\nexport default NavListItem;\r\n","import * as React from \"react\";\r\nexport interface INavListLeftProps {\r\n children: React.ReactNode;\r\n}\r\nconst NavListLeft: React.SFC = (\r\n props: INavListLeftProps\r\n) => {\r\n const { children } = props;\r\n return (\r\n
    \r\n
      {children}
    \r\n
    \r\n );\r\n};\r\n\r\nexport default NavListLeft;\r\n","import * as React from 'react';\r\n\r\nexport interface INavListRightProps{\r\n children: React.ReactNode;\r\n}\r\n\r\nconst NavListRight:React.SFC = (props:INavListRightProps) => {\r\n const {children} = props;\r\n return (\r\n
      \r\n {children}\r\n
    \r\n );\r\n};\r\n\r\nexport default NavListRight;","import * as React from \"react\";\r\n\r\nexport interface IImageProps {\r\n src: string;\r\n className?: string;\r\n alt: string;\r\n style?: React.CSSProperties;\r\n}\r\nconst Image: React.SFC = (props: IImageProps) => {\r\n const { alt, className, src, style } = props;\r\n return (\r\n \r\n {alt}\r\n \r\n );\r\n};\r\n\r\nexport default Image;\r\n","import * as React from \"react\";\r\nimport { Tooltip } from \"reactstrap\";\r\n\r\nexport interface IToolTipState {\r\n isOpen: boolean;\r\n}\r\nexport interface IToolTipProps {\r\n placement?:\r\n | \"auto-start\"\r\n | \"auto\"\r\n | \"auto-end\"\r\n | \"top-start\"\r\n | \"top\"\r\n | \"top-end\"\r\n | \"right-start\"\r\n | \"right\"\r\n | \"right-end\"\r\n | \"bottom-end\"\r\n | \"bottom\"\r\n | \"bottom-start\"\r\n | \"left-end\"\r\n | \"left\"\r\n | \"left-start\";\r\n target: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport class ToolTip extends React.Component {\r\n public state = { isOpen: false };\r\n constructor(props: IToolTipProps) {\r\n super(props);\r\n this.toggle = this.toggle.bind(this);\r\n }\r\n public toggle() {\r\n this.setState({\r\n isOpen: !this.state.isOpen\r\n });\r\n }\r\n public render() {\r\n const { children, placement, target } = this.props;\r\n const {isOpen} = this.state;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ToolTip;\r\n","import * as React from \"react\";\r\nimport Image from \"../atoms/Image\";\r\nimport Span from \"../atoms/Span\";\r\nimport ToolTip from \"../atoms/ToolTip\";\r\n\r\nexport interface IIconProps {\r\n id: string;\r\n icon: string;\r\n text: string;\r\n style?: React.CSSProperties;\r\n tooltip?: boolean;\r\n}\r\n\r\nconst Icon: React.SFC = (props: IIconProps) => {\r\n const { icon, id, style, text, tooltip } = props;\r\n return (\r\n \r\n \r\n {text}\r\n \r\n {tooltip && (\r\n \r\n {text}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Icon;\r\n","import * as React from \"react\";\r\nimport Manage from \"../../assets/icons/recentWhite.svg\";\r\nimport Icon from \"./Icon\";\r\n\r\nconst KpiIcon = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default KpiIcon;\r\n","import * as React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { NavbarBrand as BootstrapNavbarBrand } from \"reactstrap\";\r\n\r\nexport interface INavbarBrandProps {\r\n to?: string;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst NavbarBrand: React.SFC = (\r\n props: INavbarBrandProps\r\n) => {\r\n const { to, id, style, children } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default NavbarBrand;\r\n","import * as React from \"react\";\r\nimport NavbarBrand from \"../atoms/NavbarBrand\";\r\nimport Span from \"../atoms/Span\";\r\n\r\nexport interface ILogoProps {\r\n to: string;\r\n}\r\n\r\nconst Logo: React.SFC = (props: ILogoProps) => {\r\n const { to } = props;\r\n // tslint:disable-next-line:no-consolew\r\n return (\r\n \r\n \r\n \r\n \r\n CTM SMART Data\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Logo;\r\n","import * as React from \"react\";\r\nimport Logout from \"../../assets/icons/logoutWhite.svg\";\r\nimport Icon from \"./Icon\";\r\n\r\nconst LogoutIcon = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default LogoutIcon;\r\n","import * as React from \"react\";\r\nimport Text from \"../atoms/Text\";\r\nimport LogoutIcon from \"./LogoutIcon\";\r\n\r\nexport interface ILogoutButtonProps {\r\n logout: () => void;\r\n}\r\n\r\nconst LogoutButton = (props: ILogoutButtonProps) => {\r\n const { logout } = props;\r\n return (\r\n \r\n \r\n \r\n Logout\r\n \r\n \r\n );\r\n};\r\n\r\nexport default LogoutButton;\r\n","import * as React from \"react\";\r\nimport Manage from \"../../assets/icons/manageWhite.svg\";\r\nimport Icon from \"./Icon\";\r\n\r\nconst AdminIcon = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AdminIcon;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link, RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport {\r\n Dropdown,\r\n DropdownItem,\r\n DropdownMenu,\r\n DropdownToggle\r\n} from \"reactstrap\";\r\nimport { handleSetActiveRolePredicateClient } from \"../../actions/shared\";\r\nimport paths from \"../../constants\";\r\nimport IRole from \"../../models/IRole\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport Text from \"../atoms/Text\";\r\nimport AdminIcon from \"../molecules/AdminIcon\";\r\n\r\nexport interface IActiveRoleDropDownMenuProps extends RouteComponentProps {\r\n selectableRoles: IRole[];\r\n activeRoleId: number;\r\n accessToken: string;\r\n onHandleSelectActiveRoleId: (accessToken: string, roleId: number) => void;\r\n}\r\n\r\nexport interface IActiveRoleDropDownMenuState {\r\n activeRoleId: number;\r\n dropdownOpen: boolean;\r\n}\r\n\r\nclass ActiveRoleDropDownMenu extends React.Component<\r\n IActiveRoleDropDownMenuProps,\r\n IActiveRoleDropDownMenuState\r\n> {\r\n public state: IActiveRoleDropDownMenuState = {\r\n activeRoleId: 1,\r\n dropdownOpen: false\r\n };\r\n constructor(props: IActiveRoleDropDownMenuProps) {\r\n super(props);\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.activeRoleIdChange = this.activeRoleIdChange.bind(this);\r\n this.state = {\r\n activeRoleId: 1,\r\n dropdownOpen: false\r\n };\r\n }\r\n\r\n public toggle() {\r\n this.setState({\r\n dropdownOpen: !this.state.dropdownOpen\r\n });\r\n }\r\n public activeRoleIdChange = (newRoleId: number) => {\r\n const { accessToken, onHandleSelectActiveRoleId, history } = this.props;\r\n const activeRoleId = newRoleId;\r\n onHandleSelectActiveRoleId(accessToken, activeRoleId);\r\n history.push(paths.home);\r\n this.setState(() => ({ activeRoleId }));\r\n };\r\n public async componentDidUpdate(prevProps: IActiveRoleDropDownMenuProps) {\r\n const { activeRoleId } = this.props;\r\n if (\r\n activeRoleId !== prevProps.activeRoleId &&\r\n activeRoleId !== undefined &&\r\n activeRoleId !== 0\r\n ) {\r\n await this.setState(() => ({ activeRoleId }));\r\n }\r\n }\r\n public async componentDidMount() {\r\n const { activeRoleId } = this.props;\r\n if (activeRoleId !== undefined && activeRoleId !== 0) {\r\n await this.setState(() => ({ activeRoleId }));\r\n }\r\n }\r\n public render() {\r\n const { selectableRoles } = this.props;\r\n const { activeRoleId } = this.state;\r\n const activeRole = selectableRoles.find(role => role.id === activeRoleId);\r\n return (\r\n \r\n \r\n \r\n Roles\r\n \r\n \r\n Active Role\r\n {activeRole && {activeRole.displayName}}\r\n Available Roles\r\n {selectableRoles.map(\r\n role =>\r\n role.id !== activeRoleId && (\r\n \r\n {\r\n e.preventDefault();\r\n this.activeRoleIdChange(role.id);\r\n }}\r\n >\r\n {role.displayName}\r\n \r\n \r\n )\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n accessToken: state.auth0.accessToken,\r\n activeRoleId: state.activeRoleId,\r\n selectableRoles: state.userRoles\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n onHandleSelectActiveRoleId: (accessToken: string, roleId: number) => {\r\n dispatch(handleSetActiveRolePredicateClient(accessToken, roleId));\r\n }\r\n});\r\n\r\nexport default withRouter(\r\n connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n )(ActiveRoleDropDownMenu)\r\n);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link, RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport {\r\n Dropdown,\r\n DropdownItem,\r\n DropdownMenu,\r\n DropdownToggle\r\n} from \"reactstrap\";\r\nimport { clearEditRoleDetails } from \"../../actions/editRoleDetails\";\r\nimport { clearEditUserDetails } from \"../../actions/editUserDetails\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport paths, { kpiAdminGroupName, superAdminGroupName } from \"../../constants\";\r\nimport Text from \"../atoms/Text\";\r\nimport AdminIcon from \"../molecules/AdminIcon\";\r\n\r\nexport interface IAdminDropDownMenuProps extends RouteComponentProps {\r\n onHandleClearEditRole: () => void;\r\n onHandleClearEditUser: () => void;\r\n isKpiAdministrator: boolean;\r\n isSuperAdministrator: boolean;\r\n}\r\n\r\nclass AdminDropDownMenu extends React.Component {\r\n public state: any = {\r\n dropdownOpen: false\r\n };\r\n constructor(props: IAdminDropDownMenuProps) {\r\n super(props);\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.state = {\r\n dropdownOpen: false\r\n };\r\n }\r\n\r\n public toggle() {\r\n this.setState({\r\n dropdownOpen: !this.state.dropdownOpen\r\n });\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n Admin\r\n \r\n \r\n Users\r\n \r\n {\r\n e.preventDefault();\r\n this.props.onHandleClearEditUser();\r\n this.props.history.push(paths.quickAddUser);\r\n }}\r\n >\r\n Quick Add New User(s)\r\n \r\n \r\n \r\n {\r\n e.preventDefault();\r\n this.props.onHandleClearEditUser();\r\n this.props.history.push(paths.addUser);\r\n }}\r\n >\r\n New User Wizard (Detailed)\r\n \r\n \r\n \r\n Search/Edit User\r\n \r\n \r\n Roles\r\n \r\n {\r\n e.preventDefault();\r\n this.props.onHandleClearEditRole();\r\n this.props.history.push(paths.addRoleWizard);\r\n }}\r\n >\r\n New Role Wizard\r\n \r\n \r\n \r\n Search/Edit Roles\r\n \r\n \r\n Reports\r\n \r\n New Report\r\n \r\n \r\n Search/Edit Report\r\n \r\n \r\n Dashboards\r\n \r\n New Dashboard\r\n \r\n \r\n Search/Edit Dashboard\r\n \r\n \r\n User Groups\r\n \r\n New User Group\r\n \r\n \r\n Search/Edit User Groups\r\n \r\n \r\n Predicates\r\n \r\n New Predicate\r\n \r\n \r\n Search/Edit Predicates\r\n \r\n {this.props.isSuperAdministrator && (\r\n \r\n \r\n \r\n Add KPI\r\n \r\n \r\n Search/Edit KPI\r\n \r\n \r\n \r\n Add Financial Year\r\n \r\n \r\n )}\r\n {this.props.isKpiAdministrator && (\r\n \r\n \r\n Add KPI Targets\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n isKpiAdministrator:\r\n state.userGroups.find(ug => ug.name === kpiAdminGroupName) !== undefined\r\n ? true\r\n : false,\r\n isSuperAdministrator:\r\n state.userGroups.find(ug => ug.name === superAdminGroupName) !== undefined\r\n ? true\r\n : false\r\n };\r\n};\r\nconst mapDispatchToProps = (dispatch: any) => ({\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n onHandleClearEditRole: () => {\r\n dispatch(clearEditRoleDetails());\r\n },\r\n onHandleClearEditUser: () => {\r\n dispatch(clearEditUserDetails());\r\n }\r\n});\r\n\r\nexport default withRouter(\r\n connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n )(AdminDropDownMenu)\r\n);\r\n","import * as React from \"react\";\r\nimport Dashboard from \"../../assets/icons/dashboardWhite.svg\";\r\nimport Icon from \"./Icon\";\r\n\r\nconst DashboardIcon = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default DashboardIcon;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Dropdown,\r\n DropdownItem,\r\n DropdownMenu,\r\n DropdownToggle\r\n} from \"reactstrap\";\r\nimport paths from \"../../constants\";\r\nimport IPbiDashboard from \"../../models/IPbiDashboard\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport Text from \"../atoms/Text\";\r\nimport DashboardIcon from \"../molecules/DashboardIcon\";\r\n\r\nexport interface IDashboardDropDownMenuProps {\r\n dashboards: IPbiDashboard[];\r\n}\r\nexport class DashboardDropDownMenu extends React.Component<\r\n IDashboardDropDownMenuProps\r\n> {\r\n public state: any = {\r\n dropdownOpen: false\r\n };\r\n constructor(props: IDashboardDropDownMenuProps) {\r\n super(props);\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.state = {\r\n dropdownOpen: false\r\n };\r\n }\r\n\r\n public toggle() {\r\n this.setState({\r\n dropdownOpen: !this.state.dropdownOpen\r\n });\r\n }\r\n\r\n public render() {\r\n const { dashboards } = this.props;\r\n return (\r\n \r\n \r\n \r\n Dashboards\r\n \r\n \r\n {dashboards.map(dashboard => (\r\n \r\n \r\n {dashboard.displayName}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n dashboards: state.userDashboards\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(DashboardDropDownMenu);\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Card, CardBody, CardFooter, CardTitle } from \"reactstrap\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface IProfileCardProps {\r\n emailAddress: string;\r\n name: string;\r\n photo: string;\r\n}\r\n\r\nconst ProfileCard: React.SFC = (\r\n props: IProfileCardProps\r\n) => {\r\n const { emailAddress, name, photo } = props;\r\n return (\r\n \r\n \r\n {emailAddress}\r\n \r\n \r\n {photo}\r\n \r\n Full Name: {name}\r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n emailAddress: state.auth0.getProfile().email as string,\r\n name: state.auth0.getProfile().name as string,\r\n photo: state.auth0.getProfile().picture as string\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(ProfileCard);\r\n","import * as React from \"react\";\r\nimport Image from \"../atoms/Image\";\r\n\r\nexport interface IAvatarProps {\r\n height?: string;\r\n borderRadius?: number;\r\n name: string;\r\n picture: string;\r\n}\r\n\r\nconst Avatar: React.SFC = (props: IAvatarProps) => {\r\n const { height, borderRadius } = props;\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Avatar;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport Text from \"../atoms/Text\";\r\nimport Avatar from \"../molecules/Avatar\";\r\nexport interface IProfileBarProps {\r\n name: string;\r\n picture: string;\r\n}\r\nconst ProfileBar: React.SFC = (props: IProfileBarProps) => {\r\n const { name, picture } = props;\r\n return (\r\n \r\n \r\n {name}\r\n \r\n );\r\n};\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n const names = state.auth0.getProfile().name.split(\" \");\r\n return {\r\n name: names[0],\r\n picture: state.auth0.getProfile().picture\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(ProfileBar);\r\n","import * as React from \"react\";\r\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"reactstrap\";\r\nimport ProfileCard from \"../molecules/ProfileCard\";\r\nimport ProfileBar from \"./ProfileBar\";\r\n\r\nexport interface IProfileModalState {\r\n modal: boolean;\r\n}\r\nexport interface IProfileModalProps {\r\n className?: string;\r\n}\r\nexport default class ProfileModal extends React.Component<\r\n IProfileModalProps,\r\n IProfileModalState\r\n> {\r\n public state: IProfileModalState = {\r\n modal: false\r\n };\r\n constructor(props: IProfileModalProps) {\r\n super(props);\r\n this.toggle = this.toggle.bind(this);\r\n }\r\n\r\n public toggle() {\r\n this.setState({\r\n modal: !this.state.modal\r\n });\r\n }\r\n public render() {\r\n const { className } = this.props;\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n Profile\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\nimport Graph from \"../../assets/icons/GraphWhite.svg\";\r\nimport Icon from \"./Icon\";\r\n\r\nconst ReportIcon = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ReportIcon;\r\n","import * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport {\r\n Dropdown,\r\n DropdownItem,\r\n DropdownMenu,\r\n DropdownToggle\r\n} from \"reactstrap\";\r\nimport paths from \"../../constants\";\r\nimport ISqlReport from \"../../models/ISqlReport\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport Text from \"../atoms/Text\";\r\nimport ReportIcon from \"../molecules/ReportIcon\";\r\n\r\nexport interface IReportDropDownMenuProps {\r\n reports: ISqlReport[];\r\n}\r\nexport class ReportDropDownMenu extends React.Component<\r\n IReportDropDownMenuProps\r\n> {\r\n public state: any = {\r\n dropdownOpen: false\r\n };\r\n constructor(props: IReportDropDownMenuProps) {\r\n super(props);\r\n\r\n this.toggle = this.toggle.bind(this);\r\n this.state = {\r\n dropdownOpen: false\r\n };\r\n }\r\n\r\n public toggle() {\r\n this.setState({\r\n dropdownOpen: !this.state.dropdownOpen\r\n });\r\n }\r\n\r\n public render() {\r\n const { reports } = this.props;\r\n return (\r\n \r\n \r\n \r\n Reports\r\n \r\n \r\n {reports.map(report => (\r\n \r\n \r\n {report.displayName}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n reports: state.userReports\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(ReportDropDownMenu);\r\n","import * as React from \"react\";\r\nimport { Card, CardBody, CardText, CardTitle } from \"reactstrap\";\r\n\r\nconst HelpdeskCard = () => {\r\n return (\r\n \r\n \r\n Helpdesk Support\r\n \r\n For any further support please email{\" \"}\r\n HelpDesk.\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HelpdeskCard;\r\n","import * as React from \"react\";\r\nimport Help from \"../../assets/icons/helpWhite.svg\";\r\nimport Icon from \"./Icon\";\r\n\r\nconst HelpIcon = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default HelpIcon;\r\n","import * as React from \"react\";\r\nimport { Card, CardBody, CardText, CardTitle } from \"reactstrap\";\r\n\r\nconst PrivacyPolicyCard = () => {\r\n return (\r\n \r\n \r\n Privacy Policy\r\n \r\n To review our privacy policy please click{\" \"}\r\n \r\n here\r\n \r\n .\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PrivacyPolicyCard;\r\n","import * as React from \"react\";\r\nimport { Card, CardBody, CardText, CardTitle } from \"reactstrap\";\r\n\r\nconst UserManualCard = () => {\r\n return (\r\n \r\n \r\n User Manual\r\n \r\n To read the user manual please click{\" \"}\r\n \r\n here\r\n \r\n .\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default UserManualCard;\r\n","import * as React from \"react\";\r\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"reactstrap\";\r\nimport Text from \"../atoms/Text\";\r\nimport HelpdeskCard from \"../molecules/HelpdeskCard\";\r\nimport HelpIcon from \"../molecules/HelpIcon\";\r\nimport PrivacyPolicyCard from \"../molecules/PrivacyPolicyCard\";\r\nimport UserManualCard from \"../molecules/UserManualCard\";\r\n\r\nexport interface ISupportModalState {\r\n modal: boolean;\r\n}\r\nexport interface ISupportModalProps {\r\n className?: string;\r\n}\r\nexport default class SupportModal extends React.Component<\r\n ISupportModalProps,\r\n ISupportModalState\r\n> {\r\n public state: ISupportModalState = {\r\n modal: false\r\n };\r\n constructor(props: ISupportModalProps) {\r\n super(props);\r\n this.toggle = this.toggle.bind(this);\r\n }\r\n\r\n public toggle() {\r\n this.setState({\r\n modal: !this.state.modal\r\n });\r\n }\r\n public render() {\r\n const { className } = this.props;\r\n return (\r\n
    \r\n
    \r\n \r\n Support\r\n
    \r\n \r\n Support\r\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\nimport { connect } from \"react-redux\";\r\nimport { Link } from \"react-router-dom\";\r\nimport Auth from \"../../auth/Auth\";\r\nimport paths, { adminGroupName, kpiAdminGroupName } from \"../../constants\";\r\nimport IGroup from \"../../models/IGroup\";\r\nimport { IStore } from \"../../models/IStore\";\r\nimport Navbar from \"../atoms/Navbar\";\r\nimport NavLink from \"../atoms/NavLink\";\r\nimport NavListItem from \"../atoms/NavListItem\";\r\nimport NavListLeft from \"../atoms/NavListLeft\";\r\nimport NavListRight from \"../atoms/NavListRight\";\r\nimport Span from \"../atoms/Span\";\r\nimport Text from \"../atoms/Text\";\r\nimport KpiIcon from \"../molecules/KpiIcon\";\r\nimport LoginButton from \"../molecules/LoginButton\";\r\nimport Logo from \"../molecules/Logo\";\r\nimport LogoutButton from \"../molecules/LogoutButton\";\r\nimport ActiveRoleDropDownMenu from \"../organisms/ActiveRoleDropDownMenu\";\r\nimport AdminDropDownMenu from \"../organisms/AdminDropDownMenu\";\r\nimport DashboardDropDownMenu from \"../organisms/DashboardDropDownMenu\";\r\nimport ProfileModal from \"../organisms/ProfileModal\";\r\nimport ReportDropDownMenu from \"../organisms/ReportDropDownMenu\";\r\nimport SupportModal from \"../organisms/SupportModal\";\r\n\r\nexport interface ITopNavBarProps {\r\n auth: Auth;\r\n isAuthenticated: boolean;\r\n isAdministrator: boolean;\r\n isKpiAdministrator: boolean;\r\n hasMultipleRoles: boolean;\r\n}\r\n\r\nconst TopNavBar: React.SFC = (props: ITopNavBarProps) => {\r\n const {\r\n isAuthenticated,\r\n isAdministrator,\r\n isKpiAdministrator,\r\n auth,\r\n hasMultipleRoles\r\n } = props;\r\n return (\r\n \r\n \r\n \r\n \r\n {isAuthenticated && hasMultipleRoles && (\r\n \r\n \r\n \r\n\r\n \r\n )}\r\n {isAuthenticated && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {isAuthenticated && isAdministrator && (\r\n \r\n \r\n \r\n )}\r\n {isAuthenticated && isKpiAdministrator && (\r\n \r\n \r\n \r\n KPIs\r\n \r\n \r\n )}\r\n \r\n\r\n \r\n {isAuthenticated && (\r\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 {isAuthenticated && (\r\n \r\n {\r\n auth.logout();\r\n }}\r\n />\r\n \r\n )}\r\n {!isAuthenticated && (\r\n auth.login()}\r\n />\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\nconst mapStateToProps = (state: IStore) => {\r\n const adminGroup = (state.userGroups as IGroup[]).find(\r\n ug => ug.name === adminGroupName\r\n );\r\n const kpiAdminGroup = (state.userGroups as IGroup[]).find(\r\n ug => ug.name === kpiAdminGroupName\r\n );\r\n return {\r\n auth: state.auth0,\r\n isAuthenticated: state.auth0.isAuthenticated(),\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n isAdministrator: adminGroup !== undefined,\r\n isKpiAdministrator: kpiAdminGroup !== undefined,\r\n hasMultipleRoles: state.userRoles.length > 1 ? true : false\r\n };\r\n};\r\nexport default connect(mapStateToProps)(TopNavBar);\r\n","import * as React from \"react\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport AddDashboardPage from \"../components/pages/admin/AddDashboardPage\";\r\nimport AddFinancialYearPage from \"../components/pages/admin/AddFinancialYearPage\";\r\nimport AddGroupPage from \"../components/pages/admin/AddGroupPage\";\r\nimport AddKpiPage from \"../components/pages/admin/AddKpiPage\";\r\nimport AddPredicatePage from \"../components/pages/admin/AddPredicatePage\";\r\nimport AddReportPage from \"../components/pages/admin/AddReportPage\";\r\nimport AddUserPage from \"../components/pages/admin/AddUserPage\";\r\nimport EditDashboardPage from \"../components/pages/admin/EditDashboardPage\";\r\nimport EditGroupPage from \"../components/pages/admin/EditGroupPage\";\r\nimport EditKpiPage from \"../components/pages/admin/EditKpiPage\";\r\nimport EditPredicatePage from \"../components/pages/admin/EditPredicatePage\";\r\nimport EditReportPage from \"../components/pages/admin/EditReportPage\";\r\nimport RoleWizardPage from \"../components/pages/admin/RoleWizardPage\";\r\nimport SearchDashboardsPage from \"../components/pages/admin/SearchDashboardsPage\";\r\nimport SearchGroupsPage from \"../components/pages/admin/SearchGroupsPage\";\r\nimport SearchKpisPage from \"../components/pages/admin/SearchKpisPage\";\r\nimport SearchPredicatesPage from \"../components/pages/admin/SearchPredicatesPage\";\r\nimport SearchReportsPage from \"../components/pages/admin/SearchReportsPage\";\r\nimport SearchRolesPage from \"../components/pages/admin/SearchRolesPage\";\r\nimport SearchUsersPage from \"../components/pages/admin/SearchUsersPage\";\r\nimport UserWizardPage from \"../components/pages/admin/UserWizardPage\";\r\nimport KpiTargetsPage from \"../components/pages/KpiTargetsPage\";\r\nimport Callback from \"../components/pages/Callback\";\r\nimport CallbackSaml from \"../components/pages/CallbackSaml\";\r\nimport CallbackSamlNA from \"../components/pages/CallbackSamlNA\";\r\nimport CallbackSamlProdAu from \"../components/pages/CallbackSamlProdAu\";\r\nimport CallbackSamlProdNA from \"../components/pages/CallbackSamlProdNA\";\r\nimport CallbackSamlDevAu from \"../components/pages/CallbackSamlDevAu\";\r\nimport CallbackSamlProdAsia from \"../components/pages/CallbackSamlProdAsia\";\r\n\r\nimport CallbackSamlPrtlDevAu from \"../components/pages/CallbackSamlPrtlDevAu\";\r\nimport CallbackSamlPrtlQaAu from \"../components/pages/CallbackSamlPrtlQaAu\";\r\nimport CallbackSamlPrtlProdAu from \"../components/pages/CallbackSamlPrtlProdAu\";\r\n\r\n\r\nimport DashboardSelectionPage from \"../components/pages/DashboardSelectionPage\";\r\nimport ReportViewPage from \"../components/pages/ReportViewPage\";\r\nimport SplashPage from \"../components/pages/SplashPage\";\r\nimport WelcomePage from \"../components/pages/WelcomePage\";\r\nimport TopNavBar from \"../components/templates/TopNavBar\";\r\nimport { paths } from \"../constants\";\r\n\r\nexport const routes = [\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.callback,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosaml,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamlqa,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamlqana,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamlprodau,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamlprodna,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamlprodas,\r\n topbar: () => \r\n },\r\n\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamldevprtlau,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamlqaprtlau,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamlprodprtlau,\r\n topbar: () => \r\n },\r\n\r\n\r\n\r\n\r\n\r\n\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.ssosamldevau,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.root,\r\n topbar: () => \r\n }\r\n];\r\n\r\nexport const secureRoutes = [\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.pbiDashboards}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.sqlReports}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: paths.home,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: paths.kpitargets,\r\n topbar: () => \r\n }\r\n];\r\nexport const secureAdminRoutes = [\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addDashboard}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addReport}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addRoleWizard}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.quickAddUser}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addUser}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addGroup}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addKpi}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addFinancialYear}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.addPredicate}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: `${paths.searchDashboards}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: `${paths.searchReports}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: `${paths.searchRoles}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: `${paths.searchUsers}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: `${paths.searchGroups}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: `${paths.searchKpis}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: () => ,\r\n path: `${paths.searchPredicates}`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.editDashboard}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.editReport}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.editRole}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.editUser}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.editGroup}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.editPredicate}:id`,\r\n topbar: () => \r\n },\r\n {\r\n exact: true,\r\n main: (props: RouteComponentProps) => ,\r\n path: `${paths.editKpi}:id`,\r\n topbar: () => \r\n }\r\n];\r\n","import * as React from \"react\";\r\nimport Text from \"../atoms/Text\";\r\n\r\nconst ErrorPage = () => {\r\n return (\r\n \r\n Sorry, this page does not exist\r\n \r\n );\r\n};\r\n\r\nexport default ErrorPage;\r\n","import { Location } from \"history\";\r\nimport * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Redirect, Route, RouteProps } from \"react-router-dom\";\r\nimport paths from \"../../constants\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ISecureRouteProps extends RouteProps {\r\n isAuthenticated: boolean;\r\n component: React.ComponentType|any;\r\n}\r\n\r\nclass SecureRoute extends React.Component {\r\n public constructor(props: ISecureRouteProps) {\r\n super(props);\r\n }\r\n public render() {\r\n const {isAuthenticated} = this.props;\r\n const Component = this.props.component;\r\n return \r\n isAuthenticated ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n />;\r\n }\r\n}\r\n\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n isAuthenticated: state.auth0.isAuthenticated()\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(SecureRoute);\r\n","import { Location } from \"history\";\r\nimport * as React from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Redirect, Route, RouteProps } from \"react-router-dom\";\r\nimport { paths } from \"../../constants\";\r\nimport { IStore } from \"../../models/IStore\";\r\n\r\nexport interface ISecureAdminRouteProps extends RouteProps {\r\n isAuthenticated: boolean;\r\n isAdministrator: boolean;\r\n component: React.ComponentType | any;\r\n}\r\n\r\nclass SecureAdminRoute extends React.Component {\r\n public constructor(props: ISecureAdminRouteProps) {\r\n super(props);\r\n }\r\n public render() {\r\n const Component = this.props.component;\r\n const { isAuthenticated, isAdministrator } = this.props;\r\n return (\r\n \r\n isAuthenticated && isAdministrator ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n />\r\n );\r\n }\r\n}\r\nconst mapStateToProps = (state: IStore) => {\r\n return {\r\n isAdministrator: state.auth0.isAuthenticated(),\r\n isAuthenticated: state.auth0.isAuthenticated()\r\n };\r\n};\r\n\r\nexport default connect(mapStateToProps)(SecureAdminRoute);\r\n","import * as React from \"react\";\r\nimport { Route, Switch } from \"react-router\";\r\nimport { routes, secureAdminRoutes, secureRoutes } from \"../../routes/RouteList\";\r\nimport ErrorPage from \"../pages/ErrorPage\";\r\nimport SecureRoute from \"../templates/SecureRoute\";\r\nimport SecureAdminRoute from \"./SecureAdminRoute\";\r\n\r\nconst PageBodyRoutes = () => {\r\n return (\r\n \r\n {routes.map(route => (\r\n \r\n ))}\r\n {secureRoutes.map(route => (\r\n \r\n ))}\r\n {secureAdminRoutes.map(route => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default PageBodyRoutes;\r\n","import * as React from 'react';\r\nimport {Container as BootstrapContainer} from 'reactstrap';\r\n\r\nexport interface IContainerProps{\r\n children: React.ReactNode;\r\n fluid?:boolean;\r\n id?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n\r\nconst Container:React.SFC = (props:IContainerProps) => {\r\n const {children, fluid, id, style} = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default Container;","import * as React from \"react\";\r\nimport bgImage from \"../../assets/images/ctm-bg1-min1.jpg\";\r\nimport Container from \"../atoms/Container\";\r\n\r\nexport interface IPageContainerProps {\r\n fluid?: boolean;\r\n style?: React.CSSProperties;\r\n children: React.ReactNode;\r\n id?: string;\r\n}\r\nconst PageContainer: React.SFC = (\r\n props: IPageContainerProps\r\n) => {\r\n const { children, fluid, id, style } = props;\r\n return (\r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default PageContainer;\r\n","import * as React from \"react\";\r\nimport Col from \"../atoms/Col\";\r\nimport Row from \"../atoms/Row\";\r\n\r\nexport interface IPageHeaderProps {\r\n rowStyle?: React.CSSProperties;\r\n colStyle?: React.CSSProperties;\r\n children: React.ReactNode;\r\n rowId?: string;\r\n colId?: string;\r\n}\r\n\r\nconst PageHeader: React.SFC = (props: IPageHeaderProps) => {\r\n const { rowStyle, colStyle, children, rowId, colId } = props;\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default PageHeader;\r\n","import * as React from \"react\";\r\nimport { Route, Switch } from \"react-router\";\r\nimport SecureAdminRoute from \"../../components/templates/SecureAdminRoute\";\r\nimport SecureRoute from \"../../components/templates/SecureRoute\";\r\nimport {\r\n routes,\r\n secureAdminRoutes,\r\n secureRoutes\r\n} from \"../../routes/RouteList\";\r\nimport TopNavBar from \"./TopNavBar\";\r\n\r\nconst PageHeaderRoutes = () => {\r\n return (\r\n \r\n {routes.map(route => (\r\n \r\n ))}\r\n {secureRoutes.map(route => (\r\n \r\n ))}\r\n {secureAdminRoutes.map(route => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default PageHeaderRoutes;\r\n","import createHistory from \"history/createBrowserHistory\";\r\n\r\nexport default createHistory();\r\n","import * as React from \"react\";\r\nimport { Router } from \"react-router\";\r\nimport PageBody from \"./components/templates/PageBody\";\r\nimport PageBodyRoutes from \"./components/templates/PageBodyRoutes\";\r\nimport PageContainer from \"./components/templates/PageContainer\";\r\nimport PageHeader from \"./components/templates/PageHeader\";\r\nimport PageHeaderRoutes from \"./components/templates/PageHeaderRoutes\";\r\nimport history from \"./routes/history\";\r\n\r\nclass App extends React.Component {\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","export const AUTH_CONFIG = {\r\n audience: \"https://app.ctmsmartdata.com/api/v3\",\r\n clientId: \"eZp9CNAr0RxENgzaaD5pSjQf3CfZfOmx\",\r\n domain: \"ctmsmartdata.au.auth0.com\",\r\n scope: \"openid email profile access:ctmsmartdata\",\r\n\r\n samlConnectionProdAsia: \"portal-as-prod-idp\", //For CTM portal Asia PROD\r\n\r\n samlConnectionNA: \"portal-na-stage-idp\", //For North America STAGE\r\n samlConnectionProdNA: \"portal-na-prod-idp\", //For North America PROD\r\n\r\n samlConnectionDevAU: \"portal-au-dev-idp\", //For old CTM portal AU DEV\r\n samlConnection: \"portal-qa-idp\", //For old CTM portal AU qa ???\r\n samlConnectionProdAu: \"portal-prod-idp\", //For old CTM portal AU?\r\n\r\n\r\n //For new CTM portal AU:\r\n samlConnectionPrtlProdAu: \"ctm-portal-au-prod-idp\",\r\n samlConnectionPrtlQaAu: \"ctm-portal-au-qa-idp\",\r\n samlConnectionPrtlDevAu: \"ctm-portal-au-dev-idp\"\r\n\r\n\r\n};\r\n","/* eslint-disable no-loop-func */\r\nimport * as auth0 from \"auth0-js\";\r\nimport { AUTH_CONFIG } from \"./auth0-variables\";\r\n\r\nexport default class Auth {\r\n public auth0: auth0.WebAuth;\r\n public profile: auth0.Auth0UserProfile;\r\n public idToken: string;\r\n public accessToken: string;\r\n public expiresAt: number;\r\n\r\n constructor() {\r\n this.getProfile = this.getProfile.bind(this);\r\n this.handleAuthentication = this.handleAuthentication.bind(this);\r\n this.isAuthenticated = this.isAuthenticated.bind(this);\r\n this.login = this.login.bind(this);\r\n this.loginSAML = this.loginSAML.bind(this);\r\n this.loginSAMLNA = this.loginSAMLNA.bind(this);\r\n this.loginSAMLProdNA = this.loginSAMLProdNA.bind(this);\r\n this.loginSAMLProdAU = this.loginSAMLProdAU.bind(this);\r\n this.loginSAMLDevAU = this.loginSAMLDevAU.bind(this);\r\n this.loginSAMLProdAsia = this.loginSAMLProdAsia.bind(this);\r\n\r\n\r\n //For new CTM portal AU:\r\n this.loginSAMLPrtlProdAU = this.loginSAMLPrtlProdAU.bind(this);\r\n this.loginSAMLPrtlQaAU = this.loginSAMLPrtlQaAU.bind(this);\r\n this.loginSAMLPrtlDevAU = this.loginSAMLPrtlDevAU.bind(this);\r\n\r\n\r\n this.logout = this.logout.bind(this);\r\n this.setSession = this.setSession.bind(this);\r\n const arr = window.location.href.split(\"/\");\r\n const redirectUri = arr[0] + \"//\" + arr[2] + \"/callback\";\r\n this.auth0 = new auth0.WebAuth({\r\n // the following three lines MUST be updated\r\n audience: AUTH_CONFIG.audience,\r\n clientID: AUTH_CONFIG.clientId,\r\n domain: AUTH_CONFIG.domain,\r\n redirectUri, // AUTH_CONFIG.callbackUrl,\r\n responseType: \"token id_token\",\r\n scope: AUTH_CONFIG.scope\r\n });\r\n this.profile = {} as auth0.Auth0UserProfile;\r\n this.idToken = \"\";\r\n this.accessToken = \"\";\r\n this.expiresAt = 0;\r\n }\r\n\r\n public getProfile() {\r\n return this.profile;\r\n }\r\n\r\n public async handleAuthentication() {\r\n return new Promise((resolve, reject) => {\r\n this.auth0.parseHash((err:any, authResult:any) => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n if (!authResult || !authResult.idToken) {\r\n return reject(err);\r\n }\r\n this.setSession(authResult);\r\n resolve(authResult);\r\n });\r\n });\r\n }\r\n\r\n public isAuthenticated() {\r\n return new Date().getTime() < (this.expiresAt as number);\r\n }\r\n\r\n public async login() {\r\n await this.auth0.authorize();\r\n }\r\n public async loginSAML() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnection\r\n });\r\n }\r\n public async loginSAMLNA() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionNA\r\n });\r\n }\r\n public async loginSAMLProdAU() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionProdAu\r\n });\r\n }\r\n public async loginSAMLProdNA() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionProdNA\r\n });\r\n }\r\n public async loginSAMLDevAU() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionDevAU\r\n });\r\n }\r\n public async loginSAMLProdAsia() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionProdAsia\r\n });\r\n }\r\n\r\n //For new CTM portal AU:\r\n\r\n public async loginSAMLPrtlProdAU() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionPrtlProdAu\r\n });\r\n }\r\n\r\n public async loginSAMLPrtlQaAU() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionPrtlQaAu\r\n });\r\n }\r\n\r\n public async loginSAMLPrtlDevAU() {\r\n return await this.auth0.authorize({\r\n connection: AUTH_CONFIG.samlConnectionPrtlDevAu\r\n });\r\n }\r\n\r\n\r\n\r\n public async logout() {\r\n // clear id token and expiration\r\n this.idToken = \"\";\r\n this.accessToken = \"\";\r\n this.expiresAt = 0;\r\n this.profile = {} as auth0.Auth0UserProfile;\r\n await this.auth0.logout({\r\n returnTo: window.location.origin\r\n });\r\n }\r\n\r\n public setSession(authResult: auth0.Auth0DecodedHash) {\r\n this.idToken = authResult.idToken as string;\r\n this.accessToken = authResult.accessToken as string;\r\n this.profile = authResult.idTokenPayload;\r\n // set the time that the id token will expire at\r\n this.expiresAt =\r\n (authResult.expiresIn as number) * 1000 + new Date().getTime();\r\n }\r\n}\r\n","import {applyMiddleware} from 'redux';\r\nimport thunk from 'redux-thunk';\r\n\r\nexport default applyMiddleware(thunk);\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_DASHBOARD_ID,\r\n SET_ACTIVE_DASHBOARD_ID\r\n} from \"../actions/activeDashboard\";\r\n\r\nexport const activeDashboard = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_DASHBOARD_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_DASHBOARD_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeDashboard;\r\n","import IClient from \"models/IClient\";\r\nimport { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_DASHBOARD_DEFAULT_CLIENT,\r\n SET_ACTIVE_DASHBOARD_DEFAULT_CLIENT\r\n} from \"../actions/activeDashboardDefaultClient\";\r\n\r\nexport const activeDashboardDefaultClient = (state = {} as IClient, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_DASHBOARD_DEFAULT_CLIENT:\r\n return action.client as IClient;\r\n case CLEAR_ACTIVE_DASHBOARD_DEFAULT_CLIENT:\r\n return {} as IClient;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeDashboardDefaultClient;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID,\r\n SET_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID\r\n} from \"../actions/activeDashboardDefaultPredicate\";\r\n\r\nexport const activeDashboardDefaultPredicateId = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_DASHBOARD_DEFAULT_PREDICATE_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeDashboardDefaultPredicateId;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_PAGINATED_REPORT_ID,\r\n SET_ACTIVE_PAGINATED_REPORT_ID\r\n} from \"../actions/activePaginatedReport\";\r\n\r\nexport const activePaginatedReport = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_PAGINATED_REPORT_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_PAGINATED_REPORT_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activePaginatedReport;\r\n","import * as Redux from \"redux\";\r\nimport IPbiPaginatedReport from \"../models/IPbiPaginatedReport\";\r\n\r\nexport const SET_ACTIVE_PAGINATED_REPORT_ID = \"SET_ACTIVE_PAGINATED_REPORT_ID\";\r\nexport const CLEAR_ACTIVE_PAGINATED_REPORT_ID = \"CLEAR_ACTIVE_PAGINATED_REPORT_ID\";\r\n\r\nexport const setActivePaginatedReport = (id: number) => {\r\n return {\r\n id,\r\n type: SET_ACTIVE_PAGINATED_REPORT_ID\r\n };\r\n};\r\nexport const clearActivePaginatedReport = () => {\r\n return {\r\n type: CLEAR_ACTIVE_PAGINATED_REPORT_ID\r\n };\r\n};\r\n\r\nexport const handleLoadActivePaginatedReportData = (\r\n paginatedReportId: number,\r\n userPaginatedReports: IPbiPaginatedReport[]\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const paginatedReport = await userPaginatedReports.find(\r\n rep => rep.id === paginatedReportId\r\n );\r\n if (paginatedReport === undefined) {\r\n // tslint:disable-next-line:no-console\r\n console.log(\r\n \"This paginatedReport not found, or user does not have access to this paginatedReport\"\r\n );\r\n } else {\r\n dispatch(setActivePaginatedReport(paginatedReport.id));\r\n }\r\n };\r\n};\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_KPI_ID,\r\n SET_ACTIVE_KPI_ID\r\n} from \"../actions/activeKpi\";\r\n\r\nexport const activeKpi = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_KPI_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_KPI_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeKpi;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_KPI_CLIENT_ID,\r\n SET_ACTIVE_KPI_CLIENT_ID\r\n} from \"../actions/activeKpiClient\";\r\n\r\nexport const activeKpiClient = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_KPI_CLIENT_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_KPI_CLIENT_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeKpiClient;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_ACTIVE_KPI_ENTRY,\r\n CLEAR_ACTIVE_KPI_ENTRIES,\r\n LOAD_ACTIVE_KPI_ENTRIES,\r\n REMOVE_ACTIVE_KPI_ENTRY\r\n} from \"../actions/activeKpiEntries\";\r\nimport IKpiEntry from \"../models/IKpiEntry\";\r\n\r\nexport const activeKpiEntries = (\r\n state = [] as IKpiEntry[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_ACTIVE_KPI_ENTRY:\r\n const newState: IKpiEntry[] = state.slice();\r\n newState.push(action.kpiEntry as IKpiEntry);\r\n return newState;\r\n case REMOVE_ACTIVE_KPI_ENTRY:\r\n return Object.assign(\r\n [],\r\n state.filter(\r\n (kpiEntry: IKpiEntry) =>\r\n kpiEntry.kpiId !== (action.kpiEntry as IKpiEntry).kpiId &&\r\n kpiEntry.clientId === (action.kpiEntry as IKpiEntry).clientId &&\r\n kpiEntry.year === (action.kpiEntry as IKpiEntry).year &&\r\n kpiEntry.monthId === (action.kpiEntry as IKpiEntry).monthId &&\r\n kpiEntry.measuredValue ===\r\n (action.kpiEntry as IKpiEntry).measuredValue &&\r\n kpiEntry.thresholdValue ===\r\n (action.kpiEntry as IKpiEntry).thresholdValue\r\n )\r\n ) as IKpiEntry[];\r\n case LOAD_ACTIVE_KPI_ENTRIES:\r\n return action.kpiEntries as IKpiEntry[];\r\n case CLEAR_ACTIVE_KPI_ENTRIES:\r\n return [] as IKpiEntry[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeKpiEntries;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_KPI_FY_ID,\r\n SET_ACTIVE_KPI_FY_ID\r\n} from \"../actions/activeKpiFinancialYear\";\r\n\r\nexport const activeKpiFinancialYear = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_KPI_FY_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_KPI_FY_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeKpiFinancialYear;\r\n","import { AnyAction } from \"redux\";\r\nimport { CLEAR_ACTIVE_KPI_PREDICATE_ID, SET_ACTIVE_KPI_PREDICATE_ID } from \"../actions/activeKpiPredicate\";\r\n\r\nexport const activeKpiPredicate = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_KPI_PREDICATE_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_KPI_PREDICATE_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeKpiPredicate;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_REPORT_ID,\r\n SET_ACTIVE_REPORT_ID\r\n} from \"../actions/activeReport\";\r\n\r\nexport const activeReport = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_REPORT_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_REPORT_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeReport;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_ROLE_ID,\r\n SET_ACTIVE_ROLE_ID\r\n} from \"../actions/activeRole\";\r\n\r\nexport const activeRole = (state = 0, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_ROLE_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_ROLE_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeRole;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_ACTIVE_ROLE_CLIENT,\r\n CLEAR_ACTIVE_ROLE_CLIENTS,\r\n LOAD_ACTIVE_ROLE_CLIENTS,\r\n REMOVE_ACTIVE_ROLE_CLIENT\r\n} from \"../actions/activeRoleClients\";\r\nimport IClient from \"../models/IClient\";\r\n\r\nexport const activeRoleClients = (state = [] as IClient[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_ACTIVE_ROLE_CLIENT:\r\n const newState: IClient[] = state.slice();\r\n newState.push(action.client as IClient);\r\n return newState;\r\n case REMOVE_ACTIVE_ROLE_CLIENT:\r\n return Object.assign(\r\n [],\r\n state.filter((client: IClient) => client.id !== (action.client as IClient).id)\r\n ) as IClient[];\r\n case LOAD_ACTIVE_ROLE_CLIENTS:\r\n return action.clients as IClient[];\r\n case CLEAR_ACTIVE_ROLE_CLIENTS:\r\n return [] as IClient[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeRoleClients;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_ACTIVE_ROLE_KPI_GROUPING_PREDICATE,\r\n CLEAR_ACTIVE_ROLE_KPI_GROUPING_PREDICATES,\r\n LOAD_ACTIVE_ROLE_KPI_GROUPING_PREDICATES,\r\n REMOVE_ACTIVE_ROLE_KPI_GROUPING_PREDICATE\r\n} from \"../actions/activeRoleKpiGroupingPredicates\";\r\nimport IPredicate from \"../models/IPredicate\";\r\n\r\nexport const activeRoleKpiGroupingPredicates = (\r\n state = [] as IPredicate[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_ACTIVE_ROLE_KPI_GROUPING_PREDICATE:\r\n const newState: IPredicate[] = state.slice();\r\n newState.push(action.predicate as IPredicate);\r\n return newState;\r\n case REMOVE_ACTIVE_ROLE_KPI_GROUPING_PREDICATE:\r\n return Object.assign(\r\n [],\r\n state.filter(\r\n (predicate: IPredicate) => predicate.id !== (action.predicate as IPredicate).id\r\n )\r\n ) as IPredicate[];\r\n case LOAD_ACTIVE_ROLE_KPI_GROUPING_PREDICATES:\r\n return action.predicates as IPredicate[];\r\n case CLEAR_ACTIVE_ROLE_KPI_GROUPING_PREDICATES:\r\n return [] as IPredicate[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeRoleKpiGroupingPredicates;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_ACTIVE_USER_GROUP_ID,\r\n SET_ACTIVE_USER_GROUP_ID\r\n} from \"../actions/activeUserGroup\";\r\n\r\nexport const activeUserGroup = (state = 0 as number, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_USER_GROUP_ID:\r\n return action.id as number;\r\n case CLEAR_ACTIVE_USER_GROUP_ID:\r\n return 0;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default activeUserGroup;\r\n","import { AnyAction } from \"redux\";\r\nimport { INITIALISE_AUTH0, UPDATE_AUTH0 } from \"../actions/auth0\";\r\nimport Auth from \"../auth/Auth\";\r\n\r\nexport const auth0 = (state: Auth = new Auth(), action: AnyAction) => {\r\n switch (action.type) {\r\n case INITIALISE_AUTH0:\r\n return Object.assign({}, state, { auth0: action.payload as Auth });\r\n case UPDATE_AUTH0:\r\n const newState = Object.assign({}, state as Auth);\r\n newState.idToken = action.payload.idToken;\r\n newState.expiresAt = action.payload.expiresAt;\r\n newState.accessToken = action.payload.accessToken;\r\n return newState;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default auth0;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_CURRENCY_CODE,\r\n LOAD_CURRENCY_CODES,\r\n REMOVE_CURRENCY_CODE,\r\n UPDATE_CURRENCY_CODE\r\n} from \"../actions/currencyCodes\";\r\nimport ICurrencyCode from \"../models/ICurrencyCode\";\r\n\r\nexport const currencyCodes = (\r\n state = [] as ICurrencyCode[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_CURRENCY_CODE:\r\n const newState: ICurrencyCode[] = state.slice();\r\n newState.push(action.currencyCode as ICurrencyCode);\r\n return newState;\r\n case REMOVE_CURRENCY_CODE:\r\n return Object.assign(\r\n {},\r\n state.filter((cc: ICurrencyCode) => cc.id !== (action.id as number))\r\n );\r\n case UPDATE_CURRENCY_CODE:\r\n return state.map((cc: ICurrencyCode) => {\r\n if (cc.id === (action.currencyCode as ICurrencyCode).id) {\r\n return action.currencyCode as ICurrencyCode;\r\n }\r\n return cc;\r\n });\r\n case LOAD_CURRENCY_CODES:\r\n return action.currencyCodes as ICurrencyCode[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default currencyCodes;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_DASHBOARD,\r\n LOAD_DASHBOARDS,\r\n REMOVE_DASHBOARD,\r\n UPDATE_DASHBOARD\r\n} from \"../actions/dashboards\";\r\nimport IPbiDashboard from \"../models/IPbiDashboard\";\r\n\r\nexport const dashboards = (\r\n state = [] as IPbiDashboard[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_DASHBOARD:\r\n const newState: IPbiDashboard[] = state.slice();\r\n newState.push(action.dashboard as IPbiDashboard);\r\n return newState;\r\n case REMOVE_DASHBOARD:\r\n return Object.assign(\r\n [],\r\n state.filter(\r\n (dshbd: IPbiDashboard) => dshbd.id !== (action.id as number)\r\n )\r\n ) as IPbiDashboard[];\r\n case UPDATE_DASHBOARD:\r\n return Object.assign(\r\n [],\r\n state.map((dshbd: IPbiDashboard) => {\r\n if (dshbd.id === (action.dashboard as IPbiDashboard).id) {\r\n return action.dashboard as IPbiDashboard;\r\n }\r\n return dshbd;\r\n })\r\n ) as IPbiDashboard[];\r\n case LOAD_DASHBOARDS:\r\n return action.dashboards as IPbiDashboard[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default dashboards;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_PAGINATED_REPORT,\r\n LOAD_PAGINATED_REPORTS,\r\n REMOVE_PAGINATED_REPORT,\r\n UPDATE_PAGINATED_REPORT\r\n} from \"../actions/paginatedReports\";\r\nimport IPbiPaginatedReport from \"../models/IPbiPaginatedReport\";\r\n\r\nexport const paginatedReports = (\r\n state = [] as IPbiPaginatedReport[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_PAGINATED_REPORT:\r\n const newState: IPbiPaginatedReport[] = state.slice();\r\n newState.push(action.paginatedReport as IPbiPaginatedReport);\r\n return newState;\r\n case REMOVE_PAGINATED_REPORT:\r\n return Object.assign(\r\n [],\r\n state.filter(\r\n (dshbd: IPbiPaginatedReport) => dshbd.id !== (action.id as number)\r\n )\r\n ) as IPbiPaginatedReport[];\r\n case UPDATE_PAGINATED_REPORT:\r\n return Object.assign(\r\n [],\r\n state.map((dshbd: IPbiPaginatedReport) => {\r\n if (dshbd.id === (action.paginatedReport as IPbiPaginatedReport).id) {\r\n return action.paginatedReport as IPbiPaginatedReport;\r\n }\r\n return dshbd;\r\n })\r\n ) as IPbiPaginatedReport[];\r\n case LOAD_PAGINATED_REPORTS:\r\n return action.paginatedReports as IPbiPaginatedReport[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default paginatedReports;\r\n","import * as Redux from \"redux\";\r\nimport getPaginatedReports from \"../api/getPaginatedReports\";\r\n//import savePaginatedReport from \"../api/savePaginatedReport\";\r\n//import saveUpdatedPaginatedReport from \"../api/saveUpdatedPaginatedReport\";\r\n//import { removePaginatedReport as deletePaginatedReport } from \"../api/removePaginatedReport\";\r\nimport IPbiPaginatedReport from \"../models/IPbiPaginatedReport\";\r\nimport { setPaginatedReportsLoaded } from \"./loadingPaginatedReports\";\r\n\r\nexport const ADD_PAGINATED_REPORT = \"ADD_PAGINATED_REPORT\";\r\nexport const REMOVE_PAGINATED_REPORT = \"REMOVE_PAGINATED_REPORT\";\r\nexport const UPDATE_PAGINATED_REPORT = \"UPDATE_PAGINATED_REPORT\";\r\nexport const LOAD_PAGINATED_REPORTS = \"LOAD_PAGINATED_REPORTS\";\r\n\r\n//export const addPaginatedReport = (paginatedReport: IPbiPaginatedReport) => {\r\n// return {\r\n// paginatedReport,\r\n// type: ADD_PAGINATED_REPORT\r\n// };\r\n//};\r\n\r\n//export const removePaginatedReport = (id: number) => {\r\n// return {\r\n// id,\r\n// type: REMOVE_PAGINATED_REPORT\r\n// };\r\n//};\r\n\r\n//export const updatePaginatedReport = (paginatedReport: IPbiPaginatedReport) => {\r\n// return {\r\n// paginatedReport,\r\n// type: UPDATE_PAGINATED_REPORT\r\n// };\r\n//};\r\n\r\nexport const loadPaginatedReports = (paginatedReports: IPbiPaginatedReport[]) => {\r\n return {\r\n paginatedReports,\r\n type: LOAD_PAGINATED_REPORTS\r\n };\r\n};\r\n\r\n//export const handleSavePaginatedReport = (\r\n// accessToken: string,\r\n// name: string,\r\n// displayName: string,\r\n// groupId: string,\r\n// reportId: string,\r\n// paginatedReportViewerVersion: number,\r\n// isEnabled: boolean\r\n//) => {\r\n// return async (dispatch: Redux.Dispatch) => {\r\n// const paginatedReport = await savePaginatedReport(\r\n// accessToken,\r\n// name,\r\n// displayName,\r\n// groupId,\r\n// reportId,\r\n// paginatedReportViewerVersion,\r\n// isEnabled\r\n// );\r\n// if (paginatedReport !== null && paginatedReport !== undefined) {\r\n// dispatch(addPaginatedReport(paginatedReport));\r\n// }\r\n// };\r\n//};\r\n\r\n//export const handleUpdatePaginatedReport = (\r\n// accessToken: string,\r\n// paginatedReport: IPbiPaginatedReport\r\n//) => {\r\n// return async (dispatch: Redux.Dispatch) => {\r\n// const dsh = await saveUpdatedPaginatedReport(accessToken, paginatedReport);\r\n// if (dsh !== null && dsh !== undefined) {\r\n// dispatch(updatePaginatedReport(paginatedReport));\r\n// }\r\n// };\r\n//};\r\n\r\n//export const handleDeletePaginatedReport = (accessToken: string, id: number) => {\r\n// return async (dispatch: Redux.Dispatch) => {\r\n// const result = await deletePaginatedReport(accessToken, id);\r\n// if (result === 200) {\r\n// dispatch(removePaginatedReport(id));\r\n// }\r\n// };\r\n//};\r\n\r\nexport const handleLoadPaginatedReports = (accessToken: string) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const paginatedReports = await getPaginatedReports(accessToken);\r\n if (paginatedReports !== undefined) {\r\n if (paginatedReports.length > 0) {\r\n paginatedReports.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadPaginatedReports(paginatedReports));\r\n }\r\n dispatch(setPaginatedReportsLoaded(true));\r\n }\r\n };\r\n};\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_EDIT_ROLE_DASHBOARD_ID,\r\n CLEAR_EDIT_ROLE_DASHBOARD_IDS,\r\n LOAD_EDIT_ROLE_DASHBOARD_IDS,\r\n REMOVE_EDIT_ROLE_DASHBOARD_ID\r\n} from \"../actions/editRoleDashboardIds\";\r\n\r\nexport const editRoleDashboardIds = (\r\n state = [] as number[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_EDIT_ROLE_DASHBOARD_ID:\r\n const newState: number[] = state.slice();\r\n newState.push(action.id as number);\r\n return newState;\r\n case REMOVE_EDIT_ROLE_DASHBOARD_ID:\r\n return Object.assign(\r\n [],\r\n state.filter((id: number) => id !== (action.id as number))\r\n ) as number[];\r\n case LOAD_EDIT_ROLE_DASHBOARD_IDS:\r\n return action.ids as number[];\r\n case CLEAR_EDIT_ROLE_DASHBOARD_IDS:\r\n return [] as number[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editRoleDashboardIds;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_EDIT_ROLE_DETAILS,\r\n SET_EDIT_ROLE_DETAILS\r\n} from \"../actions/editRoleDetails\";\r\nimport IRole from \"../models/IRole\";\r\n\r\nexport const editRoleDetails = (\r\n state = {} as IRole,\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case SET_EDIT_ROLE_DETAILS:\r\n return action.role as IRole;\r\n case CLEAR_EDIT_ROLE_DETAILS:\r\n return {} as IRole;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editRoleDetails;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_EDIT_ROLE_PREDICATE,\r\n CLEAR_EDIT_ROLE_PREDICATES,\r\n LOAD_EDIT_ROLE_PREDICATES,\r\n REMOVE_EDIT_ROLE_PREDICATE,\r\n UPDATE_EDIT_ROLE_PREDICATE\r\n} from \"../actions/editRolePredicates\";\r\nimport IRolePredicate from \"../models/IRolePredicate\";\r\n\r\nexport const editRolePredicates = (\r\n state = [] as IRolePredicate[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_EDIT_ROLE_PREDICATE:\r\n const newState: IRolePredicate[] = state.slice();\r\n newState.push(action.rolePredicate as IRolePredicate);\r\n return newState;\r\n case REMOVE_EDIT_ROLE_PREDICATE:\r\n return Object.assign(\r\n [],\r\n state.filter(\r\n (rp: IRolePredicate) =>\r\n rp.predicateId !== (action.predicateId as number)\r\n )\r\n ) as IRolePredicate[];\r\n case UPDATE_EDIT_ROLE_PREDICATE:\r\n return Object.assign(\r\n [],\r\n state.map((rp: IRolePredicate) => {\r\n if (\r\n rp.roleId === (action.rolePredicate as IRolePredicate).roleId &&\r\n rp.predicateId ===\r\n (action.rolePredicate as IRolePredicate).predicateId\r\n ) {\r\n return action.rolePredicate as IRolePredicate;\r\n }\r\n return rp;\r\n })\r\n ) as IRolePredicate[];\r\n case LOAD_EDIT_ROLE_PREDICATES:\r\n return action.rolePredicates as IRolePredicate[];\r\n case CLEAR_EDIT_ROLE_PREDICATES:\r\n return [] as IRolePredicate[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editRolePredicates;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_EDIT_ROLE_REPORT_ID,\r\n CLEAR_EDIT_ROLE_REPORT_IDS,\r\n LOAD_EDIT_ROLE_REPORT_IDS,\r\n REMOVE_EDIT_ROLE_REPORT_ID\r\n} from \"../actions/editRoleReportIds\";\r\n\r\nexport const editRoleReportIds = (\r\n state = [] as number[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_EDIT_ROLE_REPORT_ID:\r\n const newState: number[] = state.slice();\r\n newState.push(action.id as number);\r\n return newState;\r\n case REMOVE_EDIT_ROLE_REPORT_ID:\r\n return Object.assign(\r\n [],\r\n state.filter((id: number) => id !== (action.id as number))\r\n ) as number[];\r\n case LOAD_EDIT_ROLE_REPORT_IDS:\r\n return action.ids as number[];\r\n case CLEAR_EDIT_ROLE_REPORT_IDS:\r\n return [] as number[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editRoleReportIds;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_EDIT_ROLE_USER_ID,\r\n CLEAR_EDIT_ROLE_USER_IDS,\r\n LOAD_EDIT_ROLE_USER_IDS,\r\n REMOVE_EDIT_ROLE_USER_ID\r\n} from \"../actions/editRoleUserIds\";\r\n\r\nexport const editRoleUserIds = (\r\n state = [] as number[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_EDIT_ROLE_USER_ID:\r\n const newState: number[] = state.slice();\r\n newState.push(action.id as number);\r\n return newState;\r\n case REMOVE_EDIT_ROLE_USER_ID:\r\n return Object.assign(\r\n [],\r\n state.filter((id: number) => id !== (action.id as number))\r\n ) as number[];\r\n case LOAD_EDIT_ROLE_USER_IDS:\r\n return action.ids as number[];\r\n case CLEAR_EDIT_ROLE_USER_IDS:\r\n return [] as number[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editRoleUserIds;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_EDIT_USER_DETAILS,\r\n SET_EDIT_USER_DETAILS\r\n} from \"../actions/editUserDetails\";\r\nimport IUserProfile from \"../models/IUserProfile\";\r\n\r\nexport const editUserDetails = (\r\n state = {} as IUserProfile,\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case SET_EDIT_USER_DETAILS:\r\n return action.user as IUserProfile;\r\n case CLEAR_EDIT_USER_DETAILS:\r\n return {} as IUserProfile;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editUserDetails;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_EDIT_USER_GROUP_ID,\r\n CLEAR_EDIT_USER_GROUP_IDS,\r\n LOAD_EDIT_USER_GROUP_IDS,\r\n REMOVE_EDIT_USER_GROUP_ID\r\n} from \"../actions/editUserGroupIds\";\r\n\r\nexport const editUserGroupIds = (\r\n state = [] as number[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_EDIT_USER_GROUP_ID:\r\n const newState: number[] = state.slice();\r\n newState.push(action.id as number);\r\n return newState;\r\n case REMOVE_EDIT_USER_GROUP_ID:\r\n return Object.assign(\r\n [],\r\n state.filter((id: number) => id !== (action.id as number))\r\n ) as number[];\r\n case LOAD_EDIT_USER_GROUP_IDS:\r\n return action.ids as number[];\r\n case CLEAR_EDIT_USER_GROUP_IDS:\r\n return [] as number[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editUserGroupIds;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_EDIT_USER_ROLE_ID,\r\n CLEAR_EDIT_USER_ROLE_IDS,\r\n LOAD_EDIT_USER_ROLE_IDS,\r\n REMOVE_EDIT_USER_ROLE_ID\r\n} from \"../actions/editUserRoleIds\";\r\n\r\nexport const editUserRoleIds = (\r\n state = [] as number[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_EDIT_USER_ROLE_ID:\r\n const newState: number[] = state.slice();\r\n newState.push(action.id as number);\r\n return newState;\r\n case REMOVE_EDIT_USER_ROLE_ID:\r\n return Object.assign(\r\n [],\r\n state.filter((id: number) => id !== (action.id as number))\r\n ) as number[];\r\n case LOAD_EDIT_USER_ROLE_IDS:\r\n return action.ids as number[];\r\n case CLEAR_EDIT_USER_ROLE_IDS:\r\n return [] as number[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default editUserRoleIds;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_FINANCIAL_YEAR,\r\n LOAD_FINANCIAL_YEARS,\r\n REMOVE_FINANCIAL_YEAR,\r\n UPDATE_FINANCIAL_YEAR\r\n} from \"../actions/financialYears\";\r\nimport IFinancialYear from \"../models/IFinancialYear\";\r\n\r\nexport const financialYears = (\r\n state = [] as IFinancialYear[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_FINANCIAL_YEAR:\r\n const newState: IFinancialYear[] = state.slice();\r\n newState.push(action.financialYear as IFinancialYear);\r\n return newState;\r\n case REMOVE_FINANCIAL_YEAR:\r\n return Object.assign(\r\n {},\r\n state.filter((fy: IFinancialYear) => fy.id !== (action.id as number))\r\n );\r\n case UPDATE_FINANCIAL_YEAR:\r\n return state.map((fy: IFinancialYear) => {\r\n if (fy.id === (action.financialYear as IFinancialYear).id) {\r\n return action.financialYear as IFinancialYear;\r\n }\r\n return fy;\r\n });\r\n case LOAD_FINANCIAL_YEARS:\r\n return action.financialYears as IFinancialYear[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default financialYears;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_FY_START_MONTH,\r\n LOAD_FY_START_MONTHS,\r\n REMOVE_FY_START_MONTH,\r\n UPDATE_FY_START_MONTH\r\n} from \"../actions/fyStartMonths\";\r\nimport IFYStartMonth from \"../models/IFYStartMonth\";\r\n\r\nexport const fyStartMonths = (\r\n state = [] as IFYStartMonth[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_FY_START_MONTH:\r\n const newState: IFYStartMonth[] = state.slice();\r\n newState.push(action.fyStartMonth as IFYStartMonth);\r\n return newState;\r\n case REMOVE_FY_START_MONTH:\r\n return Object.assign(\r\n {},\r\n state.filter((fysm: IFYStartMonth) => fysm.id !== (action.id as number))\r\n );\r\n case UPDATE_FY_START_MONTH:\r\n return state.map((fysm: IFYStartMonth) => {\r\n if (fysm.id === (action.fyStartMonth as IFYStartMonth).id) {\r\n return action.fyStartMonth as IFYStartMonth;\r\n }\r\n return fysm;\r\n });\r\n case LOAD_FY_START_MONTHS:\r\n return action.fyStartMonths as IFYStartMonth[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default fyStartMonths;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_GROUP,\r\n LOAD_GROUPS,\r\n REMOVE_GROUP,\r\n UPDATE_GROUP\r\n} from \"../actions/groups\";\r\nimport IUserGroup from \"../models/IGroup\";\r\n\r\nexport const groups = (state = [] as IUserGroup[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_GROUP:\r\n const newState: IUserGroup[] = state.slice();\r\n newState.push(action.group as IUserGroup);\r\n return newState;\r\n case REMOVE_GROUP:\r\n return Object.assign(\r\n [],\r\n state.filter((grp: IUserGroup) => grp.id !== (action.id as number))\r\n ) as IUserGroup[];\r\n case UPDATE_GROUP:\r\n return Object.assign(\r\n [],\r\n state.map((grp: IUserGroup) => {\r\n if (grp.id === (action.group as IUserGroup).id) {\r\n return action.group as IUserGroup;\r\n }\r\n return grp;\r\n })\r\n ) as IUserGroup[];\r\n case LOAD_GROUPS:\r\n return action.groups as IUserGroup[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default groups;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_KPI,\r\n LOAD_KPIS,\r\n REMOVE_KPI,\r\n UPDATE_KPI\r\n} from \"../actions/kpis\";\r\nimport IKpi from \"../models/IKpi\";\r\n\r\nexport const kpis = (state = [] as IKpi[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_KPI:\r\n const newState: IKpi[] = state.slice();\r\n newState.push(action.kpi as IKpi);\r\n return newState;\r\n case REMOVE_KPI:\r\n return Object.assign(\r\n [],\r\n state.filter((k: IKpi) => k.id !== (action.id as number))\r\n ) as IKpi[];\r\n case UPDATE_KPI:\r\n return Object.assign(\r\n [],\r\n state.map((k: IKpi) => {\r\n if (k.id === (action.kpi as IKpi).id) {\r\n return action.kpi as IKpi;\r\n }\r\n return k;\r\n })\r\n ) as IKpi[];\r\n case LOAD_KPIS:\r\n return action.kpis as IKpi[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default kpis;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_DATA_LOADED } from \"../actions/loading\";\r\n\r\nexport const loading = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_DATA_LOADED:\r\n return action.dataLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loading;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_CURRENCY_CODES_LOADED } from \"../actions/loadingCurrencyCodes\";\r\n\r\nexport const loadingCurrencyCodes = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_CURRENCY_CODES_LOADED:\r\n return action.currencyCodesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingCurrencyCodes;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_DASHBOARDS_LOADED } from \"../actions/loadingDashboards\";\r\n\r\nexport const loadingDashboards = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_DASHBOARDS_LOADED:\r\n return action.dashboardsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingDashboards;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_EDIT_ROLE_DASHBOARDS_LOADED } from \"../actions/loadingEditRoleDashboards\";\r\n\r\nexport const loadingEditRoleDashboards = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_EDIT_ROLE_DASHBOARDS_LOADED:\r\n return action.editRoleDashboardsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingEditRoleDashboards;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_PAGINATED_REPORTS_LOADED } from \"../actions/loadingPaginatedReports\";\r\n\r\nexport const loadingPaginatedReports = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_PAGINATED_REPORTS_LOADED:\r\n return action.paginatedReportsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingPaginatedReports;\r\n","export const SET_PAGINATED_REPORTS_LOADED = \"SET_PAGINATED_REPORTS_LOADED\";\r\n\r\nexport const setPaginatedReportsLoaded = (paginatedReportsLoaded: boolean) => {\r\n return {\r\n paginatedReportsLoaded,\r\n type: SET_PAGINATED_REPORTS_LOADED\r\n };\r\n};\r\n ","import { AnyAction } from \"redux\";\r\nimport { SET_EDIT_ROLE_PREDICATES_LOADED } from \"../actions/loadingEditRolePredicates\";\r\n\r\nexport const loadingEditRolePredicates = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_EDIT_ROLE_PREDICATES_LOADED:\r\n return action.editRolePredicatesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingEditRolePredicates;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_EDIT_ROLE_REPORTS_LOADED } from \"../actions/loadingEditRoleReports\";\r\n\r\nexport const loadingEditRoleReports = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_EDIT_ROLE_REPORTS_LOADED:\r\n return action.editRoleReportsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingEditRoleReports;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_EDIT_ROLE_USERS_LOADED } from \"../actions/loadingEditRoleUsers\";\r\n\r\nexport const loadingEditRoleUsers = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_EDIT_ROLE_USERS_LOADED:\r\n return action.editRoleUsersLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingEditRoleUsers;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_EDIT_USER_DETAILS_LOADED } from \"../actions/loadingEditUserDetails\";\r\n\r\nexport const loadingEditUserDetails = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_EDIT_USER_DETAILS_LOADED:\r\n return action.editUserDetailsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingEditUserDetails;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_EDIT_USER_GROUPS_LOADED } from \"../actions/loadingEditUserGroups\";\r\n\r\nexport const loadingEditUserGroups = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_EDIT_USER_GROUPS_LOADED:\r\n return action.editUserGroupsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingEditUserGroups;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_EDIT_USER_ROLES_LOADED } from \"../actions/loadingEditUserRoles\";\r\n\r\nexport const loadingEditUserRoles = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_EDIT_USER_ROLES_LOADED:\r\n return action.editUserRolesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingEditUserRoles;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_FINANCIAL_YEARS_LOADED } from \"../actions/loadingFinancialYears\";\r\n\r\nexport const loadingFinancialYears = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_FINANCIAL_YEARS_LOADED:\r\n return action.financialYearsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingFinancialYears;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_FY_START_MONTHS_LOADED } from \"../actions/loadingFyStartMonths\";\r\n\r\nexport const loadingFyStartMonths = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_FY_START_MONTHS_LOADED:\r\n return action.fyStartMonthsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingFyStartMonths;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_GROUPS_LOADED } from \"../actions/loadingGroups\";\r\n\r\nexport const loadingGroups = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_GROUPS_LOADED:\r\n return action.groupsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingGroups;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_KPI_ENTRIES_LOADED } from \"../actions/loadingKpiEntries\";\r\n\r\nexport const loadingKpiEntries = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_KPI_ENTRIES_LOADED:\r\n return action.kpiEntriesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingKpiEntries;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_KPIS_LOADED } from \"../actions/loadingKpis\";\r\n\r\nexport const loadingKpis = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_KPIS_LOADED:\r\n return action.kpisLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingKpis;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_PREDICATES_LOADED } from \"../actions/loadingPredicates\";\r\n\r\nexport const loadingPredicates = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_PREDICATES_LOADED:\r\n return action.predicatesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingPredicates;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_REPORTS_LOADED } from \"../actions/loadingReports\";\r\n\r\nexport const loadingReports = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_REPORTS_LOADED:\r\n return action.reportsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingReports;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_ROLE_CLIENTS_LOADED } from \"../actions/loadingRoleClients\";\r\n\r\nexport const loadingRoleClients = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ROLE_CLIENTS_LOADED:\r\n return action.roleClientsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingRoleClients;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_ROLE_KPI_GROUPING_PREDICATES_LOADED } from \"../actions/loadingRoleKpiGroupingPredicates\";\r\n\r\nexport const loadingRoleKpiGroupingPredicates = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ROLE_KPI_GROUPING_PREDICATES_LOADED:\r\n return action.roleKpiGroupingPredicatesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingRoleKpiGroupingPredicates;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_ROLES_LOADED } from \"../actions/loadingRoles\";\r\n\r\nexport const loadingRoles = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_ROLES_LOADED:\r\n return action.rolesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingRoles;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_USER_DASHBOARDS_LOADED } from \"../actions/loadingUserDashboards\";\r\n\r\nexport const loadingUserDashboards = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_USER_DASHBOARDS_LOADED:\r\n return action.userDashboardsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingUserDashboards;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_USER_PAGINATED_REPORTS_LOADED } from \"../actions/loadingUserPaginatedReports\";\r\n\r\nexport const loadingUserPaginatedReports = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_USER_PAGINATED_REPORTS_LOADED:\r\n return action.userPaginatedReportsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingUserPaginatedReports;\r\n","export const SET_USER_PAGINATED_REPORTS_LOADED = \"SET_USER_PAGINATED_REPORTS_LOADED\";\r\n\r\nexport const setUserPaginatedReportsLoaded = (userPaginatedReportsLoaded: boolean) => {\r\n return {\r\n userPaginatedReportsLoaded,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: SET_USER_PAGINATED_REPORTS_LOADED\r\n };\r\n};\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_USER_GROUPS_LOADED } from \"../actions/loadingUserGroups\";\r\n\r\nexport const loadingUserGroups = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_USER_GROUPS_LOADED:\r\n return action.userGroupsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingUserGroups;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_USER_REPORTS_LOADED } from \"../actions/loadingUserReports\";\r\n\r\nexport const loadingUserReports = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_USER_REPORTS_LOADED:\r\n return action.userReportsLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingUserReports;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_USER_ROLES_LOADED } from \"../actions/loadingUserRoles\";\r\n\r\nexport const loadingUserRoles = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_USER_ROLES_LOADED:\r\n return action.userRolesLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingUserRoles;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_USERS_LOADED } from \"../actions/loadingUsers\";\r\n\r\nexport const loadingUsers = (state = false, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_USERS_LOADED:\r\n return action.usersLoaded;\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default loadingUsers;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_PREDICATE,\r\n LOAD_PREDICATES,\r\n REMOVE_PREDICATE,\r\n UPDATE_PREDICATE\r\n} from \"../actions/predicates\";\r\nimport IPredicate from \"../models/IPredicate\";\r\n\r\nexport const predicates = (state = [] as IPredicate[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_PREDICATE:\r\n const newState: IPredicate[] = state.slice();\r\n newState.push(action.predicate as IPredicate);\r\n return newState;\r\n case REMOVE_PREDICATE:\r\n return Object.assign(\r\n [],\r\n state.filter((rp: IPredicate) => rp.id !== (action.id as number))\r\n ) as IPredicate[];\r\n case UPDATE_PREDICATE:\r\n return Object.assign(\r\n [],\r\n state.map((rp: IPredicate) => {\r\n if (rp.id === (action.predicate as IPredicate).id) {\r\n return action.predicate as IPredicate;\r\n }\r\n return rp;\r\n })\r\n ) as IPredicate[];\r\n case LOAD_PREDICATES:\r\n return action.predicates as IPredicate[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default predicates;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_USER_PROFILE,\r\n LOAD_USER_PROFILES,\r\n REMOVE_USER_PROFILE,\r\n UPDATE_USER_PROFILE\r\n} from \"../actions/profiles\";\r\nimport IUserProfile from \"../models/IUserProfile\";\r\n\r\nexport const profiles = (state = [] as IUserProfile[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_USER_PROFILE:\r\n const newState: IUserProfile[] = state.slice();\r\n newState.push(action.userProfile as IUserProfile);\r\n return newState;\r\n case REMOVE_USER_PROFILE:\r\n return Object.assign(\r\n [],\r\n state.filter((usr: IUserProfile) => usr.id !== (action.id as number))\r\n ) as IUserProfile[];\r\n case UPDATE_USER_PROFILE:\r\n return Object.assign(\r\n [],\r\n state.map((usr: IUserProfile) => {\r\n if (usr.id === (action.userProfile as IUserProfile).id) {\r\n return action.userProfile as IUserProfile;\r\n }\r\n return usr;\r\n })\r\n ) as IUserProfile[];\r\n case LOAD_USER_PROFILES:\r\n return action.userProfiles as IUserProfile[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default profiles;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_REPORT,\r\n LOAD_REPORTS,\r\n REMOVE_REPORT,\r\n UPDATE_REPORT\r\n} from \"../actions/reports\";\r\nimport ISqlReport from \"../models/ISqlReport\";\r\n\r\nexport const reports = (state = [] as ISqlReport[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_REPORT:\r\n const newState: ISqlReport[] = state.slice();\r\n newState.push(action.report as ISqlReport);\r\n return newState;\r\n case REMOVE_REPORT:\r\n return Object.assign(\r\n [],\r\n state.filter((rpt: ISqlReport) => rpt.id !== (action.id as number))\r\n ) as ISqlReport[];\r\n case UPDATE_REPORT:\r\n return Object.assign(\r\n [],\r\n state.map((rpt: ISqlReport) => {\r\n if (rpt.id === (action.report as ISqlReport).id) {\r\n return action.report as ISqlReport;\r\n }\r\n return rpt;\r\n })\r\n );\r\n case LOAD_REPORTS:\r\n return action.reports as ISqlReport[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default reports;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_ROLE_PREDICATE,\r\n LOAD_ROLE_PREDICATES,\r\n REMOVE_ROLE_PREDICATE,\r\n UPDATE_ROLE_PREDICATE\r\n} from \"../actions/rolePredicates\";\r\nimport IRolePredicate from \"../models/IRolePredicate\";\r\n\r\nexport const rolePredicates = (\r\n state = [] as IRolePredicate[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_ROLE_PREDICATE:\r\n const newState: IRolePredicate[] = state.slice();\r\n newState.push(action.rolePredicate as IRolePredicate);\r\n return newState;\r\n case REMOVE_ROLE_PREDICATE:\r\n return Object.assign(\r\n [],\r\n state.filter(\r\n (rp: IRolePredicate) => rp.roleId !== (action.roleId as number) && rp.predicateId!==(action.predicateId as number)\r\n )\r\n ) as IRolePredicate[];\r\n case UPDATE_ROLE_PREDICATE:\r\n return Object.assign(\r\n [],\r\n state.map((rp: IRolePredicate) => {\r\n if (rp.roleId === (action.rolePredicate as IRolePredicate).roleId && rp.predicateId===(action.rolePredicate as IRolePredicate).predicateId) {\r\n return action.rolePredicate as IRolePredicate;\r\n }\r\n return rp;\r\n })\r\n ) as IRolePredicate[];\r\n case LOAD_ROLE_PREDICATES:\r\n return action.rolePredicates as IRolePredicate[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default rolePredicates;\r\n","import * as Redux from \"redux\";\r\nimport getRolePredicates from \"../api/getRolePredicates\";\r\nimport { removeRolePredicate as deleteRolePredicate } from \"../api/removeRolePredicate\";\r\nimport saveRolePredicate from \"../api/saveRolePredicate\";\r\nimport saveUpdatedRolePredicate from \"../api/saveUpdatedRolePredicate\";\r\nimport IRolePredicate from \"../models/IRolePredicate\";\r\n\r\nexport const ADD_ROLE_PREDICATE = \"ADD_ROLE_PREDICATE\";\r\nexport const REMOVE_ROLE_PREDICATE = \"REMOVE_ROLE_PREDICATE\";\r\nexport const UPDATE_ROLE_PREDICATE = \"UPDATE_ROLE_PREDICATE\";\r\nexport const LOAD_ROLE_PREDICATES = \"LOAD_ROLE_PREDICATEES\";\r\n\r\nexport const addRolePredicate = (rolePredicate: IRolePredicate) => {\r\n return {\r\n rolePredicate,\r\n type: ADD_ROLE_PREDICATE\r\n };\r\n};\r\n\r\nexport const removeRolePredicate = (roleId: number, predicateId: number) => {\r\n return {\r\n roleId,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n predicateId,\r\n type: REMOVE_ROLE_PREDICATE\r\n };\r\n};\r\n\r\nexport const updateRolePredicate = (rolePredicate: IRolePredicate) => {\r\n return {\r\n rolePredicate,\r\n type: UPDATE_ROLE_PREDICATE\r\n };\r\n};\r\n\r\nexport const loadRolePredicates = (rolePredicates: IRolePredicate[]) => {\r\n return {\r\n rolePredicates,\r\n type: LOAD_ROLE_PREDICATES\r\n };\r\n};\r\n\r\nexport const handleLoadRolePredicates = (\r\n accessToken: string,\r\n roleId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const rolePredicates = await getRolePredicates(accessToken, roleId);\r\n if (rolePredicates!==undefined){\r\n if (rolePredicates.length>0){\r\n dispatch(loadRolePredicates(rolePredicates));\r\n }\r\n // dispatch(setRolePredicatesLoaded(true));\r\n }\r\n };\r\n};\r\n\r\nexport const handleSaveRolePredicate = (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number,\r\n value: string\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const rolePredicate = await saveRolePredicate(\r\n accessToken,\r\n roleId,\r\n predicateId,\r\n value\r\n );\r\n if (rolePredicate !== null && rolePredicate !== undefined) {\r\n dispatch(addRolePredicate(rolePredicate));\r\n }\r\n };\r\n};\r\n\r\nexport const handleUpdateRolePredicate = (\r\n accessToken: string,\r\n rolePredicate: IRolePredicate\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const rp = await saveUpdatedRolePredicate(accessToken, rolePredicate);\r\n if (rp !== null && rp !== undefined) {\r\n dispatch(updateRolePredicate(rp));\r\n }\r\n };\r\n};\r\n\r\nexport const handleDeleteRolePredicate = (\r\n accessToken: string,\r\n roleId: number,\r\n predicateId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const result = await deleteRolePredicate(accessToken, roleId, predicateId);\r\n if (result === 200) {\r\n dispatch(removeRolePredicate(roleId, predicateId));\r\n }\r\n };\r\n};\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_ROLE,\r\n LOAD_ROLES,\r\n REMOVE_ROLE,\r\n UPDATE_ROLE\r\n} from \"../actions/roles\";\r\nimport IRole from \"../models/IRole\";\r\n\r\nexport const roles = (state = [] as IRole[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_ROLE:\r\n const newState: IRole[] = state.slice();\r\n newState.push(action.role as IRole);\r\n return newState;\r\n case REMOVE_ROLE:\r\n return Object.assign(\r\n [],\r\n state.filter((role: IRole) => role.id !== (action.id as number))\r\n ) as IRole[];\r\n case UPDATE_ROLE:\r\n return Object.assign(\r\n [],\r\n state.map((role: IRole) => {\r\n if (role.id === (action.role as IRole).id) {\r\n return action.role as IRole;\r\n }\r\n return role;\r\n })\r\n ) as IRole[];\r\n case LOAD_ROLES:\r\n return action.roles as IRole[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default roles;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n CLEAR_PBI_ACCESS_TOKEN,\r\n SET_PBI_ACCESS_TOKEN\r\n} from \"../actions/tokenData\";\r\nimport { ITokenData } from \"../models/ITokenData\";\r\n\r\nexport const tokenData = (state = {} as ITokenData, action: AnyAction) => {\r\n switch (action.type) {\r\n case SET_PBI_ACCESS_TOKEN:\r\n return Object.assign({}, state, action.tokenData as ITokenData);\r\n case CLEAR_PBI_ACCESS_TOKEN:\r\n return Object.assign({}, {} as ITokenData);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default tokenData;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_USER_DASHBOARD,\r\n LOAD_USER_DASHBOARDS,\r\n REMOVE_USER_DASHBOARD\r\n} from \"../actions/userDashboards\";\r\nimport IPbiDashboard from \"../models/IPbiDashboard\";\r\n\r\nexport const userDashboards = (\r\n state = [] as IPbiDashboard[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_USER_DASHBOARD:\r\n const newState: IPbiDashboard[] = state.slice();\r\n newState.push(action.userDashboard as IPbiDashboard);\r\n return newState;\r\n case REMOVE_USER_DASHBOARD:\r\n return Object.assign(\r\n {},\r\n state.filter((r: IPbiDashboard) => r.id !== (action.id as number))\r\n );\r\n case LOAD_USER_DASHBOARDS:\r\n return action.userDashboards as IPbiDashboard[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default userDashboards;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_USER_PAGINATED_REPORT,\r\n LOAD_USER_PAGINATED_REPORTS,\r\n REMOVE_USER_PAGINATED_REPORT\r\n} from \"../actions/userPaginatedReports\";\r\nimport IPbiPaginatedReport from \"../models/IPbiPaginatedReport\";\r\n\r\nexport const userPaginatedReports = (\r\n state = [] as IPbiPaginatedReport[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_USER_PAGINATED_REPORT:\r\n const newState: IPbiPaginatedReport[] = state.slice();\r\n newState.push(action.userPaginatedReport as IPbiPaginatedReport);\r\n return newState;\r\n case REMOVE_USER_PAGINATED_REPORT:\r\n return Object.assign(\r\n {},\r\n state.filter((r: IPbiPaginatedReport) => r.id !== (action.id as number))\r\n );\r\n case LOAD_USER_PAGINATED_REPORTS:\r\n return action.userPaginatedReports as IPbiPaginatedReport[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default userPaginatedReports;\r\n","import * as Redux from \"redux\";\r\nimport getUserPaginatedReports from \"../api/getUserPaginatedReports\";\r\nimport IPbiPaginatedReport from \"../models/IPbiPaginatedReport\";\r\nimport { setActivePaginatedReport } from \"./activePaginatedReport\";\r\nimport { setUserPaginatedReportsLoaded } from \"./loadingUserPaginatedReports\";\r\n\r\nexport const ADD_USER_PAGINATED_REPORT = \"ADD_USER_PAGINATED_REPORT\";\r\nexport const REMOVE_USER_PAGINATED_REPORT = \"REMOVE_USER_PAGINATED_REPORT\";\r\nexport const LOAD_USER_PAGINATED_REPORTS = \"LOAD_USER_PAGINATED_REPORTS\";\r\n\r\nexport const addUserPaginatedReport = (userPaginatedReport: IPbiPaginatedReport) => {\r\n return {\r\n userPaginatedReport,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: ADD_USER_PAGINATED_REPORT\r\n };\r\n};\r\n\r\nexport const removeUserPaginatedReport = (id: number) => {\r\n return {\r\n id,\r\n type: REMOVE_USER_PAGINATED_REPORT\r\n };\r\n};\r\n\r\nexport const loadUserPaginatedReports = (userPaginatedReports: IPbiPaginatedReport[]) => {\r\n return {\r\n userPaginatedReports,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n type: LOAD_USER_PAGINATED_REPORTS\r\n };\r\n};\r\n\r\nexport const handleLoadUserPaginatedReports = (\r\n accessToken: string,\r\n userId: number\r\n) => {\r\n return async (dispatch: Redux.Dispatch) => {\r\n const paginatedReports = await getUserPaginatedReports(accessToken, userId);\r\n if (paginatedReports !== undefined) {\r\n if (paginatedReports.length > 0) {\r\n paginatedReports.sort((a, b) =>\r\n a.displayName.toLowerCase() > b.displayName.toLowerCase() ? 1 : -1\r\n );\r\n dispatch(loadUserPaginatedReports(paginatedReports));\r\n dispatch(setActivePaginatedReport(paginatedReports[0].id));\r\n }\r\n dispatch(setUserPaginatedReportsLoaded(true));\r\n }\r\n };\r\n};\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_USER_GROUP,\r\n LOAD_USER_GROUPS,\r\n REMOVE_USER_GROUP\r\n} from \"../actions/userGroups\";\r\nimport IUserGroup from \"../models/IGroup\";\r\n\r\nexport const userGroups = (\r\n state = [] as IUserGroup[],\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case ADD_USER_GROUP:\r\n const newState: IUserGroup[] = state.slice();\r\n newState.push(action.userGroup as IUserGroup);\r\n return newState;\r\n case REMOVE_USER_GROUP:\r\n return Object.assign(\r\n {},\r\n state.filter((r: IUserGroup) => r.id !== (action.id as number))\r\n );\r\n case LOAD_USER_GROUPS:\r\n return action.userGroups as IUserGroup[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default userGroups;\r\n","import { AnyAction } from \"redux\";\r\nimport { SET_ACTIVE_USER_PROFILE } from \"../actions/activeUserProfile\";\r\nimport IUserProfile from \"../models/IUserProfile\";\r\n\r\nexport const userProfile = (\r\n state = {} as IUserProfile,\r\n action: AnyAction\r\n) => {\r\n switch (action.type) {\r\n case SET_ACTIVE_USER_PROFILE:\r\n return Object.assign({}, state, action.user as IUserProfile);\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default userProfile;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_USER_REPORT,\r\n LOAD_USER_REPORTS,\r\n REMOVE_USER_REPORT\r\n} from \"../actions/userReports\";\r\nimport ISqlReport from \"../models/ISqlReport\";\r\n\r\nexport const userReports = (state = [] as ISqlReport[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_USER_REPORT:\r\n const newState: ISqlReport[] = state.slice();\r\n newState.push(action.userReport as ISqlReport);\r\n return newState;\r\n case REMOVE_USER_REPORT:\r\n return Object.assign(\r\n {},\r\n state.filter((r: ISqlReport) => r.id !== (action.id as number))\r\n );\r\n case LOAD_USER_REPORTS:\r\n return action.userReports as ISqlReport[];\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default userReports;\r\n","import { AnyAction } from \"redux\";\r\nimport {\r\n ADD_USER_ROLE,\r\n LOAD_USER_ROLES,\r\n REMOVE_USER_ROLE\r\n} from \"../actions/userRoles\";\r\nimport IRole from \"../models/IRole\";\r\n\r\nexport const userRoles = (state = [] as IRole[], action: AnyAction) => {\r\n switch (action.type) {\r\n case ADD_USER_ROLE:\r\n const newState: IRole[] = state.slice();\r\n newState.push(action.userRole as IRole);\r\n return newState;\r\n case REMOVE_USER_ROLE:\r\n return Object.assign(\r\n {},\r\n state.filter((r: IRole) => r.id !== (action.id as number))\r\n );\r\n case LOAD_USER_ROLES:\r\n return action.userRoles as IRole[];\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default userRoles;\r\n","import { combineReducers } from \"redux\";\r\nimport activeDashboard from \"./activeDashboard\";\r\nimport activeDashboardDefaultClient from \"./activeDashboardDefaultClient\";\r\nimport activeDashboardDefaultPredicateId from \"./activeDashboardDefaultPredicate\";\r\n\r\nimport activePaginatedReport from \"./activePaginatedReport\";\r\n\r\nimport activeKpi from \"./activeKpi\";\r\nimport activeKpiClient from \"./activeKpiClient\";\r\nimport activeKpiEntries from \"./activeKpiEntries\";\r\nimport activeKpiFinancialYear from \"./activeKpiFinancialYear\";\r\nimport activeKpiPredicate from \"./activeKpiPredicate\";\r\n\r\nimport activeReport from \"./activeReport\";\r\nimport activeRole from \"./activeRole\";\r\nimport activeRoleClients from \"./activeRoleClients\";\r\nimport activeRoleKpiGroupingPredicates from \"./activeRoleKpiGroupingPredicates\";\r\nimport activeUserGroup from \"./activeUserGroup\";\r\nimport auth0 from \"./auth0\";\r\nimport currencyCodes from \"./currencyCodes\";\r\n\r\nimport dashboards from \"./dashboards\";\r\nimport paginatedReports from \"./paginatedReports\";\r\n\r\nimport editRoleDashboardIds from \"./editRoleDashboardIds\";\r\nimport editRoleDetails from \"./editRoleDetails\";\r\nimport editRolePredicates from \"./editRolePredicates\";\r\nimport editRoleReportIds from \"./editRoleReportIds\";\r\nimport editRoleUserIds from \"./editRoleUserIds\";\r\nimport editUserDetails from \"./editUserDetails\";\r\nimport editUserGroupIds from \"./editUserGroupIds\";\r\nimport editUserRoleIds from \"./editUserRoleIds\";\r\nimport financialYears from \"./financialYears\";\r\nimport fyStartMonths from \"./fyStartMonths\";\r\nimport groups from \"./groups\";\r\nimport kpis from \"./kpis\";\r\nimport loading from \"./loading\";\r\nimport loadingCurrencyCodes from \"./loadingCurrencyCodes\";\r\n\r\n\r\nimport loadingDashboards from \"./loadingDashboards\";\r\nimport loadingEditRoleDashboards from \"./loadingEditRoleDashboards\";\r\n\r\n\r\nimport loadingPaginatedReports from \"./loadingPaginatedReports\";\r\n\r\n\r\nimport loadingEditRolePredicates from \"./loadingEditRolePredicates\";\r\nimport loadingEditRoleReports from \"./loadingEditRoleReports\";\r\nimport loadingEditRoleUsers from \"./loadingEditRoleUsers\";\r\nimport loadingEditUserDetails from \"./loadingEditUserDetails\";\r\nimport loadingEditUserGroups from \"./loadingEditUserGroups\";\r\nimport loadingEditUserRoles from \"./loadingEditUserRoles\";\r\nimport loadingFinancialYears from \"./loadingFinancialYears\";\r\nimport loadingFyStartMonths from \"./loadingFyStartMonths\";\r\nimport loadingGroups from \"./loadingGroups\";\r\nimport loadingKpiEntries from \"./loadingKpiEntries\";\r\nimport loadingKpis from \"./loadingKpis\";\r\nimport loadingPredicates from \"./loadingPredicates\";\r\nimport loadingReports from \"./loadingReports\";\r\nimport loadingRoleClients from \"./loadingRoleClients\";\r\nimport loadingRoleKpiGroupingPredicates from \"./loadingRoleKpiGroupingPredicates\";\r\nimport loadingRoles from \"./loadingRoles\";\r\n\r\nimport loadingUserDashboards from \"./loadingUserDashboards\";\r\nimport loadingUserPaginatedReports from \"./loadingUserPaginatedReports\";\r\n\r\n\r\nimport loadingUserGroups from \"./loadingUserGroups\";\r\nimport loadingUserReports from \"./loadingUserReports\";\r\nimport loadingUserRoles from \"./loadingUserRoles\";\r\nimport loadingUsers from \"./loadingUsers\";\r\nimport predicates from \"./predicates\";\r\nimport profiles from \"./profiles\";\r\nimport reports from \"./reports\";\r\nimport rolePredicates from \"./rolePredicates\";\r\nimport roles from \"./roles\";\r\nimport tokenData from \"./tokenData\";\r\n\r\nimport userDashboards from \"./userDashboards\";\r\nimport userPaginatedReports from \"./userPaginatedReports\";\r\n\r\nimport userGroups from \"./userGroups\";\r\nimport userProfile from \"./userProfile\";\r\nimport userReports from \"./userReports\";\r\nimport userRoles from \"./userRoles\";\r\n\r\nexport const allReducers = combineReducers({\r\n auth0,\r\n currencyCodes,\r\n fyStartMonths,\r\n predicates,\r\n userProfile,\r\n // tslint:disable-next-line:object-literal-sort-keys\r\n userDashboards,\r\n userPaginatedReports,\r\n userRoles,\r\n userReports,\r\n userGroups,\r\n dashboards,\r\n paginatedReports,\r\n\r\n groups,\r\n profiles,\r\n reports,\r\n roles,\r\n rolePredicates,\r\n editRoleDetails,\r\n editRoleDashboardIds,\r\n editRolePredicates,\r\n editRoleReportIds,\r\n editRoleUserIds,\r\n editUserDetails,\r\n editUserGroupIds,\r\n editUserRoleIds,\r\n\r\n activeDashboardId: activeDashboard,\r\n activePaginatedReportId: activePaginatedReport,\r\n\r\n activeReportId: activeReport,\r\n activeRoleId: activeRole,\r\n activeUserGroupId: activeUserGroup,\r\n tokenData,\r\n loading,\r\n loadingEditUserDetails,\r\n loadingEditUserGroups,\r\n loadingEditUserRoles,\r\n loadingUsers,\r\n loadingGroups,\r\n loadingRoles,\r\n loadingCurrencyCodes,\r\n loadingFyStartMonths,\r\n loadingPredicates,\r\n loadingUserRoles,\r\n\r\n loadingUserDashboards,\r\n loadingUserPaginatedReports,\r\n\r\n loadingUserReports,\r\n loadingUserGroups,\r\n loadingReports,\r\n\r\n loadingDashboards,\r\n loadingPaginatedReports,\r\n\r\n loadingEditRoleUsers,\r\n loadingEditRoleReports,\r\n loadingEditRoleDashboards,\r\n loadingEditRolePredicates,\r\n loadingFinancialYears,\r\n financialYears,\r\n loadingKpis,\r\n kpis,\r\n activeKpiId: activeKpi,\r\n activeKpiPredicateId: activeKpiPredicate,\r\n activeKpiFinancialYearId: activeKpiFinancialYear,\r\n activeKpiClientId: activeKpiClient,\r\n activeRoleClients,\r\n loadingRoleClients,\r\n activeRoleKpiGroupingPredicates,\r\n loadingRoleKpiGroupingPredicates,\r\n activeKpiEntries,\r\n loadingKpiEntries,\r\n activeDashboardDefaultClient,\r\n activeDashboardDefaultPredicateId\r\n});\r\n","import \"bootstrap/dist/css/bootstrap.min.css\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\nimport { Provider } from \"react-redux\";\r\nimport { compose, createStore } from \"redux\";\r\nimport { initialiseAuth0 } from \"./actions/auth0\";\r\nimport App from \"./App\";\r\nimport \"./assets/styles/index.css\";\r\nimport Auth from \"./auth/Auth\";\r\nimport middleware from \"./middleware\";\r\nimport { allReducers } from \"./reducers\";\r\nimport registerServiceWorker from \"./registerServiceWorker\";\r\n\r\nconst composeEnhancers =\r\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\r\n\r\nconst store = createStore(allReducers, composeEnhancers(middleware));\r\n\r\nconst auth = new Auth();\r\n\r\nstore.dispatch(initialiseAuth0(auth));\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById(\"root\") as HTMLElement\r\n);\r\n// registerServiceWorker();\r\n","module.exports = __webpack_public_path__ + \"static/media/recentWhite.0134505d.svg\";","module.exports = __webpack_public_path__ + \"static/media/logoutWhite.f5380e73.svg\";","module.exports = __webpack_public_path__ + \"static/media/manageWhite.ea2dd9c3.svg\";","module.exports = __webpack_public_path__ + \"static/media/dashboardWhite.7e9f592d.svg\";","module.exports = __webpack_public_path__ + \"static/media/GraphWhite.29fdc3f2.svg\";","module.exports = __webpack_public_path__ + \"static/media/helpWhite.a3b77e03.svg\";","module.exports = __webpack_public_path__ + \"static/media/ctm-bg1-min1.e6a07223.jpg\";"],"sourceRoot":""}