{"version":3,"sources":["configure/apiAuthorizationConfig.ts","api/api-authorization/AuthorizeService.ts","api/api-authorization/useAuthorizeService.ts","api/api-authorization/useAuthenticatedState.ts","components/layout/UserNav.tsx","api/account/AccountService.ts","api/account/ClaimTypes.ts","api/account/useAccountService.ts","globalState/currentUserDetails/useCurrentUserRolesCache.ts","api/account/useCurrentUserRoles.ts","api/account/useExternalAuthenticationSchemes.ts","api/account/useResendConfirmationEmailCallback.ts","api/account/useStartExternalLoginCallback.ts","shared/authorizeRoute/AuthorizeContainer.tsx","shared/authorizeRoute/AuthorizeRoute.tsx","components/shared/NavLinkTrackActive.tsx","configure/security/IdentityRoles.ts","components/home/Navigation.tsx","components/layout/appNavbarBrand/AppNavbarBrand.tsx","components/layout/Header.tsx","shared/sidebarNav/SidebarNav.tsx","shared/sidebarNav/SidebarNavTitle.tsx","components/shared/AppRoutes.tsx","components/shared/LoadingIndicator.tsx","components/shared/background/Background.tsx","components/api-authorization/LoginWaiting.tsx","components/api-authorization/ApiAuthorizationConstants.ts","components/api-authorization/Login.tsx","components/api-authorization/Logout.tsx","components/api-authorization/routes.tsx","shared/userFriendlyErrorMessage/registerErrorMessageConverters.ts","shared/alertOnErrors/AlertOnErrors.tsx","shared/userFriendlyErrorMessage/userFriendlyErrorMessage.ts","shared/useChanges/useChanges.ts","components/account/ExternalLoginButton.tsx","components/shared/FormButtons.tsx","components/shared/MainContainer.tsx","shared/passwordValidation/PasswordOptions.ts","shared/passwordValidation/PasswordValidation.ts","shared/passwordValidation/usePasswordValidation.ts","shared/passwordValidation/generatePasswordRulesDescription.ts","api/main/models/RoleGroup.ts","api/main/models/User.ts","api/main/models/Profile.ts","components/profiles/RegisterProfileDetails.tsx","api/main/profiles/useRegisterProfileCallback.ts","components/account/Register.tsx","api/account/useRegisterAccountCallback.ts","configure/mainApiConfig.ts","components/profiles/ConfirmInviteProfileDetails.tsx","api/main/profiles/useProfileForInvite.ts","components/account/routes.tsx","components/account/Login.tsx","api/account/useLoginWithPasswordCallback.ts","components/account/ExternalLoginCallback.tsx","api/account/useCompletedExternalLoginDetails.ts","api/account/useCreateAccountForExternalLoginCallback.ts","components/account/ForgotPassword.tsx","api/account/useSendPasswordResetEmailCallback.ts","components/account/ResetPassword.tsx","api/account/useResetPasswordCallback.ts","components/account/ConfirmEmail.tsx","api/account/useConfirmEmailCallback.ts","components/account/ConfirmEmailChange.tsx","api/account/useConfirmEmailChangeCallback.ts","components/account/ConfirmInvite.tsx","api/account/useConfirmInviteCallback.ts","api/main/users/useUser.ts","components/profiles/ChangeEmail.tsx","components/shared/Banner.tsx","components/shared/pillsNavBar/PillsNavBar.tsx","components/profiles/ProfileNavigation.tsx","api/main/profiles/useProfile.ts","shared/useSaveInStore/useSaveInStore.ts","api/main/profiles/useCreateProfileCallback.ts","api/main/profiles/useUpdateProfileCallback.ts","api/main/profiles/useSaveProfileCallback.ts","components/profiles/ProfileDetails.tsx","components/profiles/routes.tsx","components/profiles/Profile.tsx","api/account/useChangeEmailCallback.ts","components/profiles/ChangePassword.tsx","api/account/useChangePasswordCallback.ts","shared/useURLSearchParams/useURLSearchParams.ts","shared/useURLSearchParams/useReplaceSearchParamsEffect.ts","shared/useURLSearchParams/useSearchParams.ts","components/home/Home.tsx","api/main/models/codeOnly/BaseValue.ts","components/home/routes.tsx","components/administration/AdministrationNavigation.tsx","components/shared/SidebarRequired.tsx","components/administration/routes.tsx","components/administration/AdministrationHome.tsx","components/shared/searchInput/SearchInput.tsx","components/shared/NoResultsFound.tsx","components/shared/StickyToolbar.tsx","components/shared/TableRowButtons.tsx","components/shared/cardsOrTable/CardsOrTable.tsx","configure/recoilPersistConfig.ts","globalState/preferredListViewMode/usePreferredListViewMode.ts","shared/useFetchMoreCallback/useFetchMoreCallback.ts","components/users/UsersListBase.tsx","api/main/profiles/viewModels/useUsersListViewBaseViewModel.ts","components/users/DeleteUserBase.tsx","api/main/profiles/useDeleteProfileCallback.ts","api/account/useLockoutCallback.ts","api/main/users/useChangeUserRoleGroupCallback.ts","components/users/EditUserBase.tsx","api/account/useInviteCallback.ts","api/account/useResendInviteEmailCallback.ts","api/account/useChangeAccountEmailCallback.ts","api/main/profiles/viewModels/useProfileSupportingData.ts","components/users/administrators/routes.tsx","components/users/administrators/AdministratorsList.tsx","components/users/administrators/EditAdministrator.tsx","components/users/administrators/DeleteAdministrator.tsx","api/main/users/useCurrentUser.ts","api/main/models/FinancialModel.ts","components/dashboard/Dashboard.tsx","api/main/financialModels/useFinancialModels.ts","components/dashboard/routes.tsx","components/dashboard/MyDashboard.tsx","components/dashboard/UserDashboard.tsx","components/financialModels/FinancialModelsList.tsx","api/main/financialModels/useFinancialModel.ts","api/main/financialModels/useCreateFinancialModelCallback.ts","api/main/financialModels/useUpdateFinancialModelCallback.ts","shared/useJsonObject/useJsonObject.ts","services/calculationsProcessor/CalculationsProcessor.ts","components/financialModels/FinancialModelCalculator.ts","components/shared/ISODateTimeInput.tsx","components/shared/numberInput/NumberInput.tsx","components/shared/StyledSlider.tsx","components/financialModels/utilities/useFormattedNumber.ts","components/financialModels/edit/assumptions/AssumptionsTab.tsx","components/financialModels/edit/proposals/ProposalTab.tsx","components/financialModels/edit/clientFacing/ClientFacingTab.tsx","components/financialModels/edit/model/ModelTab.tsx","components/shared/EmptyTableRows.tsx","components/financialModels/edit/financials/FinancialsTab.tsx","components/financialModels/utilities/useCalculateForYear.ts","components/financialModels/edit/valuation/ValuationTab.tsx","components/financialModels/utilities/useIRRCalculator.ts","api/main/models/BaseValue.ts","components/layout/Footer.tsx","api/main/financialModels/useCreateFinancialModelUnauthenticatedCallback.ts","components/financialModels/EditFinancialModel.tsx","api/main/baseValues/useBaseValuesUnauthenticated.ts","api/main/financialModels/useSaveFinancialModelUnauthenticatedCallback.ts","api/main/financialModels/useSaveFinancialModelCallback.ts","components/financialModels/DeleteFinancialModel.tsx","components/financialModels/routes.tsx","api/main/financialModels/viewModels/useFinancialModelsListViewModel.ts","api/main/financialModels/useDeleteFinancialModelCallback.ts","components/users/registeredUsers/routes.tsx","components/users/registeredUsers/RegisteredUsersList.tsx","components/users/registeredUsers/EditRegisteredUser.tsx","components/users/registeredUsers/DeleteRegisteredUser.tsx","components/start/routes.tsx","components/start/Start.tsx","api/main/baseValues/useCreateBaseValueCallback.ts","api/main/baseValues/useUpdateBaseValueCallback.ts","components/baseValues/edit/CO2UnitConversionNode.tsx","components/baseValues/edit/TargetReturnRatiosNode.tsx","components/baseValues/EditBaseValue.tsx","api/main/baseValues/useBaseValue.ts","api/main/baseValues/useSaveBaseValueCallback.ts","components/baseValues/routes.tsx","configure/routeConfig.tsx","components/shared/NotFound.tsx","components/layout/Sidebar.tsx","components/layout/Layout.tsx","configure/iconsConfig.ts","configure/configureApollo.ts","configure/languageConfig.ts","locales/localeResources.ts","App.tsx","configure/configureServices.ts","configure/i18n.ts","configure/errorMessageConfig.ts","registerServiceWorker.ts","reportWebVitals.ts","index.tsx"],"names":["apiAuthorizationConfig","authService","_popUpDisabled","_callbacks","_nextSubscriptionId","_user","_isAuthenticated","_userManager","this","undefined","a","getUser","user","profile","ensureUserManagerInitialized","userManager","access_token","state","signinSilent","createArguments","silentUser","updateState","success","console","log","Error","signinPopup","popUpUser","message","error","signinRedirect","redirect","url","signinCallback","signoutPopup","signoutRedirect","signoutCallback","response","notifySubscribers","callback","push","subscription","subscriptionId","subscriptionIndex","map","element","index","found","filter","length","splice","i","useReplaceToNavigate","data","status","AuthenticationResultStatus","Fail","Success","Redirect","fetch","ok","json","settings","automaticSilentRenew","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","prefix","UserManager","events","addUserSignedOut","removeUser","useAuthorizeService","useAuthenticatedState","options","React","isAuthenticated","setIsAuthenticated","setUser","stateChanged","authenticated","userResult","includeUser","subscribe","unsubscribe","UserNav","useToggleState","dropdownOpen","toggleDropdown","t","useTranslation","Dropdown","direction","isOpen","toggle","nav","DropdownToggle","size","round","name","email","preferred_username","className","DropdownMenu","right","DropdownItem","header","tag","to","icon","divider","pathname","local","NavItem","Button","color","AccountService","api","loginWithPassword","request","returnUrl","post","encodeURIComponent","credentials","result","register","defaultRegisterReturnUrl","getExternalAuthenticationSchemes","get","startExternalLogin","provider","form","document","createElement","action","method","body","append","submit","completeExternalLogin","remoteError","createAccountForExternalLogin","model","sendPasswordResetEmail","resetPassword","confirmEmail","confirmEmailChange","currentUserRoles","changePassword","changeEmail","resendConfirmEmail","invite","resendInviteEmail","confirmInvite","changeAccountEmail","lockout","ApiFetch","window","origin","ClaimTypes","useAccountService","useServices","services","accountService","currentUserRolesCacheState","atom","key","default","roles","isLoading","useCurrentUserRolesCache","useRecoilState","refreshCurrentUserRoles","setRoles","isNullOrUndefined","prevState","useCurrentUserRoles","useAsyncCallback","refresh","isExecuting","errors","lazy","useExternalAuthenticationSchemes","externalAuthenticationSchemes","setExternalAuthenticationSchemes","useResendConfirmationEmailCallback","useStartExternalLoginCallback","AuthorizeContainer","props","usersRoles","hasRequiredRole","setHasRequiredRole","requireRole","requireRoles","flat","hasRole","roleToCheck","find","it","children","failedCheck","showIfNotAuthorized","AuthorizeRoute","Component","component","render","rest","redirectUrl","location","href","NavLinkTrackActive","exact","activeClassName","IdentityRoles","Navigation","NavLink","AppNavbarBrand","Header","fixed","Container","fluid","display","mobile","Nav","SidebarNav","SidebarNavTitle","child","AppRoutes","routes","item","authorize","path","LoadingIndicator","fullWidth","inline","style","ret","width","textAlign","Spinner","type","Background","centerChildren","background","data-background","LoginWaiting","waiting","QueryParameterNames","LogoutActions","LoginActions","ApplicationPaths","DefaultLoginRedirectPath","ApiAuthorizationPrefix","Login","LoginFailed","LoginCallback","Register","Profile","LogOut","LoggedOut","LogOutCallback","IdentityRegisterPath","IdentityManagePath","login","getReturnUrl","processLoginCallback","URLSearchParams","search","setState","redirectToProfile","redirectToRegister","signIn","navigateToReturnUrl","completeSignIn","fromQuery","startsWith","redirectToApiAuthorizationPath","apiAuthorizationPath","replace","Logout","isReady","history","logout","processLogoutCallback","populateAuthenticationState","signOut","completeSignOut","apiAuthorizationRoutes","loginAction","logoutAction","configuredErrorMessageConverters","AlertOnErrors","simple","openErrors","setOpenErrors","toggleOpen","friendlyErrors","friendly","converter","Array","isArray","toString","userFriendlyErrorMessage","errorGroups","groups","group","Alert","Row","Col","xs","onClick","cursor","Badge","pill","showIf","details","lang","JSON","stringify","useChanges","unchanged","initialChanges","changes","setChanges","change","reset","ExternalLoginButton","providerDisplayName","propsClassName","text","context","FormButtons","noPadding","MainContainer","defaultPasswordOptions","requireDigit","requiredLength","requireLowercase","requireNonAlphanumeric","requiredUniqueChars","requireUppercase","PasswordValidation","passwordOptions","password","i18n","charMap","char","charAt","indexOf","RegExp","test","errorDescription","join","valid","usePasswordValidation","passwordValidation","checkPassword","check","passwordRequirements","passwordErrors","requirements","generatePasswordRulesDescrption","roleGroupFieldsFragment","gql","userFieldsFragment","profileFieldsFragment","profileDefaultValues","id","Guid","newGuid","userId","firstName","lastName","archived","useRegisterProfileDetailsProps","useMutation","mutationAction","financialModelId","variables","actionErrors","useRegisterProfileCallback","_registerProfile","isRegisteringProfile","registerProfileErrors","useValidatorCallback","validation","fieldsToCheck","rules","checkRules","validate","validationErrors","registerProfile","RegisterProfileDetails","FormGroup","Label","htmlFor","value","onChange","e","currentTarget","onBlur","useParams","loadErrors","params","requiresTwoFactor","requiresEmailConfirmation","useRegisterAccountCallback","isRegistering","registerErrors","isPendingEmailConfirmation","setIsPendingEmailConfirmation","resendConfirmationEmail","isResendingConfirmationEmail","resendConfirmationEmailErrors","useHistory","confirmPassword","registerProfileDetailsProps","singleCheck","isDoingFullPageRedirect","setIsDoingFullPageRedirect","performRegister","succeeded","Card","CardHeader","CardBody","md","Form","onSubmit","preventDefault","executingChildren","autoComplete","FormText","disabled","displayName","mainApiConfig","ConfirmInviteProfileDetails","code","useLazyQuery","fetchPolicy","pollInterval","onCompleted","load","loading","refetch","useProfileForInvite","loadingErrors","Input","readOnly","accountRoutes","useLoginWithPasswordCallback","isLoggingIn","loginErrors","hasSentConfirmationEmail","setHasSentConfirmationEmail","rememberMe","performLogin","CustomInput","label","checked","outline","claims","isNewUser","loginProvider","setData","useCompletedExternalLoginDetails","useCreateAccountForExternalLoginCallback","createAccount","isCreatingAccount","createAccountErrors","emailClaim","emailSent","setEmailSent","useSendPasswordResetEmailCallback","sendResetEmail","isSendingResetEmail","sendResetEmailErrors","hasResetPassword","setHasResetPassword","useResetPasswordCallback","isResettingPassword","resetPasswordErrors","emailConfirmed","setEmailConfirmed","useConfirmEmailCallback","confirmEmailErrors","useConfirmEmailChangeCallback","useConfirmInviteCallback","isConfirmingInvite","confirmInviteErrors","useUser","empty","Banner","PillsNavBar","justified","textColor","pills","ProfileNavigation","useProfile","isUserId","useSaveInStore","createDataStore","updateDataStore","create","isCreating","createErrors","update","isUpdating","updateErrors","isCreate","beforeSaving","afterSaving","save","isSaving","saveErrors","useCreateProfileCallback","useUpdateProfileCallback","useSaveProfileCallback","_create","createStatus","_update","updateStatus","profileRoutes","profileTabRoutes","hasSaved","setHasSaved","setIsCreate","sub","storeModel","refreshProfile","saveForm","refreshUserModel","newEmail","useChangeEmailCallback","isChangingPassword","changeEmailErrors","hasSentEmail","setHasSentEmail","hasChangedPassword","setHasChangedPassword","currentPassword","newPassword","useChangePasswordCallback","changePasswordErrors","useURLSearchParams","useLocation","useReplaceSearchParamsEffect","changesValue","set","delete","hash","useSearchParams","forEach","BaseValueType","homeRoutes","baseValueId","baseValue","CO2UnitConversion","TargetReturnRatios","AdministrationNavigation","SidebarRequired","data-sidebar-required","administrationRoutes","administrationSidebarRoutes","SearchInput","placeholder","onSearchButtonClick","InputGroup","onKeyPress","charCode","InputGroupAddon","addonType","NoResultsFound","StickyToolbar","isStuck","setIsStuck","topOffset","scrollableAncestor","onEnter","onLeave","TableRowButtons","CardsOrTable","viewMode","items","columns","buttons","tableHeadings","onItemClick","sm","lg","column","columnIndex","node","CardFooter","Table","responsive","striped","heading","itemIndex","onDoubleClick","persistKey","persistAtom","recoilPersist","preferredListViewModeState","effects_UNSTABLE","usePreferredListViewMode","useFetchMoreCallback","fetchMoreFromStore","currentEndOffset","merge","newResultLength","_hasMore","setHasMore","fetchMore","offset","updateQuery","previousQueryResult","fetchMoreResult","hasMore","UsersListBase","title","filterByRoleGroups","roleGroupColumnHidden","baseRoute","addText","searchParam","setSearch","startOffset","first","pageSize","prevResults","newResults","useUsersListViewBaseViewModel","allItems","useToggleStateArray","isMenuOpen","toggleMenuOpen","roleGroup","lowerSearch","toLocaleLowerCase","setViewMode","ButtonGroup","view","CardTitle","CardSubtitle","ButtonDropdown","caret","DeleteUserBase","useDeleteProfileCallback","remove","removeErrors","useLockoutCallback","lockoutErrors","archive","goBack","onRemoveFormSubmit","isRemoving","removeFormErrors","plaintext","useChangeUserRoleGroupCallback","resetCurrentUserRoles","useResetCurrentUserRolesCallback","CreateUserBase","EditUserBase","onCreateDefaultValues","defaultRoleGroup","filterRoleGroups","_isLoading","userModel","changeUserModel","roleGroupModel","changeRoleGroupModel","useInviteCallback","inviteErrors","useResendInviteEmailCallback","isResendingInviteEmail","resendInviteEmailErrors","hasResentInviteEmail","setHasResentInviteEmail","currentEmail","useChangeAccountEmailCallback","changeUserRoleGroupInStore","changeUserRoleGroupInStoreErrors","useProfileSupportingData","storeRoleGroups","roleGroups","isLoadingSupportingData","loadSupportingDataErrors","sendEmail","roleGroupId","navigateTo","saveFormErrors","administratorsRoutes","useCurrentUser","authenticationUserProfile","financialModelFieldsFragment","Dashboard","useFinancialModels","financialModels","currentUser","ListGroup","ListGroupItem","date","moment","updatedDate","dashboardRoutes","useFinancialModel","useCreateFinancialModelCallback","useUpdateFinancialModelCallback","useJsonObject","onJsonChanged","useMemo","parse","setValue","useCallback","newValue","valueToStore","Function","newJson","calculateInflationReducedFigure","year","baseAmount","indexationRate","Math","pow","calculateInflatedFigure","isYear0Based","FinancialModelCalculator","inputs","calculations","addCalculation","originatorsFee","_calculations","installedCostsEPC","estimatedOutput","_inputs","sizeOfArray","specificYield","epcPrice","installedCostsIncVat","totalCapex","endDate","startDate","add","ppaTerm","subtract","export","energyUsedOnSite","takeOrPay","epcCost","eVChargingCost","totalCapex2","businessRates","managementFee","refurbishmentFeeCalculation","refurbishmentFee","depreciationRate","depreciationYears","nonDegradationMultiplier","degradation","oAndMCalculation","oAndM","insuranceCalculation","insurance","depreciation","_fieldCalculations","updatedFields","initializeCalculations","snapshot","executeCalculations","changedFields","getChangedFields","field","depth","fieldCalculation","dependencies","dep","calcualtedValues","calculate","newlyUpdatedFields","changed","Object","keys","updatedField","deps","ISODateTimeInput","format","theValue","theFormat","valueMoment","isValid","onChangeWrapper","event","newValueMoment","utc","toISOString","newEvent","target","NumberInput","onFormat","_onFocus","onFocus","_onBlur","currencySymbol","useState","isFocused","setIsFocused","formattedValue","parseFloat","StyledSlider","marksStartPoint","marksEndPoint","marksStep","sliderMarks","marks","useIndex","formatNumber","isCurrency","isDecimals","isPence","isPercentage","isDecimals1","isDecimals5","isDecimals10","AssumptionsTab","inputsModel","isExcludeInflation","changeInputsModel","calculationsModel","targetReturnRatio","energySalesPrice","valueAsNumber","step","min","max","val","annualInflation","energyInflation","currentEnergyCost","ProposalsTab","co2Savings","yearsRequired","allYearCalculations","proposalYearsRequired","proposalTerm","rowsYears","newRowData","y","yearCalculations","newRow","systemYield","onSiteUse","totalGeneration","energyCosts","energyCost","energyCostsWithoutSolar","energyCostWithoutSolar","solarEnergyCost","energyCostsWithSolar","energyCostWithSolar","fieldbold_annualSavings","annualSavings","fieldbold_cO2Savings","PopulatedTableRow","yearIndex","fieldClass","c","thisFieldClassName","values","ClientFacingTab","inputsDefaults","fullProposalYearsRequired","defaultProposalYears","arraySizeToSqFtRatio","totalSavings","totalPounds","totalCo2","totalCostWithout","totalCostsWith","totalEbitda","yearCalculation","ebitda","onChangeIsExcludeInflation","isChecked","excludeInflation","rpi","proposalYears","src","alt","ModelTab","DisplayFormGroup","numericFieldValue","displayValue","fieldName","subLabel","isNumericForFormatting","InputFormGroup","exportTariff","oAndMManager","transmissionFee","landLease","insuranceandLCInflation","audit","managementFeeInflation","receivablesDays","payablesDays","debtInterestRate","debtTerm","taxFuture","taxNow","EmptyTableRows","rows","rowindex","colindex","FinancialsTab","headerColumnText","unitHeaderColumnText","columnsYears","newColumnData","newColumn","fieldcenter_startOfPeriod","fieldcenter_endOfPeriod","fieldcenter_financialYear","fieldcenter_ppaSwitch","headerline_revenue","totalExported","exportTarrif","ppaTariff","revenue","totalline_revenue","headerline_expenses","totalExpenses","totalline_ebitda","totalline_ebit","ebit","interestExpense","totalline_ebt","ebt","taxOutlay","totalline_netIncome","netIncome","emptyRowsToBeGenerated","fullFinancialYearColumns","columnDataFieldIndex","emptyRows","thisRowClassName","yearColumnsRequired","calculateForYear","energySalesPriceFromSnapshot","isYearWithinppaTerm","isYearUnderppaTerm","openingBalance","closingBalance","receivables","payables","workingCapital","ValuationTab","irrCalculations","valuation","newValuationColumnData","newWorkingCapitalColumnData","newDepreciationColumnData","newCalculationColumnData","previousYearCalculations","changeInWC","fcfPostTax","fcfPreTax","newValuationColumn","headerline_ebitda","headerline_taxes","headerline_capex","headerline_changeInWC","headerline_fcfPostTax","totalline_irrPostTax","headerline_fcfPreTax","totalline_irrPreTax","newWorkingCapitalColumn","newDepreciationColumn","fieldcenter_switch","newCalculationColumn","calculation_fcfPostTax","calculation_fcfPreTax","valuationColumnData","workingCapitalColumnData","depreciationColumnData","calculationColumnData","columnYearZero","postTaxIRR","preTaxIRR","tableName","checkFieldName","thisYearZero","calculateIRR","guess","irrResult","dates","rate","r","irrResultDeriv","frac","positive","negative","newRate","epsRate","resultValue","resultRate","iteration","contLoop","abs","baseValueFieldsFragment","Footer","rel","useCreateFinancialModelUnauthenticatedCallback","CreateFinancialModel","EditFinancialModel","paramUserId","loadRefresh","useEffect","useBaseValuesUnauthenticated","allBaseValues","_isBaseLoading","loadBaseErrors","now","versionNumber","inputsJson","calculationsJson","baseValuesJson","createdDate","financialModelDefaultValues","useSaveFinancialModelUnauthenticatedCallback","saveUnauthenticated","saveUnauthenticatedErrors","useSaveFinancialModelCallback","_setInputsModel","setCalculationsModel","baseValues","newBaseValues","valuesJson","baseValuesModel","ratio","thisRatio","thisPriceRequired","scope2","scope3","newYearsArray","preTaxIRRFigures","postTaxIRRFigures","changeInWorkingCapital","performCalculations","fields","newValues","recalculate","scheduledCalculationFields","setScheduledCalculationFields","performCalculationsDebounced","useDebouncedCallback","scheduleCalculations","activeTab","setActiveTab","active","financialModelRoutes","profiles","useFinancialModelsListViewModel","formatDate","formatUser","useDeleteFinancialModelCallback","registeredUsersRoutes","startRoutes","fontSize","useCreateBaseValueCallback","useUpdateBaseValueCallback","CO2UnitConversionNode","valuesModel","changeValuesModel","TargetReturnRatiosNode","targetRatio1","ppaPriceRequired1","targetRatio2","ppaPriceRequired2","targetRatio3","ppaPriceRequired3","targetRatio4","ppaPriceRequired4","targetRatio5","ppaPriceRequired5","targetRatio6","ppaPriceRequired6","targetRatio7","ppaPriceRequired7","targetRatio8","ppaPriceRequired8","targetRatio9","ppaPriceRequired9","targetRatio10","ppaPriceRequired10","targetRatio11","ppaPriceRequired11","targetRatio12","ppaPriceRequired12","targetRatio13","ppaPriceRequired13","targetRatio14","ppaPriceRequired14","targetRatio15","ppaPriceRequired15","targetRatio16","ppaPriceRequired16","targetRatio17","ppaPriceRequired17","targetRatio18","ppaPriceRequired18","targetRatio19","ppaPriceRequired19","targetRatio20","ppaPriceRequired20","targetRatio21","ppaPriceRequired21","targetRatio22","ppaPriceRequired22","targetRatio23","ppaPriceRequired23","targetRatio24","ppaPriceRequired24","targetRatio25","ppaPriceRequired25","targetRatio26","ppaPriceRequired26","targetRatio27","ppaPriceRequired27","targetRatio28","ppaPriceRequired28","targetRatio29","ppaPriceRequired29","targetRatio30","ppaPriceRequired30","EditBaseValue","useBaseValue","baseValueName","requestedBaseValueId","baseValueTypeFromId","defaultJsonValues","defaultValues","baseValueDefaultValues","useSaveBaseValueCallback","_setValuesModel","baseValueRoutes","appRoutes","sidebarRoutes","Sidebar","Layout","fallback","configureIcons","library","faBook","faBuilding","faBus","faCalculator","faCarCrash","faCaretUp","faCaretDown","faCaretLeft","faCaretRight","faChalkboardTeacher","faCheck","faCheckCircle","faChevronLeft","faChevronRight","faClipboardCheck","faClone","faCloudDownloadAlt","faCode","faCogs","faCommentDots","faCopy","faCreditCard","faCross","faDesktop","faDownload","faEdit","faExclamationCircle","faExclamationTriangle","faEye","faEyeSlash","faFileAlt","faFlagCheckered","faFolderMinus","faGraduationCap","faHistory","faHome","faIdCardAlt","faInfo","faLink","faLock","faMeh","faMinus","faPersonBooth","faPhotoVideo","faPlay","faPlayCircle","faPlus","faPoundSign","faProjectDiagram","faRuler","faSave","faSchool","faSearch","faShippingFast","faSolarPanel","faSpinner","faStop","faStopwatch","faSync","faTachometerAlt","faTag","faTags","faTerminal","faThLarge","faThList","faThumbsDown","faThumbsUp","faTicketAlt","faTimes","faTimesCircle","faTrash","faTrashAlt","faTrashRestore","faUndo","faUpload","faUser","faUserCheck","faUserClock","faUsersCog","faUserGraduate","faUserTag","faUsers","faUserShield","faVideo","faVoteYea","faWindowRestore","farCalendarAlt","farCalendarTimes","farCircle","farClock","farFrown","farFrownOpen","farListAlt","farSmile","faPhone","faEnvelope","cache","InMemoryCache","apolloCachePersistor","CachePersistor","storage","localStorage","restore","link","HttpLink","uri","apolloClient","ApolloClient","availableLanguages","flagCountryCode","momentLocale","numeralLocale","localeResources","en","translation","serviceProvider","ServiceProvider","builder","singleton","apiFetch","removeItem","purgeRecoilPersist","purge","use","LanguageDetector","initReactI18next","init","fallbackLng","resources","interpolation","escapeValue","Date","isMoment","Number","isNumber","numeral","on","languageCode","thisLanguage","indexOfDash","shortCode","substring","findLanguage","locale","shouldHandle","graphQLErrors","i18next","externalProviderError","subStr","App","I18nextProvider","Provider","ApolloProvider","client","defaultTitle","titleTemplate","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","then","registration","onupdatefound","installingWorker","installing","onstatechange","controller","catch","reportWebVitals","onPerfEntry","getCLS","getFID","getFCP","getLCP","getTTFB","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","basename","URL","process","addEventListener","headers","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.48f0be5d.chunk.js","sourcesContent":["export const apiAuthorizationConfig = {\r\n endpoint: '/',\r\n applicationName: 'FinancialModelling',\r\n};","import { UserManager, WebStorageStateStore, User, Profile } from 'oidc-client';\r\nimport { apiAuthorizationConfig } from '../../configure/apiAuthorizationConfig';\r\n\r\nexport interface AuthenticationResult {\r\n status: string,\r\n message?: string,\r\n state?: any,\r\n}\r\n\r\nexport class AuthorizeService {\r\n // By default pop ups are disabled because they don't work properly on Edge.\r\n // If you want to enable pop up authentication simply set this flag to false.\r\n _popUpDisabled = true;\r\n\r\n _callbacks: Array<{ callback: () => void, subscription: number }>;\r\n _nextSubscriptionId: number;\r\n _user: User | null;\r\n _isAuthenticated: boolean = false;\r\n _userManager: UserManager | undefined;\r\n\r\n\r\n\r\n constructor() {\r\n this._callbacks = [];\r\n this._nextSubscriptionId = 0;\r\n this._user = null;\r\n this._isAuthenticated = false;\r\n this._userManager = undefined;\r\n }\r\n\r\n async isAuthenticated(): Promise {\r\n const user = await this.getUser();\r\n return !!user;\r\n }\r\n\r\n async getUser(): Promise {\r\n let user = this._user;\r\n\r\n if (user && user.profile) {\r\n return user.profile;\r\n }\r\n\r\n const userManager = await this.ensureUserManagerInitialized();\r\n user = await userManager.getUser();\r\n return user?.profile ?? null;\r\n }\r\n\r\n async getAccessToken(): Promise {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n const user = await userManager.getUser();\r\n return user?.access_token ?? null;\r\n }\r\n\r\n // We try to authenticate the user in three different ways:\r\n // 1) We try to see if we can authenticate the user silently. This happens\r\n // when the user is already logged in on the IdP and is done using a hidden iframe\r\n // on the client.\r\n // 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n // redirect flow.\r\n async signIn(state: any): Promise {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n try {\r\n const silentUser = await userManager.signinSilent(this.createArguments());\r\n this.updateState(silentUser);\r\n return this.success(state);\r\n } catch (silentError) {\r\n // User might not be authenticated, fallback to popup authentication\r\n console.log(\"Silent authentication error: \", silentError);\r\n\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n const popUpUser = await userManager.signinPopup(this.createArguments());\r\n this.updateState(popUpUser);\r\n return this.success(state);\r\n } catch (popUpError: any) {\r\n if (popUpError.message === \"Popup window closed\") {\r\n // The user explicitly cancelled the login action by closing an opened popup.\r\n return this.error(\"The user closed the window.\");\r\n } else if (!this._popUpDisabled) {\r\n console.log(\"Popup authentication error: \", popUpError);\r\n }\r\n\r\n // PopUps might be blocked by the user, fallback to redirect\r\n try {\r\n await userManager.signinRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectError: any) {\r\n console.log(\"Redirect authentication error: \", redirectError);\r\n return this.error(redirectError);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async completeSignIn(url: string): Promise {\r\n try {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n const user = await userManager.signinCallback(url);\r\n this.updateState(user);\r\n return this.success(user && user.state);\r\n } catch (error) {\r\n console.log('There was an error signing in: ', error);\r\n return this.error('There was an error signing in.');\r\n }\r\n }\r\n\r\n // We try to sign out the user in two different ways:\r\n // 1) We try to do a sign-out using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 2) If the method above fails, we redirect the browser to the IdP to perform a traditional\r\n // post logout redirect flow.\r\n async signOut(state: any) {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error('Popup disabled. Change \\'AuthorizeService.ts:AuthorizeService._popupDisabled\\' to false to enable it.')\r\n }\r\n\r\n await userManager.signoutPopup(this.createArguments());\r\n this.updateState(null);\r\n return this.success(state);\r\n } catch (popupSignOutError) {\r\n console.log(\"Popup signout error: \", popupSignOutError);\r\n try {\r\n await userManager.signoutRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectSignOutError: any) {\r\n console.log(\"Redirect signout error: \", redirectSignOutError);\r\n return this.error(redirectSignOutError);\r\n }\r\n }\r\n }\r\n\r\n async completeSignOut(url: string) {\r\n const userManager = await this.ensureUserManagerInitialized();\r\n try {\r\n const response = await userManager.signoutCallback(url);\r\n this.updateState(null);\r\n return this.success(response && response.state);\r\n } catch (error: any) {\r\n console.log(`There was an error trying to log out '${error}'.`);\r\n return this.error(error);\r\n }\r\n }\r\n\r\n updateState(user: User | null) {\r\n this._user = user;\r\n this._isAuthenticated = !!this._user;\r\n this.notifySubscribers();\r\n }\r\n\r\n subscribe(callback: () => void): number {\r\n this._callbacks.push({ callback, subscription: this._nextSubscriptionId++ });\r\n return this._nextSubscriptionId - 1;\r\n }\r\n\r\n unsubscribe(subscriptionId: number) {\r\n const subscriptionIndex = this._callbacks\r\n .map((element, index) => element.subscription === subscriptionId ? { found: true, index } : { found: false })\r\n .filter(element => element.found === true);\r\n if (subscriptionIndex.length === 1) {\r\n this._callbacks = this._callbacks.splice(subscriptionIndex[0].index as number, 1);\r\n } else {\r\n //throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\r\n }\r\n }\r\n\r\n notifySubscribers() {\r\n for (let i = 0; i < this._callbacks.length; i++) {\r\n const callback = this._callbacks[i].callback;\r\n callback();\r\n }\r\n }\r\n\r\n createArguments(state?: any) {\r\n return { useReplaceToNavigate: true, data: state };\r\n }\r\n\r\n error(message: string) : AuthenticationResult {\r\n return { status: AuthenticationResultStatus.Fail, message };\r\n }\r\n\r\n success(state: any): AuthenticationResult {\r\n return { status: AuthenticationResultStatus.Success, state };\r\n }\r\n\r\n redirect(): AuthenticationResult {\r\n return { status: AuthenticationResultStatus.Redirect };\r\n }\r\n\r\n async ensureUserManagerInitialized(): Promise {\r\n if (this._userManager !== undefined) {\r\n return this._userManager;\r\n }\r\n\r\n let response = await fetch(`${apiAuthorizationConfig.endpoint}_configuration/${apiAuthorizationConfig.applicationName}`);\r\n if (!response.ok) {\r\n throw new Error(`Could not load settings for '${apiAuthorizationConfig.applicationName}'`);\r\n }\r\n\r\n let settings = await response.json();\r\n settings.automaticSilentRenew = true;\r\n settings.includeIdTokenInSilentRenew = true;\r\n settings.userStore = new WebStorageStateStore({\r\n prefix: apiAuthorizationConfig.applicationName\r\n });\r\n\r\n this._userManager = new UserManager(settings);\r\n\r\n this._userManager.events.addUserSignedOut(async () => {\r\n await (this._userManager as UserManager).removeUser();\r\n this.updateState(null);\r\n });\r\n\r\n return this._userManager;\r\n }\r\n\r\n static get instance() { return authService }\r\n}\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n\r\nexport const AuthenticationResultStatus = {\r\n Redirect: 'redirect',\r\n Success: 'success',\r\n Fail: 'fail'\r\n};\r\n","import authService, { AuthorizeService } from './AuthorizeService';\r\n\r\n/**\r\n * Hook to return the authentication service.\r\n */\r\nexport function useAuthorizeService(): AuthorizeService {\r\n return authService;\r\n}\r\n","import * as React from 'react';\r\nimport { useAuthorizeService } from './useAuthorizeService';\r\nimport { Profile } from 'oidc-client';\r\n\r\nexport interface UseAuthenticationStateOptions {\r\n /**\r\n * By default we don't load the user details as they are often unused and require extra loading. When this is set to true we'll load the user record and return it as well.\r\n */\r\n includeUser?: boolean,\r\n}\r\n\r\n/**\r\n * Hook to return the authenticated state of the user. The hook subscribes to authenticate changes by authService and will update the state in components whenever that changes.\r\n * @param onStateChanged\r\n */\r\nexport function useAuthenticatedState(options: UseAuthenticationStateOptions = {}): { isAuthenticated: boolean | null, user: Profile | null } {\r\n const authService = useAuthorizeService();\r\n const [isAuthenticated, setIsAuthenticated] = React.useState(null);\r\n const [user, setUser] = React.useState(null);\r\n\r\n const stateChanged = React.useCallback(async () => {\r\n const authenticated = await authService.isAuthenticated();\r\n\r\n let userResult: Profile | null = null;\r\n if (options.includeUser) {\r\n userResult = await authService.getUser();\r\n setUser(userResult);\r\n }\r\n\r\n setIsAuthenticated(authenticated);\r\n }, [authService, options.includeUser]);\r\n\r\n // Subscribe to changes to the authService state.\r\n React.useEffect(() => {\r\n const subscription = authService.subscribe(() => { stateChanged(); });\r\n stateChanged();\r\n return () => { authService.unsubscribe(subscription); };\r\n }, [authService, stateChanged]);\r\n\r\n return { isAuthenticated: isAuthenticated, user: user };\r\n}\r\n","import './userNav.scss';\r\n\r\nimport * as React from 'react';\r\nimport { DropdownToggle, DropdownMenu, DropdownItem, Dropdown, NavItem, Button } from 'reactstrap';\r\nimport Avatar from 'react-avatar';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { useAuthenticatedState } from '../../api/api-authorization/useAuthenticatedState';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useToggleState } from 'use-toggle-state';\r\n\r\n/**\r\n * Navbar area that is for the current user. \r\n */\r\nexport const UserNav = () => {\r\n const { isAuthenticated, user } = useAuthenticatedState({ includeUser: true });\r\n const [dropdownOpen, toggleDropdown] = useToggleState();\r\n\r\n const { t } = useTranslation();\r\n\r\n // Render the UI\r\n //\r\n\r\n // If the user is not logged in, then give them the login and register options.\r\n if (!isAuthenticated) {\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 // User is logged in so show their options.\r\n return (\r\n toggleDropdown()} nav>\r\n \r\n \r\n \r\n {user?.name ?? ''}\r\n \r\n \r\n \r\n {t('userNav.account', 'Account')}\r\n \r\n \r\n \r\n <> {t('userNav.profile', 'Profile')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n <> {t('userNav.signOut', 'Sign out')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { ApiFetch } from \"apifetch-json\";\r\n\r\n/**\r\n * Class that provides a service for managing an account on the server.\r\n * \r\n * NOTE: not to be confused with AuthoriazationService which manages the authorised state of the current user.\r\n * \r\n * The login() and logout() method here are usually invoked through components used by AuthorizationService's routing to share the authorisation state with the server.\r\n */\r\nexport class AccountService {\r\n api: ApiFetch;\r\n\r\n constructor(api?: ApiFetch) {\r\n this.api = api ?? new ApiFetch();\r\n }\r\n\r\n /**\r\n * Attempt to login to the account with an email and password.\r\n */\r\n loginWithPassword = async (request: LoginWithPasswordRequest, returnUrl: string = ''): Promise => {\r\n const result = await this.api.post(\r\n `/api/account/login?returnUrl=${encodeURIComponent(returnUrl ?? '')}`,\r\n request,\r\n {\r\n credentials: 'include',\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Register the user with a new password based account.\r\n */\r\n register = async (request: RegisterRequest, returnUrl: string = ''): Promise => {\r\n const result = await this.api.post(\r\n `/api/account/register?returnUrl=${encodeURIComponent(returnUrl || defaultRegisterReturnUrl)}`,\r\n request,\r\n {\r\n credentials: 'include'\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a list of all external authentication schemes registered for use with accounts on this server.\r\n */\r\n getExternalAuthenticationSchemes = async (): Promise> => {\r\n const result = await this.api.get>('/api/account/getExternalAuthenticationSchemes');\r\n return result;\r\n }\r\n\r\n /**\r\n * Start the process of logging in with an external provider.\r\n */\r\n startExternalLogin = (provider: string, returnUrl: string = '') => {\r\n // We want to post the whole page to the action as it needs to return a redirect. To acheive this we create and post a form.\r\n let form = document.createElement('form');\r\n form.action = `/api/account/startExternalLogin?provider=${encodeURIComponent(provider)}&returnUrl=${encodeURIComponent(returnUrl ?? '')}`;\r\n form.method = 'post';\r\n document.body.append(form);\r\n form.submit();\r\n }\r\n\r\n /**\r\n * Complete the external login process.\r\n */\r\n completeExternalLogin = async (returnUrl: string = '', remoteError: string = '') => {\r\n const result = await this.api.get(`/api/account/completeExternalLogin?returnUrl=${encodeURIComponent(returnUrl ?? '')}&remoteError=${encodeURIComponent(remoteError ?? '')}`);\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an account linked to the current external login with the additional details passed in.\r\n */\r\n createAccountForExternalLogin = async (model: CreateExternalLoginAccountDetails, returnUrl: string = ''): Promise => {\r\n const result = await this.api.post(\r\n `/api/account/createAccountForExternalLogin?returnUrl=${encodeURIComponent(returnUrl ?? '')}`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Send a password reset email.\r\n */\r\n sendPasswordResetEmail = async (email: string) => {\r\n const result = await this.api.post(`/api/account/sendPasswordResetEmail`, { email: email });\r\n return result;\r\n }\r\n\r\n /**\r\n * Reset password (using an emailed code as varification).\r\n */\r\n resetPassword = async (model: ResetPasswordRequest) => {\r\n const result = await this.api.post(`/api/account/resetPassword`, model);\r\n return result;\r\n }\r\n\r\n /**\r\n * Confirm email (using an emailed code as varification).\r\n */\r\n confirmEmail = async (model: ConfirmEmailRequest) => {\r\n const result = await this.api.post(`/api/account/confirmEmail`, model);\r\n return result;\r\n }\r\n\r\n /**\r\n * Confirm email change (using an emailed code as varification).\r\n */\r\n confirmEmailChange = async (model: ConfirmEmailChangeRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/confirmEmailChange`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the IdentityRoles names of the current user.\r\n */\r\n currentUserRoles = async (): Promise => {\r\n const result = await this.api.get(\r\n '/api/account/currentUserRoles',\r\n {\r\n credentials: 'include'\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Change password of the logged in user.\r\n */\r\n changePassword = async (model: ChangePasswordRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/changePassword`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Change email of the logged in user.\r\n */\r\n changeEmail = async (model: ChangeEmailRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/changeEmail`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Resent the email verification email.\r\n */\r\n resendConfirmEmail = async (email: string) => {\r\n const result = await this.api.post(\r\n `/api/account/resendConfirmEmail`,\r\n { email: email }\r\n );\r\n return result;\r\n }\r\n\r\n\r\n /**\r\n * Change email of the logged in user.\r\n */\r\n invite = async (model: InviteRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/invite`,\r\n model,\r\n {\r\n credentials: 'include'\r\n }\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Resent the invite email.\r\n */\r\n resendInviteEmail = async (email: string) => {\r\n const result = await this.api.post(\r\n `/api/account/resendInviteEmail`,\r\n { email: email }\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Confirm an invite and set a password (will also perform a login).\r\n */\r\n confirmInvite = async (model: ConfirmInviteRequest, returnUrl: string = '') => {\r\n const result = await this.api.post(\r\n `/api/account/confirmInvite?returnUrl=${encodeURIComponent(returnUrl || defaultRegisterReturnUrl)}`,\r\n model\r\n );\r\n return result;\r\n }\r\n\r\n /**\r\n * Change email of another user (as an administrator)\r\n */\r\n changeAccountEmail = async (model: ChangeAccountEmailRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/changeAccountEmail`,\r\n model,\r\n {\r\n credentials: 'include'\r\n });\r\n return result;\r\n }\r\n\r\n /**\r\n * Lockout a user.\r\n */\r\n lockout = async (model: LockoutRequest) => {\r\n const result = await this.api.post(\r\n `/api/account/lockout`,\r\n model,\r\n {\r\n credentials: 'include'\r\n }\r\n );\r\n return result;\r\n }\r\n}\r\n\r\nconst defaultRegisterReturnUrl = `/authentication/login?returnUrl=${encodeURIComponent(window.origin + '/')}`;\r\n\r\nexport interface LoginWithPasswordRequest\r\n{\r\n email: string,\r\n password: string,\r\n rememberMe: boolean,\r\n}\r\n\r\nexport interface LoginResult {\r\n succeeded: boolean,\r\n requiresTwoFactor: boolean,\r\n requiresEmailConfirmation: boolean,\r\n returnUrl: string\r\n}\r\n\r\nexport interface RegisterResult extends LoginResult {\r\n userId: string,\r\n}\r\n\r\nexport interface ExternalAuthenticationScheme {\r\n name: string,\r\n displayName: string\r\n}\r\n\r\nexport interface Claim {\r\n type: string,\r\n properties: { [id: string]: string },\r\n originalIssuer: string,\r\n issuer: string,\r\n valueType: string,\r\n value: string,\r\n}\r\n\r\nexport interface CompleteExternalLoginResult {\r\n isNewUser: boolean,\r\n returnUrl: string,\r\n loginProvider: string,\r\n claims: Array,\r\n}\r\n\r\nexport interface CreateExternalLoginAccountDetails {\r\n email: string\r\n}\r\n\r\nexport interface RegisterRequest {\r\n email: string,\r\n password: string,\r\n}\r\n\r\nexport interface ResetPasswordRequest {\r\n userId: string,\r\n code: string,\r\n password: string,\r\n}\r\n\r\nexport interface ConfirmEmailRequest {\r\n userId: string,\r\n code: string,\r\n}\r\n\r\nexport interface CurrentUserRolesResult {\r\n userId: string,\r\n roles: Array,\r\n}\r\n\r\nexport interface ChangePasswordRequest {\r\n currentPassword: string,\r\n newPassword: string,\r\n}\r\n\r\nexport interface ChangeEmailRequest {\r\n newEmail: string,\r\n}\r\n\r\nexport interface ConfirmEmailChangeRequest {\r\n userId: string,\r\n code: string,\r\n email: string,\r\n}\r\n\r\nexport interface InviteRequest {\r\n email: string,\r\n sendEmail: boolean,\r\n}\r\n\r\nexport interface InviteResult {\r\n userId: string,\r\n}\r\n\r\n\r\nexport interface ChangeAccountEmailRequest {\r\n currentEmail: string,\r\n newEmail: string,\r\n}\r\n\r\nexport interface ConfirmInviteRequest {\r\n userId: string,\r\n code: string,\r\n password: string,\r\n}\r\n\r\nexport interface LockoutRequest {\r\n email: string,\r\n endDate?: string,\r\n archive?: boolean,\r\n}\r\n","/**\r\n * URIs of common claim types. \r\n */\r\nexport const ClaimTypes = {\r\n /**\r\n * The URI for a claim that specifies the actor.\r\n */\r\n actor: 'http://schemas.xmlsoap.org/ws/2009/09/identity/claims/actor',\r\n /**\r\n * The URI for a claim that specifies the postal code of an entity.\r\n */\r\n postalCode: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode',\r\n /**\r\n * The URI for a claim that specifies an RSA key.\r\n */\r\n rsa: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa',\r\n /**\r\n * The URI for a claim that specifies a security identifier (SID).\r\n */\r\n sid: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid',\r\n /**\r\n * The URI for a claim that specifies a service principal name (SPN) claim.\r\n */\r\n spn: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/spn',\r\n /**\r\n * The URI for a claim that specifies the state or province in which an entity resides.\r\n */\r\n stateOrProvince: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince',\r\n /**\r\n * The URI for a claim that specifies the street address of an entity.\r\n */\r\n streetAddress: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress',\r\n /**\r\n * The URI for a claim that specifies the surname of an entity.\r\n */\r\n surname: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname',\r\n /**\r\n * The URI for a claim that identifies the system entity.\r\n */\r\n system: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/system',\r\n /**\r\n * The URI for a claim that specifies a thumbprint. A thumbprint is a globally unique SHA-1 hash of an X.509 certificate.\r\n */\r\n thumbprint: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/thumbprint',\r\n /**\r\n * The URI for a claim that specifies a user principal name (UPN).\r\n */\r\n upn: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn',\r\n /**\r\n * The URI for a claim that specifies a URI.\r\n */\r\n uri: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/uri',\r\n /**\r\n * The URI for a claim that specifies the webpage of an entity.\r\n */\r\n webpage: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage',\r\n /**\r\n * The URI for a claim that specifies the alternative phone number of an entity.\r\n */\r\n otherPhone: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone',\r\n /**\r\n * The URI for a claim that specifies the name of an entity.\r\n */\r\n nameIdentifier: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier',\r\n /**\r\n * The URI for a claim that specifies the name of an entity.\r\n */\r\n name: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name',\r\n /**\r\n * The URI for a claim that specifies the mobile phone number of an entity.\r\n */\r\n mobilePhone: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone',\r\n /**\r\n * The URI for a claim that specifies the anonymous user.\r\n */\r\n anonymous: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/anonymous',\r\n /**\r\n * The URI for a claim that specifies details about whether an identity is authenticated.\r\n */\r\n authentication: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authentication',\r\n /**\r\n * The URI for a claim that specifies an authorization decision on an entity.\r\n */\r\n authorizationDecision: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authorizationdecision',\r\n /**\r\n * The URI for a claim that specifies the country/region in which an entity resides,\r\n */\r\n country: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country',\r\n /**\r\n * The URI for a claim that specifies the date of birth of an entity.\r\n */\r\n dateOfBirth: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth',\r\n /**\r\n * The URI for a claim that specifies a deny-only security identifier (SID) for\r\n * an entity. A deny-only SID denies the specified entity to a securable object.\r\n */\r\n denyOnlySid: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid',\r\n /**\r\n * The URI for a claim that specifies the email address of an entity.\r\n */\r\n email: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress',\r\n /**\r\n * The URI for a claim that specifies the gender of an entity.\r\n */\r\n gender: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender', \r\n /**\r\n * The URI for a claim that specifies the given name of an entity.\r\n */\r\n givenName: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname',\r\n /**\r\n * The URI for a claim that specifies a hash value.\r\n */\r\n hash: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/hash',\r\n /**\r\n * The URI for a claim that specifies the home phone number of an entity.\r\n */\r\n homePhone: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone',\r\n /**\r\n * The URI for a claim that specifies the locale in which an entity resides.\r\n */\r\n locality: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality',\r\n /**\r\n * The URI for a claim that specifies the DNS name associated with the computer\r\n * name or with the alternative name of either the subject or issuer of an X.509\r\n * certificate.\r\n */\r\n dns: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dns',\r\n /**\r\n * The URI for an X.500 distinguished name claim, such as the subject of an X.509\r\n * Public Key Certificate or an entry identifier in a directory services Directory\r\n * Information Tree.\r\n */\r\n x500DistinguishedName: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/x500distinguishedname',\r\n}\r\n\r\n/**\r\n * URIs of common Microsoft specific claim types. \r\n */\r\nexport const MicrosoftClaimTypes = {\r\n /**\r\n * The URI for a claim that specifies the primary group SID of an entity.\r\n */\r\n primaryGroupSid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid',\r\n /**\r\n * The URI for a claim that specifies the primary SID of an entity.\r\n */\r\n primarySid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid',\r\n /**\r\n * The URI for a claim that specifies the role of an entity.\r\n */\r\n role: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/role',\r\n /**\r\n * The URI for a claim that specifies a serial number.\r\n */\r\n serialNumber: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/serialnumber',\r\n /**\r\n * The URI for a claim that specifies the user data.\r\n */\r\n userData: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata',\r\n /**\r\n * The URI for a claim that specifies the version.\r\n */\r\n version: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/version',\r\n /**\r\n * The URI for a claim that specifies the Windows domain account name of an entity.\r\n */\r\n windowsAccountName: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname',\r\n /**\r\n * The URI for a claim that specifies the Windows device.\r\n */\r\n windowsDeviceClaim: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdeviceclaim',\r\n /**\r\n * The URI for a claim that specifies the Windows group SID of the device.\r\n */\r\n windowsDeviceGroup: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup',\r\n /**\r\n * \r\n */\r\n windowsFqbnVersion: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsfqbnversion',\r\n /**\r\n * \r\n */\r\n windowsSubAuthority: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowssubauthority',\r\n /**\r\n * The URI for a claim that specifies the instant at which an entity was authenticated,\r\n */\r\n authenticationInstant: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant',\r\n /**\r\n * The URI for a claim that specifies the method with which an entity was authenticated,\r\n */\r\n authenticationMethod: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod',\r\n /**\r\n * The URI for a claim that specifies the cookie path.\r\n */\r\n cookiePath: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/cookiepath',\r\n /**\r\n * The URI for a claim that specifies the deny-only primary group SID on an entity,\r\n * A deny-only SID denies the specified entity to a securable object.\r\n */\r\n denyOnlyPrimaryGroupSid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarygroupsid',\r\n /**\r\n * The URI for a claim that specifies the deny-only primary SID on an entity.\r\n * A deny-only SID denies the specified entity to a securable object.\r\n */\r\n denyOnlyPrimarySid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarysid',\r\n /**\r\n * \r\n */\r\n windowsUserClaim: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsuserclaim',\r\n /**\r\n * The URI for a claim that specifies the Windows deny-only group SID of the device,\r\n */\r\n denyOnlyWindowsDeviceGroup: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlywindowsdevicegroup',\r\n /**\r\n */\r\n dsa: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/dsa',\r\n /**\r\n * \r\n */\r\n expiration: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration',\r\n /**\r\n * \r\n */\r\n expired: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/expired',\r\n /**\r\n * The URI for a claim that specifies the SID for the group of an entity.\r\n */\r\n groupSid: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid',\r\n /**\r\n * \r\n */\r\n isPersistent: 'http://schemas.microsoft.com/ws/2008/06/identity/claims/ispersistent',\r\n}\r\n","import { AccountService } from \"./AccountService\";\r\nimport { useServices } from \"inject-typesafe-react\";\r\nimport { AppServices } from \"../../configure/configureServices\";\r\n\r\n/**\r\n * Hook to return the AccountService from the context (via useService).\r\n */\r\nexport function useAccountService(): AccountService {\r\n return useServices((services: AppServices) => services.accountService());\r\n}\r\n","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\n\r\nexport interface CurrentUserRolesCache {\r\n isLoading: boolean,\r\n isAuthenticated: boolean,\r\n roles: Array,\r\n}\r\n\r\nexport const currentUserRolesCacheState = atom({\r\n key: 'currentUserRolesCacheState',\r\n default: { isAuthenticated: false, roles: [], isLoading: false },\r\n //effects_UNSTABLE: [persistAtom],\r\n});\r\n\r\n/**\r\n * Hook that provides access to the Global search text from the global search text state while abstracting the global stage provider from the calling code.\r\n */\r\nexport function useCurrentUserRolesCache(): [CurrentUserRolesCache, React.Dispatch>] {\r\n const [value, setValue] = useRecoilState(currentUserRolesCacheState);\r\n return [value, setValue];\r\n}","import * as React from \"react\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\nimport { useAuthenticatedState } from \"../../api/api-authorization/useAuthenticatedState\";\r\nimport { isNullOrUndefined } from \"util\";\r\nimport { AccountService } from \"./AccountService\";\r\nimport { CurrentUserRolesCache, useCurrentUserRolesCache } from \"../../globalState/currentUserDetails/useCurrentUserRolesCache\";\r\n\r\n\r\n/**\r\n * Refresh the current user state using the accountService.\r\n * @param isAuthenticated\r\n */\r\nconst refreshCurrentUserRoles = async (isAuthenticated: boolean | null, accountService: AccountService, setRoles: (value: React.SetStateAction) => void): Promise => {\r\n // Do nothing if we don't know our authentication state.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return;\r\n }\r\n\r\n // If we are not authenticated then we have no roles.\r\n if (!isAuthenticated) {\r\n setRoles({ isAuthenticated: false, roles: [], isLoading: false });\r\n return;\r\n }\r\n\r\n // Otherwise we are authenticated, so load our roles.\r\n setRoles(prevState => ({ ...prevState, isLoading: true }));\r\n let result = await accountService.currentUserRoles();\r\n setRoles({ isAuthenticated: true, roles: result.roles, isLoading: false });\r\n};\r\n\r\n/**\r\n * Returns the list of roles for the current user.\r\n */\r\nexport function useCurrentUserRoles(options: AsyncLoadOptions = {}): AsyncLoadResult<{ roles: Array | null }> {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const [roles, setRoles] = useCurrentUserRolesCache();\r\n const accountService = useAccountService();\r\n\r\n const [refresh, { isExecuting: isLoading, errors }] = useAsyncCallback(async () => {\r\n // Don't trigger more than one attempt at loading the roles at once.\r\n if (roles.isLoading) {\r\n return;\r\n }\r\n\r\n await refreshCurrentUserRoles(isAuthenticated, accountService, setRoles);\r\n }, [accountService, isAuthenticated, setRoles, roles]);\r\n\r\n React.useEffect(() => {\r\n if (options.lazy) {\r\n return;\r\n }\r\n\r\n // Refresh from the store if we need to.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return;\r\n }\r\n\r\n if (!roles || roles.isAuthenticated !== isAuthenticated) {\r\n refresh();\r\n }\r\n }, [refresh, options.lazy, isAuthenticated, roles]);\r\n\r\n // TODO handle options.pollInterval.\r\n\r\n return {\r\n data: { roles: roles?.roles ?? null },\r\n refresh: refresh,\r\n isLoading: isLoading,\r\n errors: errors\r\n };\r\n}\r\n\r\n\r\n/**\r\n * Clear the cached user roles.\r\n */\r\nexport function useResetCurrentUserRolesCallback() {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const [/*roles*/, setRoles] = useCurrentUserRolesCache();\r\n const accountService = useAccountService();\r\n\r\n const [refresh] = useAsyncCallback(async () => {\r\n await refreshCurrentUserRoles(isAuthenticated, accountService, setRoles);\r\n }, [accountService, isAuthenticated]);\r\n\r\n return React.useCallback(() => {\r\n refresh();\r\n }, [refresh]);\r\n}\r\n","import * as React from \"react\";\r\nimport { ExternalAuthenticationScheme } from \"./AccountService\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Use the store to return a list of external authentication schemes for the app.\r\n */\r\nexport function useExternalAuthenticationSchemes(options: AsyncLoadOptions = {}): AsyncLoadResult<{ externalAuthenticationSchemes: Array }> {\r\n const [externalAuthenticationSchemes, setExternalAuthenticationSchemes] = React.useState>([]);\r\n\r\n const accountService = useAccountService();\r\n\r\n const [refresh, { isExecuting: isLoading, errors }] = useAsyncCallback(async () => {\r\n let result = await accountService.getExternalAuthenticationSchemes();\r\n setExternalAuthenticationSchemes(result);\r\n }, [accountService, setExternalAuthenticationSchemes]);\r\n\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n refresh();\r\n }\r\n }, [refresh, options.lazy]);\r\n\r\n // TODO handle options.pollInterval.\r\n\r\n return {\r\n data: { externalAuthenticationSchemes: externalAuthenticationSchemes },\r\n refresh: refresh,\r\n isLoading: isLoading,\r\n errors: errors\r\n };\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to resend the email confirmation email.\r\n */\r\nexport function useResendConfirmationEmailCallback(): [(email: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (email: string) => {\r\n return await accountService.resendConfirmEmail(email);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Start the external login process for a provider.\r\n */\r\nexport function useStartExternalLoginCallback(): [(provider: string, returnUrl?: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (provider: string, returnUrl?: string): Promise => {\r\n accountService.startExternalLogin(provider, returnUrl);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from 'react';\r\nimport { isNullOrUndefined } from 'util';\r\nimport { useAuthenticatedState } from '../../api/api-authorization/useAuthenticatedState';\r\nimport { useCurrentUserRoles } from '../../api/account';\r\n\r\nexport interface AuthorizeContainerProps {\r\n requireRole?: string | Array,\r\n /**\r\n * When set to true, the containers children will only show if authorization fails.\r\n */\r\n showIfNotAuthorized?: boolean,\r\n children?: React.ReactNode,\r\n}\r\n\r\n/**\r\n * Container component that will check for authorization before showing its children.\r\n * @param props\r\n */\r\nexport const AuthorizeContainer = (props: AuthorizeContainerProps) => {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const { data: { roles: usersRoles } } = useCurrentUserRoles();\r\n const [ hasRequiredRole, setHasRequiredRole ] = React.useState(); \r\n\r\n // Load the roles only if we need to.\r\n React.useEffect(() => {\r\n if (props.requireRole && !isNullOrUndefined(usersRoles)) {\r\n const requireRoles = [props.requireRole].flat(2);\r\n let hasRole = false;\r\n for (let roleToCheck of requireRoles) {\r\n if (usersRoles.find(it => it === roleToCheck)) {\r\n hasRole = true;\r\n break;\r\n }\r\n }\r\n setHasRequiredRole(hasRole);\r\n }\r\n }, [props.requireRole, usersRoles, setHasRequiredRole, isAuthenticated]);\r\n\r\n // Render the UI\r\n //\r\n const { children } = props;\r\n\r\n // Show nothing until we have a defined authenticated state.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return (<>);\r\n }\r\n\r\n let failedCheck = false;\r\n\r\n // Check if we are not authenticted.\r\n if (!isAuthenticated) {\r\n failedCheck = true;\r\n }\r\n\r\n // If we need to check a role but don't have the roles to check yet, show nothing.\r\n if (isAuthenticated && props.requireRole && isNullOrUndefined(usersRoles)) {\r\n return (<>);\r\n }\r\n\r\n // If we checked a role and didn't have one we were looking for, show nothing.\r\n if (hasRequiredRole === false) {\r\n failedCheck = true;\r\n }\r\n\r\n // If we get here then we can render the children or not based on if the check failed or succeeded.\r\n if (failedCheck) {\r\n if (props.showIfNotAuthorized) {\r\n return (<>{children});\r\n }\r\n\r\n return (<>);\r\n }\r\n\r\n if (props.showIfNotAuthorized) {\r\n return (<>);\r\n }\r\n\r\n return (<>{children});\r\n};\r\n","import * as React from 'react';\r\nimport { Route, Redirect, RouteProps } from 'react-router-dom';\r\nimport { isNullOrUndefined } from 'util';\r\nimport { useAuthenticatedState } from '../../api/api-authorization/useAuthenticatedState';\r\nimport { useCurrentUserRoles } from '../../api/account';\r\n\r\nexport interface AuthorizeRouteProps extends RouteProps {\r\n requireRole?: string | Array,\r\n}\r\n\r\n/**\r\n * Route component that will check for authorization before showing its component.\r\n * \r\n * NOTE this was originally based on AuthorizeRoute from Microsoft's template but converted to typescript and React hooks and to support more than just the component prop.\r\n * @param props\r\n */\r\nexport const AuthorizeRoute = (props: AuthorizeRouteProps) => {\r\n const { isAuthenticated } = useAuthenticatedState();\r\n const { data: { roles: usersRoles } } = useCurrentUserRoles();\r\n const [ hasRequiredRole, setHasRequiredRole ] = React.useState(); \r\n\r\n // Load the roles only if we need to.\r\n React.useEffect(() => {\r\n if (props.requireRole && !isNullOrUndefined(usersRoles)) {\r\n const requireRoles = [props.requireRole].flat(2);\r\n let hasRole = false;\r\n for (let roleToCheck of requireRoles) {\r\n if (usersRoles.find(it => it === roleToCheck)) {\r\n hasRole = true;\r\n break;\r\n }\r\n }\r\n setHasRequiredRole(hasRole);\r\n }\r\n }, [props.requireRole, usersRoles, setHasRequiredRole, isAuthenticated]);\r\n\r\n // Render the UI\r\n //\r\n const { component: Component, render, children, ...rest } = props;\r\n\r\n // Show nothing until we have a defined authenticated state.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return (<>);\r\n }\r\n \r\n // If we need to check a role, but can't yet return nothing.\r\n if (props.requireRole && isNullOrUndefined(usersRoles)) {\r\n return (<>);\r\n }\r\n\r\n // If we don't have the role we require, show text saying so.\r\n if (hasRequiredRole === false) {\r\n return (<>Sorry you do not have permission to access this area.);\r\n }\r\n\r\n return (\r\n {\r\n if (isAuthenticated) {\r\n if (Component) {\r\n return ;\r\n } else if (render) {\r\n return render(props);\r\n } else {\r\n return children;\r\n }\r\n } else {\r\n const redirectUrl = `/authentication/login?returnUrl=${encodeURIComponent(window.location.href)}`\r\n return \r\n }\r\n }} />\r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { NavLink, NavLinkProps } from 'react-router-dom';\r\n\r\nexport interface NavLinkTrackActiveProps extends NavLinkProps {\r\n}\r\n\r\n/**\r\n * NavLink from react-router configured to track the active component with the active class. \r\n * \r\n * This simply returns a that is preconfigured with activeClassName=\"active\".\r\n */\r\nexport const NavLinkTrackActive = (props: NavLinkTrackActiveProps) => {\r\n const { to, exact, activeClassName, ...rest } = props;\r\n\r\n return (\r\n \r\n );\r\n};\r\n","/**\r\n * Constants for the available roles.\r\n */\r\nexport const IdentityRoles = {\r\n DriverManagement: 'DriverManagement',\r\n SubscriptionAdministration: 'SubscriptionAdministration',\r\n DistributionAdministration: 'DistributorAdministration',\r\n Administration: 'Administration',\r\n};\r\n\r\n///**\r\n// * Constants (enum) for the available Roles.\r\n// */\r\n//export enum IdentityRoles {\r\n// Administration = 'Administration'\r\n//}\r\n","import { NavItem, NavLink } from 'reactstrap';\r\nimport { AuthorizeContainer } from '../../shared/authorizeRoute';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { NavLinkTrackActive } from '../shared/NavLinkTrackActive';\r\nimport { IdentityRoles } from '../../configure/security/IdentityRoles';\r\n\r\n/**\r\n * Primary navigation menu for the app. \r\n */\r\nexport const Navigation = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n <> {t('navigation.dashboard', 'Dashboard')}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n <> {t('navigation.administration', 'Administration')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import './appNavbarBrand.scss';\r\n\r\nimport * as React from 'react';\r\n//import { NavbarBrand } from 'reactstrap'; // Not used as it renders a / and we want to control our / elsewhere.\r\n\r\n/**\r\n * Navbar brand image for the app. \r\n */\r\nexport const AppNavbarBrand = () => {\r\n return (\r\n
\r\n {/*
\r\n
\r\n
\r\n
*/}\r\n
\r\n );\r\n};","import './header.scss';\r\n\r\nimport { Nav, Container } from 'reactstrap';\r\nimport { AppHeader, AppSidebarToggler } from '@coreui/react';\r\nimport { UserNav } from './UserNav';\r\nimport { Link } from 'react-router-dom';\r\nimport { Navigation } from '../home/Navigation';\r\nimport { AppNavbarBrand } from './appNavbarBrand/AppNavbarBrand';\r\n\r\nexport const Header = () => {\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","import * as React from 'react';\r\nimport PerfectScrollbar from 'react-perfect-scrollbar';\r\n\r\nexport const SidebarNav = (props: any) => {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n","import './sidebarNavTitle.scss';\r\n\r\nimport * as React from 'react';\r\nimport { NavItem } from 'reactstrap';\r\n\r\nexport interface SidebarNavTitleProps {\r\n className?: string,\r\n child?: boolean,\r\n children?: React.ReactNode,\r\n}\r\n\r\nexport const SidebarNavTitle = (props: SidebarNavTitleProps) => {\r\n const { className, child, children } = props;\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Route, Switch } from 'react-router';\r\nimport { RouteEntry } from '../../shared/routes';\r\nimport { AuthorizeRoute } from '../../shared/authorizeRoute';\r\n\r\nexport interface AppRoutesProps {\r\n routes: Array,\r\n}\r\n\r\nexport const AppRoutes = (props: AppRoutesProps) => {\r\n const { routes } = props;\r\n\r\n return (\r\n \r\n {\r\n routes.map((item, index) => {\r\n // If we need to authorize for this route then use an AuthorizeRoute.\r\n if (item.authorize || item.requireRole) {\r\n return ();\r\n }\r\n\r\n // Otherwise a simple Route will do.\r\n return ();\r\n })\r\n }\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { Spinner } from 'reactstrap';\r\n\r\nexport interface LoadingIndicatorProps {\r\n className?: string,\r\n fullWidth?: boolean,\r\n size?: 'sm' | 'md' | 'lg',\r\n inline?: boolean,\r\n}\r\n\r\n/**\r\n * Simple spinner that can be shown during loading.\r\n */\r\nexport const LoadingIndicator = (props: LoadingIndicatorProps) => {\r\n const { className, fullWidth, size, inline } = props;\r\n\r\n const style = React.useMemo(() => {\r\n let ret: React.CSSProperties = {};\r\n if (fullWidth) {\r\n ret.width = '100%';\r\n ret.textAlign = 'center';\r\n }\r\n\r\n if (inline) {\r\n ret.display = 'inline';\r\n }\r\n\r\n return ret;\r\n }, [inline, fullWidth])\r\n\r\n return (\r\n
\r\n \r\n Loading\r\n
\r\n );\r\n};\r\n\r\n","import './background.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\n\r\nexport interface BackgroundProps {\r\n children?: React.ReactNode,\r\n className?: string,\r\n centerChildren?: 'none' | 'vertically' | 'horizontally',\r\n\r\n background?: 'default',\r\n}\r\n\r\n/**\r\n * Background for making the back of screens look nicer.\r\n * @param props\r\n */\r\nexport const Background = (props: BackgroundProps) => {\r\n const {\r\n children,\r\n className,\r\n centerChildren,\r\n background = 'default',\r\n } = props;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {children}\r\n
\r\n );\r\n};","import { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { Background } from '../shared/background/Background';\r\n\r\nexport interface LoginWaitingProps {\r\n waiting: boolean,\r\n message: string\r\n}\r\n\r\n/**\r\n * Component that is shown during waiting of any login or logout options.\r\n * \r\n * If you want to change the \"waiting\" screen between redirects for all login actions, this is where to do it.\r\n */\r\nexport const LoginWaiting = (props: LoginWaitingProps) => {\r\n const { waiting, message } = props;\r\n\r\n return (\r\n \r\n {/**/}\r\n\r\n {\r\n waiting ? (\r\n <>\r\n \r\n
\r\n {message}\r\n
\r\n \r\n ) : (\r\n <>\r\n {\r\n !!message ? (
{message}
) : null\r\n }\r\n \r\n )\r\n }\r\n
\r\n );\r\n};","export const QueryParameterNames = {\r\n ReturnUrl: 'returnUrl',\r\n Message: 'message'\r\n};\r\n\r\nexport const LogoutActions = {\r\n LogoutCallback: 'logout-callback',\r\n Logout: 'logout',\r\n LoggedOut: 'logged-out'\r\n};\r\n\r\nexport const LoginActions = {\r\n Login: 'login',\r\n LoginCallback: 'login-callback',\r\n LoginFailed: 'login-failed',\r\n Profile: 'profile',\r\n Register: 'register'\r\n};\r\n\r\nconst prefix = '/authentication';\r\n\r\nexport const ApplicationPaths = {\r\n DefaultLoginRedirectPath: '/',\r\n ApiAuthorizationPrefix: prefix,\r\n Login: `${prefix}/${LoginActions.Login}`,\r\n LoginFailed: `${prefix}/${LoginActions.LoginFailed}`,\r\n LoginCallback: `${prefix}/${LoginActions.LoginCallback}`,\r\n Register: `${prefix}/${LoginActions.Register}`,\r\n Profile: `${prefix}/${LoginActions.Profile}`,\r\n LogOut: `${prefix}/${LogoutActions.Logout}`,\r\n LoggedOut: `${prefix}/${LogoutActions.LoggedOut}`,\r\n LogOutCallback: `${prefix}/${LogoutActions.LogoutCallback}`,\r\n IdentityRegisterPath: '/account/register',\r\n IdentityManagePath: '/profile'\r\n};\r\n","import * as React from 'react'\r\nimport { LoginWaiting } from './LoginWaiting';\r\nimport { LoginActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\r\nimport authService, { AuthenticationResultStatus } from '../../api/api-authorization/AuthorizeService';\r\n\r\nexport interface LoginProps {\r\n action: string,\r\n}\r\n\r\nexport interface LoginState {\r\n message: string | undefined | null,\r\n}\r\n\r\n// The main responsibility of this component is to handle the user's login process.\r\n// This is the starting point for the login process. Any component that needs to authenticate\r\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\r\n// let the component perform the login and return back to the return url.\r\nexport class Login extends React.Component {\r\n constructor(props: LoginProps) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LoginActions.Login:\r\n this.login(this.getReturnUrl());\r\n break;\r\n case LoginActions.LoginCallback:\r\n this.processLoginCallback();\r\n break;\r\n case LoginActions.LoginFailed:\r\n const params = new URLSearchParams(window.location.search);\r\n const error = params.get(QueryParameterNames.Message);\r\n this.setState({ message: error });\r\n break;\r\n case LoginActions.Profile:\r\n this.redirectToProfile();\r\n break;\r\n case LoginActions.Register:\r\n this.redirectToRegister();\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n render() {\r\n const action = this.props.action;\r\n const { message } = this.state;\r\n\r\n switch (action) {\r\n case LoginActions.Login:\r\n return ();\r\n case LoginActions.LoginCallback:\r\n return ();\r\n case LoginActions.Profile:\r\n case LoginActions.Register:\r\n return ();\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n async login(returnUrl: string) {\r\n const state = { returnUrl };\r\n const result = await authService.signIn(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid status result ${result.status}.`);\r\n }\r\n }\r\n\r\n async processLoginCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignIn(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeSignIn finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid authentication result status '${result.status}'.`);\r\n }\r\n }\r\n\r\n getReturnUrl(state?: any) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}/`;\r\n }\r\n\r\n redirectToRegister() {\r\n this.redirectToApiAuthorizationPath(`${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURIComponent(ApplicationPaths.Login)}`);\r\n }\r\n\r\n redirectToProfile() {\r\n this.redirectToApiAuthorizationPath(ApplicationPaths.IdentityManagePath);\r\n }\r\n\r\n redirectToApiAuthorizationPath(apiAuthorizationPath: string) {\r\n const redirectUrl = `${window.location.origin}${apiAuthorizationPath}`;\r\n // It's important that we do a replace here so that when the user hits the back arrow on the\r\n // browser he gets sent back to where it was on the app instead of to an endpoint on this\r\n // component.\r\n window.location.replace(redirectUrl);\r\n }\r\n\r\n navigateToReturnUrl(returnUrl: string) {\r\n // It's important that we do a replace here so that we remove the callback uri with the\r\n // fragment containing the tokens from the browser history.\r\n window.location.replace(returnUrl);\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { LogoutActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\r\nimport { LoginWaiting } from './LoginWaiting';\r\nimport authService, { AuthenticationResultStatus } from '../../api/api-authorization/AuthorizeService';\r\nimport { Redirect } from 'react-router';\r\n\r\nexport interface LogoutProps {\r\n action: string,\r\n}\r\n\r\nexport interface LogoutState {\r\n message: string | undefined,\r\n isReady: boolean,\r\n authenticated: boolean,\r\n}\r\n\r\n// The main responsibility of this component is to handle the user's logout process.\r\n// This is the starting point for the logout process, which is usually initiated when a\r\n// user clicks on the logout button on the LoginMenu component.\r\nexport class Logout extends React.Component {\r\n constructor(props: LogoutProps) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n isReady: false,\r\n authenticated: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n if (!!window.history.state.state.local) {\r\n this.logout(this.getReturnUrl());\r\n } else {\r\n // This prevents regular links to /authentication/logout from triggering a logout\r\n this.setState({ isReady: true, message: \"The logout was not initiated from within the page.\" });\r\n }\r\n break;\r\n case LogoutActions.LogoutCallback:\r\n this.processLogoutCallback();\r\n break;\r\n case LogoutActions.LoggedOut:\r\n this.setState({ isReady: true, message: \"You successfully logged out!\" });\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n\r\n this.populateAuthenticationState();\r\n }\r\n\r\n render() {\r\n const { isReady, message } = this.state;\r\n if (!isReady) {\r\n return ();\r\n }\r\n\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n return ();\r\n case LogoutActions.LogoutCallback:\r\n return ();\r\n case LogoutActions.LoggedOut:\r\n return ();\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n } }\r\n\r\n async logout(returnUrl: string) {\r\n const state = { returnUrl };\r\n const isauthenticated = await authService.isAuthenticated();\r\n if (isauthenticated) {\r\n const result = await authService.signOut(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n } else {\r\n this.setState({ message: \"You successfully logged out!\" });\r\n }\r\n }\r\n\r\n async processLogoutCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignOut(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeAuthentication finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n this.setState({ isReady: true, authenticated });\r\n }\r\n\r\n getReturnUrl(state?: any) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) ||\r\n fromQuery ||\r\n `${window.location.origin}${ApplicationPaths.LoggedOut}`;\r\n }\r\n\r\n navigateToReturnUrl(returnUrl: string) {\r\n return window.location.replace(returnUrl);\r\n }\r\n}\r\n","import { Login } from './Login'\r\nimport { Logout } from './Logout'\r\nimport { RouteEntry } from '../../shared/routes';\r\n\r\nexport const apiAuthorizationRoutes: Array = [\r\n { path: '/authentication/login', render: () => loginAction('login') },\r\n { path: '/authentication/login-callback', render: () => loginAction('login-callback') },\r\n { path: '/authentication/login-failed', render: () => loginAction('login-failed') },\r\n { path: '/authentication/profile', render: () => loginAction('profile') },\r\n { path: '/authentication/register', render: () => loginAction('register') },\r\n\r\n { path: '/authentication/logout', render: () => logoutAction('logout') },\r\n { path: '/authentication/logout-callback', render: () => logoutAction('logout-callback') },\r\n { path: '/authentication/logged-out', render: () => logoutAction('logged-out') },\r\n];\r\n\r\nfunction loginAction(name: string){\r\n return ();\r\n}\r\n\r\nfunction logoutAction(name: string) {\r\n return ();\r\n}\r\n","import { ErrorMessageConverter } from \"./ErrorMessageConverter\";\r\n\r\n/**\r\n * Register all converters to use for error messages when calling userFriendlyErrorMessage().\r\n * \r\n * Convters will be run in array order, with the first non-null/undefined result being returned as the error message.\r\n * \r\n * @param converters\r\n */\r\nexport function registerErrorMessageConverters(converters: Array): void {\r\n configuredErrorMessageConverters = converters;\r\n}\r\n\r\n/**\r\n * Currently registered ErrorMessageConvters set by registerErrorMessageConverters().\r\n */\r\nexport let configuredErrorMessageConverters: Array = [];","import * as React from 'react';\r\nimport { Alert, AlertProps, Row, Col, Badge } from 'reactstrap';\r\nimport { userFriendlyErrorMessage, FriendlyErrorMessage } from '../userFriendlyErrorMessage';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\n\r\n\r\nexport interface AlertOnErrorsProps extends AlertProps {\r\n errors?: any,\r\n children?: any,\r\n simple?: boolean,\r\n}\r\n\r\n/**\r\n * Alert that shows an if error is set.\r\n * @param props\r\n */\r\nexport const AlertOnErrors = (props: AlertOnErrorsProps) => {\r\n const { errors, color, simple, ...rest } = props;\r\n\r\n const [openErrors, setOpenErrors] = React.useState>([]);\r\n const isOpen = React.useCallback((key: string) => !!openErrors.find(it => it === key), [openErrors]);\r\n const toggleOpen = React.useCallback((key: string) => {\r\n setOpenErrors(prevState => {\r\n if (prevState.find(it => it === key)) {\r\n return prevState.filter(it => it !== key);\r\n } else {\r\n return [...prevState, key];\r\n }\r\n });\r\n }, [setOpenErrors]);\r\n\r\n // Get the friendly version of each error.\r\n const friendlyErrors = React.useMemo(() => {\r\n // Flatten up to three levels of errors (wrapping in our own array first) and removing any\r\n // empty items (e.g. null, undefined, '').\r\n let flatErrors = [errors].flat(4).filter(item => item ? true : false);\r\n\r\n // Make friendly versions of all the error messages.\r\n const ret: Array = [flatErrors.map(error => userFriendlyErrorMessage(error))].flat(2);\r\n return ret;\r\n }, [errors])\r\n\r\n // Group errors with the same message together.\r\n const errorGroups = React.useMemo(() => {\r\n let groups: Array<{ message: string, errors: Array }> = [];\r\n\r\n for (const error of friendlyErrors) {\r\n let group = groups.find(item => item.message === error.message);\r\n if (!group) {\r\n group = { message: error.message, errors: [] };\r\n groups.push(group);\r\n }\r\n\r\n group.errors.push(error);\r\n }\r\n\r\n return groups;\r\n }, [friendlyErrors]);\r\n \r\n // If we have no errors, return nothing.\r\n if (!friendlyErrors.length) {\r\n return null;\r\n }\r\n\r\n // If we are in simple mode, return a list of friendly messages with no grouping or options to expand for more details.\r\n if (!!simple) {\r\n return (\r\n \r\n {props.children}\r\n\r\n {\r\n friendlyErrors.map((item, index) => (\r\n
\r\n {item.message}\r\n
\r\n ))\r\n }\r\n
\r\n );\r\n }\r\n\r\n // If we are not in simple mode (the default) then provide an interactive list of errors with grouping and the ability to expand for more\r\n // details if the user wants to.\r\n return (\r\n \r\n {props.children}\r\n {\r\n errorGroups.map(item => (\r\n
\r\n \r\n \r\n
toggleOpen(item.message)} style={{ cursor: 'pointer' }}>\r\n \r\n <> {\r\n item.errors.length > 1 ? (\r\n \r\n {item.errors.length}\r\n \r\n ) : (\r\n \r\n \r\n \r\n )\r\n }\r\n 1}>\r\n <> \r\n \r\n
\r\n \r\n \r\n
\r\n {item.message}\r\n
\r\n \r\n {\r\n item.errors.map((error, index) => (\r\n
\r\n \r\n
\r\n {error.details}\r\n
\r\n
\r\n \r\n {JSON.stringify(error?.error, null, 4)}\r\n \r\n
\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 { isNullOrUndefined } from \"util\";\r\nimport { configuredErrorMessageConverters } from \"./registerErrorMessageConverters\";\r\nimport { FriendlyErrorMessage } from \"./FriendlyErrorMessage\";\r\n\r\n/**\r\n * Translate an error message into a user friendly message, also giving the option for wrapping the message for translation if required\r\n * and seperating out additional details from the core error message.\r\n * \r\n * @param error the original error.\r\n */\r\nexport function userFriendlyErrorMessage(error: any): FriendlyErrorMessage | Array {\r\n // Give each converter in order a chance to handle the error until one does.\r\n for (const converter of configuredErrorMessageConverters) {\r\n const friendly = converter(error);\r\n if (!isNullOrUndefined(friendly)) {\r\n if (Array.isArray(friendly)) {\r\n return friendly as Array;\r\n } else if ((friendly as FriendlyErrorMessage)?.error) {\r\n return friendly as FriendlyErrorMessage;\r\n } else {\r\n return { message: friendly as string, error: error };\r\n }\r\n }\r\n }\r\n\r\n // Give up and return the error with a basic wrapper.\r\n return {\r\n message: error?.message ?? error?.toString,\r\n error: error\r\n };\r\n}","import * as React from 'react';\r\nimport { ModelChanges } from './ModelChanges';\r\n\r\n/**\r\n * Hook that makes it easy to apply changes ontop of original data.\r\n */\r\nexport function useChanges(unchanged: T | undefined | null, initialChanges: Partial = {}): ModelChanges {\r\n // Store changes in the state.\r\n const [changes, setChanges] = React.useState>(initialChanges);\r\n\r\n // Provide a method to apply a change or set of changes.\r\n const change = React.useCallback((changes: Partial) => {\r\n\r\n setChanges(prevState =>({\r\n ...prevState,\r\n ...changes\r\n }));\r\n }, [setChanges]);\r\n\r\n // Provide a method to reset all changes.\r\n const reset = React.useCallback(() => {\r\n setChanges({});\r\n }, [setChanges]);\r\n\r\n // Combine the initial model with the changes to produce model with its current state.\r\n const model = React.useMemo((): T => {\r\n return {\r\n ...(unchanged ?? {} as T), ...changes\r\n };\r\n }, [unchanged, changes]);\r\n\r\n // Combine everything into a return value and return it (caching it with useMemo()).\r\n const ret = React.useMemo(() => ({\r\n change: change,\r\n changes: changes,\r\n reset: reset,\r\n model: model\r\n }), [changes, change, reset, model]);\r\n\r\n return ret;\r\n}","import './externalLoginButton.scss';\r\n\r\nimport * as React from 'react';\r\nimport { ButtonProps, Button } from 'reactstrap';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface ExternalLoginButtonProps extends ButtonProps {\r\n provider: string,\r\n providerDisplayName?: string,\r\n}\r\n\r\ninterface ProviderDisplayOptions {\r\n text: string,\r\n icon: IconProp,\r\n className: string,\r\n}\r\n\r\n/**\r\n * Button for a an external service that can be used to log in. \r\n */\r\nexport const ExternalLoginButton = (props: ExternalLoginButtonProps) => {\r\n const { t } = useTranslation();\r\n const { provider, providerDisplayName, className: propsClassName, ...rest } = props;\r\n\r\n const { text, icon, className } = React.useMemo((): ProviderDisplayOptions => {\r\n switch (provider) {\r\n case 'Microsoft':\r\n return { text: t('externalLoginButton.microsoftAccountProviderText', 'Microsoft Account'), icon: ['fab', 'microsoft'], className: 'microsoft' };\r\n case 'Google':\r\n return { text: providerDisplayName ?? provider, icon: ['fab', 'google'], className: 'google' };\r\n case 'Facebook':\r\n return { text: providerDisplayName ?? provider, icon: ['fab', 'facebook'], className: 'facebook' };\r\n case 'Twitter':\r\n return { text: providerDisplayName ?? provider, icon: ['fab', 'twitter'], className: 'twitter' };\r\n default:\r\n return { text: providerDisplayName ?? provider, icon: 'external-link-alt', className: 'other' };\r\n }\r\n }, [provider, providerDisplayName, t]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import './formButtons.scss';\r\n\r\nimport * as React from 'react';\r\n\r\nexport interface FormButtonsProps {\r\n className?: string,\r\n noPadding?: boolean,\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Container for buttons (e.g. sumbit) at the bottom of a form. \r\n */\r\nexport const FormButtons = (props: FormButtonsProps) => {\r\n const { className, children, noPadding = false } = props;\r\n\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};","import './mainContainer.scss'; \r\n\r\nimport * as React from 'react';\r\nimport { Container, ContainerProps } from 'reactstrap';\r\n\r\nexport interface MainContainerProps extends ContainerProps {\r\n color?: 'main' | 'transparent',\r\n}\r\n\r\n/**\r\n * Main container that ensures \r\n */\r\nexport const MainContainer = (props: MainContainerProps) => {\r\n const {\r\n className,\r\n children,\r\n color = 'main',\r\n ...rest } = props;\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};","\r\n/**\r\n * Rules for a password.\r\n * \r\n * This is designed to mirror PasswordOptions from ASP.NET Core Identity.\r\n */\r\nexport interface PasswordOptions {\r\n requireDigit: boolean,\r\n requiredLength: number,\r\n requireLowercase: boolean,\r\n requireNonAlphanumeric: boolean,\r\n requiredUniqueChars: number,\r\n requireUppercase: boolean\r\n}\r\n\r\n/**\r\n * Default PasswordOptions used when no custom options are supplied.\r\n * \r\n * The default rules match those for ASP.NET Core Identity to make it out-of-the-box compatible with backends using\r\n * ASP.NET Core identity, however there is no dependency on it and it can be used with any backend.\r\n */\r\nexport const defaultPasswordOptions = {\r\n requireDigit: true,\r\n requiredLength: 6,\r\n requireLowercase: true,\r\n requireNonAlphanumeric: true,\r\n requiredUniqueChars: 1,\r\n requireUppercase: true\r\n} as PasswordOptions;\r\n","import i18n from 'i18next';\r\nimport { PasswordOptions, defaultPasswordOptions } from './PasswordOptions';\r\n\r\n/**\r\n * Enforce and describe PasswordOptions.\r\n */\r\nexport class PasswordValidation {\r\n private readonly passwordOptions: PasswordOptions;\r\n\r\n constructor(passwordOptions?: PasswordOptions) {\r\n this.passwordOptions = passwordOptions ?? defaultPasswordOptions;\r\n }\r\n\r\n /**\r\n * Check password against the PasswordOptions and return a success indicator and an array of any errors, and a friendly description of all errors.\r\n * @param password\r\n */\r\n check(password: string): PasswordCheckResults {\r\n let ok = true;\r\n let errors: Array = [];\r\n\r\n if (this.passwordOptions.requiredLength > password.length) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requiredLengthError', 'must be at least {{requiredLength}} characters long', { requiredLength: this.passwordOptions.requiredLength }));\r\n }\r\n\r\n if (this.passwordOptions.requiredUniqueChars > 1) {\r\n let charMap = Array();\r\n for (let i = 0; i < password.length; ++i) {\r\n let char = password.charAt(i);\r\n if (charMap.indexOf(char) !== -1) {\r\n charMap.push(char);\r\n\r\n // Break if we know enough to let the password pass on this rule.\r\n if (charMap.length > this.passwordOptions.requiredUniqueChars) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requiredUniqueChars > charMap.length) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requiredUniqueCharsError', 'must contain at least {{requiredUniqueChars}} unique characters', { requiredUniqueChars: this.passwordOptions.requiredUniqueChars }));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireDigit) {\r\n let regExp = new RegExp('.*[0-9].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireDigitError', 'must contain a number'));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireLowercase) {\r\n let regExp = new RegExp('.*[a-z].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireLowercaseError', 'must contain a lowercase letter'));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireUppercase) {\r\n let regExp = new RegExp('.*[A-Z].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireUppercaseError', 'must contain an uppercase letter'));\r\n }\r\n }\r\n\r\n if (this.passwordOptions.requireNonAlphanumeric) {\r\n let regExp = new RegExp('.*[^0-9a-zA-Z].*');\r\n if (!regExp.test(password)) {\r\n ok = false;\r\n errors.push(i18n.t('passwordValidation.requireNonAlphanumericError', 'must contain a symbol (such as !$%&*@#)'));\r\n }\r\n }\r\n\r\n // Generate a textual description of all errors, or blank if there are no errors for errorDescription.\r\n let errorDescription: string = '';\r\n if (errors.length) {\r\n errorDescription = i18n.t('passwordValidation.errorDescription', 'Password {{errors}}', { errors: errors.join(', ') });\r\n }\r\n\r\n return { valid: ok, errors, errorDescription };\r\n }\r\n}\r\n\r\nexport interface PasswordCheckResults {\r\n valid: boolean,\r\n errors: Array,\r\n errorDescription: string,\r\n}\r\n\r\n","import * as React from 'react';\r\nimport { PasswordCheckResults, PasswordValidation } from './PasswordValidation';\r\nimport { generatePasswordRulesDescrption } from './generatePasswordRulesDescription';\r\n\r\nexport interface PasswordValidationResult {\r\n checkPassword: (password: string) => PasswordCheckResults,\r\n passwordRequirements: string,\r\n}\r\n\r\n/**\r\n * Hook for password validation.\r\n */\r\nexport function usePasswordValidation(): PasswordValidationResult {\r\n let passwordValidation = React.useMemo(() => new PasswordValidation(), []);\r\n let checkPassword = React.useCallback((password: string) => {\r\n return passwordValidation.check(password);\r\n }, [passwordValidation]);\r\n let passwordRequirements = React.useMemo(() => {\r\n return generatePasswordRulesDescrption(passwordValidation);\r\n }, [passwordValidation])\r\n\r\n return {\r\n checkPassword,\r\n passwordRequirements\r\n };\r\n}","import i18n from 'i18next';\r\nimport { PasswordValidation } from \"./PasswordValidation\";\r\n\r\n/**\r\n * Generates a plain text description of the password rules for passwordValidation.\r\n * @param passwordValidation\r\n */\r\nexport function generatePasswordRulesDescrption(passwordValidation: PasswordValidation): string {\r\n const { valid, errors: passwordErrors } = passwordValidation.check('');\r\n if (valid) {\r\n return '';\r\n }\r\n\r\n return i18n.t('generatePasswordRulesDescription.passwordRequirements', 'Your password {{requirements}}.', { requirements: passwordErrors.join(', ')});\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { roleGroupFields } from \"../generated/roleGroupFields\";\r\n\r\nexport const roleGroupFieldsFragment = gql`\r\n fragment roleGroupFields on RoleGroup {\r\n id\r\n name\r\n }\r\n`;\r\n\r\n\r\nexport type RoleGroup = Omit;","import gql from \"graphql-tag\";\r\nimport { userFields } from \"../generated/userFields\";\r\nimport { roleGroupFieldsFragment } from \"./RoleGroup\";\r\n\r\nexport const userFieldsFragment = gql`\r\n fragment userFields on User {\r\n id\r\n userName\r\n email\r\n emailConfirmed\r\n phoneNumberConfirmed\r\n twoFactorEnabled\r\n lockoutEnd\r\n lockoutEnabled\r\n accessFailedCount\r\n roleGroup {\r\n ...roleGroupFields\r\n }\r\n }\r\n\r\n ${roleGroupFieldsFragment}\r\n`;\r\n\r\n\r\nexport type User = Omit;\r\n","import gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { profileFields } from \"../generated/profileFields\";\r\nimport { userFieldsFragment } from \"./User\";\r\n\r\nexport const profileFieldsFragment = gql`\r\n fragment profileFields on Profile {\r\n id\r\n userId\r\n firstName\r\n lastName\r\n archived\r\n\r\n user {\r\n ...userFields,\r\n }\r\n }\r\n\r\n ${userFieldsFragment}\r\n`;\r\n\r\n\r\nexport type Profile = Omit;\r\n\r\n/**\r\n * Default values.\r\n */\r\nexport const profileDefaultValues = (): Partial => ({\r\n id: Guid.newGuid(),\r\n userId: undefined,\r\n firstName: '',\r\n lastName: '',\r\n archived: false,\r\n});","import * as React from \"react\";\r\nimport { FormGroup, Label } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback, ValidateCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Profile as ProfileModel, profileDefaultValues } from '../../api/main/models/Profile';\r\nimport { useRegisterProfileCallback } from \"../../api/main/profiles/useRegisterProfileCallback\";\r\nimport { ProfileCreateInput } from \"../../api/main/generated/globalTypes\";\r\nimport { ValidationErrors } from \"pojo-validator\";\r\n\r\nexport interface RegisterProfileDetailsProps {\r\n // Public\r\n registerProfile: (userId: string, financialModelId?: string) => Promise,\r\n isRegisteringProfile: boolean,\r\n registerProfileErrors: any,\r\n\r\n validate: ValidateCallback,\r\n validationErrors: ValidationErrors\r\n\r\n // Private\r\n model: ProfileModel,\r\n change: (changes: Partial) => void,\r\n changes: Partial,\r\n\r\n}\r\n\r\n/**\r\n * Custom hook that lets users of RegisterProfileDetails own the state of the Profile without being aware of its format.\r\n * @param userId\r\n */\r\nexport function useRegisterProfileDetailsProps(): RegisterProfileDetailsProps {\r\n const { t } = useTranslation();\r\n\r\n const [_registerProfile, { isExecuting: isRegisteringProfile, errors: registerProfileErrors }] = useRegisterProfileCallback();\r\n const { model, change, changes } = useChanges(null, { ...profileDefaultValues() });\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n firstName: () => !model.firstName ? t('registerProfileDetails.firstNameRequired', 'First name is required') : '',\r\n lastName: () => !model.lastName ? t('registerProfileDetails.lastNameRequired', 'Last name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n const registerProfile = React.useCallback(async (userId: string, financialModelId?: string) => {\r\n await _registerProfile({ ...model, userId: userId } as ProfileCreateInput, financialModelId);\r\n }, [_registerProfile, model]);\r\n\r\n return {\r\n registerProfile: registerProfile,\r\n isRegisteringProfile: isRegisteringProfile,\r\n registerProfileErrors: registerProfileErrors,\r\n\r\n validate: validate,\r\n validationErrors: validationErrors,\r\n\r\n model: model,\r\n change: change,\r\n changes: changes,\r\n };\r\n};\r\n\r\n\r\n/**\r\n * Allow the user to set their personal details on their profile during registration.\r\n */\r\nexport const RegisterProfileDetails = (props: RegisterProfileDetailsProps & { children?: React.ReactNode }) => {\r\n const { model, change, validate, validationErrors, children, } = props;\r\n const { t } = useTranslation();\r\n\r\n // Render the UI.\r\n //\r\n return (\r\n <>\r\n \r\n \r\n change({ firstName: e.currentTarget.value })} onBlur={e => validate('firstName')} validationErrors={validationErrors['firstName']} />\r\n \r\n \r\n \r\n change({ lastName: e.currentTarget.value })} onBlur={e => validate('lastName')} validationErrors={validationErrors['lastName']} />\r\n \r\n\r\n {children}\r\n \r\n );\r\n};\r\n","import { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ProfileCreateInput } from '../generated/globalTypes';\r\nimport { registerProfileMutation, registerProfileMutationVariables } from '../generated/registerProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\nimport { useMutation } from '@apollo/react-hooks';\r\nimport gql from 'graphql-tag';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\n\r\n/**\r\n * Get a callback to create a Profile in the store during registration.\r\n */\r\nexport function useRegisterProfileCallback(): [(model: ProfileCreateInput, financialModelId?: string) => Promise, AsyncActionStatus] {\r\n //throw new Error('Users cannot self register for this app.');\r\n\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation registerProfileMutation ($model: ProfileCreateInput!, $financialModelId: ID) {\r\n registerProfile(model: $model, financialModelId: $financialModelId) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ProfileCreateInput, financialModelId?: string) => {\r\n const result = await mutationAction({ variables: { model: model, financialModelId: financialModelId } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Row, Col, Form, Alert, FormGroup, Label, Spinner, FormText, Card, CardHeader, CardBody } from \"reactstrap\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { Link, useHistory, useParams } from \"react-router-dom\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { LoadingIndicator } from \"../../components/shared/LoadingIndicator\";\r\nimport { useExternalAuthenticationSchemes, useStartExternalLoginCallback, useRegisterAccountCallback, useResendConfirmationEmailCallback } from \"../../api/account\";\r\nimport { Register as RegisterModel } from '../../api/account/models/Register';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ExternalLoginButton } from \"./ExternalLoginButton\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\nimport { RegisterProfileDetails, useRegisterProfileDetailsProps } from \"../profiles/RegisterProfileDetails\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { Background } from \"../shared/background/Background\";\r\n\r\n/**\r\n * Register screen.\r\n */\r\nexport const Register = () => {\r\n const { t } = useTranslation();\r\n\r\n const { financialModelId } = useParams<{ financialModelId: string | undefined }>();\r\n\r\n const { data: { externalAuthenticationSchemes }, isLoading, errors: loadErrors } = useExternalAuthenticationSchemes();\r\n const [register, { isExecuting: isRegistering, errors: registerErrors }] = useRegisterAccountCallback();\r\n const [startExternalLogin] = useStartExternalLoginCallback();\r\n const [isPendingEmailConfirmation, setIsPendingEmailConfirmation] = React.useState(false);\r\n const [resendConfirmationEmail, { isExecuting: isResendingConfirmationEmail, errors: resendConfirmationEmailErrors }] = useResendConfirmationEmailCallback();\r\n const history = useHistory();\r\n\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n\r\n const { model, change } = useChanges({ email: '', password: '', confirmPassword: '' });\r\n\r\n const registerProfileDetailsProps = useRegisterProfileDetailsProps();\r\n\r\n // Need the URL to pass on to registration or 2faif we redirect to it.\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n \r\n /**\r\n * Validate the model before trying to use it.\r\n */\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n email: () => !model.email ? t('register.emailRequired', 'Email is required') : '',\r\n password: () => !model.password ? t('register.passwordRequired', 'Password is required')\r\n : checkPassword(model.password).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.password ? t('register.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n\r\n // Check the profile details as well (ensuring an error reflects in our error state).\r\n validation.singleCheck('profileDetails', !registerProfileDetailsProps.validate(fieldsToCheck), 'Profile details has some validation errors');\r\n }, [model, registerProfileDetailsProps.validate]);\r\n\r\n /**\r\n * Perform a login by and handle the result.\r\n */\r\n const [isDoingFullPageRedirect, setIsDoingFullPageRedirect] = React.useState(false);\r\n const performRegister = React.useCallback(async (): Promise => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const result = await register(model);\r\n\r\n if (result) {\r\n setIsPendingEmailConfirmation(result.requiresEmailConfirmation);\r\n\r\n // Save the profile.\r\n await registerProfileDetailsProps.registerProfile(result.userId, financialModelId);\r\n\r\n // Now send the initial email confirmation as we have the profile saved, so can address the user by name.\r\n await resendConfirmationEmail(model.email);\r\n\r\n if (result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n history.push(`/account/loginWithTwoFactor?returnUrl=${encodeURIComponent(result.returnUrl)}`);\r\n }\r\n\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n if (result.succeeded) {\r\n // Redirect the whole page (not just react) to the returnUrl to let the server handle as well as the client.\r\n if (!result.requiresEmailConfirmation && !result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n window.location.href = result.returnUrl;\r\n }\r\n }\r\n }\r\n }, [register, model, setIsPendingEmailConfirmation, history, validate, registerProfileDetailsProps, setIsDoingFullPageRedirect, resendConfirmationEmail, financialModelId]);\r\n \r\n // Render the UI.\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {t('register.registerNewAccountHeading', 'Register a new account')}\r\n

\r\n
\r\n \r\n \r\n \r\n
{ e.preventDefault(); await performRegister(); }}>\r\n \r\n\r\n \r\n \r\n \r\n \r\n {t('register.confirmationEmailHasBeenResent', 'Please check your email to confirm your account. You won\\'t be able to login until you have confirmed your account.')}\r\n \r\n \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n \r\n \r\n\r\n\r\n {/* Repeated because the height of the form on screen is too long for the user to see this at the top */}\r\n \r\n \r\n \r\n \r\n {t('register.confirmationEmailHasBeenResent', 'Please check your email to confirm your account. You won\\'t be able to login until you have confirmed your account.')}\r\n \r\n \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {t('register.login', 'Already have an account? Sign in instead.')}\r\n \r\n \r\n \r\n {t('register.registering', 'Registering...')}}>\r\n {t('register.register', 'Register')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n isLoading ? (\r\n \r\n ) : (\r\n <>\r\n
{t('register.useExternalService', 'Or register using an identity provider')}
\r\n
\r\n {\r\n !externalAuthenticationSchemes ? null\r\n : externalAuthenticationSchemes.length !== 0 ? (\r\n <>\r\n {\r\n externalAuthenticationSchemes.map((item) => (\r\n
\r\n startExternalLogin(item.name, returnUrl)} />\r\n
\r\n ))\r\n }\r\n \r\n ) : null\r\n }\r\n
\r\n \r\n )\r\n }\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { RegisterRequest, RegisterResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Register an account.\r\n */\r\nexport function useRegisterAccountCallback(): [(model: RegisterRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const returnUrl = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n return returnUrl;\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: RegisterRequest) => {\r\n let result = await accountService.register(model, returnUrl);\r\n\r\n // If we have additional steps to take before we are completely signed in, handle those now.\r\n if (result.requiresTwoFactor || result.requiresEmailConfirmation) {\r\n // Don't want to redirect to returnUrl.\r\n return result;\r\n }\r\n\r\n // If we get here we have a successful login\r\n\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { WatchQueryFetchPolicy } from \"@apollo/client\";\r\n\r\nexport const mainApiConfig = {\r\n endpoint: '/graphql',\r\n blobUploadEndpoint: '/api/blobs',\r\n blobDownloadEndpoint: '/api/blobs/redirectToUrl',\r\n defaultFetchPolicy: 'cache-and-network' as WatchQueryFetchPolicy,\r\n //defaultFetchPolicy: 'cache-first' as WatchQueryFetchPolicy,\r\n};","import { FormGroup, Label, Input } from \"reactstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useProfileForInvite } from \"../../api/main/profiles/useProfileForInvite\";\r\n\r\n/**\r\n * Allow the user to set their personal details on their profile during registration.\r\n */\r\nexport const ConfirmInviteProfileDetails = () => {\r\n const { t } = useTranslation();\r\n\r\n const { data: { model }, errors: loadingErrors } = useProfileForInvite();\r\n\r\n // Render the UI.\r\n //\r\n return (\r\n <>\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { profileForInviteQuery, profileForInviteQueryVariables } from '../generated/profileForInviteQuery';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a Profile from the store using the information available when confirming an invite.\r\n * \r\n * This exists because useProfile() is secured to only load information for authenticated users. This method exists to use the details of an invite as\r\n * permission to load the details of the related profile.\r\n * \r\n * This version gets its details from the query string invite code.\r\n * \r\n * @param id\r\n * @param options\r\n */\r\nexport function useProfileForInvite(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Get the details from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query profileForInviteQuery ($userId: ID!, $code: String!) {\r\n model: profileForInvite(userId: $userId, code: $code) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n userId: userId,\r\n code: code\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { Login } from \"./Login\";\r\nimport { Register } from \"./Register\";\r\nimport { ExternalLoginCallback } from \"./ExternalLoginCallback\";\r\nimport { ConfirmEmail } from \"./ConfirmEmail\";\r\nimport { ForgotPassword } from './ForgotPassword';\r\nimport { ResetPassword } from \"./ResetPassword\";\r\nimport { ConfirmEmailChange } from \"./ConfirmEmailChange\";\r\nimport { ConfirmInvite } from \"./ConfirmInvite\";\r\n\r\nexport const accountRoutes: Array = [\r\n { path: '/account/login', component: Login },\r\n { path: '/account/register', exact: true, component: Register },\r\n { path: '/account/register/:financialModelId', exact: true, component: Register },\r\n { path: '/account/externalLogin', component: ExternalLoginCallback },\r\n { path: '/account/forgotPassword', component: ForgotPassword },\r\n { path: '/account/resetPassword', component: ResetPassword },\r\n { path: '/account/confirmEmail', component: ConfirmEmail },\r\n { path: '/account/confirmEmailChange', component: ConfirmEmailChange },\r\n { path: '/account/confirmInvite', component: ConfirmInvite },\r\n];\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, CustomInput, Spinner, Row, Col, Card, CardHeader, CardBody, Button } from \"reactstrap\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { LoadingIndicator } from \"../../components/shared/LoadingIndicator\";\r\nimport { useExternalAuthenticationSchemes, useLoginWithPasswordCallback, useStartExternalLoginCallback, useResendConfirmationEmailCallback } from \"../../api/account\";\r\nimport { Login as LoginModel } from '../../api/account/models/Login';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ExternalLoginButton } from \"./ExternalLoginButton\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { Background } from \"../shared/background/Background\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\n\r\n/**\r\n * Login screen.\r\n */\r\nexport const Login = () => {\r\n const { t } = useTranslation();\r\n const { data: { externalAuthenticationSchemes }, isLoading, errors: loadErrors } = useExternalAuthenticationSchemes();\r\n const [login, { isExecuting: isLoggingIn, errors: loginErrors }] = useLoginWithPasswordCallback();\r\n const [startExternalLogin] = useStartExternalLoginCallback();\r\n const [isPendingEmailConfirmation, setIsPendingEmailConfirmation] = React.useState(false);\r\n const history = useHistory();\r\n\r\n const [resendConfirmationEmail, { isExecuting: isResendingConfirmationEmail, errors: resendConfirmationEmailErrors }] = useResendConfirmationEmailCallback();\r\n const [hasSentConfirmationEmail, setHasSentConfirmationEmail] = React.useState(false);\r\n\r\n const { model, change } = useChanges({ email: '', password: '', rememberMe: true });\r\n\r\n // Need the URL to pass on to registration or 2faif we redirect to it.\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n\r\n /**\r\n * Validate the model before trying to use it.\r\n */\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n email: () => !model.email ? t('login.emailRequired', 'Email or PIN is required') : '',\r\n password: () => !model.password ? t('login.passwordRequired', 'Password is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n /**\r\n * Perform a login by and handle the result.\r\n */\r\n const [isDoingFullPageRedirect, setIsDoingFullPageRedirect] = React.useState(false);\r\n const performLogin = React.useCallback(async (): Promise => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n let result = await login(model);\r\n\r\n if (result) {\r\n setIsPendingEmailConfirmation(result.requiresEmailConfirmation);\r\n\r\n if (result.requiresTwoFactor) {\r\n history.push(`/account/loginWithTwoFactor?returnUrl=${encodeURIComponent(result.returnUrl)}`);\r\n }\r\n\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n if (result.succeeded) {\r\n // Redirect the whole page (not just react) to the returnUrl to let the server handle as well as the client.\r\n if (!result.requiresEmailConfirmation && !result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n window.location.href = result.returnUrl;\r\n }\r\n }\r\n }\r\n }, [login, model, setIsPendingEmailConfirmation, history, validate, setIsDoingFullPageRedirect]);\r\n\r\n // Render the UI.\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {t('login.signInHeading', 'Sign in')}\r\n

\r\n
\r\n \r\n
{ e.preventDefault(); await performLogin(); }}>\r\n \r\n {\r\n isPendingEmailConfirmation ?\r\n hasSentConfirmationEmail ? (\r\n \r\n <>{t('login.confirmationEmailHasBeenResent', 'Confirmation link to verify the email for this account has been resent. Please check your email to confirm.')} \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); setHasSentConfirmationEmail(true); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : (\r\n \r\n <>{t('login.mustConfirmEmailBeforeLogin', 'You need to confirm your account before you can sign in. Please check your email.')} \r\n { e.preventDefault(); await resendConfirmationEmail(model.email); setHasSentConfirmationEmail(true); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n \r\n change({ rememberMe: e.currentTarget.checked })} />\r\n \r\n\r\n \r\n \r\n \r\n \r\n {t('login.forgotYourPassword', 'Forgotten your password?')}\r\n \r\n \r\n \r\n {t('login.loggingIn', 'Signing in...')}}>\r\n {t('login.signIn', 'Sign in')}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n
\r\n {\r\n isLoading ? (\r\n \r\n ) : (\r\n <>\r\n
\r\n {\r\n !externalAuthenticationSchemes ? null\r\n : externalAuthenticationSchemes.length !== 0 ? (\r\n <>\r\n
{t('login.useExternalService', 'Or sign in using an identity provider')}
\r\n {\r\n externalAuthenticationSchemes.map((item) => (\r\n startExternalLogin(item.name, returnUrl)} />\r\n ))\r\n }\r\n \r\n )\r\n : null\r\n }\r\n
\r\n \r\n )\r\n }\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import * as React from \"react\";\r\nimport { LoginResult } from \"../../api/account\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { LoginWithPasswordRequest } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Login using a password.\r\n */\r\nexport function useLoginWithPasswordCallback(): [(model: LoginWithPasswordRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const returnUrl = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n return returnUrl;\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: LoginWithPasswordRequest) => {\r\n let result = await accountService.loginWithPassword(model, returnUrl);\r\n\r\n // If we have additional steps to take before we are completely signed in, handle those now.\r\n if (result.requiresTwoFactor || result.requiresEmailConfirmation) {\r\n // Don't want to redirect to returnUrl.\r\n return result;\r\n }\r\n\r\n // If we get here we have a successful login\r\n\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { useCompletedExternalLoginDetails, useCreateAccountForExternalLoginCallback } from \"../../api/account\";\r\nimport { ClaimTypes } from \"../../api/account\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { LoadingIndicator } from \"../../components/shared/LoadingIndicator\";\r\nimport { FormGroup, Label, Form, Spinner, Card, CardHeader, CardBody } from \"reactstrap\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { ExternalLoginCallback as ExternalLoginCallbackModel } from \"../../api/account/models/ExternalLoginCallback\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { RegisterProfileDetails, useRegisterProfileDetailsProps } from \"../profiles/RegisterProfileDetails\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { Background } from \"../shared/background/Background\";\r\n\r\n/**\r\n * Complete an the external login.\r\n */\r\nexport const ExternalLoginCallback = () => {\r\n const { t } = useTranslation();\r\n const { data: { isNewUser, loginProvider, returnUrl, claims }, isLoading, errors: loadErrors } = useCompletedExternalLoginDetails();\r\n const [createAccount, { isExecuting: isCreatingAccount, errors: createAccountErrors }] = useCreateAccountForExternalLoginCallback();\r\n\r\n const registerProfileDetailsProps = useRegisterProfileDetailsProps();\r\n\r\n const { model, change } = useChanges({ email: '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n email: () => !model.email ? t('externalLoginCallback.emailRequired', 'Email is required') : '',\r\n };\r\n validation.checkRules(rules, fieldsToCheck);\r\n\r\n // Check the profile details as well (ensuring an error reflects in our error state).\r\n validation.singleCheck('profileDetails', !registerProfileDetailsProps.validate(fieldsToCheck), 'Profile details has some validation errors');\r\n }, [model]);\r\n\r\n // When the data returned by the external login changes, we want to use it to either default some changes or redirect away from the page.\r\n React.useEffect(() => {\r\n // If this is not a new user just redirect to their target page.\r\n if (!isNewUser) {\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n window.location.href = returnUrl || '/';\r\n } else {\r\n // Default the email in the model for new users (if the external login provided one).\r\n let emailClaim = claims.find(item => item.type === ClaimTypes.email);\r\n if (emailClaim && emailClaim.value) {\r\n change({ email: emailClaim.value });\r\n }\r\n }\r\n }, [isNewUser, returnUrl, claims, change]);\r\n\r\n // Render the UI.\r\n //\r\n\r\n // If we're not ready, show the loading indicator.\r\n if (isLoading || !isNewUser) {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // Render the external login registration view.\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('externalLoginCallback.registerAccountHeading', 'Register with your {{loginProvider}} account', { context: loginProvider, loginProvider: loginProvider })}

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

\r\n {t('externalLOginCallback.registerHelpText', 'You\\'ve successfully authenticated with {loginProvider}. Please enter an email address for this site below and click the Register button to finish logging in.')}\r\n

\r\n \r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const result = await createAccount(model)\r\n if (result) {\r\n // Save the profile.\r\n await registerProfileDetailsProps.registerProfile(result.userId);\r\n }\r\n }}>\r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n {t('externalLoginCallback.registring', 'Registering...')}}>\r\n {t('externalLoginCallback.register', 'Register')}\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 { AsyncLoadResult, AsyncLoadOptions } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { CompleteExternalLoginResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Details of the external login that has just completed and invoked our callback.\r\n */\r\nexport function useCompletedExternalLoginDetails(options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n const [data, setData] = React.useState({ claims: [], isNewUser: false, loginProvider: '', returnUrl: '' });\r\n\r\n const accountService = useAccountService();\r\n\r\n // Get the details from the external login off the query string.\r\n const { returnUrl, remoteError } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n const remoteError = params.get('remoteError') ?? params.get('RemoteError') ?? '';\r\n return { returnUrl, remoteError};\r\n }, []);\r\n\r\n const [refresh, { isExecuting: isLoading, errors }] = useAsyncCallback(async () => {\r\n let result = await accountService.completeExternalLogin(returnUrl, remoteError);\r\n setData(result);\r\n }, [accountService, returnUrl, remoteError, setData]);\r\n\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n refresh();\r\n }\r\n }, [refresh, options.lazy]);\r\n\r\n // TODO handle options.pollInterval.\r\n\r\n return {\r\n data: data,\r\n refresh: refresh,\r\n isLoading: isLoading,\r\n errors: errors\r\n };\r\n}\r\n","import * as React from \"react\";\r\nimport { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { CreateExternalLoginAccountDetails, RegisterResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Register an account for an authenticated external login.\r\n */\r\nexport function useCreateAccountForExternalLoginCallback(): [(model: CreateExternalLoginAccountDetails) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const returnUrl = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const returnUrl = params.get('returnUrl') ?? params.get('ReturnUrl') ?? '';\r\n return returnUrl;\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: CreateExternalLoginAccountDetails) => {\r\n let result = await accountService.createAccountForExternalLogin(model, returnUrl);\r\n\r\n // If we get here everything went well so redirect to the returnUrl.\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n window.location.href = result.returnUrl;\r\n\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner, Row, Col, CardHeader, Card, CardBody } from \"reactstrap\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { useSendPasswordResetEmailCallback } from \"../../api/account\";\r\nimport { ForgotPassword as ForgotPasswordModel } from '../../api/account/models/ForgotPassword';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { Background } from \"../shared/background/Background\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\n/**\r\n * Request a password reset emai because the user has forgotten their password.\r\n */\r\nexport const ForgotPassword = () => {\r\n const { t } = useTranslation();\r\n const [emailSent, setEmailSent] = React.useState(false);\r\n const [sendResetEmail, { isExecuting: isSendingResetEmail, errors: sendResetEmailErrors }] = useSendPasswordResetEmailCallback();\r\n\r\n const { model, change } = useChanges({ email: '' });\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n email: () => !model.email ? t('forgotPassword.emailRequired', 'Email is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n // Render the UI.\r\n // \r\n return (\r\n \r\n \r\n \r\n \r\n

{t('forgotPassword.forgotPasswordHeading', 'Forgot your password?')}

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

\r\n {t('forgotPassword.helpText', 'Enter your email and we\\'ll send you a link you can use to recover your account and set a new password.')}\r\n

\r\n
{\r\n e.preventDefault();\r\n const ok = await sendResetEmail(model.email);\r\n setEmailSent(ok);\r\n }}>\r\n\r\n \r\n {\r\n emailSent ? (\r\n \r\n \r\n \r\n {t('forgotPassword.emailHasBeenSent', 'Please check your email and follow the link to reset your password.')}\r\n \r\n \r\n {t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n \r\n \r\n ) : null\r\n }\r\n \r\n \r\n change({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n\r\n \r\n \r\n \r\n \r\n {t('forgottenPassord.forgotYourPassword', 'Remembered your password and want to login instead?')}\r\n \r\n \r\n \r\n {t('common.sending', 'Sending...')}}>\r\n {t('forgottenPassword.send', 'Send password reset email')}\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 { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Send a password reset email.\r\n */\r\nexport function useSendPasswordResetEmailCallback(): [(email: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (email: string) => {\r\n return await accountService.sendPasswordResetEmail(email);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner, Button, FormText, Row, Col, Card, CardHeader, CardBody } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { useResetPasswordCallback } from \"../../api/account\";\r\nimport { ResetPassword as ResetPasswordModel } from '../../api/account/models/ResetPassword';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { Background } from \"../shared/background/Background\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\n\r\n/**\r\n * Reset the password (after following a unique link from an email).\r\n */\r\nexport const ResetPassword = () => {\r\n const { t } = useTranslation();\r\n const [hasResetPassword, setHasResetPassword] = React.useState(false);\r\n const [resetPassword, { isExecuting: isResettingPassword, errors: resetPasswordErrors }] = useResetPasswordCallback();\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n\r\n const { model, change } = useChanges({ password: '', confirmPassword: '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n password: () => !model.password ? t('resetPassword.passwordRequired', 'Password is required')\r\n : checkPassword(model.password).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.password ? t('register.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n \r\n // Render the UI.\r\n //\r\n\r\n // If we're not ready, show the loading indicator.\r\n if (!model) {\r\n return ();\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('resetPassword.resetPasswordHeading', 'Reset Password')}

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

\r\n {t('resetPassword.thanksForConfirmingEmail', 'Thanks for confirming your email. You can now set a new password.')}\r\n

\r\n\r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const ok = await resetPassword(model.password);\r\n setHasResetPassword(ok);\r\n }}>\r\n {\r\n resetPasswordErrors ? (\r\n \r\n {resetPasswordErrors}\r\n \r\n ) : null\r\n }\r\n {\r\n hasResetPassword ? (\r\n \r\n \r\n \r\n {t('resetPassword.passwordHasBeenReset', 'Your password has been reset.')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : null\r\n }\r\n\r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {t('resetPassword.resetting', 'Resetting password...')}}>\r\n {t('resetPassword.reset', 'Reset password')}\r\n \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 { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to reset the password of an account using a unique URL from an email as authorization.\r\n */\r\nexport function useResetPasswordCallback(): [(password: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the code from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (password: string) => {\r\n return await accountService.resetPassword({ userId: userId, code: code, password: password });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Alert, Button, Card, CardBody, CardHeader, Col, Row } from \"reactstrap\";\r\nimport { useConfirmEmailCallback } from \"../../api/account\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { Background } from \"../shared/background/Background\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\n\r\n/**\r\n * Confirm an email address for an account using a unique link included in the email. \r\n */\r\nexport const ConfirmEmail = () => {\r\n const { t } = useTranslation();\r\n const [emailConfirmed, setEmailConfirmed] = React.useState(false);\r\n const [confirmEmail, { errors: confirmEmailErrors }] = useConfirmEmailCallback();\r\n\r\n // Trigger the email confirmation on page load.\r\n React.useEffect(() => {\r\n (async () => {\r\n if (!emailConfirmed) {\r\n const ok = await confirmEmail();\r\n setEmailConfirmed(ok);\r\n }\r\n })();\r\n }, [confirmEmail, setEmailConfirmed, emailConfirmed]);\r\n\r\n // Render the UI.\r\n // \r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n confirmEmailErrors ? t('confirmEmail.confirmEmailFailureHeading', 'Sorry we cannot confirm your email using this code')\r\n : emailConfirmed ? t('confirmEmail.confirmEmailSuccessHeading', 'Thanks for confirming your email')\r\n : ()\r\n }\r\n

\r\n
\r\n \r\n \r\n \r\n {confirmEmailErrors}\r\n \r\n \r\n \r\n {/**/}\r\n {/* {t('confirmEmail.thankYouForConfirming', 'Thank you for confirming your email. You account setup is now complete.')}*/}\r\n {/**/}\r\n

\r\n {t('confirmEmail.thankYouForConfirming', 'Thank you for confirming your email. You account setup is now complete.')}\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \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 { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Confirm an email address.\r\n */\r\nexport function useConfirmEmailCallback(): [() => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async () => {\r\n return await accountService.confirmEmail({ userId: userId, code: code });\r\n }, [accountService, userId, code]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Alert, Button, Card, CardBody, CardHeader, Col, Row } from \"reactstrap\";\r\nimport { useConfirmEmailChangeCallback } from \"../../api/account\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LinkContainer } from \"react-router-bootstrap\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { Background } from \"../shared/background/Background\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\n\r\n/**\r\n * Confirm an email address change for an account using a unique link included in the email. \r\n */\r\nexport const ConfirmEmailChange = () => {\r\n const { t } = useTranslation();\r\n const [emailConfirmed, setEmailConfirmed] = React.useState(false);\r\n const [confirmEmail, { errors: confirmEmailErrors }] = useConfirmEmailChangeCallback();\r\n\r\n // Trigger the email confirmation on page load.\r\n React.useEffect(() => {\r\n (async () => {\r\n if (!emailConfirmed) {\r\n const ok = await confirmEmail();\r\n setEmailConfirmed(ok);\r\n }\r\n })();\r\n }, [confirmEmail, setEmailConfirmed, emailConfirmed]);\r\n\r\n // Render the UI.\r\n // \r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n confirmEmailErrors ? t('confirmEmailChange.confirmEmailChangeFailureHeading', 'Sorry we cannot confirm your change of email using this code')\r\n : emailConfirmed ? t('confirmEmailChange.confirmEmailChangeSuccessHeading', 'Thank you for confirming your change of email.')\r\n : ()\r\n }\r\n

\r\n
\r\n \r\n \r\n \r\n {confirmEmailErrors}\r\n \r\n \r\n \r\n {/**/}\r\n {/* <>{t('confirmEmailChange.thankYouForConfirming', 'Thank you for confirming your change of email. We\\'ve swapped that over for you.')} */}\r\n {/**/}\r\n

\r\n {t('confirmEmailChange.thankYouForConfirming', 'Thank you for confirming your change of email. We\\'ve swapped that over for you.')}\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \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 { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Confirm an email address.\r\n */\r\nexport function useConfirmEmailChangeCallback(): [() => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the return url from the query string.\r\n const { userId, code, email } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n const email = params.get('email') ?? params.get('Email') ?? '';\r\n return { userId, code, email };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async () => {\r\n return await accountService.confirmEmailChange({ userId: userId, code: code, email: email });\r\n }, [accountService, userId, code, email]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, FormGroup, Label, FormText, Spinner, Row, Col, CardHeader, Card, CardBody } from \"reactstrap\";\r\nimport { useConfirmInviteCallback } from \"../../api/account\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { ConfirmInvite as ConfirmInviteModel } from \"../../api/account/models/ConfirmInvite\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { useHistory } from \"react-router\";\r\nimport { ConfirmInviteProfileDetails } from \"../profiles/ConfirmInviteProfileDetails\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { Background } from \"../shared/background/Background\";\r\n\r\n/**\r\n * Confirm an email address and provide registration details as part of an invite.\r\n */\r\nexport const ConfirmInvite = () => {\r\n const { t } = useTranslation();\r\n const [confirmInvite, { isExecuting: isConfirmingInvite, errors: confirmInviteErrors }] = useConfirmInviteCallback();\r\n const { model, change } = useChanges({ password: '', confirmPassword: '' });\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n const history = useHistory();\r\n\r\n /**\r\n * Validate the model before trying to use it.\r\n */\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n password: () => !model.password ? t('confirmInvite.passwordRequired', 'Password is required')\r\n : checkPassword(model.password).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.password ? t('confirmInvite.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n /**\r\n * Perform a login by and handle the result.\r\n */\r\n const [isDoingFullPageRedirect, setIsDoingFullPageRedirect] = React.useState(false);\r\n const performRegister = React.useCallback(async (): Promise => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const result = await confirmInvite(model);\r\n\r\n if (result) {\r\n if (result.requiresTwoFactor) {\r\n history.push(`/account/loginWithTwoFactor?returnUrl=${encodeURIComponent(result.returnUrl)}`);\r\n }\r\n\r\n // Redirect the whole page (not just the react app) as its likely the returnUrl is handled on the server.\r\n if (result.succeeded) {\r\n // Redirect the whole page (not just react) to the returnUrl to let the server handle as well as the client.\r\n if (!result.requiresEmailConfirmation && !result.requiresTwoFactor) {\r\n setIsDoingFullPageRedirect(true);\r\n window.location.href = result.returnUrl;\r\n }\r\n }\r\n }\r\n }, [confirmInvite, model, history, validate, setIsDoingFullPageRedirect]);\r\n\r\n\r\n // Render the UI.\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {t('confirmInvite.finishRegistrationHeading', 'Register your account')}\r\n

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

\r\n {t('confirmInvite.thanksForAccepting', 'Thanks for accepting the invite. You can now set a password to finish your account creation.')}\r\n

\r\n\r\n
{ e.preventDefault(); await performRegister(); }}>\r\n \r\n\r\n \r\n\r\n \r\n \r\n change({ password: e.currentTarget.value })} onBlur={e => validate('password')} validationErrors={validationErrors['password']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n {t('confirmInvite.registering', 'Registering...')}}>\r\n {t('confirmInvite.register', 'Register')}\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 { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\nimport { RegisterResult } from \"./AccountService\";\r\n\r\n/**\r\n * Confirm an invite and set a password.\r\n */\r\nexport function useConfirmInviteCallback(): [(model: { password: string }) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n // Get the details from the query string.\r\n const { userId, code } = React.useMemo(() => {\r\n const params = new URLSearchParams(window.location.search);\r\n const userId = params.get('userId') ?? params.get('UserId') ?? '';\r\n const code = params.get('code') ?? params.get('Code') ?? '';\r\n return { userId, code };\r\n }, []);\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: { password: string }) => {\r\n return await accountService.confirmInvite({ userId: userId, code: code, password: model.password });\r\n }, [accountService, userId, code]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { userQuery, userQueryVariables } from '../generated/userQuery';\r\nimport { userFieldsFragment } from '../models/User';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a User from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useUser(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need from the API.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query userQuery ($id: ID!) {\r\n model: user(id: $id) {\r\n ...userFields\r\n }\r\n }\r\n\r\n ${userFieldsFragment}\r\n `,\r\n {\r\n variables: { id: id ?? Guid.empty },\r\n pollInterval: options.pollInterval,\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { ChangeEmail as ChangeEmailModel } from '../../api/account/models/ChangeEmail';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useChangeEmailCallback, useResendConfirmationEmailCallback } from \"../../api/account\";\r\nimport { useUser } from \"../../api/main/users/useUser\";\r\nimport { useAuthenticatedState } from \"../../api/api-authorization/useAuthenticatedState\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\n\r\n/**\r\n * Change the logged in user's email.\r\n */\r\nexport const ChangeEmail = () => {\r\n const { t } = useTranslation();\r\n const { user } = useAuthenticatedState({ includeUser: true });\r\n const { data: { model: storeModel, }, isLoading, errors: loadErrors, refresh: refreshUserModel } = useUser(user?.sub ?? '', { lazy: true });\r\n\r\n const [changeEmail, { isExecuting: isChangingPassword, errors: changeEmailErrors }] = useChangeEmailCallback();\r\n const [hasSentEmail, setHasSentEmail] = React.useState(false);\r\n\r\n const [resendConfirmationEmail, { isExecuting: isResendingConfirmationEmail, errors: resendConfirmationEmailErrors }] = useResendConfirmationEmailCallback();\r\n const [hasSentConfirmationEmail, setHasSentConfirmationEmail] = React.useState(false);\r\n\r\n const { model, change } = useChanges({ newEmail: storeModel?.email ?? '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n newEmail: () => !model.newEmail ? t('changeEmail.newEmailRequired', 'Email is required')\r\n : storeModel && storeModel.email === model.newEmail ? t('changeEmail.newEmailMatchesOldEmail', 'Your new email is the same as your old email and so does not need to go through an email update process.')\r\n : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n // Only load the user model once we know the user id.\r\n React.useEffect(() => {\r\n if (!user) {\r\n return;\r\n }\r\n\r\n refreshUserModel();\r\n }, [user, refreshUserModel]);\r\n \r\n // Render the UI.\r\n //\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const ok = await changeEmail(model.newEmail);\r\n setHasSentEmail(ok);\r\n }}>\r\n \r\n\r\n {\r\n hasSentEmail ? (\r\n \r\n <>{t('changeEmail.emailHasBeenSent', 'Confirmation link to change email sent. Please check your email to confirm.')} \r\n { e.preventDefault(); await changeEmail(model.newEmail); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n {\r\n hasSentConfirmationEmail ? (\r\n \r\n <>{t('login.confirmationEmailHasBeenResent', 'Confirmation link to verify the email for this account has been resent. Please check your email to confirm.')} \r\n { e.preventDefault(); await resendConfirmationEmail(storeModel?.email ?? model.newEmail); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n\r\n \r\n \r\n change({ newEmail: e.currentTarget.value })} onBlur={e => validate('newEmail')} validationErrors={validationErrors['newEmail']} />\r\n {\r\n storeModel && !storeModel.emailConfirmed && model.newEmail === storeModel.email ? (\r\n
\r\n { e.preventDefault(); await resendConfirmationEmail(model.newEmail); setHasSentConfirmationEmail(true); }}\r\n isExecuting={isResendingConfirmationEmail}\r\n executingChildren={<>{t('common.resendingEmail', 'Resending email...')}}>\r\n {t('changeEmail.resendVerificationEmail', 'Resend verification email')}\r\n \r\n
\r\n ): null\r\n }\r\n
\r\n\r\n \r\n {t('changeEmail.updatingEmail', 'Updating email...')}}>\r\n {t('changeEmail.updateEmail', 'Update email')}\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import './banner.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Container } from 'reactstrap';\r\n\r\nexport interface BannerProps {\r\n children?: React.ReactNode,\r\n className?: string,\r\n fluid?: boolean,\r\n}\r\n\r\n/**\r\n * Banner to show title and toolbars at the top of pages.\r\n * @param props\r\n */\r\nexport const Banner = (props: BannerProps) => {\r\n const { children, className, fluid } = props;\r\n\r\n return (\r\n
\r\n \r\n {children}\r\n \r\n
\r\n );\r\n};","import './pillsNavBar.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Nav } from 'reactstrap';\r\n\r\nexport interface PillsNavBarProps {\r\n className?: string,\r\n style?: React.CSSProperties,\r\n children?: React.ReactNode,\r\n justified?: boolean,\r\n textColor?: 'inherit' | 'white'\r\n}\r\n\r\n/**\r\n * Navigation of NavItems via styled pills.\r\n * @param props\r\n */\r\nexport const PillsNavBar = (props: PillsNavBarProps) => {\r\n const {\r\n className,\r\n style,\r\n children,\r\n justified,\r\n textColor = 'inherit',\r\n } = props;\r\n\r\n return (\r\n \r\n );\r\n};","import { useTranslation } from \"react-i18next\";\r\nimport { NavItem, NavLink } from \"reactstrap\";\r\nimport { NavLinkTrackActive } from \"../shared/NavLinkTrackActive\";\r\n\r\n/**\r\n * Navigation under the Profile area.\r\n */\r\nexport const ProfileNavigation = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n \r\n \r\n {t('profile.profile', 'Profile')}\r\n \r\n \r\n \r\n \r\n {t('profile.changeEmail', 'Email')}\r\n \r\n \r\n \r\n \r\n {t('profile.changePassword', 'Change Password')}\r\n \r\n \r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { profileQuery, profileQueryVariables } from '../generated/profileQuery';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\nexport interface ProfileOptions extends AsyncLoadOptions {\r\n isUserId?: boolean,\r\n}\r\n\r\n/**\r\n * Get a Profile from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useProfile(id: string | undefined | null, options: ProfileOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query profileQuery ($id: ID, $userId: ID) {\r\n model: profile(id: $id, userId: $userId) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: !options.isUserId ? id ?? Guid.empty : null,\r\n userId: options.isUserId ? id ?? Guid.empty : null\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import * as React from 'react';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { AsyncActionStatus } from '../abstractStore';\r\n\r\n/**\r\n * Options for saiving store data. \r\n */\r\nexport interface SaveInStoreOptions {\r\n beforeSaving?: (id: TId, changes: Partial, isCreate: boolean) => void,\r\n afterSaving?: (id: TId, changes: Partial, isCreate: boolean) => void,\r\n}\r\n\r\n/**\r\n * Hook to give us a save method that can cope with creating or updating the store as appropriate.\r\n */\r\nexport function useSaveInStore(\r\n createDataStore: [(model: T) => Promise, AsyncActionStatus],\r\n updateDataStore: [(id: TId, model: Partial) => Promise, AsyncActionStatus],\r\n options?: SaveInStoreOptions\r\n)\r\n : [(id: TId, changes: Partial, isCreate: boolean) => Promise, AsyncActionStatus]\r\n{\r\n\r\n const [create, { isExecuting: isCreating, errors: createErrors }] = createDataStore;\r\n const [update, { isExecuting: isUpdating, errors: updateErrors }] = updateDataStore;\r\n const [save, { isExecuting: isSaving, errors: saveErrors }] = useAsyncCallback(async (id: TId, changes: Partial, isCreate: boolean) => {\r\n // Run the pre-save option.\r\n if (options && options.beforeSaving) {\r\n options.beforeSaving(id, changes, isCreate);\r\n } \r\n\r\n // Create or update the item in the store.\r\n if (isCreate) {\r\n await create(changes as T);\r\n } else {\r\n await update(id, changes);\r\n }\r\n\r\n // Run the post-save option.\r\n if (options && options.afterSaving) {\r\n options.afterSaving(id, changes, isCreate);\r\n } \r\n }, [create, update, options]);\r\n\r\n // Combine errors from all sources into a single errors result.\r\n const errors = React.useMemo(() => {\r\n let ret = [];\r\n if (createErrors) {\r\n ret.push(createErrors);\r\n }\r\n if (updateErrors) {\r\n ret.push(updateErrors);\r\n }\r\n if (saveErrors) {\r\n ret.push(saveErrors);\r\n }\r\n\r\n if (ret.length === 0) {\r\n return undefined;\r\n }\r\n\r\n if (ret.length === 1) {\r\n return ret[0];\r\n }\r\n\r\n return ret;\r\n }, [createErrors, updateErrors, saveErrors]);\r\n\r\n return [save, { isExecuting: isSaving || isCreating || isUpdating, errors: errors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ProfileCreateInput } from '../generated/globalTypes';\r\nimport { createProfileMutation, createProfileMutationVariables } from '../generated/createProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to create a Profile in the store.\r\n */\r\nexport function useCreateProfileCallback(): [(model: ProfileCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createProfileMutation ($model: ProfileCreateInput!) {\r\n createProfile(model: $model) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ProfileCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ProfileUpdateInput } from '../generated/globalTypes';\r\nimport { updateProfileMutation, updateProfileMutationVariables } from '../generated/updateProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to update a Profile in the store.\r\n */\r\nexport function useUpdateProfileCallback(): [(id: string, model: ProfileUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateProfileMutation ($model: ProfileUpdateInput!) {\r\n updateProfile(model: $model) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: ProfileUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { ProfileCreateInput, ProfileUpdateInput } from '../generated/globalTypes';\r\nimport { useSaveInStore, SaveInStoreOptions } from '../../../shared/useSaveInStore';\r\nimport { useCreateProfileCallback } from './useCreateProfileCallback';\r\nimport { useUpdateProfileCallback } from './useUpdateProfileCallback';\r\nimport { Profile } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to save a Profile in the store using either a create or update.\r\n */\r\nexport function useSaveProfileCallback(options: SaveInStoreOptions = {}) {\r\n const [_create, createStatus] = useCreateProfileCallback();\r\n const create = React.useCallback((model: Partial) => _create(model as ProfileCreateInput), [_create]);\r\n\r\n const [_update, updateStatus] = useUpdateProfileCallback();\r\n const update = React.useCallback((id: string, changes: Partial) => _update(id, changes as ProfileUpdateInput), [_update]);\r\n\r\n return useSaveInStore(\r\n [create, createStatus],\r\n [update, updateStatus],\r\n options\r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport { Row, Col, Form, FormGroup, Label, Spinner, Alert } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\"\r\nimport { useAuthenticatedState } from \"../../api/api-authorization/useAuthenticatedState\";\r\nimport { LoadingIndicator } from \"../shared/LoadingIndicator\";\r\nimport { Guid } from \"guid-string\";\r\nimport { useProfile } from \"../../api/main/profiles/useProfile\";\r\nimport { useSaveProfileCallback } from \"../../api/main/profiles/useSaveProfileCallback\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\n\r\n/**\r\n * Allow the user to change their personal details on their profile.\r\n */\r\nexport const ProfileDetails = () => {\r\n const { t } = useTranslation();\r\n const [hasSaved, setHasSaved] = React.useState(false);\r\n const [isCreate, setIsCreate] = React.useState(false);\r\n const { user } = useAuthenticatedState({ includeUser: true});\r\n const { data: { model: storeModel, }, isLoading, errors: loadErrors, refresh: refreshProfile } = useProfile(user?.sub ?? '', {\r\n isUserId: true,\r\n lazy: true,\r\n onCompleted: (data) => {\r\n // If we don't find a record in the database, create one ready to save.\r\n if (!data) {\r\n setIsCreate(true);\r\n change({ id: Guid.newGuid(), userId: user?.sub ?? '' });\r\n }\r\n } });\r\n const { model, change, changes } = useChanges(storeModel);\r\n const [save, { isExecuting: isSaving, errors: saveErrors }] = useSaveProfileCallback({ afterSaving: () => setIsCreate(false) })\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n firstName: () => !model.firstName ? t('profileDetails.firstNameRequired', 'First name is required') : '',\r\n lastName: () => !model.lastName ? t('profileDetails.lastNameRequired', 'Last name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n // Only load the profile once we know the user.\r\n React.useEffect(() => {\r\n if (!user) {\r\n return;\r\n }\r\n\r\n refreshProfile();\r\n }, [user, refreshProfile]);\r\n\r\n const [saveForm] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n await save(model.id, changes, isCreate);\r\n\r\n setHasSaved(true);\r\n }, [save, model, setHasSaved, validate, isCreate, changes]);\r\n\r\n\r\n // Render the UI.\r\n //\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n
{ e.preventDefault(); await saveForm(); }}>\r\n \r\n\r\n {\r\n hasSaved ? (\r\n \r\n {t('profileDetails.hasSaved', 'Your details have been updated.')}\r\n \r\n ): null\r\n }\r\n\r\n \r\n \r\n \r\n \r\n change({ firstName: e.currentTarget.value })} onBlur={e => validate('firstName')} validationErrors={validationErrors['firstName']} />\r\n \r\n \r\n \r\n \r\n \r\n change({ lastName: e.currentTarget.value })} onBlur={e => validate('lastName')} validationErrors={validationErrors['lastName']} />\r\n \r\n \r\n \r\n\r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import { Redirect } from \"react-router\";\r\nimport { RouteEntry } from \"../../shared/routes\";\r\nimport { ChangeEmail } from \"./ChangeEmail\";\r\nimport { ChangePassword } from \"./ChangePassword\";\r\nimport { Profile } from \"./Profile\";\r\nimport { ProfileDetails } from \"./ProfileDetails\";\r\n\r\nexport const profileRoutes: Array = [\r\n { path: '/profile', component: Profile, authorize: true },\r\n];\r\n\r\nexport const profileTabRoutes: Array = [\r\n { path: '/profile', exact: true, component: () => , authorize: true },\r\n { path: '/profile/details', exact: true, component: ProfileDetails, authorize: true },\r\n { path: '/profile/changeEmail', exact: true, component: ChangeEmail, authorize: true },\r\n { path: '/profile/changePassword', exact: true, component: ChangePassword, authorize: true },\r\n];\r\n\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { Banner } from \"../shared/Banner\";\r\nimport { Background } from \"../shared/background/Background\";\r\nimport { profileTabRoutes } from \"./routes\";\r\nimport { AppRoutes } from \"../shared/AppRoutes\";\r\nimport { PillsNavBar } from \"../shared/pillsNavBar/PillsNavBar\";\r\nimport { ProfileNavigation } from \"./ProfileNavigation\";\r\nimport { Col, Row } from \"reactstrap\";\r\n\r\n/**\r\n * Allow the user to change their profile.\r\n */\r\nexport const Profile = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('profile.heading', '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 );\r\n};\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to change the email of the current user..\r\n */\r\nexport function useChangeEmailCallback(): [(newEmail: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (newEmail: string) => {\r\n return await accountService.changeEmail({ newEmail: newEmail });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from \"react\";\r\nimport { Form, Alert, FormGroup, Label, Spinner, FormText } from \"reactstrap\";\r\nimport { useChanges } from \"../../shared/useChanges\";\r\nimport { useValidatorCallback } from \"pojo-validator-react\";\r\nimport { ValidatedInput } from \"pojo-validator-reactstrap\";\r\nimport { ButtonAsync } from \"reactstrap-buttonasync\";\r\nimport { ChangePassword as ChangePasswordModel } from '../../api/account/models/ChangePassword';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { AlertOnErrors } from \"../../shared/alertOnErrors\";\r\nimport { useChangePasswordCallback } from \"../../api/account\";\r\nimport { usePasswordValidation } from \"../../shared/passwordValidation\";\r\nimport { FormButtons } from \"../shared/FormButtons\";\r\nimport { MainContainer } from \"../shared/MainContainer\";\r\n\r\n/**\r\n * Change the logged in user's password.\r\n */\r\nexport const ChangePassword = () => {\r\n const { t } = useTranslation();\r\n const [hasChangedPassword, setHasChangedPassword] = React.useState(false);\r\n const [changePassword, { isExecuting: isChangingPassword, errors: changePasswordErrors }] = useChangePasswordCallback();\r\n const { checkPassword, passwordRequirements } = usePasswordValidation();\r\n\r\n const { model, change } = useChanges({ currentPassword: '', newPassword: '', confirmPassword: '' });\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n if (!model) {\r\n return;\r\n }\r\n\r\n const rules = {\r\n currentPassword: () => !model.currentPassword ? t('changePassword.currentPasswordRequred', 'Current password is required'): '',\r\n newPassword: () => !model.newPassword ? t('changePassword.newPasswordRequired', 'Password is required')\r\n : checkPassword(model.newPassword).errorDescription,\r\n confirmPassword: () => model.confirmPassword !== model.newPassword ? t('changePassword.passwordsDoNotMatch', 'The password and confirmation password do not match') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n \r\n // Render the UI.\r\n //\r\n\r\n return (\r\n \r\n
{\r\n e.preventDefault();\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n const ok = await changePassword(model.currentPassword, model.newPassword);\r\n setHasChangedPassword(ok);\r\n }}>\r\n \r\n\r\n {\r\n hasChangedPassword ? (\r\n \r\n {t('changePassword.passwordHasBeenChanged', 'Your password has been changed.')}\r\n \r\n ) : null\r\n }\r\n\r\n \r\n \r\n change({ currentPassword: e.currentTarget.value })} onBlur={e => validate('currentPassword')} validationErrors={validationErrors['currentPassword']} />\r\n \r\n \r\n \r\n change({ newPassword: e.currentTarget.value })} onBlur={e => validate('newPassword')} validationErrors={validationErrors['newPassword']} />\r\n \r\n {passwordRequirements}\r\n \r\n \r\n \r\n \r\n change({ confirmPassword: e.currentTarget.value })} onBlur={e => validate('confirmPassword')} validationErrors={validationErrors['confirmPassword']} />\r\n \r\n \r\n {t('changePassword.updatingPassword', 'Updating password...')}}>\r\n {t('changePassword.updatePassword', 'Update password')}\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to change the password of the current user..\r\n */\r\nexport function useChangePasswordCallback(): [(currentPassword: string, newPassword: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (currentPassword: string, newPassword: string) => {\r\n return await accountService.changePassword({ currentPassword: currentPassword, newPassword: newPassword });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from 'react';\r\nimport { useLocation } from \"react-router\";\r\n\r\n/**\r\n * Hook to get the URLSearchParams from the current or passed in location.\r\n * @param search\r\n */\r\nexport function useURLSearchParams(search?: string) {\r\n const location = useLocation();\r\n return React.useMemo(() => new URLSearchParams(search ?? location?.search ?? ''), [search, location]);\r\n}","import * as React from 'react';\r\nimport { useURLSearchParams } from \"./useURLSearchParams\";\r\nimport { useHistory, useLocation } from \"react-router\";\r\n\r\n/**\r\n * Replace the Search params in the browser using history.replace().\r\n * @param name name of the Query param to return the value of.\r\n */\r\nexport function useReplaceSearchParamsEffect(changes: T): void {\r\n const location = useLocation();\r\n const params = useURLSearchParams();\r\n const history = useHistory();\r\n\r\n const url = React.useMemo(() => {\r\n for (let key in changes) {\r\n\r\n // Make sure we treat undefined, null, and empty strings the same to avoid potentially infinate rerenders\r\n // if an empty string is passed in to changes.\r\n let changesValue = changes[key] ?? '';\r\n let paramsValeue = params.get(key) ?? '';\r\n\r\n if (changesValue === paramsValeue) {\r\n continue;\r\n }\r\n\r\n if (!changesValue) {\r\n params.delete(key);\r\n } else {\r\n params.set(key, changesValue);\r\n }\r\n }\r\n\r\n return `${location.pathname}?${params}${location.hash}`;\r\n }, [changes, location, params]);\r\n\r\n // If we have changed the url because of a parameter, apply it with history.replace().\r\n React.useEffect(() => {\r\n if (!url) {\r\n return;\r\n }\r\n\r\n history.replace(url);\r\n }, [url, history]);\r\n}","import * as React from 'react';\r\nimport { useURLSearchParams } from \"./useURLSearchParams\";\r\n\r\n\r\n/**\r\n * Hook to get the value of specific search parameters using deconstruction.\r\n * @param name name of the Query param to return the value of.\r\n */\r\nexport function useSearchParams(): { [key: string]: string | null } {\r\n const params = useURLSearchParams();\r\n const deconstructionObject = React.useMemo(() => {\r\n let ret = {};\r\n params.forEach((value, key) => {\r\n ret = {\r\n ...ret,\r\n [key]: value\r\n }\r\n });\r\n return ret;\r\n }, [params]);\r\n\r\n return deconstructionObject;\r\n}","import { Redirect } from 'react-router';\r\nimport { isNullOrUndefined } from 'util';\r\nimport { useAuthenticatedState } from '../../api/api-authorization/useAuthenticatedState';\r\nimport { useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\n\r\n/**\r\n * Default / home page.\r\n */\r\nexport const Home = () => {\r\n // If we have a redirect URL on the query string redirect there.\r\n const { redirectUrl } = useSearchParams();\r\n\r\n const { isAuthenticated } = useAuthenticatedState();\r\n\r\n // If we don't know if we are logged in or not, wait until we do.\r\n if (isNullOrUndefined(isAuthenticated)) {\r\n return ();\r\n }\r\n\r\n // If we are not logged in, redirect to the start page.\r\n if (!isAuthenticated) {\r\n return ();\r\n }\r\n\r\n // If we are logged in, redirect to the user's dashboard.\r\n return ();\r\n};","import { TFunction } from \"i18next\";\r\n\r\n/**\r\n * Base Values\r\n */\r\nexport enum BaseValueType {\r\n CO2UnitConversion = \"CO2UnitConversion\",\r\n TargetReturnRatios = \"TargetReturnRatios\",\r\n}\r\n\r\n\r\n/**\r\n * Return base value fixed id.\r\n * @param baseValue\r\n */\r\nexport function baseValueId(baseValue: BaseValueType | undefined): string | undefined{\r\n switch (baseValue) {\r\n case BaseValueType.CO2UnitConversion: return '28D15C72-5568-4396-AB25-7110E7F2AAD7';\r\n case BaseValueType.TargetReturnRatios: return '434CEFBB-A38F-410C-8195-56C651450FB8';\r\n }\r\n}\r\n\r\n/**\r\n * Return base value display name.\r\n * @param baseValue\r\n * @param t\r\n */\r\nexport function baseValuedisplayName(baseValue: BaseValueType | undefined, t: TFunction): string | undefined{\r\n switch (baseValue) {\r\n case BaseValueType.CO2UnitConversion: return t('baseValueTypeDisplayName.cO2Savings', 'CO2 savings');\r\n case BaseValueType.TargetReturnRatios: return t('baseValueDisplayName.targetReturnRatios', 'Target return ratios');\r\n }\r\n}\r\n\r\n/**\r\n * Return base value from id.\r\n * @param requestedBaseValueId\r\n * @param t\r\n */\r\nexport function baseValueFromId(requestedBaseValueId: string): BaseValueType | undefined {\r\n switch (requestedBaseValueId) {\r\n case baseValueId(BaseValueType.CO2UnitConversion): return BaseValueType.CO2UnitConversion;\r\n case baseValueId(BaseValueType.TargetReturnRatios): return BaseValueType.TargetReturnRatios;\r\n default: return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Return base value type from id.\r\n * @param requestedBaseValueId\r\n * @param t\r\n */\r\nexport function baseValueTypeFromId(requestedBaseValueId: string | undefined, t: TFunction): string | undefined {\r\n switch (requestedBaseValueId) {\r\n case baseValueId(BaseValueType.CO2UnitConversion): return t('baseValueType.cO2Savings', 'CO2UnitConversion');\r\n case baseValueId(BaseValueType.TargetReturnRatios): return t('baseValueType.targetReturnRatios', 'TargetReturnRatios');\r\n default: return '';\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Return base value display name from id.\r\n * @param requestedBaseValueId\r\n * @param t\r\n */\r\nexport function baseValueDisplayNameFromId(requestedBaseValueId: string | undefined, t: TFunction): string | undefined {\r\n switch (requestedBaseValueId) {\r\n case baseValueId(BaseValueType.CO2UnitConversion): return t('baseValueTypeDisplayName.cO2Savings', 'CO2 savings');\r\n case baseValueId(BaseValueType.TargetReturnRatios): return t('baseValueTypeDisplayName.targetReturnRatios', 'Target return ratios');\r\n default: return '';\r\n }\r\n}\r\n\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { Home } from \"./Home\";\r\n\r\nexport const homeRoutes: Array = [\r\n { path: '/', exact: true, component: Home },\r\n];\r\n","import { NavItem, NavLink } from 'reactstrap';\r\nimport { AuthorizeContainer } from '../../shared/authorizeRoute';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { NavLinkTrackActive } from '../shared/NavLinkTrackActive';\r\nimport { IdentityRoles } from '../../configure/security/IdentityRoles';\r\nimport { SidebarNavTitle } from '../../shared/sidebarNav';\r\nimport { BaseValueType, baseValueId } from '../../api/main/models/codeOnly/BaseValue';\r\n\r\n/**\r\n * Administration navigation menu for the app. \r\n */\r\nexport const AdministrationNavigation = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n \r\n \r\n {t('administrationNavigation.dashboardTitle', 'Financial models')}\r\n \r\n \r\n \r\n \r\n <> {t('administrationNavigation.financialModels', 'Financial models')}\r\n \r\n \r\n\r\n \r\n {t('administrationNavigation.usersTitle', 'User management')}\r\n \r\n\r\n\r\n \r\n \r\n \r\n <> {t('administrationNavigation.registeredUsers', 'Registered users')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n <> {t('administrationNavigation.administrators', 'Administrators')}\r\n \r\n \r\n\r\n \r\n {t('administrationNavigation.baseData', 'Base data')}\r\n \r\n\r\n \r\n \r\n \r\n <> {t('administrationNavigation.cO2Savings', 'CO2 savings')}\r\n \r\n \r\n\r\n \r\n \r\n \r\n <> {t('administrationNavigation.targetReturnRatios', 'Target return ratios')}\r\n \r\n \r\n\r\n \r\n \r\n );\r\n};\r\n","import './sidebarRequired.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Helmet } from 'react-helmet-async';\r\n\r\nexport interface SidebarRequiredProps {\r\n children?: React.ReactNode,\r\n}\r\n\r\n/**\r\n * Component that shows the sidebr if it is required/recommended for the screensize.\r\n */\r\nexport const SidebarRequired = (props: SidebarRequiredProps) => {\r\n const { children } = props;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { AdministrationNavigation } from \"./AdministrationNavigation\";\r\nimport { AdministrationHome } from \"./AdministrationHome\";\r\nimport { SidebarRequired } from \"../shared/SidebarRequired\";\r\nimport { IdentityRoles } from \"../../configure/security/IdentityRoles\";\r\n\r\nexport const administrationRoutes: Array = [\r\n { path: '/administration', exact: true, component: AdministrationHome, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n\r\nexport const administrationSidebarRoutes: Array = [\r\n { path: '/administration', component: () => , authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import { Redirect } from 'react-router';\r\n\r\n/**\r\n * Default Administration home page.\r\n */\r\nexport const AdministrationHome = () => {\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};","import './searchInput.scss';\r\nimport * as React from 'react';\r\nimport { Input, InputGroup, InputGroupAddon, Button, InputProps } from 'reactstrap';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface SearchInputProps extends InputProps {\r\n onSearchButtonClick?: () => void,\r\n children?: React.ReactNode,\r\n}\r\n\r\n/**\r\n * Input that is hooked up for searching as the user types, by introducing an appropriate delay before raising the onSearch event.\r\n */\r\nexport const SearchInput = (props: SearchInputProps) => {\r\n const { type, placeholder, className, style, onSearchButtonClick, children, ...rest } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n {\r\n // When the user presses enter, trigger a click on the search button.\r\n if (e.charCode === 13) {\r\n if (onSearchButtonClick) {\r\n onSearchButtonClick();\r\n }\r\n }\r\n }}\r\n {...rest} />\r\n \r\n \r\n \r\n {children}\r\n \r\n );\r\n};","import './noResultsFound.scss';\r\n\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\r\n\r\nexport interface NoResultsFoundProps {\r\n className?: string,\r\n search?: string,\r\n children?: React.ReactNode,\r\n icon?: IconProp,\r\n}\r\n\r\n/**\r\n * Component to show when a search or query returned no results.\r\n */\r\nexport const NoResultsFound = (props: NoResultsFoundProps) => {\r\n const {\r\n className,\r\n search,\r\n children,\r\n icon\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Otherwise render th default contents.\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {\r\n children ? children\r\n : (\r\n

\r\n {\r\n search ?\r\n t('notResultsFound.nothingMatchedSearch', 'Sorry there were no matches for \"{{search}}.\"', { search: search })\r\n : t('notResultsFound.nothingFound', 'Sorry there is nothing to show you here yet.')\r\n }\r\n

\r\n )\r\n }\r\n
\r\n );\r\n};","import './stickyToolbar.scss';\r\n\r\nimport * as React from 'react';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { Container } from 'reactstrap';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\n\r\nexport interface StickyToolbarProps {\r\n className?: string,\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Container for a toolbar that sticks to the top of the screen when its scrolled off the screen.\r\n * \r\n * NOTE Some code here is specific to the layout rather than the overall functionality. Namely:\r\n * 1. The use of the \"main\" class when top-toolbar-stuck which is used to make sure available margins are kept in sync with the
element\r\n * during sidebar states.\r\n * 2. The topOffset=\"\" which is used to ensure the triggering happens when we would move behind the fixed nav header.\r\n * \r\n * If you want to use this code elsewhere, you will likely need to tweak these values.\r\n */\r\nexport const StickyToolbar = (props: StickyToolbarProps) => {\r\n const [isStuck, setIsStuck] = React.useState(false);\r\n const { className, children } = props;\r\n\r\n return (\r\n <>\r\n setIsStuck(false)} onLeave={() => setIsStuck(true)} />\r\n\r\n \r\n
\r\n \r\n {children}\r\n \r\n
\r\n
\r\n\r\n {/* Render the unstuck version even when we render the stuck version as well (prevents screen jitter when the screen is only just big enough to \"stick\" but removing the Sticky elements from the flow causes there to be enough virticle space again */}\r\n
\r\n {children}\r\n
\r\n \r\n );\r\n};","import './tableRowButtons.scss';\r\n\r\nimport * as React from 'react';\r\n\r\nexport interface TableRowButtonsProps {\r\n className?: string,\r\n children: React.ReactNode\r\n}\r\n\r\n/**\r\n * Container for buttons used in a table's row.\r\n */\r\nexport const TableRowButtons = (props: TableRowButtonsProps) => {\r\n const { className, children } = props;\r\n\r\n return (\r\n
\r\n {children}\r\n
\r\n );\r\n};","import { ReactNode } from \"react\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { Card, CardBody, CardFooter, Col, Row, Table } from \"reactstrap\";\r\nimport { isNullOrUndefined } from \"util\";\r\nimport { TableRowButtons } from \"../TableRowButtons\";\r\nimport \"./cardsOrTable.scss\";\r\n\r\nexport type CardsOrTableViewMode = 'cards' | 'table';\r\n\r\nexport type CardsOrTableColumnFunction = (item: ItemType, view: CardsOrTableViewMode) => ReactNode | undefined | null;\r\n\r\nexport interface CardsOrTableProps {\r\n viewMode: CardsOrTableViewMode,\r\n items: Array,\r\n columns: Array>,\r\n buttons?: CardsOrTableColumnFunction | undefined | null,\r\n tableHeadings: Array,\r\n onItemClick?: (item: ItemType) => void,\r\n}\r\n\r\nexport const CardsOrTable = (props: CardsOrTableProps) => {\r\n const {\r\n viewMode = 'cards',\r\n items,\r\n columns,\r\n buttons,\r\n tableHeadings,\r\n onItemClick,\r\n } = props;\r\n\r\n switch (viewMode) {\r\n case 'cards':\r\n return (\r\n
\r\n \r\n {\r\n items?.map((item, index) => {\r\n return (\r\n \r\n \r\n !!onItemClick && onItemClick(item)} style={{ cursor: !!onItemClick ? 'pointer' : undefined }}>\r\n {\r\n columns.map((column, columnIndex) => {\r\n const node = column(item, viewMode);\r\n if (!node) {\r\n return node;\r\n }\r\n\r\n return (\r\n
\r\n {node}\r\n
\r\n );\r\n })\r\n }\r\n
\r\n \r\n {buttons && buttons(item, viewMode)}\r\n \r\n
\r\n \r\n );\r\n })\r\n }\r\n
\r\n
\r\n );\r\n case 'table':\r\n return (\r\n
\r\n \r\n \r\n \r\n {\r\n tableHeadings.map((heading, columnIndex) => {\r\n const node = heading;\r\n if (isNullOrUndefined(node)) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n items?.map((item, itemIndex) => (\r\n !!onItemClick && onItemClick(item)}>\r\n {\r\n columns.map((column, columnIndex) => {\r\n const node = column(item, viewMode);\r\n if (isNullOrUndefined(node)) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n })\r\n }\r\n\r\n \r\n \r\n \r\n \r\n ))\r\n }\r\n \r\n
\r\n {node}\r\n  
\r\n {node}\r\n \r\n \r\n {buttons && buttons(item, viewMode)}\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import { recoilPersist } from 'recoil-persist';\r\n\r\nconst persistKey = 'recoil-persist';\r\n\r\n/**\r\n * Configure persistance of recoil, to use you need to add an effect to any atom you want to be persisted e.g.:\r\n const counterState = atom({\r\n key: 'count',\r\n default: 0,\r\n effects_UNSTABLE: [persistAtom],\r\n })\r\n */\r\nexport const { persistAtom } = recoilPersist({\r\n key: persistKey\r\n});\r\n\r\n/**\r\n * Purge the recoil persistance.\r\n */\r\nexport function purgeRecoilPersist() {\r\n window?.localStorage?.removeItem(persistKey);\r\n}\r\n","import * as React from 'react';\r\nimport { atom, useRecoilState } from 'recoil';\r\nimport { CardsOrTableViewMode } from '../../components/shared/cardsOrTable/CardsOrTable';\r\nimport { persistAtom } from '../../configure/recoilPersistConfig';\r\n\r\nexport const preferredListViewModeState = atom({\r\n key: 'preferredListViewModeState',\r\n default: 'cards',\r\n effects_UNSTABLE: [persistAtom],\r\n \r\n});\r\n\r\n/**\r\n * Hook that returns the users preferred view mode for list views so that changing it once preserves it across all lists until changed back.\r\n */\r\nexport function usePreferredListViewMode(): [CardsOrTableViewMode, React.Dispatch>] {\r\n const [value, setValue] = useRecoilState(preferredListViewModeState);\r\n return [value, setValue];\r\n}","import * as React from 'react';\r\n\r\n/**\r\n * Returns a hook based callback that can be used to fetch more data in a controlled way and will automatically stop fetching when it reaches the end,\r\n * which it identifies by a call that returns less data than we are expecting.\r\n * \r\n * You can check if there is more using the hasMore() function returned in its state.\r\n */\r\nexport function useFetchMoreCallback(\r\n fetchMoreFromStore: any,// (...args: any) => Promise<{ data: T }>,\r\n currentEndOffset: number | undefined | null,\r\n merge: (prevResult: T | undefined | null, newResult: T | undefined | null) => T | undefined | null,\r\n newResultLength: (newResult: T | undefined | null) => number | undefined | null\r\n): { fetchMore: () => void, hasMore: () => boolean }\r\n{\r\n const [_hasMore, setHasMore] = React.useState(true);\r\n\r\n // Read more data.\r\n const fetchMore = React.useCallback(() => {\r\n fetchMoreFromStore({\r\n variables: { offset: currentEndOffset ?? 0 },\r\n updateQuery: (previousQueryResult: T | undefined | null, { fetchMoreResult }: { fetchMoreResult: (T | undefined | null) }) => {\r\n if (!fetchMoreResult) {\r\n return previousQueryResult;\r\n }\r\n\r\n // If we didn't read any extra results, tell the cursor its reached the end.\r\n if (!newResultLength(fetchMoreResult)) {\r\n setHasMore(false);\r\n }\r\n\r\n // Merge everything together.\r\n return merge(previousQueryResult, fetchMoreResult);\r\n\r\n }\r\n });\r\n }, [fetchMoreFromStore, currentEndOffset, merge, newResultLength]);\r\n\r\n // Is there any more data available? True until fetchMore reads past the end of the data.\r\n const hasMore = React.useCallback(() => _hasMore, [_hasMore]);\r\n\r\n return React.useMemo(() => ({\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [fetchMore, hasMore]);\r\n} ","import * as React from 'react';\r\nimport { Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem, CardTitle, CardSubtitle } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { useToggleStateArray } from 'use-toggle-state';\r\nimport { Background } from '../shared/background/Background';\r\nimport { CardsOrTable } from '../shared/cardsOrTable/CardsOrTable';\r\nimport { usePreferredListViewMode } from '../../globalState/preferredListViewMode/usePreferredListViewMode';\r\nimport { useUsersListViewBaseViewModel } from '../../api/main/profiles/viewModels/useUsersListViewBaseViewModel';\r\n\r\nexport interface UsersListBaseProps {\r\n title: string,\r\n filterByRoleGroups?: Array,\r\n roleGroupColumnHidden?: boolean,\r\n baseRoute: string,\r\n addText?: string,\r\n}\r\n\r\n/**\r\n * List of administrator users.\r\n */\r\nexport const UsersListBase = (props: UsersListBaseProps) => {\r\n const {\r\n title,\r\n filterByRoleGroups,\r\n roleGroupColumnHidden,\r\n baseRoute,\r\n addText,\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useUsersListViewBaseViewModel({ pageSize: undefined });\r\n const [isMenuOpen, toggleMenuOpen] = useToggleStateArray();\r\n const history = useHistory();\r\n\r\n\r\n // Filter by the user's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n let ret = (allItems ?? []);\r\n\r\n // Filter by the role groups allowed.\r\n if (filterByRoleGroups) {\r\n ret = ret.filter(item => !!filterByRoleGroups.find(it => it === item.user?.roleGroup?.id));\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n ret = ret.filter(item =>\r\n item.firstName.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.lastName.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || item.user.email.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || (item.user?.roleGroup?.name?.toLocaleLowerCase()?.indexOf(lowerSearch) ?? -1) >= 0\r\n || `${item.firstName} ${item.lastName}`.toLocaleLowerCase().indexOf(lowerSearch) >= 0 // Full name in languages \"first last\"\r\n || `${item.lastName} ${item.firstName}`.toLocaleLowerCase().indexOf(lowerSearch) >= 0 // Full name in languages \"last first\"\r\n );\r\n\r\n return ret;\r\n }, [allItems, search, filterByRoleGroups]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const [viewMode, setViewMode] = usePreferredListViewMode();\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n

\r\n {title}\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n setSearch(e.currentTarget.value)} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n view === 'cards' ? ({item.firstName + \" \" + item.lastName}) : null,\r\n (item, view) => view === 'cards' ? null : item.firstName,\r\n (item, view) => view === 'cards' ? null : item.lastName,\r\n (item, view) =>\r\n view === 'cards' ? ({item.user?.email ?? ''})\r\n : item.user?.email ?? '',\r\n (item) => roleGroupColumnHidden ? null : item.user?.roleGroup?.name,\r\n ]}\r\n buttons={(item) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n onItemClick={item => history.push(`${baseRoute}/edit/${item.id}`)}\r\n />\r\n \r\n \r\n \r\n \r\n\r\n \r\n\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 { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult, AsyncLoadPagedOptions } from '../../../../shared/abstractStore';\r\nimport { useFetchMoreCallback } from '../../../../shared/useFetchMoreCallback';\r\nimport { usersListViewBaseViewModelQuery, usersListViewBaseViewModelQueryVariables } from '../../generated/usersListViewBaseViewModelQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\nimport { profileFieldsFragment } from '../../models/Profile';\r\n\r\nexport interface UsersListViewBaseViewModelAsyncLoadPagedOptions extends AsyncLoadPagedOptions {\r\n}\r\n\r\n/**\r\n * Get a list of profiles from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useUsersListViewBaseViewModel(options: UsersListViewBaseViewModelAsyncLoadPagedOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query usersListViewBaseViewModelQuery ($offset: Int, $first: Int) {\r\n items: profiles (offset: $offset, first: $first) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])],\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n \r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Form, Label, FormGroup, Spinner, Input, Row, Col } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useProfile } from '../../api/main/profiles/useProfile';\r\nimport { useLockoutCallback } from '../../api/account';\r\nimport { useDeleteProfileCallback } from '../../api/main/profiles/useDeleteProfileCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\n\r\nexport interface DeleteUserBaseProps {\r\n}\r\n\r\n\r\n/**\r\n * Delete a user (profile) by locking them out permanently.\r\n */\r\nexport const DeleteUserBase = (props: DeleteUserBaseProps) => {\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string }>();\r\n const { data: { model }, isLoading, errors: loadErrors } = useProfile(id);\r\n const [remove, { errors: removeErrors }] = useDeleteProfileCallback();\r\n const [lockout, { errors: lockoutErrors }] = useLockoutCallback();\r\n const history = useHistory();\r\n\r\n const [onRemoveFormSubmit, { isExecuting: isRemoving, errors: removeFormErrors }] = useAsyncCallback(async () => {\r\n if (!model || !model.user) {\r\n return;\r\n }\r\n\r\n await remove(model.id);\r\n await lockout({ email: model.user.email, archive: true, });\r\n\r\n history.goBack();\r\n }, [lockout, model, history]);\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('deleteUserBase.heading.default', 'Are you sure you want to delete this 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
{ e.preventDefault(); onRemoveFormSubmit(); }}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.deleting', 'Deleting...')}}>\r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { deleteProfileMutation, deleteProfileMutationVariables } from '../generated/deleteProfileMutation';\r\nimport { profileFieldsFragment } from '../models/Profile';\r\n\r\n/**\r\n * Get a callback to delete a Profile in the store.\r\n */\r\nexport function useDeleteProfileCallback(): [(id: string) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation deleteProfileMutation ($id: ID!) {\r\n deleteProfile(id: $id) {\r\n ...profileFields\r\n }\r\n }\r\n\r\n ${profileFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string) => {\r\n const result = await mutationAction({ variables: { id: id } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { LockoutRequest } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to lockout an account.\r\n */\r\nexport function useLockoutCallback(): [(model: LockoutRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: LockoutRequest) => {\r\n let result = await accountService.lockout(model);\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { ChangeUserRoleGroupInput } from '../generated/globalTypes';\r\nimport { userFieldsFragment } from \"../models/User\";\r\nimport { changeUserRoleGroupMutationVariables, changeUserRoleGroupMutation } from \"../generated/changeUserRoleGroupMutation\";\r\nimport { useResetCurrentUserRolesCallback } from \"../../account\";\r\n\r\n/**\r\n * Get a callback to change the role grup of a user in the store.\r\n */\r\nexport function useChangeUserRoleGroupCallback(): [(model: ChangeUserRoleGroupInput) => Promise, AsyncActionStatus] {\r\n const resetCurrentUserRoles = useResetCurrentUserRolesCallback();\r\n\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation changeUserRoleGroupMutation ($model: ChangeUserRoleGroupInput!) {\r\n changeUserRoleGroup(model: $model) {\r\n ...userFields\r\n }\r\n }\r\n\r\n ${userFieldsFragment}\r\n `,\r\n {\r\n update: () => resetCurrentUserRoles()\r\n }\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: ChangeUserRoleGroupInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import * as React from 'react';\r\nimport { Button, Row, Col, Form, Label, FormGroup, Spinner, FormText, Alert } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useProfile } from '../../api/main/profiles/useProfile';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useSaveProfileCallback } from '../../api/main/profiles/useSaveProfileCallback';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { FormButtons } from '../shared/FormButtons';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useInviteCallback, useChangeAccountEmailCallback, useResendInviteEmailCallback } from '../../api/account';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { useChangeUserRoleGroupCallback } from '../../api/main/users/useChangeUserRoleGroupCallback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { useProfileSupportingData } from '../../api/main/profiles/viewModels/useProfileSupportingData';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\nimport { Profile, profileDefaultValues } from '../../api/main/models/Profile';\r\n\r\nexport interface EditUserBaseProps {\r\n isCreate?: boolean,\r\n onCreateDefaultValues?: () => Partial,\r\n defaultRoleGroup: string,\r\n filterRoleGroups?: (groups: Array<{ id: string, name: string }>) => Array<{ id: string, name: string }>,\r\n}\r\n\r\n\r\n/**\r\n * Create and invite a new user.\r\n */\r\nexport const CreateUserBase = (props: EditUserBaseProps) => ();\r\n\r\n/**\r\n * Edit a user (actually a profile).\r\n */\r\nexport const EditUserBase = (props: EditUserBaseProps) => {\r\n const {\r\n isCreate,\r\n onCreateDefaultValues,\r\n defaultRoleGroup,\r\n filterRoleGroups,\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n const { id } = useParams<{ id: string | undefined }>();\r\n const { data: { model: storeModel }, isLoading: _isLoading, errors: loadErrors } = useProfile(id);\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { ...profileDefaultValues(), ...(onCreateDefaultValues ? onCreateDefaultValues() : {}) } : undefined);\r\n const { model: userModel, change: changeUserModel } = useChanges(storeModel?.user);\r\n const { model: roleGroupModel, change: changeRoleGroupModel } = useChanges<{ id: string }>({ id: storeModel?.user?.roleGroup?.id ?? '' }, isCreate ? { id: defaultRoleGroup }: undefined);\r\n const [save, { errors: saveErrors }] = useSaveProfileCallback();\r\n const [invite, { errors: inviteErrors }] = useInviteCallback();\r\n const [resendInviteEmail, { isExecuting: isResendingInviteEmail, errors: resendInviteEmailErrors }] = useResendInviteEmailCallback();\r\n const [hasResentInviteEmail, setHasResentInviteEmail] = React.useState(false);\r\n const [changeAccountEmail, { errors: changeEmailErrors }] = useChangeAccountEmailCallback();\r\n const [changeUserRoleGroupInStore, { errors: changeUserRoleGroupInStoreErrors }] = useChangeUserRoleGroupCallback();\r\n const history = useHistory();\r\n\r\n // Supporting data (dependant on the current user's subscription).\r\n const { data: { roleGroups: storeRoleGroups }, isLoading: isLoadingSupportingData, errors: loadSupportingDataErrors } = useProfileSupportingData();\r\n const isLoading = _isLoading || isLoadingSupportingData;\r\n\r\n \r\n const roleGroups = React.useMemo(() => {\r\n if (!filterRoleGroups) {\r\n return storeRoleGroups;\r\n }\r\n\r\n return filterRoleGroups(storeRoleGroups ?? []);\r\n }, [storeRoleGroups, filterRoleGroups]);\r\n\r\n\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n firstName: () => !model?.firstName ? t('editUserBase.firstNameRequired', 'First name is required') : '',\r\n lastName: () => !model?.lastName ? t('editUserBase.lastNameRequired', 'Last name is required') : '',\r\n email: () => !userModel?.email ? t('editUserBase.emailRequired', 'Email is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model, userModel]);\r\n\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async (options?: { navigateTo?: string, }) => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n // If we are creating this user, make sure we save the user and get its id before continuing with saving the profile.\r\n let userId = model.userId;\r\n if (isCreate) {\r\n // Create an invited user but don't send the invite yet, we'll send it after the profile has been saved to so we can include their name\r\n // and make it more personal for higher engagement.\r\n const result = await invite({ ...userModel, sendEmail: false });\r\n userId = result.userId;\r\n changeUserModel({ id: userId });\r\n change({ userId: userId });\r\n }\r\n\r\n await save(model.id, { ...changes, userId: userId }, !!isCreate);\r\n\r\n // If we created a user invite, send the email now the profile has been saved so it can include more personal information (e.g. their name).\r\n if (isCreate) {\r\n await resendInviteEmail(userModel.email);\r\n }\r\n\r\n // Handle changes to the email address of existing users.\r\n if (!isCreate && storeModel && storeModel.user.email !== userModel.email) {\r\n await changeAccountEmail(storeModel.user.email, userModel.email);\r\n }\r\n\r\n // Handle the role group change.\r\n if (isCreate || storeModel?.user.roleGroup?.id !== roleGroupModel.id) {\r\n await changeUserRoleGroupInStore({ userId: userId, roleGroupId: roleGroupModel.id });\r\n }\r\n\r\n // Navigate to the next screen.\r\n if (options?.navigateTo) {\r\n history.push(options.navigateTo);\r\n } else {\r\n history.goBack();\r\n }\r\n }, [validate, save, model, changes, isCreate, history, userModel, invite, changeUserModel, change, changeAccountEmail, resendInviteEmail]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

\r\n {\r\n isCreate ? (\r\n <>{t('editUserBase.createHeading.default', 'Add user')}\r\n ) : (\r\n <>{t('editUserBase.editHeading.default', 'Edit 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\n hasResentInviteEmail ? (\r\n \r\n <>{t('editUserBase.confirmationEmailHasBeenResent', 'Invite email for this user has been resent. Please ask the user to check their email to confirm.')} \r\n { e.preventDefault(); await resendInviteEmail(storeModel?.user?.email ?? userModel.email); }}\r\n isExecuting={isResendingInviteEmail}\r\n executingChildren={<>{t('common.sending', 'Sending...')}}>\r\n {t('common.resendEmail', 'Resend email')}\r\n \r\n \r\n ) : null\r\n }\r\n\r\n
{ e.preventDefault(); saveForm(); }}>\r\n \r\n \r\n \r\n \r\n change({ firstName: e.currentTarget.value })} onBlur={e => validate('firstName')} validationErrors={validationErrors['firstName']} />\r\n \r\n \r\n \r\n \r\n \r\n change({ lastName: e.currentTarget.value })} onBlur={e => validate('lastName')} validationErrors={validationErrors['lastName']} />\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n changeUserModel({ email: e.currentTarget.value })} onBlur={e => validate('email')} validationErrors={validationErrors['email']} />\r\n \r\n {\r\n storeModel && !storeModel.user.emailConfirmed && userModel.email === storeModel.user.email ? (\r\n \r\n { e.preventDefault(); await resendInviteEmail(userModel.email); setHasResentInviteEmail(true); }}\r\n isExecuting={isResendingInviteEmail}\r\n executingChildren={<>{t('editUserBase.resendingInvite', 'Resending invite...')}}>\r\n \r\n <> {t('editUserBase.resendInvite', 'Resend invite')}\r\n \r\n \r\n ) : null\r\n }\r\n \r\n {\r\n storeModel && !storeModel.user.emailConfirmed && userModel.email === storeModel.user.email ? (\r\n \r\n {t('editUserBase.userHasNotAcceptedInvite', 'This user has not accepted the invite. You can change their email if required or resend the invite.')}\r\n \r\n ) : storeModel && !storeModel.user.emailConfirmed && userModel.email !== storeModel.user.email ? (\r\n \r\n {t('editUserBase.userHasNotAcceptedInviteAndEmailChanged', 'This user has not yet accepted the invite, a new invite will be sent to the new email you have supplied.')}\r\n \r\n ) : storeModel && storeModel.user.emailConfirmed && userModel.email !== storeModel.user.email ? (\r\n \r\n {t('editUserBase.userHasAcceptedInviteAndEmailChanged', 'This user will be asked to confirm the email change before it takes affect. The old email address will be shown in the system until the change has been confirmed.')}\r\n \r\n ) : storeModel && storeModel.user.emailConfirmed && userModel.email === storeModel.user.email ? (\r\n \r\n {t('editUserBase.userHasAcceptedInviteAndEmailNotChanged', 'If you change this user\\'s email they will be sent an email to confirm the change before it takes affect.')}\r\n \r\n ) : null\r\n }\r\n \r\n\r\n 1}>\r\n \r\n \r\n changeRoleGroupModel({ id: e.currentTarget.value })} onBlur={e => validate('roleGroup')} validationErrors={validationErrors['roleGroup']}>\r\n {\r\n roleGroups?.map(item => (\r\n \r\n ))\r\n }\r\n \r\n \r\n \r\n\r\n \r\n \r\n {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { InviteRequest, InviteResult } from \"./AccountService\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to Invite an account to register.\r\n */\r\nexport function useInviteCallback(): [(model: InviteRequest) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (model: InviteRequest) => {\r\n let result = await accountService.invite(model);\r\n return result;\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to resend the inviten email.\r\n */\r\nexport function useResendInviteEmailCallback(): [(email: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (email: string) => {\r\n return await accountService.resendInviteEmail(email);\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import { AsyncActionStatus } from \"../../shared/abstractStore\";\r\nimport { useAsyncCallback } from \"react-use-async-callback\";\r\nimport { useAccountService } from \"./useAccountService\";\r\n\r\n/**\r\n * Callback to change the email of another user as an administrator.\r\n */\r\nexport function useChangeAccountEmailCallback(): [(currentEmail: string, newEmail: string) => Promise, AsyncActionStatus] {\r\n const accountService = useAccountService();\r\n\r\n const [action, { isExecuting, errors }] = useAsyncCallback(async (currentEmail: string, newEmail: string) => {\r\n return await accountService.changeAccountEmail({ currentEmail: currentEmail, newEmail: newEmail });\r\n }, [accountService]);\r\n\r\n return [action, { isExecuting, errors }];\r\n}\r\n","import * as React from 'react';\r\nimport { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../../shared/abstractStore';\r\nimport { profileSupportingDataQuery } from '../../generated/profileSupportingDataQuery';\r\nimport { mainApiConfig } from '../../../../configure/mainApiConfig';\r\n\r\nexport interface ProfileSupportingDataOptions extends AsyncLoadOptions {\r\n}\r\n\r\n/**\r\n * Get a the supporting data needed to interactivly edit an Profile.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useProfileSupportingData(options: ProfileSupportingDataOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query profileSupportingDataQuery {\r\n roleGroups {\r\n id\r\n name\r\n }\r\n }\r\n `,\r\n {\r\n variables: {\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { IdentityRoles } from \"../../../configure/security/IdentityRoles\";\r\nimport { RouteEntry } from \"../../../shared/routes\";\r\nimport { AdministratorsList } from \"./AdministratorsList\";\r\nimport { DeleteAdministrator } from \"./DeleteAdministrator\";\r\nimport { CreateAdministrator, EditAdministrator } from \"./EditAdministrator\";\r\n\r\n\r\nexport const administratorsRoutes: Array = [\r\n { path: '/administration/administrators', exact: true, component: AdministratorsList, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/administrators/edit/:id', component: EditAdministrator, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/administrators/add', component: CreateAdministrator, authorize: true, requireRole: IdentityRoles.Administration },\r\n { path: '/administration/administrators/delete/:id', component: DeleteAdministrator, authorize: true, requireRole: IdentityRoles.Administration },\r\n];\r\n","import { useTranslation } from \"react-i18next\";\r\nimport { UsersListBase } from \"../UsersListBase\";\r\n\r\n/**\r\n * List of administrators.\r\n */\r\nexport const AdministratorsList = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n );\r\n};","import { CreateUserBase, EditUserBase } from \"../EditUserBase\";\r\n\r\n/**\r\n * Create an administrator.\r\n */\r\nexport const CreateAdministrator = () => (\r\n ({ /* No defaults needed */ })}\r\n defaultRoleGroup=\"Administrator\"\r\n filterRoleGroups={(groups) => groups.filter(item => item.id === 'Administrator')}\r\n />);\r\n\r\n/**\r\n * Edit an administrator.\r\n */\r\nexport const EditAdministrator = () => (\r\n groups.filter(item => item.id === 'Administrator')}\r\n />);\r\n","import { DeleteUserBase } from \"../DeleteUserBase\";\r\n\r\n/**\r\n * Delete a administrator.\r\n */\r\nexport const DeleteAdministrator = () => ();\r\n","import { useAuthenticatedState } from \"../../api-authorization/useAuthenticatedState\";\r\nimport { useUser } from \"./useUser\";\r\nimport { User } from \"../models/User\";\r\nimport { Guid } from \"guid-string\";\r\n\r\n/**\r\n * Hook to get the current user.\r\n * \r\n * NOTE this is a wrapper around useAuthenticationState() for the commmon use case of just wanting the current user.\r\n */\r\nexport function useCurrentUser(): User | null | undefined {\r\n const { user: authenticationUserProfile } = useAuthenticatedState({ includeUser: true });\r\n const { data: { model: user } } = useUser(authenticationUserProfile?.sub ?? Guid.empty, { fetchPolicy: 'cache-first' });\r\n return user;\r\n}\r\n","import gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport moment from \"moment\";\r\nimport { financialModelFields } from \"../generated/financialModelFields\";\r\n\r\nexport const financialModelFieldsFragment = gql`\r\n fragment financialModelFields on FinancialModel {\r\n id\r\n name\r\n versionNumber\r\n userId\r\n archived\r\n inputsJson\r\n calculationsJson\r\n baseValuesJson\r\n createdDate\r\n updatedDate\r\n isExcludeInflation\r\n }\r\n`;\r\n\r\n\r\nexport type FinancialModel = Omit;\r\n\r\n/**\r\n * Default values.\r\n */\r\nexport const financialModelDefaultValues = (): Partial => {\r\n const now = moment();\r\n\r\n return {\r\n id: Guid.newGuid(),\r\n name: '',\r\n versionNumber: '1',\r\n userId: undefined,\r\n archived: false,\r\n inputsJson: '{}',\r\n calculationsJson: '{}',\r\n baseValuesJson: '{}',\r\n createdDate: now.toISOString(),\r\n updatedDate: now.toISOString(),\r\n isExcludeInflation: false,\r\n }\r\n};","import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport moment from 'moment';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport { Button, Col, ListGroup, ListGroupItem, Row } from 'reactstrap';\r\nimport { useFinancialModels } from '../../api/main/financialModels/useFinancialModels';\r\nimport { useCurrentUser } from '../../api/main/users/useCurrentUser';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { Background } from '../shared/background/Background';\r\nimport { Banner } from '../shared/Banner';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\n\r\nexport interface DashboardProps {\r\n userId: string,\r\n}\r\n\r\n/**\r\n * Dashboard for a user.\r\n */\r\nexport const Dashboard = (props: DashboardProps) => {\r\n const {\r\n userId\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n const { data: { items: financialModels }, isLoading, errors: loadErrors, } = useFinancialModels({ userId });\r\n\r\n const currentUser = useCurrentUser();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

{t('dashboard.heading', 'Your saving calculations')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n {\r\n financialModels?.map(item => (\r\n \r\n \r\n \r\n \r\n {item.name}\r\n \r\n \r\n \r\n {t('common.dateTime', '{{date, DD/MM/YYYY HH:mm}}', { date: moment(item.updatedDate) })}\r\n \r\n \r\n \r\n ))\r\n }\r\n\r\n \r\n \r\n {t('dashboard.noFinancialModels', 'You have not saved any savings financial models yet.')}\r\n
\r\n \r\n {t('dashboard.noFinancialModels', 'Model your savings now.')}\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 { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncLoadPagedResult, AsyncLoadPagedOptions } from '../../../shared/abstractStore';\r\nimport { useFetchMoreCallback } from '../../../shared/useFetchMoreCallback';\r\nimport { financialModelsQuery, financialModelsQueryVariables } from '../generated/financialModelsQuery';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\nimport { financialModelFieldsFragment } from '../models/FinancialModel';\r\n\r\nexport interface FinancialModelsOptions extends AsyncLoadPagedOptions {\r\n userId?: string | undefined | null,\r\n}\r\n\r\n/**\r\n * Get a list of financialModels from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useFinancialModels(options: FinancialModelsOptions = {}): AsyncLoadPagedResult {\r\n // Query data we need from the api.\r\n const [load, { data, loading, error, refetch, fetchMore: fetchMoreFromStore }] = useLazyQuery(\r\n gql`\r\n query financialModelsQuery ($offset: Int, $first: Int, $userId: ID) {\r\n items: financialModels (offset: $offset, first: $first, userId: $userId) {\r\n ...financialModelFields\r\n }\r\n }\r\n\r\n ${financialModelFieldsFragment}\r\n `,\r\n {\r\n\r\n variables: {\r\n offset: options.startOffset,\r\n first: options.pageSize,\r\n userId: options.userId,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Get the functions used to manage paging.\r\n const { fetchMore, hasMore: _hasMore } = useFetchMoreCallback(\r\n fetchMoreFromStore,\r\n (options?.startOffset ?? 0) + (data?.items?.length ?? 0),\r\n (prevResults, newResults) => ({\r\n ...prevResults,\r\n ...newResults,\r\n\r\n items: [...(prevResults?.items ?? []), ...(newResults?.items ?? [])]\r\n }),\r\n (newResults) => newResults?.items?.length\r\n );\r\n const hasMore = React.useCallback(() => !options.pageSize ? false : _hasMore(), [options.pageSize, _hasMore]);\r\n \r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error,\r\n fetchMore: fetchMore,\r\n hasMore: hasMore,\r\n }), [data, refresh, loading, error, fetchMore, hasMore]);\r\n}\r\n","import { RouteEntry } from \"../../shared/routes\";\r\nimport { MyDashboard } from \"./MyDashboard\";\r\nimport { UserDashboard } from \"./UserDashboard\";\r\n\r\nexport const dashboardRoutes: Array = [\r\n { path: '/dashboard', exact: true, component: MyDashboard, authorize: true, },\r\n { path: '/dashboard/:userId', exact: true, component: UserDashboard, authorize: true, },\r\n];\r\n","import { useCurrentUser } from \"../../api/main/users/useCurrentUser\";\r\nimport { Dashboard } from \"./Dashboard\";\r\n\r\n/**\r\n * Dashboard for a the current user.\r\n */\r\nexport const MyDashboard = () => {\r\n const user = useCurrentUser();\r\n\r\n if (!user) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n )\r\n};","import { useParams } from \"react-router\";\r\nimport { Dashboard } from \"./Dashboard\";\r\nimport \"./dashboard.scss\"\r\n/**\r\n * Dashboard for a user with the userId given on the route.\r\n */\r\nexport const UserDashboard = () => {\r\n const { userId } = useParams<{ userId: string }>();\r\n\r\n return (\r\n \r\n )\r\n};","import * as React from 'react';\r\nimport { Button, Row, Col, ButtonGroup, ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem, CardTitle } from 'reactstrap';\r\nimport { LinkContainer } from 'react-router-bootstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { Waypoint } from 'react-waypoint';\r\nimport { useReplaceSearchParamsEffect, useSearchParams } from '../../shared/useURLSearchParams';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SearchInput } from '../shared/searchInput/SearchInput';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { NoResultsFound } from '../shared/NoResultsFound';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport { useHistory } from 'react-router';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { useToggleStateArray } from 'use-toggle-state';\r\nimport { Background } from '../shared/background/Background';\r\nimport { CardsOrTable } from '../shared/cardsOrTable/CardsOrTable';\r\nimport { usePreferredListViewMode } from '../../globalState/preferredListViewMode/usePreferredListViewMode';\r\nimport moment from 'moment';\r\nimport { useFinancialModelsListViewModel } from '../../api/main/financialModels/viewModels/useFinancialModelsListViewModel';\r\n\r\n\r\n\r\n/**\r\n * List of FinancialModels.\r\n */\r\nexport const FinancialModelsList = () => {\r\n const { t } = useTranslation();\r\n const { search: searchParam } = useSearchParams();\r\n const [search, setSearch] = React.useState(searchParam ?? '');\r\n const { data: { items: allItems, profiles }, isLoading, errors: loadingErrors, fetchMore, hasMore } = useFinancialModelsListViewModel({ pageSize: undefined });\r\n const [isMenuOpen, toggleMenuOpen] = useToggleStateArray();\r\n const history = useHistory();\r\n\r\n // Helper functions for formatting.\r\n const formatDate = React.useCallback((date: string) => t('common.dateTime', '{{date, DD/MM/YYYY HH:mm}}', { date: moment(date) }), [t]);\r\n const formatUser = React.useCallback((userId: string) => {\r\n if (!userId) {\r\n return t('financialModelsList.formatUser.noUser', '(User did not log in)');\r\n }\r\n\r\n const profile = profiles.find(it => it.userId === userId);\r\n if (!profile) {\r\n return t('financialModelsList.formatUser.unknown', '(User is unknown)');\r\n }\r\n\r\n return t('financialModelsList.formatUser.userDetails', '{{firstName}} {{lastName}} ({{email}})', { firstName: profile.firstName, lastName: profile.lastName, email: profile.user.email });\r\n }, [t, profiles]);\r\n\r\n // Filter by the financialModel's search client side so it can work when offline as well as online.\r\n const items = React.useMemo(() => {\r\n if (!allItems || !search) {\r\n return allItems;\r\n }\r\n\r\n let lowerSearch = search.toLocaleLowerCase();\r\n\r\n // Filter the items being displayed.\r\n return allItems.filter(item =>\r\n item.name.toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || formatDate(item.updatedDate).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n || formatUser(item.userId).toLocaleLowerCase().indexOf(lowerSearch) >= 0\r\n );\r\n }, [allItems, search, formatDate, formatUser]);\r\n\r\n useReplaceSearchParamsEffect({ search: search });\r\n\r\n const [viewMode, setViewMode] = usePreferredListViewMode();\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n

{t('administratorsFinancialModelList.heading', 'Financial models')}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n setSearch(e.currentTarget.value)} />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n history.push(`/review/${item.id}`)}\r\n tableHeadings={[\r\n t('financialModelBase.name', 'Company name'),\r\n t('financialModelBase.owner', 'Owner'),\r\n t('financialModelBase.updatedOn', 'Updated on'),\r\n ]}\r\n columns={[\r\n (item, view) => view === 'cards' ? ({item.name}) : item.name,\r\n (item) => formatUser(item.userId),\r\n (item) => formatDate(item.updatedDate)\r\n ]}\r\n\r\n buttons={(item) => (\r\n\r\n \r\n \r\n \r\n \r\n toggleMenuOpen(item.id)}>\r\n \r\n {t('common.menuDropdown', 'More')}\r\n \r\n \r\n \r\n \r\n \r\n <> {t('common.delete', 'Delete')}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \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 { useLazyQuery } from \"@apollo/react-hooks\";\r\nimport gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport { AsyncLoadResult, AsyncLoadOptions } from '../../../shared/abstractStore';\r\nimport { financialModelQuery, financialModelQueryVariables } from '../generated/financialModelQuery';\r\nimport { financialModelFieldsFragment } from '../models/FinancialModel';\r\nimport { mainApiConfig } from '../../../configure/mainApiConfig';\r\n\r\n/**\r\n * Get a FinancialModel from the store.\r\n * @param id\r\n * @param options\r\n */\r\nexport function useFinancialModel(id: string | undefined | null, options: AsyncLoadOptions = {}): AsyncLoadResult {\r\n // Query the data we need form the api.\r\n const [load, { data, loading, error, refetch }] = useLazyQuery(\r\n gql`\r\n query financialModelQuery ($id: ID!) {\r\n model: financialModel(id: $id) {\r\n ...financialModelFields\r\n }\r\n }\r\n\r\n ${financialModelFieldsFragment}\r\n `,\r\n {\r\n variables: {\r\n id: id ?? Guid.empty,\r\n },\r\n fetchPolicy: options.fetchPolicy ?? mainApiConfig.defaultFetchPolicy,\r\n pollInterval: options.pollInterval,\r\n onCompleted: (data) => {\r\n if (options.onCompleted) {\r\n options.onCompleted(data);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Run the query (unless we are being lazy).\r\n React.useEffect(() => {\r\n if (!options.lazy) {\r\n load();\r\n }\r\n }, [options.lazy, load])\r\n\r\n // Return the results.\r\n const refresh = React.useCallback(async () => { !refetch ? await load() : await refetch(); }, [refetch, load]);\r\n return React.useMemo(() => ({\r\n data: data ?? ({} as any),\r\n refresh: refresh,\r\n isLoading: loading,\r\n errors: error\r\n }), [data, refresh, loading, error]);\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { FinancialModelCreateInput } from '../generated/globalTypes';\r\nimport { createFinancialModelMutation, createFinancialModelMutationVariables } from '../generated/createFinancialModelMutation';\r\nimport { financialModelFieldsFragment } from '../models/FinancialModel';\r\n\r\n/**\r\n * Get a callback to create a FinancialModel in the store.\r\n */\r\nexport function useCreateFinancialModelCallback(): [(model: FinancialModelCreateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createFinancialModelMutation ($model: FinancialModelCreateInput!) {\r\n createFinancialModel(model: $model) {\r\n ...financialModelFields\r\n }\r\n }\r\n\r\n ${financialModelFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: FinancialModelCreateInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { FinancialModelUpdateInput } from '../generated/globalTypes';\r\nimport { updateFinancialModelMutation, updateFinancialModelMutationVariables } from '../generated/updateFinancialModelMutation';\r\nimport { financialModelFieldsFragment } from '../models/FinancialModel';\r\n\r\n/**\r\n * Get a callback to update a FinancialModel in the store.\r\n */\r\nexport function useUpdateFinancialModelCallback(): [(id: string, model: FinancialModelUpdateInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation updateFinancialModelMutation ($model: FinancialModelUpdateInput!) {\r\n updateFinancialModel(model: $model) {\r\n ...financialModelFields\r\n }\r\n }\r\n\r\n ${financialModelFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (id: string, model: FinancialModelUpdateInput) => {\r\n const result = await mutationAction({ variables: { model: { ...model, id: id } } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { useMemo, SetStateAction, useCallback, Dispatch } from \"react\";\r\n\r\n/**\r\n * Hook that parses json and provides useState style access to the parsed value and access to setting the value. \r\n **/\r\nexport function useJsonObject(json: string, onJsonChanged: (json: string) => void): [T, Dispatch>] {\r\n // Parse the json into an object and cast it as a T.\r\n const value = useMemo(() => JSON.parse(json), [json]) as T;\r\n\r\n // Return a setter that behaves like J\r\n const setValue = useCallback(newValue => {\r\n // Allow value to be a function so we have same API as useState\r\n let valueToStore = newValue;\r\n if (newValue instanceof Function) {\r\n valueToStore = newValue(value);\r\n }\r\n\r\n // Save state back to original source.\r\n const newJson = JSON.stringify(valueToStore);\r\n onJsonChanged(newJson);\r\n }, [value, onJsonChanged]);\r\n\r\n return [value, setValue];\r\n}\r\n","/**\r\n * Inner workings of a CalculationsProcessor, abstracted into a base class to keep the implemention seperate to the business logic.\r\n */\r\nexport class CalculationsProcessor {\r\n protected _inputs: NameValuePairs;\r\n protected _calculations: NameValuePairs;\r\n private _fieldCalculations: Array;\r\n\r\n public constructor(inputs: NameValuePairs, calculations: NameValuePairs) {\r\n this._inputs = inputs;\r\n this._calculations = calculations;\r\n\r\n this._fieldCalculations = [];\r\n }\r\n\r\n /**\r\n * Initialize all caluclations for calculating fields. Edit this method if you want to add a new calcualtion.\r\n */\r\n protected initializeCalculations(): void {\r\n // Default implementation does nothing.\r\n }\r\n\r\n /**\r\n * Repeats calculations affected by the updated fields. Once a calculation has been performed, it will trigger a recalculation of fields that it depends on.\r\n * \r\n * Any updated fields will be returned in the returned value.\r\n */\r\n recalculate(updatedFields?: Array): NameValuePairs {\r\n // Initialize the field calculations on first use.\r\n if (!this._fieldCalculations.length) {\r\n this.initializeCalculations();\r\n }\r\n\r\n // Take a snapshot of the _calculations so we can work out what has changed.\r\n const snapshot = { ...this._calculations };\r\n\r\n // Execute all required calculations (recurssivly if needed).\r\n this.executeCalculations(updatedFields, 0);\r\n\r\n // Compare the snapshot to any updated values and get a list of updated fields.\r\n const changedFields = this.getChangedFields(snapshot, this._calculations);\r\n\r\n let ret: NameValuePairs = {};\r\n\r\n for (const field of changedFields) {\r\n ret[field] = this._calculations[field];\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n /**\r\n * Execute all the calculations needed to handle updatedFields recursivly, with a safeguard ensuring we don't go past \r\n * @param updatedFields\r\n * @param depth\r\n */\r\n private executeCalculations(updatedFields: Array | undefined, depth: number): void {\r\n // If we have exceeded the max depth, throw an error.\r\n const maxDepth = 20;\r\n if (depth > maxDepth) {\r\n throw new Error(`Calculations have gone past the maximum depth of ${maxDepth} recurrsion.`);\r\n }\r\n\r\n\r\n for (const fieldCalculation of this._fieldCalculations) {\r\n // If we have a list of updatedFields, only run the calculation if that a dependency has been updated.\r\n if (updatedFields) {\r\n const anyMatchingDependencies = !!fieldCalculation.dependencies.find(dep => !!updatedFields.find(field => field === dep));\r\n if (!anyMatchingDependencies) {\r\n continue;\r\n }\r\n }\r\n\r\n // If we get here we are going to run the calculation.\r\n const calcualtedValues = fieldCalculation.calculate();\r\n\r\n // Work out if any of the calculatedValues have changed.\r\n const newlyUpdatedFields = this.getChangedFields(this._calculations, calcualtedValues);\r\n \r\n // If any fields did change, updated the calculated values and then execute any calculations with newly updated dependencies via a recursive call.\r\n if (newlyUpdatedFields.length) {\r\n // Updated the stored calculated values.\r\n this._calculations = {\r\n ...this._calculations,\r\n ...calcualtedValues,\r\n };\r\n\r\n this.executeCalculations(newlyUpdatedFields, depth + 1);\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Returns any fields with values that are different between _calculations and calcualtedValues.\r\n */\r\n private getChangedFields(unchanged: NameValuePairs, changed: NameValuePairs): Array {\r\n let ret: Array = [];\r\n for (const updatedField of Object.keys(changed)) {\r\n const newValue = changed[updatedField];\r\n const oldValue = unchanged[updatedField];\r\n\r\n if (newValue !== oldValue) {\r\n ret.push(updatedField);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n // Add a calculation to the field calculations for this calculator.\r\n protected addCalculation(calculate: () => NameValuePairs, deps: Array): void {\r\n this._fieldCalculations.push({ calculate: calculate, dependencies: deps });\r\n }\r\n}\r\n\r\n\r\n/**\r\n * decreases a base amount for inflation for a number of years.\r\n **/\r\nexport function calculateInflationReducedFigure(year: number, baseAmount: number, indexationRate: number): number {\r\n\r\n if (!baseAmount) {\r\n return 0;\r\n }\r\n\r\n // indexation rate might be zero\r\n if (!indexationRate) {\r\n return baseAmount;\r\n }\r\n\r\n return baseAmount * Math.pow(indexationRate, year);\r\n}\r\n\r\n/**\r\n * increase a base amount for inflation for a number of years.\r\n **/\r\nexport function calculateInflatedFigure(year: number, baseAmount: number, indexationRate: number, isYear0Based: boolean = false): number {\r\n if (!baseAmount) {\r\n return 0;\r\n }\r\n\r\n // indexation rate might be zero\r\n if (!indexationRate) {\r\n return baseAmount;\r\n }\r\n\r\n // do the calculation\r\n if (isYear0Based) {\r\n return baseAmount * Math.pow((1 + (indexationRate / 100)), year);\r\n } else {\r\n return baseAmount * Math.pow((1 + (indexationRate / 100)), year - 1);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport type NameValuePairs = { [key: string]: any };\r\n\r\nexport interface FieldCalculation {\r\n calculate: () => NameValuePairs,\r\n dependencies: Array,\r\n}\r\n","import moment from \"moment\";\r\nimport { CalculationsProcessor, NameValuePairs } from \"../../services/calculationsProcessor/CalculationsProcessor\";\r\n\r\n/**\r\n * Calculator that will process the inputs and calculations to generate all calculated values.\r\n */\r\nexport class FinancialModelCalculator extends CalculationsProcessor {\r\n\r\n public constructor(inputs: NameValuePairs, calculations: NameValuePairs) {\r\n super(inputs, calculations);\r\n }\r\n\r\n /**\r\n * Initialize all calculations here. You can calculate one or more fields for each calculation. List the dependent fields (inputted or calculated) for you\r\n * calculation to ensure it only runs when needed.\r\n */\r\n protected initializeCalculations() {\r\n\r\n // Originator's Fee\r\n this.addCalculation(() => ({ originatorsFee: this._calculations.installedCostsEPC * 0.05 }), ['installedCostsEPC']);\r\n\r\n // Estimated Output (kWh / annum)\r\n this.addCalculation(() => ({ estimatedOutput: this._inputs.sizeOfArray * this._inputs.specificYield }), ['sizeOfArray', 'specificYield']);\r\n\r\n // Installed Costs - EPC (ex VAT)\r\n this.addCalculation(() => ({ installedCostsEPC: this._inputs.sizeOfArray * this._inputs.epcPrice * 10 }), ['sizeOfArray', 'epcPrice']);\r\n\r\n // Installed Costs - EPC (inc VAT)\r\n this.addCalculation(() => ({ installedCostsIncVat: this._calculations.totalCapex * 1.2 }), ['totalCapex']);\r\n\r\n // Model End Date\r\n this.addCalculation(() => ({\r\n endDate:\r\n moment(\r\n moment(this._inputs.startDate).add(this._inputs.ppaTerm, 'years')\r\n .subtract(1, 'days'))\r\n }), ['startDate', 'ppaTerm']);\r\n\r\n // Export\r\n this.addCalculation(() => ({ export: this._calculations.estimatedOutput * ((100 - this._inputs.energyUsedOnSite) / 100) }), ['estimatedOutput', 'energyUsedOnSite']);\r\n\r\n // Take or Pay\r\n this.addCalculation(() => ({ takeOrPay: this._calculations.estimatedOutput * (this._inputs.energyUsedOnSite / 100)}), ['estimatedOutput', 'energyUsedOnSite']);\r\n\r\n // EPC Cost\r\n this.addCalculation(() => ({ epcCost: this._inputs.sizeOfArray * this._inputs.epcPrice * 10 }), ['sizeOfArray', 'epcPrice']);\r\n\r\n // EV Charging Cost\r\n this.addCalculation(() => ({ eVChargingCost: this._inputs.sizeOfArray * 27 }), ['sizeOfArray']);\r\n\r\n // Total Capex\r\n this.addCalculation(() => ({ totalCapex: this._calculations.epcCost + this._calculations.originatorsFee + this._calculations.eVChargingCost }), ['epcCost', 'originatorsFee', 'eVChargingCost']);\r\n // Total Capex2 - alternative\r\n this.addCalculation(() => ({ totalCapex2: ((this._inputs.epcPrice / 100) * this._inputs.sizeOfArray * 1000) + this._calculations.originatorsFee }), ['epcCost', 'originatorsFee']);\r\n\r\n // Business Rates\r\n this.addCalculation(() => ({ businessRates: this._inputs.sizeOfArray * 3 }), ['sizeOfArray']);\r\n\r\n // Management Fee\r\n this.addCalculation(() => ({ managementFee: this._inputs.sizeOfArray * 3 }), ['sizeOfArray']);\r\n\r\n // Refurbishment Fee financial figure named with calculation in name so we don't accidently us inputs.refurbishmentFee\r\n this.addCalculation(() => ({ refurbishmentFeeCalculation: this._inputs.refurbishmentFee * this._inputs.sizeOfArray}), ['refurbishmentFee', 'sizeOfArray']);\r\n\r\n // Depreciation Rate\r\n this.addCalculation(() => ({ depreciationRate: (1 / this._inputs.depreciationYears) * 100 }), ['depreciationYears']);\r\n\r\n // NondegradationMultiplier \r\n this.addCalculation(() => ({ nonDegradationMultiplier: 1 - (this._inputs.degradation / 100) }), ['degradation']);\r\n\r\n // oandM financial figure named with calculation in name so we don't accidently us inputs.oAndM\r\n this.addCalculation(() => ({ oAndMCalculation: this._inputs.oAndM * this._inputs.sizeOfArray }), ['oAndM','sizeOfArray']);\r\n\r\n // insurance financial figure named with calculation in name so we don't accidently us inputs.insurance\r\n this.addCalculation(() => ({ insuranceCalculation: this._inputs.insurance * this._inputs.sizeOfArray }), ['oAndM', 'sizeOfArray']);\r\n\r\n // depreciation\r\n this.addCalculation(() => ({ depreciation: this._calculations.totalCapex2 / this._calculations.depreciationRate }), []);\r\n\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport moment, { Moment, MomentInput } from 'moment';\r\nimport { InputProps, Input } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface DateTimeInputProps extends InputProps {\r\n onChange?: (event: React.ChangeEvent) => void,\r\n format?: string,\r\n}\r\n\r\n/**\r\n * Input with validation support for a datetime picker using moment() to keep our dates straight.\r\n * @param props\r\n */\r\nexport const ISODateTimeInput = (props: DateTimeInputProps) => {\r\n const {\r\n type = 'datetime-local',\r\n value,\r\n format,\r\n onChange,\r\n plaintext,\r\n ...rest\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n const theValue = React.useMemo(() => {\r\n // Use a moment to get the local datetime and format into formats supported by browser input tags.\r\n const theFormat = format || (type === 'datetime' || type === 'datetime-local' ? 'YYYY-MM-DD[T]HH:mm' : 'YYYY-MM-DD');\r\n const valueMoment: Moment = moment(value as MomentInput).local();\r\n let ret = '';\r\n if (valueMoment.isValid()) {\r\n ret = valueMoment.format(theFormat);\r\n }\r\n\r\n // Special handling for plainText rendering, in this case we need to format ready for consumption not for date picker.\r\n if (plaintext) {\r\n if (type === 'datetime' || type === 'datetime-local') {\r\n ret = t('common.datetime', '{{date, DD/MM/YYYY HH:mm}}', { date: valueMoment });\r\n } else {\r\n ret = t('common.date', '{{date, DD/MM/YYYY}}', { date: valueMoment });\r\n }\r\n }\r\n\r\n return ret;\r\n }, [value, type, format, plaintext, t]);\r\n\r\n // Wrap the real on change event to always return the ISO date string in UTC time.\r\n const onChangeWrapper = React.useCallback((event: React.ChangeEvent) => {\r\n if (onChange) {\r\n const newValueMoment: Moment = moment(event.currentTarget.value);\r\n if (!newValueMoment.isValid()) {\r\n // Don't push changes if they are not valid dates.\r\n return;\r\n }\r\n\r\n // Swap the value out for the ISO date in the moment \r\n const newValue = newValueMoment.utc().toISOString();\r\n\r\n const newEvent = {\r\n ...event,\r\n currentTarget: {\r\n ...event.currentTarget,\r\n value: newValue,\r\n },\r\n target: {\r\n ...event.target,\r\n value: newValue,\r\n }\r\n };\r\n\r\n onChange(newEvent);\r\n }\r\n }, [onChange]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { useMemo, useState } from \"react\";\r\nimport { Input, InputProps } from \"reactstrap\";\r\n\r\nexport interface NumberInputProps extends InputProps {\r\n onFormat?: (value: number) => string,\r\n currencySymbol?: string\r\n}\r\n\r\n/**\r\n * Handles the behaviour of a number input field so that it is not formatted until the field loses focus.\r\n */\r\n\r\nexport const NumberInput = (props: NumberInputProps) => {\r\n const { value, type, onFormat, onFocus: _onFocus, onBlur: _onBlur, currencySymbol, ...rest } = props;\r\n\r\n // Need to know if the focus is on us or not.\r\n const [isFocused, setIsFocused] = useState(false);\r\n\r\n // Get the value formatted as the user wants it formatted.\r\n const formattedValue = useMemo(() => {\r\n // If we're focused don't run any potentially expensive formatting that we're not even going to use, we just want the raw value.\r\n if (isFocused) {\r\n return value;\r\n }\r\n\r\n // Let the input be formatted.\r\n if (onFormat) {\r\n // check if we have a forced currency symbol\r\n if (!!currencySymbol) {\r\n return currencySymbol + onFormat(parseFloat(value?.toString() ?? '0'));\r\n }\r\n return onFormat(parseFloat(value?.toString() ?? '0'));\r\n }\r\n\r\n // don't know how to format it so just return doing nothing.\r\n return value;\r\n }, [value, onFormat, isFocused, currencySymbol]);\r\n\r\n return ( {\r\n setIsFocused(true);\r\n if (_onFocus) {\r\n _onFocus(e);\r\n }\r\n }}\r\n onBlur={e => {\r\n setIsFocused(false);\r\n if (_onBlur) {\r\n _onBlur(e);\r\n }\r\n }}\r\n {...rest}\r\n />);\r\n};","import './styledSlider.scss';\r\n\r\nimport Slider, { SliderProps } from 'rc-slider';\r\nimport { useMemo } from 'react';\r\n\r\nexport interface StyledSliderProps extends SliderProps {\r\n marksStartPoint?: number,\r\n marksEndPoint?: number,\r\n marksStep?: number,\r\n}\r\n\r\n/**\r\n * Slider, styled to look like the owning site\r\n */\r\nexport const StyledSlider = (props: StyledSliderProps) => {\r\n const { className, marksStartPoint, marksEndPoint = 0, marksStep, ...rest } = props;\r\n\r\n // get slider marks\r\n const sliderMarks = useMemo(() => {\r\n let marks: Record = {};\r\n\r\n for (let i = marksStartPoint ?? 1; i <= (marksEndPoint ?? 0); i += (marksStep ?? 1)) {\r\n const useIndex = Math.round(i * 100) / 100; // use round because we got some weird results with figures < 0\r\n marks[useIndex] = { label: useIndex.toString(), }\r\n }\r\n\r\n return marks;\r\n }, [marksStartPoint, marksEndPoint, marksStep]);\r\n\r\n return (\r\n \r\n );\r\n};","import { useMemo } from \"react\";\r\nimport i18n from 'i18next';\r\n\r\n/**\r\n * Returns a string formatted version of a number.\r\n **/\r\nexport function useFormattedNumber(value: number, options?: {\r\n isDecimals?: boolean, isPence?: boolean, isCurrency?: boolean, isPercentage?: boolean,\r\n isDecimals5?: boolean, isDecimals10?: boolean, \r\n}) {\r\n const formattedNumber = useMemo(() => {\r\n return formatNumber(value, {\r\n isDecimals: options?.isDecimals, isPence: options?.isPence, isCurrency: options?.isCurrency, isPercentage: options?.isPercentage,\r\n isDecimals5: options?.isDecimals, isDecimals10: options?.isDecimals,\r\n });\r\n\r\n }, [value, options?.isDecimals, options?.isPence, options?.isCurrency, options?.isPercentage,]);\r\n\r\n return formattedNumber;\r\n}\r\n\r\n\r\nexport function formatNumber(value: number, options?: {\r\n isDecimals?: boolean, isPence?: boolean, isCurrency?: boolean, isPercentage?: boolean,\r\n isDecimals1?: boolean, isDecimals5?: boolean, isDecimals10?: boolean, \r\n}) {\r\n\r\n // Get the value formatted as the user wants it formatted.\r\n let ret = '';\r\n\r\n if (!!options?.isCurrency) {\r\n // currency with £ symbol\r\n ret = !!options.isDecimals ? i18n.t('common.currency', `£{{ value, #, 0.00}}`, { value }) : ret =i18n.t('common.currency.nodecimals', `£{{ value, #, 0}}`, { value });\r\n } else if (options?.isPence) {\r\n ret = options.isDecimals ?i18n.t('common.pence', `{{ value, #, 0.00}}p`, { value }) : ret =i18n.t('common.pence.nodecimals', `{{ value, #, 0}}p`, { value });\r\n } else if (options?.isPercentage) {\r\n ret = options.isDecimals ?i18n.t('common.percentage', `{{ value, #, 0.00%}}`, { value }) : ret =i18n.t('common.pence.nodecimals', `{{ value, #, 0%}}`, { value });\r\n } else if (options?.isDecimals1) {\r\n ret = i18n.t('common.number.1decimals', `{{ value, #, 0.0}}`, { value });\r\n } else if (options?.isDecimals5) {\r\n ret = i18n.t('common.number.5decimals', `{{ value, #, 0.00000}}`, { value });\r\n } else if (options?.isDecimals10) {\r\n ret =i18n.t('common.number.5decimals', `{{ value, #, 0.0000000000}}`, { value });\r\n } else {\r\n // normal number\r\n ret = options?.isDecimals ?i18n.t('common.number', `{{ value, #, 0.00}}`, { value }) : ret =i18n.t('common.number.nodecimals', `{{ value, #, 0}}`, { value });\r\n }\r\n\r\n return ret;\r\n\r\n}","import moment from \"moment\";\r\nimport { useMemo } from \"react\";\r\nimport { ConditionalFragment } from \"react-conditionalfragment\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Col, FormGroup, Label, Row } from \"reactstrap\";\r\nimport { ISODateTimeInput } from \"../../../shared/ISODateTimeInput\";\r\nimport { NumberInput } from \"../../../shared/numberInput/NumberInput\";\r\nimport { StyledSlider } from \"../../../shared/StyledSlider\";\r\nimport { formatNumber } from \"../../utilities/useFormattedNumber\";\r\nimport './assumptionsTab.scss';\r\n\r\nexport interface AssumptionsTabProps {\r\n inputsModel: any | undefined,\r\n isExcludeInflation: boolean,\r\n changeInputsModel: (changes: any) => void,\r\n calculationsModel: any | undefined,\r\n targetReturnRatio: { ratio: number, energySalesPrice: number },\r\n}\r\n\r\n/**\r\n * Tab for maintaining the assumptions on a financial model.\r\n * @param props\r\n */\r\nexport const AssumptionsTab = (props: AssumptionsTabProps) => {\r\n const {\r\n inputsModel, // all inputs\r\n isExcludeInflation,\r\n changeInputsModel, // use this for the input fields on this tab\r\n calculationsModel, // holds the bottom level calculations created by the calculator from the inputs\r\n targetReturnRatio, // from snapshot basevalues\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n const energySalesPrice = useMemo(() => { return !!targetReturnRatio ? targetReturnRatio.energySalesPrice : 0; }, [targetReturnRatio]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n t('common.number.noDecimal', `{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ sizeOfArray: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n
\r\n changeInputsModel({ sizeOfArray: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={2000}\r\n marksStep={100}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n t('common.number.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ annualInflation: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n disabled={isExcludeInflation}\r\n />\r\n
\r\n changeInputsModel({ annualInflation: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={20}\r\n marksStep={0.5}\r\n disabled={isExcludeInflation}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n t('common.number.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ energyInflation: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n disabled={isExcludeInflation}\r\n />\r\n
\r\n changeInputsModel({ energyInflation: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={20}\r\n marksStep={0.5}\r\n disabled={isExcludeInflation}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n t('common.number.percentage.nodecimals', `{{value, #,0%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ energyUsedOnSite: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n
\r\n changeInputsModel({ energyUsedOnSite: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={100}\r\n marksStep={10}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {formatNumber(inputsModel?.currentEnergyCost ?? 0, { isPence: true, isDecimals: true, })}\r\n
\r\n
\r\n\r\n \r\n \r\n t('common.number.nodecimals', `{{value, #,0}}`, { value: value })}\r\n onChange={e => changeInputsModel({ specificYield: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n
\r\n changeInputsModel({ specificYield: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={1500}\r\n marksStep={50}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {formatNumber(energySalesPrice ?? 0, { isDecimals: true, isPence: true, })}\r\n
\r\n
\r\n \r\n \r\n t('common.currency.noDecimals', `£{{value, #,0}}`, { value: value })}\r\n onChange={e => changeInputsModel({ epcPrice: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n
\r\n changeInputsModel({ epcPrice: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={200}\r\n marksStep={10}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {inputsModel?.ppaTerm ?? 0}\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {formatNumber(calculationsModel?.originatorsFee, { isDecimals: false, isCurrency: true, })}\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n changeInputsModel({ startDate: moment(e.currentTarget.value) })} />\r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n {formatNumber(calculationsModel?.estimatedOutput, { isDecimals: false, })}\r\n
\r\n
\r\n\r\n \r\n \r\n t('common.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ degradation: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n
\r\n changeInputsModel({ degradation: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={1}\r\n marksStep={0.10}\r\n />\r\n
\r\n
\r\n \r\n \r\n
\r\n {formatNumber(calculationsModel?.installedCostsEPC, { isDecimals: false, isCurrency: true })}\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {formatNumber(calculationsModel?.totalCapex, { isDecimals: false, isCurrency: true })}\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {formatNumber(calculationsModel?.installedCostsIncVat, { isDecimals: false, isCurrency: true })}\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n \r\n );\r\n};","import { useCallback, useMemo, } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Col, Label, Row, Table } from \"reactstrap\";\r\nimport { YearCalculation } from \"../../utilities/useCalculateForYear\";\r\nimport { formatNumber } from \"../../utilities/useFormattedNumber\";\r\nimport './proposalTab.scss';\r\n\r\nexport interface ProposalsTabProps {\r\n inputsModel: any | undefined,\r\n co2Savings: number,\r\n yearsRequired?: number[],\r\n allYearCalculations: YearCalculation[],\r\n}\r\n\r\n/**\r\n * Tab for maintaining the proposal table.\r\n * @param props\r\n */\r\nexport const ProposalsTab = (props: ProposalsTabProps) => {\r\n const {\r\n inputsModel, // all inputs\r\n co2Savings, // from snapshot basevalues\r\n yearsRequired,\r\n allYearCalculations, // holds all the calculations for all years of the proposal including year zero\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Number of years for full proposal calculations\r\n const proposalYearsRequired = inputsModel?.proposalTerm ?? 40;\r\n\r\n // Array of all full years' data, formatted and converted to strings\r\n const rowsYears = useMemo(() => {\r\n\r\n // data for the table\r\n let newRowData: Array = [];\r\n\r\n // loop round creating a row for each full year including year 0 as the figures on the proposal \r\n // are the start figures in year 1 not figures adjusted after a year\r\n for (let y = 0; y < proposalYearsRequired; y++) {\r\n\r\n // this year's figures that are based on base calculations and inputs\r\n const yearCalculations = allYearCalculations[y];\r\n\r\n // make up a column for this year's figures for the table\r\n let newRow: RowData = ({\r\n year: (y + 1).toString(), // y + 1 otherwise we'd show 0 to 39 not 1 to 40 as the year number\r\n systemYield: formatNumber(Math.round(yearCalculations.systemYield)),\r\n onSiteUse: formatNumber(Math.round(yearCalculations.totalGeneration)),\r\n energyCosts: formatNumber(Math.round(yearCalculations.energyCost * 10) / 10, { isDecimals1: true }), // round to 1 decimal\r\n energyCostsWithoutSolar: formatNumber(Math.round(yearCalculations.energyCostWithoutSolar)),\r\n solarEnergyCost: formatNumber(yearCalculations.solarEnergyCost, { isDecimals: true }),\r\n energyCostsWithSolar: formatNumber(Math.round(yearCalculations.energyCostWithSolar)),\r\n fieldbold_annualSavings: formatNumber(yearCalculations.annualSavings),\r\n fieldbold_cO2Savings: formatNumber(yearCalculations.systemYield * co2Savings),\r\n });\r\n\r\n // add the new row to the table data array \r\n newRowData.push(newRow);\r\n }\r\n\r\n // return an array for the table holding a row for each year required\r\n return newRowData;\r\n }, [co2Savings, proposalYearsRequired, allYearCalculations,]);\r\n\r\n // A populated table row of as many columns as needed \r\n // May return a blank node if years required has been stated and this year is not in the array\r\n const PopulatedTableRow = useCallback((props: { yearIndex: number }) => {\r\n const {\r\n yearIndex\r\n } = props;\r\n\r\n // check if this year is required\r\n if (!!yearsRequired) {\r\n let yearToInclude = yearsRequired.find(item => item === yearIndex + 1);\r\n\r\n if (!yearToInclude) {\r\n return (<>);\r\n }\r\n }\r\n\r\n // check for any of the special cases defined by the prefix to the field name\r\n // we can use special line prefixes on the tr, or the td if they are to be applied selectively and not every cell on the row\r\n\r\n // apply special field prefixes to the td when required \r\n\r\n // check each column\r\n let fieldClass: Array = [];\r\n for (let c = 0; c < 9; c++) {\r\n let thisFieldClassName = 'yearColumn';\r\n if (Object.keys(rowsYears[0])[c].startsWith('fieldbold_')) {\r\n thisFieldClassName += ' fieldbold';\r\n }\r\n fieldClass.push(thisFieldClassName);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {\r\n /* one row per year */\r\n [...Array(Object.keys(rowsYears[0]).length)].map((value: undefined, index) => {\r\n return (\r\n \r\n {Object.values(rowsYears[yearIndex])[index]}\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n )\r\n }, [rowsYears, yearsRequired]);\r\n\r\n /** UI\r\n **/\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n
\r\n\r\n {/* Table */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n [...Array(proposalYearsRequired)].map((value: undefined, index) => {\r\n\r\n /* return a single row populated with the correct year's figures */\r\n return (\r\n \r\n )\r\n })\r\n }\r\n \r\n
{t('proposalsTab.headerColumn.year', 'Year')}{t('proposalsTab.headerColumn.systemYield', 'System Yield')}{t('proposalsTab.headerColumn.onSiteUse', 'On Site Use')}{t('proposalsTab.headerColumn.energyCosts', 'Energy Costs')}{t('proposalsTab.headerColumn.energyCostsWithoutSolar', 'Energy Costs without Solar')}{t('proposalsTab.headerColumn.solarEnergyCost ', 'Solar Energy Cost ')}{t('proposalsTab.headerColumn.energyCostsWithSolar', 'Energy Costs with Solar')}{t('proposalsTab.headerColumn.annualSavings', 'Annual Savings')}{t('proposalsTab.headerColumn.cO2Savings', 'CO2 Savings')}
{t('common.', '')}{t('common.kwh', 'kWh')}{t('common.kwh', 'kWh')}{t('common.pKwh', 'p/kWh')}{t('common.currency.pound', '£')}{t('common.pKwh', 'p/kWh')}{t('common.currency.pound', '£')}{t('common.currency.pound', '£')}{t('common.kg', 'Kg')}
\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\n\r\n// in the row data below there are some special prenames for fields:\r\n// fieldbold_ adds a class that causes data to be displayed in bold\r\n\r\n/**\r\n * Data for a row in the table\r\n */\r\nexport interface RowData {\r\n year: string,\r\n systemYield: string,\r\n onSiteUse: string,\r\n energyCosts: string,\r\n energyCostsWithoutSolar: string,\r\n solarEnergyCost: string,\r\n energyCostsWithSolar: string,\r\n fieldbold_annualSavings: string,\r\n fieldbold_cO2Savings: string,\r\n}\r\n\r\n","import { useCallback, useMemo, } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Col, FormGroup, Input, Label, Row } from \"reactstrap\";\r\nimport { NumberInput } from \"../../../shared/numberInput/NumberInput\";\r\nimport { StyledSlider } from \"../../../shared/StyledSlider\";\r\nimport { YearCalculation } from \"../../utilities/useCalculateForYear\";\r\nimport { formatNumber } from \"../../utilities/useFormattedNumber\";\r\nimport { ProposalsTab } from \"../proposals/ProposalTab\";\r\nimport './clientFacingTab.scss';\r\n\r\nexport interface ClientFacingTabProps {\r\n change: (changes: any) => void,\r\n isExcludeInflation: boolean,\r\n inputsDefaults: any,\r\n inputsModel: any | undefined,\r\n changeInputsModel: (changes: any) => void,\r\n //calculationsModel: any | undefined,\r\n targetReturnRatio: { ratio: number, energySalesPrice: number },\r\n co2Savings: number,\r\n allYearCalculations: YearCalculation[],\r\n fullProposalYearsRequired: number,\r\n //irrCalculations: { preTaxIRR: number | '#NUM!', postTaxIRR: number | '#NUM!' }\r\n}\r\n\r\n/**\r\n * Tab for maintaining Client Facing inputs and calculations.\r\n * @param props\r\n */\r\nexport const ClientFacingTab = (props: ClientFacingTabProps) => {\r\n const {\r\n change, // change the main financial model\r\n isExcludeInflation,\r\n inputsDefaults,\r\n inputsModel, // all inputs\r\n changeInputsModel, // use this for the input fields on this tab\r\n //calculationsModel, // holds the bottom level calculations created by the calculator from the inputs\r\n targetReturnRatio, // from snapshot basevalues\r\n co2Savings, // from snapshot basevalues\r\n allYearCalculations, // holds all the calculations for all years of the proposal including year zero\r\n fullProposalYearsRequired, // if the number of years needs changing do it once in the editFinancialModel component\r\n //irrCalculations, // pre and post tax irr calculations\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n\r\n // Default years to show in reduced proposal section of client facing page\r\n const defaultProposalYears = useMemo(() => { return [1, 5, 10, 25, 40]; }, []);\r\n\r\n // Calculation of size of array from sq ft\r\n const arraySizeToSqFtRatio = 0.0195;\r\n\r\n // lookups and calculationsa needed for the display\r\n const energySalesPrice = useMemo(() => { return !!targetReturnRatio ? targetReturnRatio.energySalesPrice : 0; }, [targetReturnRatio]);\r\n //const [year1Ebitda, setYear1Ebitda] = useState(0);\r\n //const interestPayable = useMemo(() => { return !inputsModel || !calculationsModel ? 0 : (calculationsModel?.totalCapex ?? 0) * ((inputsModel?.debtInterestRate ?? 0) / 100); }, [calculationsModel, inputsModel]);\r\n //const debtServiceRatio = useMemo(() => { return !year1Ebitda || !interestPayable ? 0 : year1Ebitda / interestPayable; }, [year1Ebitda, interestPayable]);\r\n //const availableCapital = useMemo(() => {\r\n //return !year1Ebitda || !interestPayable ? 0 : (year1Ebitda - interestPayable) * (inputsModel?.energyUsedOnSite / 100);\r\n //}, [year1Ebitda, interestPayable, inputsModel]);\r\n\r\n\r\n // get the total figures for display across all years of the proposal\r\n const totalSavings: { totalPounds: number, totalCo2: number, totalCostWithout: number, totalCostsWith: number, totalEbitda: number, } = useMemo(() => {\r\n let totalPounds = 0;\r\n let totalCo2 = 0;\r\n let totalCostWithout = 0;\r\n let totalCostsWith = 0;\r\n let totalEbitda = 0;\r\n\r\n if (!allYearCalculations.length) {\r\n return { totalPounds: totalPounds, totalCo2: totalCo2, totalCostWithout: totalCostWithout, totalCostsWith: totalCostsWith, totalEbitda: totalEbitda };\r\n }\r\n\r\n for (let y = 1; y <= fullProposalYearsRequired; y++) {\r\n\r\n // this year's figures that are based on base calculations and inputs\r\n const yearCalculation = allYearCalculations[y];\r\n\r\n // we need the year 1 ebitda for the display\r\n //if (y === 1) {\r\n // setYear1Ebitda(yearCalculation.ebitda);\r\n //}\r\n\r\n // accumulate the year totals figures\r\n totalPounds += yearCalculation.annualSavings > 0 ? yearCalculation.annualSavings : 0;\r\n totalCo2 += yearCalculation.systemYield * co2Savings;\r\n totalCostWithout += yearCalculation.energyCostWithoutSolar;\r\n totalCostsWith += yearCalculation.energyCostWithSolar;\r\n totalEbitda += yearCalculation.ebitda;\r\n }\r\n\r\n return { totalPounds: totalPounds, totalCo2: totalCo2, totalCostWithout: totalCostWithout, totalCostsWith: totalCostsWith, totalEbitda: totalEbitda };\r\n\r\n }, [co2Savings, fullProposalYearsRequired, allYearCalculations]);\r\n\r\n const onChangeIsExcludeInflation = useCallback((isChecked: boolean) => {\r\n\r\n let excludeInflation = !isChecked;\r\n\r\n if (excludeInflation) {\r\n // Set all inflation related input variables to 0\r\n changeInputsModel({ rpi: 0, annualInflation: 0, energyInflation: 0 });\r\n } else {\r\n // Set all inflation related input variables to defaults\r\n changeInputsModel({ rpi: inputsDefaults.rpi, annualInflation: inputsDefaults.annualInflation, energyInflation: inputsDefaults.energyInflation });\r\n }\r\n\r\n\r\n change({ isExcludeInflation: excludeInflation })\r\n\r\n }, [inputsDefaults, change, changeInputsModel]);\r\n\r\n // handle changes to the selection of years to be shown in the mini proposal on this page - up to 5\r\n //const manageProposalYears = useCallback((isChecked: boolean, yearSelected: number) => {\r\n\r\n // let newProposalYears: Array = inputsModel?.proposalYears ?? defaultProposalYears;\r\n\r\n // // if item is unchecked then remove from proposal years\r\n // if (!isChecked) {\r\n // let yearIndex = newProposalYears.indexOf(yearSelected);\r\n // if (yearIndex > -1) {\r\n // newProposalYears.splice(yearIndex, 1);\r\n // }\r\n // } else {\r\n // // if item is checked then add to proposal years\r\n // // unless we already have 5 - then ignore\r\n // if (newProposalYears.length < 5) {\r\n // newProposalYears.push(yearSelected);\r\n // }\r\n // }\r\n\r\n // // change the inputs model to save the new settings\r\n // changeInputsModel({ proposalYears: newProposalYears.sort((a, b) => a < b ? -1 : a > b ? 1 : 0) });\r\n\r\n //}, [inputsModel, changeInputsModel, defaultProposalYears,]);\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n t('common.number', `{{value, #,0.00}}`, { value })}\r\n onChange={e => changeInputsModel({ currentEnergyCost: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n
\r\n changeInputsModel({ currentEnergyCost: val })}\r\n marksStartPoint={0}\r\n marksEndPoint={50}\r\n marksStep={5}\r\n />\r\n
\r\n
\r\n\r\n \r\n \r\n changeInputsModel({ ppaTerm: e.currentTarget.valueAsNumber })} />\r\n
\r\n
\r\n changeInputsModel({ ppaTerm: val })}\r\n marksStartPoint={3}\r\n marksEndPoint={30}\r\n marksStep={1}\r\n />\r\n
\r\n
\r\n changeInputsModel({ ppaTerm: val })}\r\n marksStartPoint={3}\r\n marksEndPoint={30}\r\n marksStep={3}\r\n />\r\n
\r\n
\r\n
\r\n\r\n {/* The following form group relates directly to the sizeOfArray. It is never stored anywhere. */}\r\n \r\n \r\n {/* 1 slider for xs and another for sm and above to make scales look right */}\r\n
\r\n
{t(\"clientFacingTab.buildingArea.label2\", \"(thousands)\")}
\r\n t('common.number.noDecimal', `{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ sizeOfArray: !!e.currentTarget.value ? (e.currentTarget.valueAsNumber * 1000) * arraySizeToSqFtRatio : 0 })}\r\n />\r\n
\r\n changeInputsModel({ sizeOfArray: !!val ? (val * 1000) * arraySizeToSqFtRatio : 0 })}\r\n marksStartPoint={5}\r\n marksEndPoint={100}\r\n marksStep={10}\r\n />\r\n
\r\n
\r\n
\r\n t('common.number.noDecimal', `{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ sizeOfArray: !!e.currentTarget.value ? e.currentTarget.valueAsNumber * arraySizeToSqFtRatio : 0 })}\r\n />\r\n
\r\n changeInputsModel({ sizeOfArray: !!val ? val * arraySizeToSqFtRatio : 0 })}\r\n marksStartPoint={5000}\r\n marksEndPoint={100000}\r\n marksStep={5000}\r\n />\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n {formatNumber(Math.round(energySalesPrice * 100) / 100 ?? 0, { isDecimals: true, isPence: true })}\r\n
\r\n
\r\n \r\n \r\n
\r\n {/* Convert from kg to tonnes as a last minute client request */}\r\n {formatNumber(totalSavings.totalCo2 / 1000)}\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {formatNumber(totalSavings.totalCostWithout, { isCurrency: true })}\r\n
\r\n
\r\n \r\n \r\n
\r\n {formatNumber(totalSavings.totalCostsWith, { isCurrency: true })}\r\n
\r\n
\r\n \r\n \r\n
\r\n {formatNumber(totalSavings.totalPounds, { isCurrency: true })}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n \r\n \r\n \r\n\r\n \r\n onChangeIsExcludeInflation(e.currentTarget.checked)}\r\n />\r\n \r\n \r\n\r\n {/* */}\r\n {/* */}\r\n {/*
*/}\r\n {/* {*/}\r\n {/* [...Array(inputsModel?.proposalTerm ?? 40)].map((item, index) => (*/}\r\n {/* */}\r\n {/* ))*/}\r\n {/* }*/}\r\n {/*
*/}\r\n {/*
*/}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \"Price\r\n \r\n \r\n \r\n \"Funding\r\n \r\n \r\n
\r\n );\r\n};","import moment from \"moment\";\r\nimport { useCallback, useMemo, } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Col, FormGroup, Label, Row } from \"reactstrap\";\r\nimport { NumberInput } from \"../../../shared/numberInput/NumberInput\";\r\nimport { formatNumber } from \"../../utilities/useFormattedNumber\";\r\nimport './modelTab.scss';\r\n\r\nexport interface ModelTabProps {\r\n inputsModel: any | undefined,\r\n changeInputsModel: (changes: any) => void,\r\n calculationsModel: any | undefined,\r\n targetReturnRatio: { ratio: number, energySalesPrice: number },\r\n}\r\n\r\n/**\r\n * Tab for maintaining the financial model.\r\n * @param props\r\n */\r\nexport const ModelTab = (props: ModelTabProps) => {\r\n const {\r\n inputsModel, // all inputs\r\n changeInputsModel, // use this for the input fields on this tab\r\n calculationsModel, // holds the bottom level calculations created by the calculator from the inputs\r\n targetReturnRatio, // from snapshot basevalues\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n const energySalesPrice = useMemo(() => { return !!targetReturnRatio ? targetReturnRatio.energySalesPrice : 0; }, [targetReturnRatio]);\r\n\r\n // a formatted node for a display item - this is just to keep the UI a bit easier to read\r\n const DisplayFormGroup = useCallback((props: {\r\n numericFieldValue?: number, displayValue: string, fieldName: string, label: string, subLabel?: string,\r\n isNumericForFormatting?: boolean, isDecimals?: boolean, isPence?: boolean, isCurrency?: boolean, isPercentage?: boolean,\r\n }) => {\r\n const {\r\n numericFieldValue, displayValue, fieldName, label, subLabel = '', isNumericForFormatting = false, isDecimals = true, isPence = false, isCurrency = false, isPercentage = false,\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {\r\n isNumericForFormatting ?\r\n formatNumber(numericFieldValue ?? 0, { isDecimals: isDecimals, isPence: isPence, isCurrency: isCurrency, isPercentage: isPercentage })\r\n :\r\n displayValue\r\n }\r\n
\r\n \r\n
\r\n
\r\n )\r\n }, []);\r\n\r\n // a formatted node for an input item - this is just to keep the UI a bit easier to read\r\n const InputFormGroup = useCallback((props: { fieldName: string, label: string, subLabel?: string, children: React.ReactNode }) => {\r\n const {\r\n fieldName, label, subLabel = '', children,\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {children}\r\n
\r\n \r\n
\r\n
\r\n )\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n\r\n {/**** Inputs Section ****/}\r\n\r\n
{t('modelTab.subheading.inputs', 'Inputs')}
\r\n \r\n \r\n \r\n\r\n {/**** Project Details Section ****/}\r\n\r\n
{t('modelTab.subheading.projectDetails', 'Project Details')}
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n t('common.pence', `{{value, #,0.00}}p`, { value })}\r\n onChange={e => changeInputsModel({ exportTariff: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n\r\n \r\n t('common.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ rpi: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n\r\n  \r\n
{t('modelTab.subheading.generationDetails', 'Generation Details')}
\r\n  \r\n  \r\n\r\n {/**** Capex Section ****/}\r\n\r\n
{t('modelTab.subheading.capex', 'Capex')}
\r\n \r\n \r\n \r\n \r\n \r\n  \r\n  \r\n \r\n
\r\n \r\n \r\n
\r\n\r\n {/**** Expenses Section ****/}\r\n\r\n
{t('modelTab.subheading.expenses', 'Expenses')}
\r\n\r\n \r\n t('common.currency.noDecimals', `£{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ oAndM: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.currency.noDecimals', `£{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ oAndMManager: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n\r\n \r\n t('common.currency.noDecimals', `£{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ transmissionFee: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.currency.noDecimals', `£{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ landLease: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.currency', `£{{value, #,0.00}}`, { value })}\r\n onChange={e => changeInputsModel({ insurance: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ insuranceandLCInflation: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.currency.noDecimals', `£{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ audit: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n\r\n \r\n t('common.currency.noDecimals', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ managementFeeInflation: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.currency', `£{{value, #,0.00}}`, { value })}\r\n onChange={e => changeInputsModel({ refurbishmentFee: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n {/**** Working Capital Section ****/}\r\n\r\n
{t('modelTab.subheading.workingCapital', 'Working Capital')}
\r\n \r\n t('common.number.noDecimals', `{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ receivablesDays: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.number.noDecimals', `{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ payablesDays: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n {/**** Depreciation Section ****/}\r\n\r\n
{t('modelTab.subheading.depreciation', 'Depreciation')}
\r\n \r\n\r\n \r\n t('common.number.noDecimals', `{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ depreciationYears: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n {/**** Debt Section ****/}\r\n\r\n
{t('modelTab.subheading.debt', 'Debt')}
\r\n\r\n \r\n t('common.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ debtInterestRate: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n \r\n t('common.number.noDecimals', `{{value, #,0}}`, { value })}\r\n onChange={e => changeInputsModel({ debtTerm: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n\r\n\r\n {/**** Tax Section ****/}\r\n\r\n
{t('modelTab.subheading.tax', 'Tax')}
\r\n \r\n t('common.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ taxFuture: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n \r\n t('common.percentage', `{{value, #,0.00%}}`, { value: value / 100 })}\r\n onChange={e => changeInputsModel({ taxNow: !!e.currentTarget.value ? e.currentTarget.valueAsNumber : 0 })}\r\n />\r\n \r\n
\r\n \r\n
\r\n \r\n );\r\n};","\r\nexport interface EmptyTableRowsProps {\r\n rows?: number,\r\n columns: number\r\n}\r\n\r\n/**\r\n * A variable number of empty rows in a table\r\n */\r\nexport const EmptyTableRows = (props: EmptyTableRowsProps) => {\r\n const {\r\n rows = 1,\r\n columns,\r\n } = props;\r\n\r\n return (\r\n <>\r\n {\r\n [...Array(rows)].map((value: undefined, rowindex) => {\r\n return (\r\n \r\n {\r\n [...Array(columns)].map((value: undefined, colindex) => {\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};","import moment from \"moment\";\r\nimport { useCallback, useMemo, } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Col, Row, Table } from \"reactstrap\";\r\nimport { EmptyTableRows } from \"../../../shared/EmptyTableRows\";\r\nimport { YearCalculation } from \"../../utilities/useCalculateForYear\";\r\nimport { formatNumber } from \"../../utilities/useFormattedNumber\";\r\nimport './financialsTab.scss';\r\n\r\nexport interface FinancialsTabProps {\r\n inputsModel: any | undefined,\r\n calculationsModel: any | undefined,\r\n allYearCalculations: YearCalculation[],\r\n}\r\n\r\n/**\r\n * Tab for maintaining the financial table.\r\n * @param props\r\n */\r\nexport const FinancialsTab = (props: FinancialsTabProps) => {\r\n const {\r\n inputsModel, // all inputs\r\n calculationsModel, // holds the bottom level calculations created by the calculator from the inputs\r\n allYearCalculations, // holds all the calculations for all years of the proposal including year zero\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Number of years for full calculations - excludes year 0\r\n // this is just for the financials tab and is different from the proposal years\r\n const yearColumnsRequired = 30;\r\n\r\n // Array of items to show one on each row in the header column - the first column in the table\r\n const headerColumnText = useMemo(() => {\r\n return [\r\n t('financialsTab.headerColumn.startOfPeriod', 'Start of Period'),\r\n t('financialsTab.headerColumn.endOfPeriod', 'End of Period'),\r\n t('financialsTab.headerColumn.financialYear', 'Financial Year'),\r\n t('financialsTab.headerColumn.ppaSwitch', 'PPA Switch'),\r\n t('financialsTab.headerColumn.revenue', 'Revenue'),\r\n t('financialsTab.headerColumn.totalExported', 'Total Exported'),\r\n t('financialsTab.headerColumn.totalGeneration', 'Total Generation'),\r\n t('financialsTab.headerColumn.exportTariff', 'Export Tariff'),\r\n t('financialsTab.headerColumn.ppaTariff', 'PPA Tariff'),\r\n t('financialsTab.headerColumn.revenue', 'Revenue'),\r\n t('financialsTab.headerColumn.revenue', 'Revenue'),\r\n t('financialsTab.headerColumn.expenses', 'Expenses'),\r\n t('financialsTab.headerColumn.oAndM', 'O&M'),\r\n t('financialsTab.headerColumn.oAndMManager', 'O&M Manager'),\r\n t('financialsTab.headerColumn.businessRates', 'Business Rates'),\r\n t('financialsTab.headerColumn.transmissionFee', 'Transmission Fee'),\r\n t('financialsTab.headerColumn.landLease', 'Land Lease'),\r\n t('financialsTab.headerColumn.insurance', 'Insurance'),\r\n t('financialsTab.headerColumn.audit', 'Audit'),\r\n t('financialsTab.headerColumn.managementFee', 'Management Fee'),\r\n t('financialsTab.headerColumn.refurbishmentFee', 'Refurbishment Fee'),\r\n t('financialsTab.headerColumn.totalExpenses', 'Total Expenses'),\r\n t('financialsTab.headerColumn.ebitda', 'EBITDA'),\r\n t('financialsTab.headerColumn.depreciation', 'Depreciation'),\r\n t('financialsTab.headerColumn.ebit', 'EBIT'),\r\n t('financialsTab.headerColumn.interestExpense', 'Interest Expense'),\r\n t('financialsTab.headerColumn.ebt', 'EBT'),\r\n t('financialsTab.headerColumn.taxOutlay', 'Tax Outlay'),\r\n t('financialsTab.headerColumn.netIncome', 'Net Income'),\r\n ]\r\n }, [t]);\r\n\r\n // Array of items to show one on each row in the unit column - the second column in the table\r\n const unitHeaderColumnText = useMemo(() => {\r\n return [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n t('common.kWh', 'kWh'),\r\n t('common.pencekWh', 'pence/kWh'),\r\n t('common.pencekWh', 'pence/kWh'),\r\n t('common.gbp', 'GBP'),\r\n '',\r\n '',\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n ]\r\n }, [t]);\r\n\r\n // Array of all full years' data, formatted and converted to strings with '-' representing 0 for display fields\r\n // This is ready for this tab, the same data is formatted differently for other tabs\r\n const columnsYears = useMemo(() => {\r\n\r\n // data for the table\r\n let newColumnData: Array = [];\r\n\r\n // loop round creating a column for each full year\r\n for (let y = 1; y <= yearColumnsRequired; y++) {\r\n\r\n // this year's figures that are based on base calculations and inputs\r\n const yearCalculations = allYearCalculations[y];\r\n\r\n // make up a column for this year's figures for the table\r\n let newColumn: FinancialsColumnData = ({\r\n fieldcenter_startOfPeriod: !!inputsModel?.startDate ? moment(inputsModel?.startDate).add(y - 1, 'years').format('L') : '-',\r\n fieldcenter_endOfPeriod: !!inputsModel?.startDate ? moment(inputsModel?.startDate ?? '').add(y, 'years').subtract(1, 'days').format('L') : '-',\r\n fieldcenter_financialYear: !!inputsModel?.startDate ? moment(inputsModel?.startDate ?? '').add(y - 1, 'years').format('YYYY') : '-',\r\n fieldcenter_ppaSwitch: inputsModel?.ppaTerm >= y ? t('common.true', 'TRUE') : t('common.false', 'FALSE'),\r\n headerline_revenue: '',\r\n totalExported: yearCalculations.totalExported !== 0 ? formatNumber(Math.round(yearCalculations.totalExported)) : '-',\r\n totalGeneration: yearCalculations.totalGeneration !== 0 ? formatNumber(Math.round(yearCalculations.totalGeneration)) : '-',\r\n exportTarrif: yearCalculations.exportTarrif !== 0 ? formatNumber((Math.round(yearCalculations.exportTarrif * 100) / 100), { isDecimals: true }) : '-',\r\n ppaTariff: yearCalculations.ppaTariff !== 0 ? formatNumber((Math.round(yearCalculations.ppaTariff * 100) / 100), { isDecimals: true }) : '-',\r\n revenue: yearCalculations.revenue !== 0 ? formatNumber((Math.round(yearCalculations.revenue))) : '-',\r\n totalline_revenue: yearCalculations.revenue !== 0 ? formatNumber((Math.round(yearCalculations.revenue))) : '-',\r\n headerline_expenses: '',\r\n oAndM: yearCalculations.oAndM !== 0 ? formatNumber(Math.round(yearCalculations.oAndM)) : '-',\r\n oAndMManager: yearCalculations.oAndMManager !== 0 ? formatNumber(Math.round(yearCalculations.oAndMManager)) : '-',\r\n businessRates: yearCalculations.businessRates !== 0 ? formatNumber(Math.round(yearCalculations.businessRates)) : '-',\r\n transmissionFee: yearCalculations.transmissionFee !== 0 ? formatNumber(Math.round(yearCalculations.transmissionFee)) : '-',\r\n landLease: yearCalculations.landLease !== 0 ? formatNumber(Math.round(yearCalculations.landLease)) : '-',\r\n insurance: yearCalculations.insurance !== 0 ? formatNumber(Math.round(yearCalculations.insurance)) : '-',\r\n audit: yearCalculations.audit !== 0 ? formatNumber(Math.round(yearCalculations.audit)) : '-',\r\n managementFee: yearCalculations.managementFee !== 0 ? formatNumber(Math.round(yearCalculations.managementFee)) : '-',\r\n refurbishmentFee: yearCalculations.refurbishmentFee !== 0 ? formatNumber(Math.round(yearCalculations.refurbishmentFee)) : '-',\r\n totalExpenses: yearCalculations.totalExpenses !== 0 ? formatNumber(Math.round(yearCalculations.totalExpenses)) : '-',\r\n totalline_ebitda: yearCalculations.ebitda !== 0 ? formatNumber(Math.round(yearCalculations.ebitda)) : '-',\r\n depreciation: inputsModel?.depreciationYears >= y && calculationsModel?.depreciation !== 0 ? formatNumber(Math.round(calculationsModel?.depreciation)) : '-',\r\n totalline_ebit: yearCalculations.ebit !== 0 ? formatNumber(Math.round(yearCalculations.ebit)) : '-',\r\n interestExpense: yearCalculations.interestExpense > 0 ? formatNumber(Math.round(yearCalculations.interestExpense)) : '-',\r\n totalline_ebt: yearCalculations.ebt !== 0 ? formatNumber(Math.round(yearCalculations.ebt)) : '-',\r\n taxOutlay: yearCalculations.taxOutlay !== 0 ? formatNumber(Math.round(yearCalculations.taxOutlay)) : '-',\r\n totalline_netIncome: yearCalculations.netIncome !== 0 ? formatNumber(Math.round(yearCalculations.netIncome)) : '-',\r\n });\r\n\r\n // add the new column to the table data array \r\n newColumnData.push(newColumn);\r\n }\r\n\r\n // return an array for the table holding a column for each year required\r\n return newColumnData;\r\n }, [inputsModel, calculationsModel, allYearCalculations, t]);\r\n\r\n // a way to work out the number of rows required in each table - excludes empty rows\r\n const rows = useMemo(() => {\r\n if (columnsYears.length < 1) {\r\n return 0;\r\n }\r\n return Object.keys(columnsYears[0]).length;\r\n }, [columnsYears]);\r\n\r\n // empty rows to be generated - key is index of row before, value is number of empty rows required\r\n const emptyRowsToBeGenerated = useMemo(() => {\r\n return [\r\n { key: 3, value: 3 },\r\n { key: 9, value: 1 },\r\n { key: 10, value: 1 },\r\n { key: 11, value: 1 },\r\n { key: 12, value: 1 },\r\n { key: 21, value: 1 },\r\n { key: 22, value: 1 },\r\n { key: 23, value: 1 },\r\n { key: 24, value: 1 },\r\n { key: 25, value: 1 },\r\n { key: 26, value: 1 },\r\n { key: 27, value: 1 },\r\n ]\r\n }, []);\r\n\r\n // a populated table row of as many columns as needed together with empty rows as appropriate\r\n const PopulatedTableRow = useCallback((props: { fullFinancialYearColumns: number, columnDataFieldIndex: number }) => {\r\n const {\r\n fullFinancialYearColumns, columnDataFieldIndex\r\n } = props;\r\n const emptyRows = emptyRowsToBeGenerated.find(item => item.key === columnDataFieldIndex)?.value ?? 0;\r\n\r\n\r\n // check for any of the special cases defined by the prefix to the field name\r\n // we can use special line prefixes on the tr, or the td if they are to be applied selectively and not every cell on the row\r\n let thisRowClassName = '';\r\n if (Object.keys(columnsYears[0])[columnDataFieldIndex].startsWith('totalline_')) {\r\n /* total line has colored background and bold text and double underline */\r\n thisRowClassName = 'totalline';\r\n } else if (Object.keys(columnsYears[0])[columnDataFieldIndex].startsWith('headerline_')) {\r\n /* header with bold text */\r\n thisRowClassName = 'headerline'\r\n }\r\n if (columnDataFieldIndex === Object.keys(columnsYears[0]).length - 1 && thisRowClassName === 'totalline') {\r\n /* last row of table which we know is a total line */\r\n thisRowClassName = 'totallinefinal'\r\n }\r\n\r\n // apply special field prefixes to the td when required \r\n let thisFieldClassName = 'yearColumn';\r\n if (Object.keys(columnsYears[0])[columnDataFieldIndex].startsWith('fieldcenter_')) {\r\n thisFieldClassName += ' fieldcenter';\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {/* header column */}\r\n {headerColumnText[columnDataFieldIndex]}\r\n {/* sub-header column */}\r\n {unitHeaderColumnText[columnDataFieldIndex]}\r\n {/* year zero column */}\r\n {!inputsModel?.startDate || columnDataFieldIndex !== 1 ? '' : moment(inputsModel?.startDate ?? '').subtract(1, 'days').format('L')}\r\n {\r\n /* full financial column for a year */\r\n [...Array(fullFinancialYearColumns)].map((value: undefined, index) => {\r\n return (\r\n \r\n {Object.values(columnsYears[index])[columnDataFieldIndex]}\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n )\r\n }, [headerColumnText, unitHeaderColumnText, inputsModel, columnsYears, emptyRowsToBeGenerated, ]);\r\n\r\n /** UI\r\n **/\r\n return (\r\n <>\r\n \r\n \r\n
\r\n
\r\n\r\n {/* Table */}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n /* one column for each of the numbered years plus a first one for year 0 */\r\n [...Array(yearColumnsRequired + 1)].map((value: undefined, index) => {\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n {\r\n [...Array(rows)].map((value: undefined, index) => {\r\n\r\n /* could return a single row or a row plus a number of empty rows */\r\n return (\r\n \r\n )\r\n })\r\n }\r\n \r\n
{t('financialsTab.headerColumn.year', 'Year')} {/*intentionally blank*/}\r\n {index}\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\n\r\n// in the column data below there are some special prenames for fields:\r\n// fieldcenter_ adds a class that causes data to be text align center when displayed in a table cell\r\n// headerline_ adds a class that causes the row to be displayed as an internal header - usually just increasing the font weight\r\n// totalline_ adds a class that causes the row to be displayed differently - usually background coplor and double underline\r\n// calculation_ for calculation not display\r\n\r\n/**\r\n * Data for a column in the table\r\n */\r\nexport interface FinancialsColumnData {\r\n fieldcenter_startOfPeriod: string,\r\n fieldcenter_endOfPeriod: string,\r\n fieldcenter_financialYear: string,\r\n fieldcenter_ppaSwitch: string,\r\n headerline_revenue: string,\r\n totalExported: string,\r\n totalGeneration: string,\r\n exportTarrif: string,\r\n ppaTariff: string,\r\n revenue: string,\r\n totalline_revenue: string,\r\n headerline_expenses: string,\r\n oAndM: string,\r\n oAndMManager: string,\r\n businessRates: string,\r\n transmissionFee: string,\r\n landLease: string,\r\n insurance: string,\r\n audit: string,\r\n managementFee: string,\r\n refurbishmentFee: string,\r\n totalExpenses: string,\r\n totalline_ebitda: string,\r\n depreciation: string,\r\n totalline_ebit: string,\r\n interestExpense: string,\r\n totalline_ebt: string,\r\n taxOutlay: string,\r\n totalline_netIncome: string\r\n}\r\n\r\n","import { useMemo } from \"react\";\r\nimport { calculateInflatedFigure, calculateInflationReducedFigure } from \"../../../services/calculationsProcessor/CalculationsProcessor\";\r\n\r\nexport interface YearCalculation {\r\n totalExported: number,\r\n totalGeneration: number,\r\n exportTarrif: number,\r\n ppaTariff: number,\r\n revenue: number,\r\n oAndM: number,\r\n oAndMManager: number,\r\n businessRates: number,\r\n transmissionFee: number,\r\n landLease: number,\r\n insurance: number,\r\n audit: number,\r\n managementFee: number,\r\n refurbishmentFee: number,\r\n totalExpenses: number,\r\n ebitda: number,\r\n openingBalance: number,\r\n closingBalance: number,\r\n systemYield: number,\r\n energyCost: number,\r\n solarEnergyCost: number,\r\n receivables: number,\r\n payables: number,\r\n workingCapital: number,\r\n ebit: number,\r\n interestExpense: number,\r\n ebt: number,\r\n taxOutlay: number,\r\n netIncome: number,\r\n energyCostWithoutSolar: number,\r\n energyCostWithSolar: number,\r\n annualSavings: number,\r\n}\r\n\r\nexport const yearCalculationDefaultValues = (): YearCalculation => {\r\n\r\n return {\r\n totalExported: 0,\r\n totalGeneration: 0,\r\n exportTarrif: 0,\r\n ppaTariff: 0,\r\n revenue: 0,\r\n oAndM: 0,\r\n oAndMManager: 0,\r\n businessRates: 0,\r\n transmissionFee: 0,\r\n landLease: 0,\r\n insurance: 0,\r\n audit: 0,\r\n managementFee: 0,\r\n refurbishmentFee: 0,\r\n totalExpenses: 0,\r\n ebitda: 0,\r\n openingBalance: 0,\r\n closingBalance: 0,\r\n systemYield: 0,\r\n energyCost: 0,\r\n solarEnergyCost: 0,\r\n receivables: 0,\r\n payables: 0,\r\n workingCapital: 0,\r\n ebit: 0,\r\n interestExpense: 0,\r\n ebt: 0,\r\n taxOutlay: 0,\r\n netIncome: 0,\r\n energyCostWithoutSolar: 0,\r\n energyCostWithSolar: 0,\r\n annualSavings: 0,\r\n }\r\n};\r\n/**\r\n * Returns all the figures required for each year of the model adjusted by te appropriate indexation rate.\r\n **/\r\nexport function useCalculateForYear(inputsModel: any | undefined, calculationsModel: any | undefined, year: number, energySalesPriceFromSnapshot: number,) {\r\n const yearCalculations = useMemo(() => {\r\n return calculateForYear(inputsModel, calculationsModel, year, energySalesPriceFromSnapshot, );\r\n\r\n\r\n }, [inputsModel, calculationsModel, year, energySalesPriceFromSnapshot, ]);\r\n\r\n return yearCalculations;\r\n}\r\n\r\nexport function calculateForYear(inputsModel: any | undefined, calculationsModel: any | undefined, year: number, energySalesPriceFromSnapshot: number,) {\r\n const isYearWithinppaTerm = inputsModel?.ppaTerm >= year;\r\n const isYearUnderppaTerm = inputsModel?.ppaTerm > year;\r\n\r\n const totalExported = calculateInflationReducedFigure(year, calculationsModel?.export, calculationsModel?.nonDegradationMultiplier);\r\n const totalGeneration = calculateInflationReducedFigure(year, calculationsModel?.takeOrPay, calculationsModel?.nonDegradationMultiplier);\r\n const ppaTariff = isYearWithinppaTerm ? calculateInflatedFigure(year, energySalesPriceFromSnapshot, inputsModel?.annualInflation) : 0;\r\n const exportTarrif = isYearWithinppaTerm ? calculateInflatedFigure(year, inputsModel?.exportTariff, inputsModel?.rpi) : 0;\r\n const oAndM = calculateInflatedFigure(year, calculationsModel?.oAndMCalculation, inputsModel?.rpi);\r\n const oAndMManager = calculateInflatedFigure(year, inputsModel?.oAndMManager, inputsModel?.rpi);\r\n const businessRates = calculateInflatedFigure(year, calculationsModel?.businessRates, inputsModel?.rpi);\r\n const transmissionFee = calculateInflatedFigure(year, inputsModel?.transmissionFee, inputsModel?.rpi);\r\n const landLease = calculateInflatedFigure(year, inputsModel?.landLease, inputsModel?.rpi);\r\n const insurance = calculateInflatedFigure(year, calculationsModel?.insuranceCalculation, inputsModel?.insuranceandLCInflation);\r\n const audit = calculateInflatedFigure(year, inputsModel?.audit, inputsModel?.rpi);\r\n const managementFee = calculateInflatedFigure(year, calculationsModel?.managementFee, inputsModel?.managementFeeInflation);\r\n const refurbishmentFee = calculateInflatedFigure(year, calculationsModel?.refurbishmentFeeCalculation, inputsModel?.rpi);\r\n const openingBalance = calculationsModel?.totalCapex2 - (calculationsModel?.depreciation * (year - 1));\r\n const closingBalance = calculationsModel?.totalCapex2 - (calculationsModel?.depreciation * year);\r\n const systemYield = calculateInflationReducedFigure(year, calculationsModel?.estimatedOutput, calculationsModel?.nonDegradationMultiplier);\r\n const energyCost = calculateInflatedFigure(year, inputsModel?.currentEnergyCost, inputsModel?.energyInflation, true);\r\n const solarEnergyCost = calculateInflatedFigure(year, energySalesPriceFromSnapshot, inputsModel?.annualInflation, true);\r\n\r\n\r\n // some things calculated here and not in calculator as they rely on more than 1 different rate for inflation calculation\r\n const revenue = isYearWithinppaTerm ? ((totalExported * (exportTarrif / 100)) + (totalGeneration * (ppaTariff / 100))) : 0;\r\n const totalExpenses = isYearWithinppaTerm ? oAndM + oAndMManager + businessRates + transmissionFee + landLease + insurance + audit + managementFee + refurbishmentFee : 0;\r\n const ebitda = revenue - totalExpenses;\r\n const receivables = revenue * (inputsModel?.receivablesDays / 365);\r\n const payables = totalExpenses * (inputsModel?.payablesDays / 365);\r\n const workingCapital = receivables - payables;\r\n const ebit = isYearWithinppaTerm ? ebitda - calculationsModel?.depreciation : 0;\r\n // TODO no calc for interest rate provided\r\n const interestExpense = 0;\r\n const ebt = isYearWithinppaTerm ? ebit - interestExpense : 0;\r\n const taxOutlay = isYearWithinppaTerm ? (year === 1 ? ebt * (inputsModel?.taxNow?? 0) / 100 : ebt * (inputsModel?.taxFuture ?? 0) / 100) : 0;\r\n const netIncome = ebt - taxOutlay;\r\n const energyCostWithoutSolar = totalGeneration * energyCost / 100;\r\n const energyCostWithSolar = isYearUnderppaTerm ? totalGeneration * solarEnergyCost / 100 : 0;\r\n const annualSavings = energyCostWithoutSolar - energyCostWithSolar;\r\n\r\n return {\r\n totalExported: totalExported,\r\n totalGeneration: totalGeneration,\r\n exportTarrif: exportTarrif,\r\n ppaTariff: ppaTariff,\r\n revenue: revenue,\r\n oAndM: oAndM,\r\n oAndMManager: oAndMManager,\r\n businessRates: businessRates,\r\n transmissionFee: transmissionFee,\r\n landLease: landLease,\r\n insurance: insurance,\r\n audit: audit,\r\n managementFee: managementFee,\r\n refurbishmentFee: refurbishmentFee,\r\n totalExpenses: totalExpenses,\r\n ebitda: ebitda,\r\n openingBalance: openingBalance,\r\n closingBalance: closingBalance,\r\n systemYield: systemYield,\r\n energyCost: energyCost,\r\n solarEnergyCost: solarEnergyCost,\r\n receivables: receivables,\r\n payables: payables,\r\n workingCapital: workingCapital,\r\n ebit: ebit,\r\n interestExpense: interestExpense,\r\n ebt: ebt,\r\n taxOutlay: taxOutlay,\r\n netIncome: netIncome,\r\n energyCostWithoutSolar: energyCostWithoutSolar,\r\n energyCostWithSolar: energyCostWithSolar,\r\n annualSavings: annualSavings,\r\n } as YearCalculation\r\n}\r\n\r\n","import { useCallback, useMemo, } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Col, Row, Table } from \"reactstrap\";\r\nimport { EmptyTableRows } from \"../../../shared/EmptyTableRows\";\r\nimport { YearCalculation, yearCalculationDefaultValues } from \"../../utilities/useCalculateForYear\";\r\nimport { formatNumber } from \"../../utilities/useFormattedNumber\";\r\nimport './valuationTab.scss';\r\n\r\nexport interface ValuationTabProps {\r\n inputsModel: any | undefined,\r\n calculationsModel: any | undefined,\r\n allYearCalculations: YearCalculation[],\r\n irrCalculations: { preTaxIRR: number | '#NUM!', postTaxIRR: number | '#NUM!' }\r\n}\r\n\r\n/**\r\n * Tab for maintaining the valuation details - Valuation, Working Capital, and Depreciation.\r\n * @param props\r\n */\r\nexport const ValuationTab = (props: ValuationTabProps) => {\r\n const {\r\n inputsModel, // all inputs\r\n calculationsModel, // holds the bottom level calculations created by the calculator from the inputs\r\n allYearCalculations, // holds all the calculations for all years of the proposal including year zero\r\n irrCalculations, // pre and post tax irr calculations\r\n } = props;\r\n\r\n const { t } = useTranslation();\r\n\r\n // Number of years for full calculations - excludes year 0\r\n // this is just for the financials tab and is different from the proposal years\r\n const yearColumnsRequired = 30;\r\n\r\n // Arrays of items to show one on each row in the header column - the first column in the tables\r\n // One array for each table\r\n const headerColumnText = useMemo(() => {\r\n return {\r\n valuation: [\r\n t('valuationTab.headerColumn.ebitda', 'EBITDA'),\r\n t('valuationTab.headerColumn.taxes', 'Taxes'),\r\n t('valuationTab.headerColumn.capex', 'Capex'),\r\n t('valuationTab.headerColumn.changeInWC', 'Change in WC'),\r\n t('valuationTab.headerColumn.fcfPostTax', 'FCF - post Tax'),\r\n t('valuationTab.headerColumn.irrPostTax', 'IRR - post Tax'),\r\n t('valuationTab.headerColumn.fcfPreTax', 'FCF - pre Tax'),\r\n t('valuationTab.headerColumn.irrPreTax', 'IRR - pre Tax'),\r\n ],\r\n workingCapital: [\r\n t('valuationTab.headerColumn.receivables', 'Receivables'),\r\n t('valuationTab.headerColumn.payables', 'Payables'),\r\n t('valuationTab.headerColumn.workingCapital', 'Working capital'),\r\n ],\r\n depreciation: [\r\n t('valuationTab.headerColumn.switch', 'Switch'),\r\n t('valuationTab.headerColumn.openingBalance', 'Opening Balance'),\r\n t('valuationTab.headerColumn.depreciation', 'Depreciation'),\r\n t('valuationTab.headerColumn.closingBalance', 'Closing Balance'),\r\n ]\r\n }\r\n }, [t]);\r\n\r\n // Arrays of items to show one on each row in the unit column - the second column in the tables\r\n // One array for each table\r\n const unitHeaderColumnText = useMemo(() => {\r\n return {\r\n valuation: [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ],\r\n workingCapital: [\r\n '',\r\n '',\r\n '',\r\n ],\r\n depreciation: [\r\n '',\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n t('common.gbp', 'GBP'),\r\n ]\r\n }\r\n }, [t]);\r\n\r\n // Arrays of all full years' data, formatted and converted to strings with '-' representing 0 for display fields\r\n // There will be an array for each table required, and an additional array for the calculation fields which remain as numbers and are not displayed\r\n const columnsYears = useMemo(() => {\r\n\r\n // data for valuation table\r\n let newValuationColumnData: Array = [];\r\n // data for working capital table\r\n let newWorkingCapitalColumnData: Array = [];\r\n // data for depreciation table\r\n let newDepreciationColumnData: Array = [];\r\n // data for non-display calculation table\r\n let newCalculationColumnData: Array = [];\r\n\r\n // temporary array to hold previous year's figure to work out the current year for some calculations.\r\n let previousYearCalculations: YearCalculation = { ...yearCalculationDefaultValues() };\r\n\r\n // loop round creating a column for each full year\r\n for (let y = 1; y <= yearColumnsRequired; y++) {\r\n\r\n // this year's figures that are based on base calculations and inputs\r\n const yearCalculations = allYearCalculations[y];\r\n\r\n // calculations that rquire previous and current year calculations\r\n const changeInWC = !previousYearCalculations.workingCapital || !yearCalculations.workingCapital ? 0 : previousYearCalculations.workingCapital - yearCalculations.workingCapital;\r\n const fcfPostTax = yearCalculations.ebitda - yearCalculations.taxOutlay + changeInWC;\r\n const fcfPreTax = yearCalculations.ebitda + changeInWC;\r\n\r\n // make up a column for this year's figures for the valuations table\r\n let newValuationColumn: ValuationColumnData = ({\r\n headerline_ebitda: yearCalculations.ebitda > 0 ? formatNumber(Math.round(yearCalculations.ebitda)) : '-',\r\n headerline_taxes: yearCalculations.taxOutlay === 0 ? '-' : formatNumber(Math.round(yearCalculations.taxOutlay * -1)),\r\n headerline_capex: '',\r\n headerline_changeInWC: changeInWC === 0 ? '-' : formatNumber(Math.round(changeInWC)),\r\n headerline_fcfPostTax: fcfPostTax === 0 ? '-' : formatNumber(Math.round(fcfPostTax)),\r\n totalline_irrPostTax: '',\r\n headerline_fcfPreTax: fcfPreTax === 0 ? '-' : formatNumber(Math.round(fcfPreTax)),\r\n totalline_irrPreTax: '',\r\n });\r\n\r\n // make up a column for this year's figures for the working capital table\r\n let newWorkingCapitalColumn: WorkingCapitalColumnData = ({\r\n receivables: yearCalculations.receivables > 0 ? formatNumber(Math.round(yearCalculations.receivables)) : '-',\r\n payables: yearCalculations.payables > 0 ? formatNumber(Math.round(yearCalculations.payables)) : '-',\r\n workingCapital: yearCalculations.workingCapital > 0 ? formatNumber(Math.round(yearCalculations.workingCapital)) : '-',\r\n });\r\n\r\n // make up a column for this year's figures for the depreciation table\r\n let newDepreciationColumn: DepreciationColumnData = ({\r\n fieldcenter_switch: inputsModel?.depreciationYears >= y ? t('common.true', 'TRUE') : t('common.false', 'FALSE'),\r\n openingBalance: yearCalculations.openingBalance > 0 ? formatNumber(Math.round(yearCalculations.openingBalance)) : '-',\r\n depreciation: inputsModel?.depreciationYears >= y ? formatNumber(Math.round(calculationsModel?.depreciation)) : '-',\r\n closingBalance: yearCalculations.closingBalance > 0 ? formatNumber(Math.round(yearCalculations.closingBalance)) : '-',\r\n });\r\n\r\n // store the non-display calculation fields\r\n let newCalculationColumn: CalculationColumnData = ({\r\n calculation_fcfPostTax: fcfPostTax,\r\n calculation_fcfPreTax: fcfPreTax\r\n });\r\n\r\n // add the new columns to each of the table data arrays \r\n newValuationColumnData.push(newValuationColumn);\r\n newWorkingCapitalColumnData.push(newWorkingCapitalColumn);\r\n newDepreciationColumnData.push(newDepreciationColumn);\r\n newCalculationColumnData.push(newCalculationColumn);\r\n\r\n // update the temporary previous years data \r\n previousYearCalculations = yearCalculations;\r\n\r\n }\r\n\r\n // return an array for each table holding a column for each year required\r\n return { valuationColumnData: newValuationColumnData, workingCapitalColumnData: newWorkingCapitalColumnData, depreciationColumnData: newDepreciationColumnData, calculationColumnData: newCalculationColumnData };\r\n }, [inputsModel, calculationsModel, t, allYearCalculations, ]);\r\n\r\n // figures needed for the 0 year column - a full years calculations is not required until year 1\r\n // one array for each table\r\n const columnYearZero = useMemo(() => {\r\n\r\n return {\r\n valuation: [\r\n '', // ebitda\r\n '', //taxes\r\n !calculationsModel?.totalCapex2 ? '-' : formatNumber(Math.round(calculationsModel?.totalCapex2 * -1)), //capex\r\n '', //changeInWC\r\n !calculationsModel?.totalCapex2 ? '-' : formatNumber(Math.round(calculationsModel?.totalCapex2 * -1)), //fcfPostTax\r\n irrCalculations.postTaxIRR === '#NUM!' ? '0.00%' : formatNumber(irrCalculations.postTaxIRR, { isDecimals: true, isPercentage: true }), //irrPostTax\r\n !calculationsModel?.totalCapex2 ? '-' : formatNumber(Math.round(calculationsModel?.totalCapex2 * -1)), //fcfPreTax\r\n irrCalculations.preTaxIRR === '#NUM!' ? '0.00%' : formatNumber(irrCalculations.preTaxIRR, { isDecimals: true, isPercentage: true }), //irrPreTax\r\n ],\r\n workingCapital: [\r\n '', //receivables\r\n '', //payables\r\n '', //workingCapital\r\n ],\r\n depreciation: [\r\n '', //switch\r\n '', //openingBalance\r\n '', //depreciation\r\n '' //closingBalance\r\n ]\r\n };\r\n }, [calculationsModel, irrCalculations,]);\r\n\r\n\r\n // a way to work out the number of rows required in each table - excludes empty rows\r\n // one figure for each table\r\n const rows = useMemo(() => {\r\n if (!columnsYears.valuationColumnData.length || !columnsYears.workingCapitalColumnData.length || !columnsYears.depreciationColumnData.length) {\r\n return { valuation: 0, workingCapital: 0, depreciation: 0 };\r\n }\r\n return {\r\n valuation: Object.keys(columnsYears.valuationColumnData[0]).length,\r\n workingCapital: Object.keys(columnsYears.workingCapitalColumnData[0]).length,\r\n depreciation: Object.keys(columnsYears.depreciationColumnData[0]).length\r\n };\r\n }, [columnsYears]);\r\n\r\n // empty rows to be generated - key is index of row before, value is number of empty rows required\r\n // one array for each table\r\n const emptyRowsToBeGenerated: { valuation: { key: number, value: number }[], workingCapital: { key: number, value: number }[], depreciation: { key: number, value: number }[], } = useMemo(() => {\r\n return {\r\n valuation: [\r\n { key: 3, value: 1 },\r\n { key: 5, value: 2 },\r\n ],\r\n workingCapital: [\r\n ],\r\n depreciation: [\r\n ]\r\n };\r\n }, []);\r\n\r\n // a populated table row of as many columns as needed together with empty rows as appropriate\r\n const PopulatedTableRow = useCallback((props: { fullFinancialYearColumns: number, columnDataFieldIndex: number, tableName: string }) => {\r\n const {\r\n fullFinancialYearColumns, columnDataFieldIndex, tableName,\r\n } = props;\r\n\r\n // we need to get the field name from the right interface for the table being created to check for special processing\r\n // and at the same time we'll get the year zero figures for the right table and the emoty rows\r\n let checkFieldName = '';\r\n let thisYearZero: Array = [];\r\n let emptyRows = 0;\r\n if (tableName === 'Valuation') {\r\n checkFieldName = Object.keys(columnsYears.valuationColumnData[0])[columnDataFieldIndex];\r\n thisYearZero = columnYearZero.valuation;\r\n emptyRows = emptyRowsToBeGenerated.valuation.find(item => item.key === columnDataFieldIndex)?.value ?? 0\r\n } else if (tableName === 'WorkingCapital') {\r\n checkFieldName = Object.keys(columnsYears.workingCapitalColumnData[0])[columnDataFieldIndex];\r\n thisYearZero = columnYearZero.workingCapital;\r\n emptyRows = emptyRowsToBeGenerated.workingCapital.find(item => item.key === columnDataFieldIndex)?.value ?? 0\r\n } else if (tableName === 'Depreciation') {\r\n checkFieldName = Object.keys(columnsYears.depreciationColumnData[0])[columnDataFieldIndex];\r\n thisYearZero = columnYearZero.depreciation;\r\n emptyRows = emptyRowsToBeGenerated.depreciation.find(item => item.key === columnDataFieldIndex)?.value ?? 0\r\n }\r\n\r\n // check for any of the special cases defined by the prefix to the field name\r\n // we can use special line prefixes on the tr, or the td if they are to be applied selectively and not every cell on the row\r\n let thisRowClassName = '';\r\n if (checkFieldName.startsWith('totalline_')) {\r\n /* total line has colored background and bold text and double underline */\r\n thisRowClassName = 'totalline';\r\n } else if (checkFieldName.startsWith('headerline_')) {\r\n /* header with bold text */\r\n thisRowClassName = 'headerline'\r\n }\r\n\r\n // apply special field prefixes to the td when required \r\n let thisFieldClassName = 'yearColumn';\r\n if (checkFieldName.startsWith('fieldcenter_')) {\r\n /* align text centrally */\r\n thisFieldClassName += ' fieldcenter';\r\n }\r\n\r\n // the populated row with any empty rows\r\n return (\r\n <>\r\n \r\n {/* header column */}\r\n \r\n {\r\n tableName === 'Valuation' ? headerColumnText.valuation[columnDataFieldIndex]\r\n : tableName === 'WorkingCapital' ? headerColumnText.workingCapital[columnDataFieldIndex]\r\n : headerColumnText.depreciation[columnDataFieldIndex]\r\n }\r\n\r\n\r\n \r\n {/* sub-header column */}\r\n \r\n {\r\n tableName === 'Valuation' ? unitHeaderColumnText.valuation[columnDataFieldIndex]\r\n : tableName === 'WorkingCapital' ? unitHeaderColumnText.workingCapital[columnDataFieldIndex]\r\n : unitHeaderColumnText.depreciation[columnDataFieldIndex]\r\n }\r\n \r\n {/* year zero column */}\r\n {thisYearZero[columnDataFieldIndex]}\r\n {\r\n /* full financial column for a year */\r\n [...Array(fullFinancialYearColumns)].map((value: undefined, index) => {\r\n\r\n return (\r\n \r\n {\r\n tableName === 'Valuation' ? Object.values(columnsYears.valuationColumnData[index])[columnDataFieldIndex]\r\n : tableName === 'WorkingCapital' ? Object.values(columnsYears.workingCapitalColumnData[index])[columnDataFieldIndex]\r\n : Object.values(columnsYears.depreciationColumnData[index])[columnDataFieldIndex]\r\n }\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n )\r\n }, [headerColumnText, unitHeaderColumnText, columnsYears, emptyRowsToBeGenerated, columnYearZero,]);\r\n\r\n /** UI\r\n **/\r\n return (\r\n <>\r\n \r\n \r\n
\r\n
\r\n\r\n {/* Valuation Table */}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n /* one column for each of the numbered years plus a first one for year 0 */\r\n [...Array(yearColumnsRequired + 1)].map((value: undefined, index) => {\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n {\r\n [...Array(rows.valuation)].map((value: undefined, index) => {\r\n\r\n /* could return a single row or a row plus a number of empty rows */ \r\n return (\r\n \r\n )\r\n })\r\n }\r\n \r\n
{t('valuationTab.headerColumn.valuation', 'Valuation')} {/*intentionally blank*/}\r\n {index}\r\n
\r\n\r\n {/* Working Capital Table */}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n /* one column for each of the numbered years plus a first one for year 0 */\r\n [...Array(yearColumnsRequired + 1)].map((value: undefined, index) => {\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n {\r\n [...Array(rows.workingCapital)].map((value: undefined, index) => {\r\n\r\n /* could return a single row or a row plus a number of empty rows */ \r\n return (\r\n \r\n )\r\n })\r\n }\r\n \r\n
{t('valuationTab.headerColumn.workingCapitalCalcs', 'Working Capital')} {/*intentionally blank*/}\r\n {index}\r\n
\r\n\r\n {/* Depreciation Table */}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n /* one column for each of the numbered years plus a first one for year 0 */\r\n [...Array(yearColumnsRequired + 1)].map((value: undefined, index) => {\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n \r\n {\r\n [...Array(rows.depreciation)].map((value: undefined, index) => {\r\n\r\n /* could return a single row or a row plus a number of empty rows */ \r\n return (\r\n \r\n )\r\n })\r\n }\r\n \r\n
{t('valuationTab.headerColumn.depreciation', 'Depreciation')} {/*intentionally blank*/}\r\n {index}\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\n\r\n// in the column data below there are some special prenames for fields:\r\n// fieldcenter_ adds a class that causes data to be text align center when displayed in a table cell\r\n// headerline_ adds a class that causes the row to be displayed as an internal header - usually just increasing the font weight\r\n// totalline_ adds a class that causes the row to be displayed differently - usually background coplor and double underline\r\n// calculation_ for calculation not display\r\n\r\n/**\r\n * Data for a column in the valuation table\r\n */\r\nexport interface ValuationColumnData {\r\n headerline_ebitda: string,\r\n headerline_taxes: string,\r\n headerline_capex: string,\r\n headerline_changeInWC: string,\r\n headerline_fcfPostTax: string,\r\n totalline_irrPostTax: string,\r\n headerline_fcfPreTax: string,\r\n totalline_irrPreTax: string,\r\n}\r\n/**\r\n * Data for a column in the working capital table\r\n */\r\nexport interface WorkingCapitalColumnData {\r\n receivables: string,\r\n payables: string,\r\n workingCapital: string,\r\n}\r\n/**\r\n * Data for a column in the depreciation table\r\n */\r\nexport interface DepreciationColumnData {\r\n fieldcenter_switch: string,\r\n openingBalance: string,\r\n depreciation: string,\r\n closingBalance: string,\r\n}\r\n/**\r\n * Equivalent raw data for calculations on a column in the tables\r\n */\r\nexport interface CalculationColumnData {\r\n calculation_fcfPostTax: number, // used for IRR calc\r\n calculation_fcfPreTax: number, // used for IRR calc\r\n}","import { useMemo } from \"react\";\r\n\r\n//export interface YearCalculation {\r\n// totalExported: number,\r\n// totalGeneration: number,\r\n// exportTarrif: number,\r\n// ppaTariff: number,\r\n// revenue: number,\r\n// oAndM: number,\r\n// oAndMManager: number,\r\n// businessRates: number,\r\n// transmissionFee: number,\r\n// landLease: number,\r\n// insurance: number,\r\n// audit: number,\r\n// managementFee: number,\r\n// refurbishmentFee: number,\r\n// totalExpenses: number,\r\n// ebitda: number,\r\n// openingBalance: number,\r\n// closingBalance: number,\r\n// receivables: number,\r\n// payables: number,\r\n// workingCapital: number,\r\n// ebit: number,\r\n// interestExpense: number,\r\n// ebt: number,\r\n// taxOutlay: number,\r\n// netIncome: number,\r\n//}\r\n\r\n/**\r\n * Returns IRR calculation based on a range of figures.\r\n **/\r\nexport function useIRRCalculator(values: number[], guess: number,) {\r\n const IRRCalculation = useMemo(() => {\r\n return calculateIRR(values, guess);\r\n\r\n\r\n }, [values, guess]);\r\n\r\n return IRRCalculation;\r\n}\r\n\r\n// Copyright (c) 2012 Sutoiku, Inc. (MIT License)\r\n\r\n// Some algorithms have been ported from Apache OpenOffice:\r\n\r\n/**************************************************************\r\n * \r\n * Licensed to the Apache Software Foundation (ASF) under one\r\n * or more contributor license agreements. See the NOTICE file\r\n * distributed with this work for additional information\r\n * regarding copyright ownership. The ASF licenses this file\r\n * to you under the Apache License, Version 2.0 (the\r\n * \"License\"); you may not use this file except in compliance\r\n * with the License. You may obtain a copy of the License at\r\n * \r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n * \r\n * Unless required by applicable law or agreed to in writing,\r\n * software distributed under the License is distributed on an\r\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n * KIND, either express or implied. See the License for the\r\n * specific language governing permissions and limitations\r\n * under the License.\r\n * \r\n *************************************************************/\r\n\r\nexport function calculateIRR(values: number[], guess: number | undefined,) {\r\n // Credits: algorithm inspired by Apache OpenOffice\r\n\r\n // Calculates the resulting amount\r\n const irrResult = function (values: number[], dates: number[], rate: number) {\r\n let r = rate + 1;\r\n let result = values[0];\r\n for (let i = 1; i < values.length; i++) {\r\n result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\r\n }\r\n return result;\r\n }\r\n\r\n // Calculates the first derivation\r\n const irrResultDeriv = function (values: number[], dates: number[], rate: number) {\r\n let r = rate + 1;\r\n let result = 0;\r\n for (let i = 1; i < values.length; i++) {\r\n let frac = (dates[i] - dates[0]) / 365;\r\n result -= frac * values[i] / Math.pow(r, frac + 1);\r\n }\r\n return result;\r\n }\r\n\r\n // Initialize dates and check that values contains at least one positive value and one negative value\r\n let dates: Array = [];\r\n let positive = false;\r\n let negative = false;\r\n for (var i = 0; i < values.length; i++) {\r\n dates[i] = (i === 0) ? 0 : dates[i - 1] + 365;\r\n if (values[i] > 0) positive = true;\r\n if (values[i] < 0) negative = true;\r\n }\r\n\r\n // Return error if values does not contain at least one positive value and one negative value\r\n if (!positive || !negative) return '#NUM!';\r\n\r\n // Initialize guess and resultRate\r\n guess = (typeof guess === 'undefined') ? 0.1 : guess;\r\n let resultRate = guess;\r\n\r\n // Set maximum epsilon for end of iteration\r\n const epsMax = 1e-10;\r\n\r\n // Set maximum number of iterations\r\n const iterMax = 50;\r\n\r\n // Implement Newton's method\r\n let newRate, epsRate, resultValue;\r\n let iteration = 0;\r\n let contLoop = true;\r\n do {\r\n resultValue = irrResult(values, dates, resultRate);\r\n newRate = resultRate - resultValue / irrResultDeriv(values, dates, resultRate);\r\n epsRate = Math.abs(newRate - resultRate);\r\n resultRate = newRate;\r\n contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\r\n } while (contLoop && (++iteration < iterMax));\r\n\r\n if (contLoop) return '#NUM!';\r\n\r\n // Return internal rate of return\r\n return resultRate;\r\n}","import gql from \"graphql-tag\";\r\nimport { Guid } from \"guid-string\";\r\nimport moment from \"moment\";\r\nimport { baseValueFields } from \"../generated/baseValueFields\";\r\n\r\nexport const baseValueFieldsFragment = gql`\r\n fragment baseValueFields on BaseValue {\r\n id\r\n name\r\n valuesJson\r\n archived\r\n createdDate\r\n updatedDate\r\n }\r\n`;\r\n\r\n\r\nexport type BaseValue = Omit;\r\n\r\n/**\r\n * Default values.\r\n */\r\nexport const baseValueDefaultValues = (): Partial => {\r\n const now = moment();\r\n\r\n return {\r\n id: Guid.newGuid(),\r\n name: '',\r\n valuesJson: '{}',\r\n archived: false,\r\n createdDate: now.toISOString(),\r\n updatedDate: now.toISOString(),\r\n }\r\n};","import './footer.scss';\r\nimport { AppFooter } from '@coreui/react';\r\nimport { Col, Nav, Row } from 'reactstrap';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const Footer = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n {t('footer.contact', 'Get in touch')}\r\n {/* {t('footer.help', 'Help Centre')}*/}\r\n \r\n \r\n \r\n \r\n {t('footer-address', 'The Sustainability Hub, Exeter EX6 7BE')}\r\n
\r\n {t('footer-company', 'Company Number 9682843')}\r\n \r\n \r\n {t('footer-phone','01392 549 700')}\r\n \r\n \r\n {t('footer-terms', 'Terms and Conditions')}\r\n \r\n
\r\n\r\n \r\n
\r\n );\r\n};\r\n\r\n","import { useMutation } from \"@apollo/react-hooks\";\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport gql from \"graphql-tag\";\r\nimport { AsyncActionStatus } from '../../../shared/abstractStore';\r\nimport { FinancialModelCreateUnauthenticatedInput } from '../generated/globalTypes';\r\nimport { createFinancialModelUnauthenticatedMutation, createFinancialModelUnauthenticatedMutationVariables } from '../generated/createFinancialModelUnauthenticatedMutation';\r\nimport { financialModelFieldsFragment } from '../models/FinancialModel';\r\n\r\n/**\r\n * Get a callback to create a FinancialModel in the store when the user is Unauthenticated.\r\n */\r\nexport function useCreateFinancialModelUnauthenticatedCallback(): [(model: FinancialModelCreateUnauthenticatedInput) => Promise, AsyncActionStatus] {\r\n const [mutationAction, { error }] = useMutation(\r\n gql`\r\n mutation createFinancialModelUnauthenticatedMutation ($model: FinancialModelCreateUnauthenticatedInput!) {\r\n createFinancialModelUnauthenticated(model: $model) {\r\n ...financialModelFields\r\n }\r\n }\r\n\r\n ${financialModelFieldsFragment}\r\n `\r\n );\r\n\r\n // Wrap the mutation in a standard callback.\r\n const [action, { isExecuting, errors: actionErrors }] = useAsyncCallback(async (model: FinancialModelCreateUnauthenticatedInput) => {\r\n const result = await mutationAction({ variables: { model: model } });\r\n if (result.errors && result.errors.length) {\r\n throw result.errors;\r\n }\r\n }, [mutationAction]);\r\n\r\n return [action, { isExecuting: isExecuting, errors: error ? error.message : actionErrors }];\r\n}\r\n","import { Button, Row, Col, Label, FormGroup, Spinner, NavItem, NavLink } from 'reactstrap';\r\nimport { AlertOnErrors } from '../../shared/alertOnErrors';\r\nimport { LoadingIndicator } from '../shared/LoadingIndicator';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { MainContainer } from '../shared/MainContainer';\r\nimport { useParams, useHistory } from 'react-router';\r\nimport { useFinancialModel } from '../../api/main/financialModels/useFinancialModel';\r\nimport { useChanges } from '../../shared/useChanges';\r\nimport { useSaveFinancialModelCallback } from '../../api/main/financialModels/useSaveFinancialModelCallback';\r\nimport { useValidatorCallback } from 'pojo-validator-react';\r\nimport { ValidatedInput } from 'pojo-validator-reactstrap';\r\nimport { ButtonAsync } from 'reactstrap-buttonasync';\r\nimport { useAsyncCallback } from 'react-use-async-callback';\r\nimport { ConditionalFragment } from 'react-conditionalfragment';\r\nimport { Banner } from '../shared/Banner';\r\nimport { Background } from '../shared/background/Background';\r\nimport { financialModelDefaultValues } from '../../api/main/models/FinancialModel';\r\nimport { useCurrentUser } from '../../api/main/users/useCurrentUser';\r\nimport { useJsonObject } from '../../shared/useJsonObject';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { FinancialModelCalculator } from './FinancialModelCalculator';\r\nimport { useDebouncedCallback } from 'use-debounce/lib';\r\nimport { StickyToolbar } from '../shared/StickyToolbar';\r\nimport './editFinancialModel.scss';\r\nimport { PillsNavBar } from '../shared/pillsNavBar/PillsNavBar';\r\nimport { AssumptionsTab } from './edit/assumptions/AssumptionsTab';\r\nimport { ClientFacingTab } from './edit/clientFacing/ClientFacingTab';\r\nimport { ModelTab } from './edit/model/ModelTab';\r\nimport { FinancialsTab } from './edit/financials/FinancialsTab';\r\nimport { ValuationTab } from './edit/valuation/ValuationTab';\r\nimport { ProposalsTab } from './edit/proposals/ProposalTab';\r\nimport { AuthorizeContainer } from '../../shared/authorizeRoute';\r\nimport { IdentityRoles } from '../../configure/security/IdentityRoles';\r\nimport { calculateForYear, YearCalculation, yearCalculationDefaultValues } from './utilities/useCalculateForYear';\r\nimport { calculateIRR, } from './utilities/useIRRCalculator';\r\nimport { useBaseValuesUnauthenticated } from '../../api/main/baseValues/useBaseValuesUnauthenticated';\r\nimport { Footer } from '../layout/Footer';\r\nimport { useSaveFinancialModelUnauthenticatedCallback } from '../../api/main/financialModels/useSaveFinancialModelUnauthenticatedCallback';\r\nimport moment from 'moment';\r\n\r\ninterface EditFinancialModelProps {\r\n isCreate?: boolean,\r\n}\r\n\r\n/**\r\n * Create and invite a new financialModel.\r\n */\r\nexport const CreateFinancialModel = () => ();\r\n\r\n/**\r\n * Edit a financialModel.\r\n */\r\nexport const EditFinancialModel = (props: EditFinancialModelProps) => {\r\n const { isCreate } = props;\r\n const { t } = useTranslation();\r\n const { id, userId: paramUserId } = useParams<{ id: string | undefined, userId: string | undefined, }>();\r\n\r\n // use lazy here because the user may not be logged in and for create we don't get any data anyway\r\n const { data: { model: storeModel }, isLoading: _isLoading, errors: loadErrors, refresh: loadRefresh } = useFinancialModel(id, { lazy: true });\r\n // if we are editing we need to really load the data \r\n useEffect(() => {\r\n if (!isCreate) {\r\n // load the data\r\n loadRefresh();\r\n }\r\n\r\n }, [isCreate, loadRefresh]);\r\n\r\n // lookup all the baseValues\r\n const { data: { items: allBaseValues }, isLoading: _isBaseLoading, errors: loadBaseErrors, } = useBaseValuesUnauthenticated();\r\n\r\n const isLoading = _isLoading || _isBaseLoading;\r\n const { model, change, changes } = useChanges(storeModel, isCreate ? { ...financialModelDefaultValues(), userId: paramUserId, } : undefined);\r\n\r\n const [saveUnauthenticated, { errors: saveUnauthenticatedErrors }] = useSaveFinancialModelUnauthenticatedCallback();\r\n const [save, { errors: saveErrors }] = useSaveFinancialModelCallback();\r\n const history = useHistory();\r\n\r\n // Default new records to the current user.\r\n const currentUser = useCurrentUser();\r\n useEffect(() => {\r\n // If we are not a create or not ready, do nothing.\r\n if (!isCreate\r\n || ! currentUser\r\n || !model\r\n ) {\r\n return;\r\n }\r\n\r\n // If we have the user to use supplied by the routing, do nothing here, we've handled it already when initialisting useChanges().\r\n if (paramUserId) {\r\n return;\r\n }\r\n\r\n // If we've already set the user do nothing.\r\n if (model.userId === currentUser.id) {\r\n return;\r\n }\r\n // Set the user.\r\n // and make sure the versionNumber is back to the default in case we were using it for an unauthenticated model\r\n change({ userId: currentUser.id, versionNumber: '1' });\r\n\r\n }, [isCreate, currentUser, model, paramUserId, change,]);\r\n\r\n // Inputted values get stored in JSON to ease the development overhead of storing new items.\r\n const [inputsModel, _setInputsModel] = useJsonObject(model?.inputsJson ?? '{}', (json) => change({ inputsJson: json }));\r\n\r\n // Calculated values get stored in their own JSON separate to input values (see below), so we could wipe them and repeat if we find an issue.\r\n const [calculationsModel, setCalculationsModel] = useJsonObject(model?.calculationsJson ?? '{}', (json) => change({ calculationsJson: json }));\r\n\r\n\r\n // This number represents the number of years on the Proposal tab.\r\n // It means we will calculate 40 years of figuresbased on the basic inputs and calculations\r\n // and pass them around to the tabs that need them.\r\n // We also include a year zero so it is actually 1 more than this figure in the array.\r\n const fullProposalYearsRequired = inputsModel?.proposalTerm ?? 40;\r\n\r\n const fullFinancialYearsRequired = 30;\r\n\r\n // A snapshot of the BaseValues values get stored in their own JSON (see below), so that changes to the basevalues don't affect pre-existing FinancialModels.\r\n // This happens when the Financial Model is first created or if we come across one that hasn't got a snapshot for some reason.\r\n useEffect(() => {\r\n if (!allBaseValues) {\r\n return;\r\n }\r\n\r\n const baseValues = JSON.parse(storeModel?.baseValuesJson ?? '{}');\r\n\r\n // if we don't have any values - take a snapshot now.\r\n if (isCreate || Object.keys(baseValues).length === 0) {\r\n let newBaseValues: { [key: string]: any } = {};\r\n for (let i = 0; i < allBaseValues.length; i++) {\r\n // get the name\r\n const thisName = allBaseValues[i].name;\r\n\r\n // get the Json values\r\n newBaseValues[thisName] = JSON.parse(allBaseValues[i].valuesJson);\r\n }\r\n\r\n const json = JSON.stringify(newBaseValues);\r\n\r\n change({ baseValuesJson: json });\r\n }\r\n }, [isCreate, storeModel, allBaseValues, change,]);\r\n\r\n\r\n // Turn the snapshot baseValues string into a JSON object to work with\r\n // We may have just created these or they may be already on the model if editing\r\n const baseValuesModel: any = useMemo(() => {\r\n if (!model || !model.baseValuesJson) {\r\n return;\r\n }\r\n\r\n return JSON.parse(model.baseValuesJson);\r\n }, [model]);\r\n\r\n\r\n // The target return ratio is dependent on the number of years entered as the ppa term.\r\n // It is a straight lookup from the baseValues. It includes a ratio and the corresponding energy price required to hit that ratio.\r\n // TODO we should be able to calculate either the ratio or the price when one or other is known - not sure how this fits with the flow of the process.\r\n const targetReturnRatio: {ratio: number, energySalesPrice: number } = useMemo(() => {\r\n if (!baseValuesModel || !baseValuesModel['Target Return Ratios'] || !inputsModel || !inputsModel?.ppaTerm) {\r\n return { ratio: 0, energySalesPrice: 0 };\r\n }\r\n\r\n var thisRatio = baseValuesModel['Target Return Ratios']['targetRatio' + inputsModel.ppaTerm];\r\n var thisPriceRequired = baseValuesModel['Target Return Ratios']['ppaPriceRequired' + inputsModel.ppaTerm];\r\n\r\n return { ratio: thisRatio ?? 0, energySalesPrice: thisPriceRequired ?? 0 };\r\n\r\n\r\n }, [inputsModel, baseValuesModel]);\r\n\r\n\r\n // get the co2Savings from the snapshot baseValues\r\n const co2Savings = useMemo(() => {\r\n if (!baseValuesModel || !inputsModel) {\r\n return;\r\n }\r\n\r\n return (baseValuesModel['CO2 Unit Conversion']?.scope2 ?? 0) + (baseValuesModel['CO2 Unit Conversion']?.scope3 ?? 0);\r\n\r\n }, [inputsModel, baseValuesModel]);\r\n\r\n\r\n // Do the year calculations for all required years and pass an array of them into each tab that needs them\r\n // This array will also hold a year zero set of values\r\n const allYearCalculations: Array = useMemo(() => {\r\n\r\n let newYearsArray: Array = [];\r\n // loop round 1 more than the years required so we have a year zero\r\n // number of years calculated needs to be at least 30 so we have all the figures for the financials tab\r\n\r\n for (let y = 0; y <= fullProposalYearsRequired || y <= fullFinancialYearsRequired; y++) {\r\n const yearCalculations = calculateForYear(inputsModel, calculationsModel, y, targetReturnRatio.energySalesPrice);\r\n newYearsArray.push(yearCalculations);\r\n }\r\n\r\n return newYearsArray;\r\n\r\n }, [fullProposalYearsRequired, inputsModel, calculationsModel, targetReturnRatio]);\r\n\r\n // IRR calculations return a number or '#NUM!' in line with what the calculateIRR function will return\r\n const irrCalculations: { preTaxIRR: number | '#NUM!', postTaxIRR: number | '#NUM!' } = useMemo(() => {\r\n let preTaxIRR: number | '#NUM!' = 0;\r\n let postTaxIRR: number | '#NUM!' = 0;\r\n\r\n if (!allYearCalculations.length) {\r\n return { preTaxIRR: preTaxIRR, postTaxIRR: postTaxIRR};\r\n }\r\n\r\n\r\n // figures ready for pre-tax IRR calc\r\n let preTaxIRRFigures: Array = [];\r\n // first figure is the capex converted to a negative\r\n preTaxIRRFigures.push((calculationsModel?.totalCapex2 ?? 0) * -1);\r\n // figures ready for post-tax IRR calc\r\n let postTaxIRRFigures: Array = [];\r\n // first figure is the capex converted to a negative\r\n postTaxIRRFigures.push((calculationsModel?.totalCapex2 ?? 0) * -1);\r\n\r\n for (let y = 1; y <= fullFinancialYearsRequired; y++) {\r\n const yearCalculations = allYearCalculations[y];\r\n const previousYearCalculations = y === 1 ? { ...yearCalculationDefaultValues() } : allYearCalculations[y - 1];\r\n\r\n const changeInWorkingCapital = (previousYearCalculations?.workingCapital ?? 0) - (yearCalculations?.workingCapital ?? 0);\r\n const fcfPostTax = (yearCalculations?.ebitda ?? 0) - (yearCalculations?.taxOutlay ?? 0) + changeInWorkingCapital;\r\n const fcfPreTax = (yearCalculations?.ebitda ?? 0) + changeInWorkingCapital;\r\n\r\n // update the preTaxIRR figures\r\n preTaxIRRFigures.push(fcfPreTax);\r\n // update the postTaxIRR figures\r\n postTaxIRRFigures.push(fcfPostTax);\r\n\r\n }\r\n\r\n // IRR calcualations\r\n postTaxIRR = calculateIRR(postTaxIRRFigures, 0.1);\r\n preTaxIRR = calculateIRR(preTaxIRRFigures, 0.1);\r\n\r\n return { preTaxIRR: preTaxIRR, postTaxIRR: postTaxIRR };\r\n\r\n }, [allYearCalculations, calculationsModel, fullFinancialYearsRequired]);\r\n\r\n // Perform calculations on the model using our custom calculator.\r\n // This gets the values we can calculate from the inputs.\r\n // We'll use the inputs and these calculated values to get to all the inflation adjusted figures across all years of the model.\r\n const performCalculations = (fields: Array | undefined) => {\r\n const calculator = new FinancialModelCalculator(inputsModel, calculationsModel);\r\n const newValues = calculator.recalculate(fields);\r\n setCalculationsModel((prevState: any) => ({\r\n ...prevState,\r\n ...newValues,\r\n }));\r\n };\r\n\r\n const [scheduledCalculationFields, setScheduledCalculationFields] = useState>([]);\r\n\r\n const performCalculationsDebounced = useDebouncedCallback(() => {\r\n const fields = [...scheduledCalculationFields];\r\n setScheduledCalculationFields([]);\r\n performCalculations(fields);\r\n });\r\n\r\n const scheduleCalculations = useCallback((fields: Array) => {\r\n setScheduledCalculationFields(prevState => [\r\n ...prevState,\r\n ...fields,\r\n ]);\r\n\r\n performCalculationsDebounced();\r\n }, [setScheduledCalculationFields, performCalculationsDebounced]);\r\n\r\n\r\n // Change the value of an input model. Will also trigger any required recalculations.\r\n const changeInputsModel = useCallback((changes: any) => {\r\n // Update the data.\r\n _setInputsModel((prevState: any) => ({\r\n ...(prevState ?? {}),\r\n ...changes,\r\n }));\r\n\r\n // Schedule recalculation.\r\n scheduleCalculations(Object.keys(changes));\r\n }, [_setInputsModel, scheduleCalculations]);\r\n\r\n const inputsDefaults = {\r\n startDate: moment('2023-09-01'),\r\n ppaTerm: 25,\r\n currentEnergyCost: 15,\r\n exportTariff: 6.5,\r\n rpi: 2.2,\r\n annualInflation: 2.2,\r\n energyInflation: 5,\r\n oAndM: 3,\r\n oAndMManager: 1,\r\n transmissionFee: 1,\r\n landLease: 1,\r\n insurance: 1.5,\r\n insuranceandLCInflation: 1.5,\r\n managementFeeInflation: 2,\r\n refurbishmentFee: 1,\r\n receivablesDays: 60,\r\n payablesDays: 30,\r\n depreciationYears: 60,\r\n debtInterestRate: 6,\r\n debtTerm: 15,\r\n taxFuture: 25,\r\n taxNow: 25,\r\n sizeOfArray: 999,\r\n energyUsedOnSite: 85,\r\n degradation: 0.4,\r\n specificYield: 850, // this is the default specific production / default array size (849150 / 999)\r\n epcPrice: 62,\r\n };\r\n\r\n\r\n // Need some defaults when creatin g as we may never save the model but we need somewhere to start\r\n useEffect(() => {\r\n if (!inputsModel || !inputsDefaults || !isCreate) {\r\n return;\r\n }\r\n\r\n // Only do this once\r\n if (!!inputsModel.startDate) {\r\n return;\r\n }\r\n\r\n // Set the defaults -- use inputsModel values if we have any to avoid accidentally overwriting if someone removes their start date\r\n changeInputsModel({\r\n startDate: inputsDefaults.startDate,\r\n ppaTerm: inputsModel.ppaTerm ?? inputsDefaults.ppaTerm,\r\n currentEnergyCost: inputsModel.currentEnergyCost ?? inputsDefaults.currentEnergyCost,\r\n exportTariff: inputsModel.exportTariff ?? inputsDefaults.exportTariff,\r\n rpi: inputsModel.rpi ?? inputsDefaults.rpi,\r\n annualInflation: inputsModel.annualInflation ?? inputsDefaults.annualInflation,\r\n energyInflation: inputsModel.energyInflation ?? inputsDefaults.energyInflation,\r\n oAndM: inputsModel?.oAndM ?? inputsDefaults.oAndM,\r\n oAndMManager: inputsModel?.oAndMManager ?? inputsDefaults.oAndMManager,\r\n transmissionFee: inputsModel?.transmissionFee ?? inputsDefaults.transmissionFee,\r\n landLease: inputsModel?.landLease ?? inputsDefaults.landLease,\r\n insurance: inputsModel?.insurance ?? inputsDefaults.insurance,\r\n insuranceandLCInflation: inputsModel?.insuranceandLCInflation ?? inputsDefaults.insuranceandLCInflation,\r\n managementFeeInflation: inputsModel?.managementFeeInflation ?? inputsDefaults.managementFeeInflation,\r\n refurbishmentFee: inputsModel?.refurbishmentFee ?? inputsDefaults.refurbishmentFee,\r\n receivablesDays: inputsModel?.receivablesDays ?? inputsDefaults.receivablesDays,\r\n payablesDays: inputsModel?.payablesDays ?? inputsDefaults.payablesDays,\r\n depreciationYears: inputsModel?.depreciationYears ?? inputsDefaults.depreciationYears,\r\n debtInterestRate: inputsModel?.debtInterestRate ?? inputsDefaults.debtInterestRate,\r\n debtTerm: inputsModel?.debtTerm ?? inputsDefaults.debtTerm,\r\n taxFuture: inputsModel?.debtTerm ?? inputsDefaults.taxFuture,\r\n taxNow: inputsModel?.taxNow ?? inputsDefaults.taxNow,\r\n sizeOfArray: inputsModel?.sizeOfArray ?? inputsDefaults.sizeOfArray,\r\n energyUsedOnSite: inputsModel?.energyUsedOnSite ?? inputsDefaults.energyUsedOnSite,\r\n degradation: inputsModel?.degradation ?? inputsDefaults.degradation,\r\n specificYield: inputsModel?.specificYield ?? inputsDefaults.specificYield, \r\n epcPrice: inputsModel?.epcPrice ?? inputsDefaults.epcPrice,\r\n });\r\n\r\n });\r\n\r\n\r\n\r\n // Validate.\r\n const [validate, validationErrors] = useValidatorCallback((validation, fieldsToCheck) => {\r\n const rules = {\r\n name: () => !model?.name ? t('editFinancialModel.nameRequired', 'Name is required') : '',\r\n };\r\n\r\n validation.checkRules(rules, fieldsToCheck);\r\n }, [model]);\r\n\r\n // Tab tracking.\r\n const [activeTab, setActiveTab] = useState<'InputsOutputs' | 'Assumptions' | 'Model' | 'Financials' | 'Valuation' | 'Proposal'>('InputsOutputs');\r\n\r\n // Save changes.\r\n const [saveForm, { isExecuting: isSaving, errors: saveFormErrors }] = useAsyncCallback(async () => {\r\n if (!validate()) {\r\n return;\r\n }\r\n\r\n if (!currentUser) {\r\n // user is not logged in so do an unauthenticated save and pass user to the login screen \r\n // with the new model id so we can find their financial model that we stored before they logged in or registered\r\n await saveUnauthenticated(model.id, changes, true)\r\n history.push(`/account/register/${model.id}`);\r\n } else {\r\n await save(model.id, changes, !!isCreate);\r\n history.goBack();\r\n }\r\n }, [validate, save, model, changes, isCreate, history]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n

\r\n {\r\n model?.name ? (\r\n <>{model.name}\r\n ) : (\r\n <>{t('editFinancialModel.defaultHeading', 'Calculate savings')}\r\n )\r\n }\r\n

\r\n \r\n \r\n \r\n \r\n \r\n setActiveTab('InputsOutputs')}>\r\n <> {t('editFinancialModel.tabs.inputsCalculations', 'Inputs/Outputs')}\r\n \r\n \r\n \r\n \r\n setActiveTab('Assumptions')}>\r\n <> {t('editFinancialModel.tabs.assumptions', 'Assumptions')}\r\n \r\n \r\n \r\n setActiveTab('Model')}>\r\n <> {t('editFinancialModel.tabs.model', 'Model')}\r\n \r\n \r\n \r\n setActiveTab('Financials')}>\r\n <> {t('editFinancialModel.tabs.financials', 'Financials')}\r\n \r\n \r\n \r\n setActiveTab('Valuation')}>\r\n <> {t('editFinancialModel.tabs.valuation', 'Valuation')}\r\n \r\n \r\n \r\n setActiveTab('Proposal')}>\r\n <> {t('editFinancialModel.tabs.Proposal', 'Proposal')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n saveForm()}\r\n executingChildren={<> {t('common.saving', 'Saving...')}}>\r\n \r\n <> {t('common.save', 'Save')}\r\n \r\n \r\n <> \r\n \r\n <> \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n\r\n

{t('editFinancialModel.heading','Olympus Power Quote')}

\r\n\r\n
\r\n \r\n \r\n change({ name: e.currentTarget.value })}\r\n onBlur={e => validate('name')}\r\n validationErrors={validationErrors['name']}\r\n placeholder={t('editFinancialModel.name.placeholder','Enter a name for your quote so you can come back to it later ...')}\r\n />\r\n \r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n