{"version":3,"sources":["services/custom/CustomServiceManager.js","components/renderers/CellWithMoreActions/CellWithMoreActions.jsx","components/renderers/CellInputText.jsx","components/renderers/CellSwitch/CellSwitch.jsx","components/renderers/CellPercent.jsx","components/renderers/CellValue.jsx","components/renderers/CellWithIconAction.jsx","components/renderers/CellWithPlusMinusIcons.jsx","components/renderers/CellAdaptedDate.jsx","components/renderers/CellAdaptedMessageDate.jsx","components/renderers/CellLink/CellLink.jsx","configs/config.js","pages/pages/Portfolios/pages/SinglePortfolioView/constants.js","redux/enroll/enrollActions.js","error/errorTypes.js","pages/pages/Activation/images/play_store_qr.png","pages/pages/Activation/images/app_store_qr.png","utils/formatting.js","../node_modules/moment/locale sync /^/.*$","error/commonErrors.js","redux/theme/themeSelectors.js","utils/configureTheme.js","hocs/withTheme.jsx","components/Loading/Loading.jsx","hocs/withAuthentication.jsx","utils/setHTMLDocumentTitle.js","components/RouteWithAppTitle/index.js","components/RouteWithAppTitle/RouteWithAppTitle.jsx","pages/pages/404/PageNotFound.jsx","constants/constants.js","locale/LocaleService.js","locale/formatTypes.js","locale/utils.js","locale/LocaleContext.jsx","locale/useLocale.js","locale/useFormatting.js","components/organisms/ChartType.jsx","components/PageSection/PageSection.jsx","components/molecules/WidgetError/WidgetError.jsx","components/molecules/Preloader.jsx","components/molecules/EmptyContent.jsx","components/organisms/InvestmentAllocation.jsx","components/organisms/News/LinkNews.jsx","pages/pages/News/constants/constants.js","components/organisms/News/NewsItem.jsx","components/organisms/News/News.jsx","components/MonthRangePicker/index.jsx","components/organisms/AssetDevelopment.jsx","models/Error.js","errors/AdapterError.js","errors/ServerError.js","hooks/useDetectedMobileDevice.js","utils/charts.js","utils/adaptPlotsAmount.js","pages/pages/Dashboard/adapters/adaptInvestmentOverviewPerformance.js","pages/pages/Dashboard/components/AssetDevelopmentComponent.jsx","pages/pages/Dashboard/hooks/useWithInvestmentOverviewPerformance.js","components/Overview/OverviewItem.jsx","components/Overview/constants.js","components/Overview/OverviewPanel.jsx","pages/pages/Dashboard/components/Overview/OverviewItem.jsx","pages/pages/Dashboard/components/Overview/constants.js","pages/pages/Dashboard/components/Overview/Overview.jsx","static/na.js","pages/pages/Dashboard/components/RelationshipManager/RelationshipManager.jsx","pages/pages/Dashboard/components/RelationshipManager/index.js","pages/pages/Dashboard/adapters/adaptProfile.js","pages/pages/Dashboard/hooks/useWithClientProfile.js","constants/portfolioTypeIds.js","pages/pages/Dashboard/utils/index.js","pages/pages/Dashboard/adapters/adaptInvestmentOverview.js","pages/pages/Dashboard/hooks/useWithInvestmentOverview.js","pages/pages/News/adapters/adaptNews.js","utils/innerHTMLRender.jsx","pages/pages/News/adapters/adaptWPNews.js","pages/pages/News/hooks/useNews.js","utils/toPascalCase.js","pages/pages/Dashboard/adapters/adaptParentsAllocations.js","pages/pages/Dashboard/components/PortfoliosCard/component/PortfoliosCard/PortfoliosCard.jsx","pages/pages/Dashboard/components/PortfoliosCard/component/PortfoliosCard/index.js","pages/pages/Dashboard/components/PortfoliosCard/PortfoliosList.jsx","pages/pages/Dashboard/components/PortfoliosCard/index.js","pages/pages/Dashboard/hooks/usePerformanceYTD.js","pages/pages/Dashboard/Dashboard.jsx","pages/pages/Dashboard/hooks/useParentsAllocations.js","pages/pages/Dashboard/Router.jsx","pages/pages/News/News.jsx","pages/pages/News/hooks/useWPNewsPost.js","pages/pages/News/pages/SingleNewsView/SingleWPNewsView.jsx","pages/pages/News/hooks/useNewsPost.js","pages/pages/News/pages/SingleNewsView/SingleNewsView.jsx","pages/pages/News/pages/hocs/withLanguageChange.jsx","pages/pages/News/Router.jsx","services/custom/getSecurityFactsheet.js","pages/pages/Portfolios/pages/SinglePortfolioView/pages/PositionDetails/components/Overview.jsx","pages/pages/Portfolios/pages/SinglePortfolioView/pages/PositionDetails/adapters/adaptPortfolioDetails.js","pages/pages/Portfolios/pages/SinglePortfolioView/pages/PositionDetails/adapters/adaptSecurities.js","pages/pages/Portfolios/pages/common/hooks/useSecurityDetails.js","pages/pages/Portfolios/pages/SinglePortfolioView/pages/PositionDetails/PositionDetailsOverview.jsx","pages/pages/Portfolios/pages/common/hooks/usePortfolioDetails.js","pages/pages/Portfolios/pages/common/hooks/useSecuritiesSearch.js","pages/pages/Portfolios/pages/SinglePortfolioView/components/Allocation.jsx","pages/pages/Portfolios/pages/SinglePortfolioView/components/Overview.jsx","pages/pages/Portfolios/pages/SinglePortfolioView/components/Positions.jsx","pages/pages/Portfolios/pages/common/components/Analysis.jsx","pages/pages/Portfolios/pages/common/adapters/adaptAllocationGroups.js","pages/pages/Portfolios/pages/common/adapters/adaptAllocations.js","pages/pages/Portfolios/pages/common/utils/index.js","pages/pages/Portfolios/pages/SinglePortfolioView/adapters/groupPortfolioPositions.js","pages/pages/Portfolios/pages/SinglePortfolioView/adapters/adaptPortfolioDetails.js","pages/pages/Portfolios/pages/common/adapters/adaptPerformanceAndRiskCompare.js","pages/pages/Portfolios/pages/common/hooks/usePerformanceAndRiskCompare.js","pages/pages/Portfolios/pages/SinglePortfolioView/SinglePortfolioView.jsx","pages/pages/Portfolios/pages/SinglePortfolioView/hooks/usePortfolioDetails.js","pages/pages/Portfolios/pages/common/hooks/useAnalysisDetails.js","components/organisms/Portfolios.jsx","pages/pages/Portfolios/adapters/adaptPortfolios.js","pages/pages/Portfolios/Portfolios.jsx","pages/pages/Portfolios/hooks/usePortfolios.js","pages/pages/Portfolios/Router.jsx","pages/pages/UserActivation/UserActivation.jsx","pages/pages/UserActivation/selectors.js","pages/pages/Documents/hooks/useDocument.js","pages/pages/Documents/adapters/adaptDocument.js","pages/pages/Documents/constants.js","pages/pages/Documents/Documents.jsx","pages/pages/Documents/pages/DocumentView/hooks/useDocument.js","pages/pages/Documents/pages/DocumentView/adapters/adaptDocument.js","pages/pages/Documents/pages/DocumentView/DocumentView.jsx","pages/pages/Documents/Router.jsx","pages/pages/Activation/const.js","pages/pages/Activation/en/ActivationPageEN.jsx","pages/pages/Activation/fr/ActivationPageFR.jsx","pages/pages/Activation/de/ActivationPageDE.jsx","pages/pages/Activation/it/ActivationPageIT.jsx","pages/pages/Activation/pr/ActivationPagePR.jsx","pages/pages/Activation/es/ActivationPageES.jsx","pages/pages/Faq/Faq.jsx","pages/pages/Faq/content.js","pages/pages/ResetPassword/validation.js","error/errors.js","pages/pages/ResetPassword/ResetPassword.jsx","pages/pages/ResetPassword/selectors.js","pages/pages/ResetPassword/index.js","lib/ui-library/Footer/FooterMini/DefaultContent.jsx","lib/ui-library/Footer/FooterMini/FooterMini.jsx","translations/component/LanguageSwitcher/index.js","translations/component/LanguageSwitcher/LanguageSwitcher.jsx","components/Footer/Footer.jsx","components/ScrollTop.jsx","components/Logo/Logo.jsx","pages/components/Header/Header.jsx","pages/containers/adapters/adaptProfile.js","pages/containers/HeaderContainer.jsx","pages/containers/hooks/useWithClientProfile.js","pages/templates/RootTemplate.jsx","components/TermsOfUse/TermsText.jsx","components/TermsOfUse/TermsOfUse.jsx","pages/containers/hocs/WithTermsOfUse.jsx","pages/RootRouter.jsx","pages/pages/Login/constants/index.js","pages/pages/Login/components/LoginForm/LoginFormNew.jsx","pages/pages/Login/components2/LoginForm.jsx","pages/pages/Login/components2/FuturaePasscode/FuturaePasscode.jsx","pages/pages/Login/components2/MobileAppApprove.jsx","pages/pages/Login/api/preAuth.js","pages/pages/Login/api/enrollDevice.js","pages/pages/Login/components2/EnrollQRCode.jsx","pages/pages/Login/api/validatePassCode.js","pages/pages/Login/components2/LoginContentPane.jsx","pages/pages/Login/components2/ToEnrollDevice.jsx","pages/pages/Login/containers/LoginContainer.jsx","pages/templates/NoHeaderTemplate.jsx","pages/pages/Login/Router.jsx","pages/pages/ForgotPassword/ForgotPasswordAskRM.jsx","pages/pages/ForgotPassword/Router.jsx","pages/pages/DocumentsPreview/api/auth.js","pages/pages/DocumentsPreview/api/common.js","pages/pages/DocumentsPreview/hooks/useDocumentLoadFromUrl.js","pages/pages/DocumentsPreview/api/documents.js","pages/pages/DocumentsPreview/MobileAppFactsheetDownload/MobileAppDownloadFactsheet.jsx","pages/pages/DocumentsPreview/MobileAppFactsheetDownload/index.js","pages/pages/DocumentsPreview/MobileAppDocumentDownload/MobileAppDownloadDocument.jsx","pages/pages/DocumentsPreview/MobileAppDocumentDownload/index.js","App.jsx","translations/adaptors/resourceAdapt.js","translations/utils/Backend.js","translations/utils/SessionStoreManager.js","translations/models/StoreManager.js","translations/i18n.js","index.js","utils/documentUtils.js","utils/datetime.js","components/Button/Button.jsx","components/Button/PrimaryButton.jsx","components/Button/SuccessButton.jsx","components/Button/InfoButton.jsx","components/Button/WarningButton.jsx","components/Button/DangerButton.jsx","components/Button/LinkButton.jsx","utils/url.js","redux/theme/themeActions.js","static/requestResults.js","components/Form/UserAndPassword.jsx","redux/enroll/enrollSelectors.js","pages/pages/Login/components/EnrollDeviceByUserAndPassword_old/EnrollDeviceByUserAndPassword.jsx","pages/pages/Login/components/EnrollDeviceByUserAndPassword_old/EnrollDeviceByUserAndPasswordContainer.js","pages/pages/Login/components/validation.js","pages/pages/Login/components/LoginForm/LoginForm.jsx","redux/session/sessionSelectors.js","error/authErrors.js","services/core/DetectorSystemTheme.js","utils/rounding.js","utils/index.js","services/core/ServiceManager.js","components/renderers/CellPDFView.jsx","store.js","services/core/generalStatusCheck.js","components/EnrollmentInfoBox/index.js","components/EnrollmentInfoBox/EnrollementInfoBox.jsx","clientRequirements/images/icon_NS.png","pages/pages/Login/utils/validation.js","clientRequirements/images/logo-mobile.svg","components/Field/FieldRenderer.jsx","components/PasswordEyeButton/index.jsx","components/Field/PasswordRenderer.jsx","filters/investementPerformanceFilters.js","services/core/history.js","redux/auth/authActions.js","utils/analytics.js","middleware/redux-sessionstorage.js","utils/sorting.js","redux/auth/authSelectors.js","error/ErrorModel.js","components/molecules/Passcode/Passcode.jsx","clientRequirements/images/eyeOpened.png","clientRequirements/images/eyeСlosed.png","clientRequirements/images/itunes_icon.svg","clientRequirements/images/gplay_icon.svg","components/Profile/selector.js","clientRequirements/styles/dark/variables-export.css","clientRequirements/styles/modern/variables-export.css","hocs/withAutoLogout.jsx","pages/pages/Dashboard/components/RelationshipManager/getAvatarPath.js","translations/hooks/useLanguageSwitcher.js","translations/adaptors/languagesAdapt.js","styles/icons/linkedin.svg","redux/auth/authReducers.js","redux/enroll/enrollReducers.js","redux/theme/themeReducers.js","redux/session/sessionReducers.js","rootReducer.js"],"names":["CustomServiceManager","method","argsArray","service","result","promise","Promise","then","catch","reason","checkStatus","get","serviceCall","Service","getRequest","getDmsUrl","isSecure","metadataId","externalId","language","getServicesUrl","params","postRequest","queries","Object","entries","urlParams","reduce","acc","item","getCustomUrl","postId","username","password","UserName","ForceExpiringPreviousSession","AccessToken","_ref2","trustedDeviceToken","V11","Password","TrustedDeviceToken","contactId","CellWithMoreActions","value","actions","placement","title","type","map","action","onClick","text","defaultProps","CellInputText","numberSeparators","data","isObject","addonAfter","validation","minValue","maxValue","onChange","disabled","className","CellLinked","renderers","CellTooltiped","CellSwitch","props","undefined","label","maxLength","link","CellPercent","getFormattedNumber","num","maximumFractionDigits","minimumFractionDigits","sign","getColorClass","CellValue","formatCurrency","propTypes","PropTypes","number","isRequired","CellWithIconAction","icon","size","CellWithPlusMinusIcons","onDecrease","onIncrease","noop","CellAdaptedDate","t","date","isToday","formatTime","isTomorrow","isYesterday","formatDate","isReplied","bool","string","CellWithMessageDate","CellAdaptedMessageDate","getFormattedDate","getFormattedTime","CellLink","window","reactAdditiv","settings","services","withJWT","GATEWAY_API_URL","process","SERVICES_URL_SUFFIX","global","AppConfig","DMS_URL_SUFFIX","CUSTOM_URL_SUFFIX","CellWithIcon","ASSET_CLASSES_ORDERS","JSON","parse","additionalConfig","assetClassesOrder","ASSET_CLASSES_ORDERS_FALLBACK","order","ASSET_STRATEGY_IDS","getAssetClassOrder","id","positionsColumns","key","sortable","sorter","sorterString","render","sorterNumber","hidden","sorterByDate","width","minWidth","titleType","fixed","headerRenderer","positionsMobileColumns","checkEnrollStatusTimeout","cookies","Cookies","UNENROLL_START","UNENROLL_SUCCESS","UNENROLL_FAIL","ENROLL_START","ENROLL_SUCCESS","ENROLL_FAIL","DEVICE_ENROLL_START","DEVICE_ENROLL_SUCCESS","DEVICE_ENROLL_FAIL","CLEAN_ENROLL","enrollComplete","payload","enrollDeviceFail","cleanEnrollment","dispatch","clearTimeout","checkEnrollStatus","enrollmentSessionId","triggerUserProfile","ServiceManager","deviceEnrollment","response","enrollStatus","enrollStatusSelector","resultType","Result","errorObject","getErrorModelByStatus","SUCCESS","remove","getUserProfile","PENDING","setTimeout","EXPIRED","SESSION_EXPIRED","UNEXPECTED_ERROR","enrollDeviceByUserAndPassword","validatedLogin","test","USERNAME_EMAIL_DOMAIN","resolve","reject","getAuthErrorByStatus","SubmissionError","LOGIN_FAILED_UNEXPECTEDLY","AUTH_ERROR","module","exports","NA","TYPE_CURRENCY","TYPE_PERCENT","TYPE_TEXT","validateStringData","validateName","getAdaptedDate","percentIsZero","precision","Number","toFixed","amount","symbol","isNumber","formatMoney","decimal","thousand","format","formatCurrencyWithPrecision","formatPercentageValue","Math","abs","formatNumber","formatNumberValue","formatPercentage","multiplier","getfromDataObject","path","formatBigNumber","isNaN","formatNumberRounding","formatter","getContracted","formatSignPercent","formatValueByType","typeValue","withSign","allocationPercentFormat","validateData","validateNumber","formatWithDate","webpackContext","req","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","COMMON_AUTH_ERROR","ACCESS_DENIED_MESSAGE","USERNAME_INVALID_MESSAGE","INVALID_CREDENTIALS_MESSAGE","CONTACT_LOCKED_MESSAGE","CONTACT_NOT_ACTIVATED_MESSAGE","CONTACT_NOT_PASSWORD_SET_MESSAGE","USERNAME_INVALID","ErrorModel","message","INVALID_CREDENTIALS","CONTACT_NOT_ACTIVATED","CONTACT_LOCKED","CONTACT_NOT_PASSWORD_SET","ACCESS_DENIED","UNEXPECTED_ERROR_OR_INVALID_PASSCODE","MTAN_INVALID","getThemeSelector","createSelector","state","theme","variables","dark","darkCustomVariables","light","modernCustomVariables","setThemeVariables","vars","forEach","document","documentElement","style","setProperty","withTheme","Component","useSelector","useEffect","setAttribute","Loading","withAuthentication","WrappedComponent","mapDispatchToProps","checkSession","checkSessionAction","connect","isAuthenticated","isAuthenticatedSelector","isCurrentSessionChecked","isCurrentSessionCheckedSelector","isSessionValid","isSessionValidSelector","withAutoLogout","to","pathname","from","history","location","setHTMLDocumentTitle","newTitle","RouteWithAppTitle","PageNotFound","useTranslation","CellWithSubtext","BAR","CellWithLinkIcon","CellWithHyperlinkIcon","CellWithButtonIcon","LIST","allocationColumns","defaultSortOrder","portfoliosColumns","portfoliosMobileColumns","portfolioActions","productName","push","lineChartLabels","months","split","shortMonths","locales","cookie","priority","locale","getLocaleFromCookie","navigation","getLocaleFromNavigator","localeService","LocaleService","dateTimeFormats","getUTCDate","d","Date","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","LocaleContext","createContext","Provider","LocaleProvider","Consumer","children","useState","localization","setLocale","onLangChange","add","subscription","subscribe","addEventListener","removeEventListener","unsubscribe","useMemo","formattedNum","Intl","NumberFormat","thousandSeparator","decimalSeparator","getNumberSeparators","context","useContext","useLocale","useCallback","options","getDateFormat","year","month","day","hour","minute","getFormattedPhoneNumber","phone","parsePhoneNumberFromString","String","replace","formatInternational","getFormattedCurrency","currency","formatted","getFormattedXAxisFormat","formattedDate","DateTimeFormat","formattedTime","match","dateSeparator","timeSeparator","getDateTimeSeparators","millisecond","second","week","ChartType","chartView","useFormatting","PieChart","xAxisFormat","labels","columns","MemoizedChartType","memo","prevPropsData","prevChartView","nextPropsData","nextChartView","isEqual","PageSection","WidgetError","Preloader","isLoading","error","accent","EmptyContent","buttonText","length","InvestmentAllocation","setChartView","changeView","numberFormat","labelFormat","underline","chart","defaultActiveKey","tabBarExtraContent","isActive","i","tab","toString","name","LinkNews","origin","href","rel","target","query","NewsItem","image","content","src","alt","News","withLink","MonthRangePicker","monthFrom","monthTo","MonthPicker","DatePicker","startDate","setStartDate","endDate","setEndDate","getFirstDayOfMonth","setStartDateWithValidation","placeholder","disabledDate","current","AssetDevelopment","onFilterChange","currentFilter","chartValueFormat","yAxisFormat","setFilterDates","MONTH_TO_MONTH","overflow","getPerformanceSelectOptions","performance","height","valueFormat","tooltipFormat","assets","yTitle","additionalData","this","AdapterError","err","ServerError","detectIsMobile","body","clientWidth","useDetectedMobileDevice","isMobileSize","setMobileSize","handleResize","getPerformancePeriodByFilterOrDates","filter","filterDates","getLastDayOfMonth","dateFormat","filterPeriod","YTD","getFirstDayOfYear","YEARS1","subtractUnits","YEARS3","YEARS5","SINCE_INCEPTION","ONE_YEAR_BEFORE","getYearDates","TWO_YEARS_BEFORE","THREE_YEARS_BEFORE","getPeriodByFilter","adaptPlotsAmount","PLOTS_MAX_COUNT","delta","ceil","selected","last","slice","selectedLast","adaptDate","getTimestamp","adaptInvestmentOverviewPerformance","rawData","chartStartDate","adaptedInvestmentOverviewPerformance","CurrencyCode","idx","Value","Amount","start","isSameDay","getSecondDayOfYear","adaptStartDate","compareDates","isNeedToAddFlatLine","timestampStart","adaptedValue","round","AssetDevelopmentComponent","clientId","setCurrentFilter","isLoadingCurrency","setError","setLoading","setData","i18n","isMonthToMothLoadAllowed","getParamsByFilter","portfolioManagement","Values","useWithInvestmentOverviewPerformance","sendGAEvent","GA_ACTIONS","changePerformanceFilter","GA_CATEGORIES","dashboard","OverviewItem","htmlTitle","colored","percent","getClassNames","OverviewPanel","hideOnMobile","hideOnMobileClassName","classNames","Overview","performanceYTD","totalValue","inceptionDate","gainYTD","RelationshipManager","showPhone","setPhone","Img","Name","Contacts","viewRM","contactRM","Icon","PhoneNumber","Button","getPortfoliosCount","portfolios","find","PortfolioType","isNil","Count","adaptRMData","email","phoneNumber","getPhoneNumber","validatedContacts","Email","Information","subtitle","Phone","getAvatarPath","FirstName","LastName","useWithClientProfile","clientProfile","RMProfile","contactManagement","responseMember","members","ChosenRiskCategory","Investments","lastLogin","LastLogin","adaptProfile","portfolioTypeIds","getAccountInceptionDate","oldestDate","portfolio","createDate","getOverviewGainYTD","useWithInvestmentOverview","overview","investmentAllocation","pie","bar","list","positions","BaseCurrency","Positions","ConsolidatedPositions","Portfolios","PortfolioTypeId","customAttr","CustomAttributes","Id","Product","Profile","RiskCategory","CurrentValue","Currency","Performance","CurrentPerformance","Actions","GainLossYTD","CreateDate","performanceValue","adaptInvestmentOverview","getValueByKey","object","Content","Key","adaptNews","checkNullData","posts","dateTimeFormat","tagsSettings","iframe","node","getAttribute","startsWith","parentNode","removeChild","DOMPurify","addHook","tagName","innerHTMLRender","dangerouslySetInnerHTML","__html","sanitize","ADD_TAGS","adaptWPNews","totalPages","rendered","excerpt","fullContent","originLink","decodeURIComponent","newsTags","general","en","de","fr","it","es","pt","getPostImage","media","Array","isArray","attachment","sizes","medium","getAdaptedWpNewsData","a","tags","getWPPosts","per_page","postsData","all","post","getWPPostImages","headers","postsWithImages","getAdaptedDfsNewsData","dfsNews","page","commonContent","getNews","useNews","newsList","setNewsList","allSettled","wp","dfs","newPosts","status","sort","b","toPascalCase","g0","g1","g2","toLocaleUpperCase","toLocaleLowerCase","adaptChartTypes","getAllocationsGroups","assetClasses","currencyPortfolio","roundedAllocations","roundAllocations","groups","obj","positionAllocation","position","roundedAllocation","Security","Allocation","getPositionAllocation","AssetClass","assetClassParent","getParent","typeName","indexOf","sortingOrder","percentage","InvestmentValue","assetParent","findIndex","includes","assetName","asset","assetInd","child","currencyName","gruopArrays","groupKey","group","sortAssetsByOrderPropOrAllocation","adaptParentsAllocations","flatAssetClasses","array","flatted","Data","traversalTree","childrenArr","Children","flatArray","PortfoliosCard","PortfoliosList","usePerformanceYTD","performanceData","Dashboard","isLoadingInvestmentOverview","errorInvestmentOverview","errorAllocation","isLoadingAllocation","commonService","useParentsAllocations","isLoadingProfile","errorProfile","news","actionButtonLabel","onActionButtonClick","onRow","open","contactIdSelector","Router","exact","component","displayName","NewsPage","getAdaptedNewsData","wpNewsPost","SingleWPNewsView","newsId","newsItem","useWPNewsPost","include","dfsNewsAdapted","SingleNewsView","useNewsPost","withLanguageChange","languageChanged","on","off","getSecurityFactsheet","securityDetails","getMetaDataId","metaData","DocumentReferenceId","metaDataId","Factsheet","getPublicDocument","positionCurrency","positionValue","units","quantity","price","priceDate","costPrice","portfolioAllocation","onDownload","isFactsheet","isDownLoading","showFullView","adaptPortfolioDetails","positionId","getFormatedDate","securityId","portfolioName","productId","Quantity","currencyId","tradingPrice","BuyPrice","LastPriceDate","FxRate","factor","Factor","performanceSP","performanceSI","calcRoundingLot","log10","adaptSecurities","security","Securities","TradingPrice","tradingUnit","TradingUnit","roundingLot","RoundingLot","useSecurityDetails","isError","instrumentsService","securityDetailsAdapter","PositionDetailsOverview","portfolioId","tabId","errorPortfolioDetails","isLoadingPortfolioDetails","dataPortfolioDetails","usePortfolioDetails","securityPriceDate","PriceHistory","onDownloadFactsheet","newBlob","createBlobFile","openDocumentUrl","factsheet","download","fileName","console","log","errorSecurities","isLoadingSecurities","dataSecurities","totalSecurities","setTotalSecurities","Page","PageSize","TotalNumberOfResults","useSecuritiesSearch","defaultActiveKeyList","header","goBack","percentFormat","portfolioValue","strategy","expandedColumn","paging","total","currentPage","pageSize","headerControls","selectControlsLabel","selectAll","reset","Analysis","performanceFilter","setPerformanceDates","values","valuesFormatted","new","curr","labelInfobox","optional","legendEnabled","AnalysisWithMemo","React","prevProps","nextProps","stringify","chartTypesList","getAmount","investmentValuePortfolioCurrency","securitiesValue","isUndefined","getPercentage","allocation","buildAllocationGroup","percents","assetClass","assetId","InvestmentValuePortfolioCurrency","val","getChildren","adaptAllocationGroups","getAllocations","InstrumentId","Notes","IsNotAdvised","isLiquidity","redirectToReadOnlyPositionDetails","baseUrl","groupPortfolioPositions","portfolioCurrency","groupToValues","securityData","accumulator","roundedAlloc","n","accParent","isLiquidityPosition","parentId","isin","Isin","url","allocationData","latestPrice","ValuationPrice","latestPriceDate","valuation","subAssetClass","Type","unrealizedGainLoss","UnrealizedGainLoss","valuationInSecurityCurrency","InvestmentValueSecurityCurrency","valuationData","performanceCCY","MonetaryPerformance","groupMembersData","sum","lastPriceDate","childCurrentType","groupingIndexes","index","groupIndexObj","grouping","splice","groupBySubStrategy","groupItem","resultGroupItem","groupMemberItem","resultGroupMemberItem","productID","backTitle","updateDate","UpdateDate","product","constraints","OptimisationConstraint","investmentAllocations","positionsRaw","riskReturn","Risk","Return","HistoricalPerformance","adaptPerformancePlots","adaptedData","basePerformance","graphPerformance","usePerformanceAndRiskCompare","defaultFilter","setPerformanceFilter","isLoadingPerformanceAndRisk","errorPerformanceAndRisk","setPerformance","dates","filteredPerformance","historicalPerformance","performanceValues","filteredValues","getDatesDifference","filterHistoricalPerformanceByDates","onPerformanceChange","param","performanceAndRisk","SinglePortfolioView","performanceDates","ModelPortfolioId","parseFloat","modelData","analysisData","useAnalysisDetails","secutiryId","sortByLabel","adaptPortfolios","filterPortfolios","PerformanceYTD","usePortfolios","UserActivation","view","activationKey","user","isPasswordSet","IsPasswordSet","ContactId","userSelect","setState","names","setNames","dataChecked","setDataChecked","config","ownerIds","addDaysToDate","onClientListChecked","checked","oldArray","downloadDocument","documentId","DocumentsService","getDocuments","OwnerId","ValidTill","ExternalId","OriginalFilename","RetrieveFileAsName","DocumentMetadata","IsActive","OutputFilename","ShowToCustomer","DmsDocumentCategoryName","documentName","stripHtmlTags","showToCustomer","nameCol","valid","filename","category","adaptDocuments","onChecked","listOfNames","Set","getNames","CellPDFView","Documents","useDocuments","getColumns","File","file","adaptDocument","DocumentView","ownerId","useDocument","defProps","NsTopDomain","NsConnect","ActivationPageEN","AppStoreQrCode","PlayStoreQrCode","ActivationPageFR","ActivationPageDE","ActivationPageIT","ActivationPagePR","ActivationPageES","Faq","faqContent","validate","errors","confirmPassword","errorMessageToErrorModelXref","commonErrorMessageToErrorModelXref","ACTIVATION_KEY_INVALID","PASSWORD_SAME_ALREADY_SET","PASSWORD_SET_ACTIVE","ResetPassword","handleSubmit","preventDefault","initAllValues","isEmpty","isGeneralError","generalErrorMessage","generalErrors","changePasswordInputHandler","bind","changeConfirmPasswordInputHandler","fieldName","prevState","updateState","onSubmit","htmlType","withTranslation","DefaultContent","FooterMini","logo","logoLink","LanguageSwitcher","useLanguageSwitcher","languages","changeLanguage","Footer","footerLink","footerLogo","linkedinIcon","ScrollTop","scrollTopElement","useRef","visible","innerHeight","pageYOffset","classList","scrollTo","top","behavior","ref","Logo","LogoImage","Header","onRightButtonClick","profile","profileOpen","setProfileOpen","isOpen","setIsOpen","closeNavigation","active","useDispatch","defaultChecked","changeTheme","newTheme","setTheme","detectorTheme","matches","DetectorSystemTheme","profileInfo","withEdit","withAlert","logoutText","onLogout","additionalInfo","riskProfile","onVisibleChange","navigationTablet","onClose","leftButton","rightButton","onLeftButtonClick","logout","stateProps","dispatchProps","ownProps","assign","products","clientName","Attributes","ClientName","dataProfile","RootTemplate","TermsText","classNameName","role","TermsOfUse","setTerms","userSelector","setTermsAccepted","isTermsAccepted","RootRouter","WithTermsOfUse","ActivationEn","ActivationFr","ActivationDe","ActivationIt","ActivationPr","ActivationEs","TITLE_VIEWS","renderForgotLink","historyRouter","LoginForm","submitting","onLogin2FA","qrCode","onEnroll","isEnrollSuccess","isEnrollDeviceSuccess","isEnrollUnsuccess","setView","errorContent","login","DEVICE_NOT_ENROLLED","backgroundImage","newProps","bottomLinks","submitLabel","info","EnrollementInfoBox","UserAndPassword","isSubmitting","Field","autoComplete","FieldRenderer","PasswordFieldRenderer","WrappedIntoReduxForm","reduxForm","form","validateLoginForm","FuturaePasscode","infoText","passcodeLength","passcode","setPasscode","event","onCancel","MobileAppApprove","isPreAuthLoading","onPreAuth","validatePasscode","onBackToLogin","Passcode","isMTan","preAuth","callback","logIn2","preAuthResult","responseError","_error","CampaignContact","session","Session","sessionId","SessionId","jwtAccessToken","JwtAccessToken","enrollResult","Status","enrollError","enrollStatusTimeout","_errror","AsynchronousParameters","ActivationQrCodeUrl","EnrollmentSessionId","EnrollQRCode","cleanUp","isTrustedDevice","setTrusted","resultStatus","LoginContentPane","LoginLogoSvgLight","ToEnrollDevice","router","isLoginDone","isLoginDoneSelector","handleGetUserProfile","onAuthComplete","AUTH_COMPLETE","redirectToDashboard","validatedUsername","loginData","setLoginData","getUrlTokenCredentials","urlAccessToken","urlContactId","roleId","isURLLogin","fromPathname","getOr","currentHandler","validateUsername","loginView","handler","errorView","currentTitle","NoHeaderTemplate","LoginContainer","ForgotPassword","validateUrlParams","targetObject","propertiesToCheck","validateToken","validationData","updateStateApi","useDocumentLoadFromUrl","requiredPropsList","setDocument","getDownloadDocumentUrlCredentials","getDocumentWithUrlParams","setup","jwt","getFactsheetWithUrlParams","factsheetName","docname","FACTSHEET_URL_PROPS","MobileAppDownloadFactsheet","pagesCount","setPagesCount","pages","pagesArray","onLoadSuccess","numPages","el","pageNumber","DOCUMENT_URL_PROPS","MobileAppDownloadDocument","fallback","strict","LoginRouter","resourceAdapt","resources","Resources","currentValue","ResourceValues","Backend","resourceName","lang","saveManager","backendOptions","SaveManager","nameSpace","resourceStore","ns","namespace","localResource","resourcesFromSessionStorage","loadResource","save","saveToSessionStorage","load","SessionStoreManager","storeName","sessionStorage","setItem","getItem","use","LanguageDetector","initReactI18next","init","fallbackLng","keySeparator","react","wait","backend","debug","interpolation","escapeValue","MEASUREMENT_ID","GOOGLEANALYTIC_MEASUREMENTID","initAnalitics","documentMode","ReactDOM","store","getElementById","fileData","stringFile","atob","fileType","byteString","buffer","ArrayBuffer","dataBuffer","Uint8Array","charCodeAt","Blob","MimeType","BlobFile","URL","createObjectURL","anchorElement","createElement","display","appendChild","click","require","dateYearFormat","dateTimeSecondsFormat","importLocale","moment","HTML5_FMT","DATETIME_LOCAL_SECONDS","warn","outputFormat","inputFormat","utc","local","initFormat","unit","subtract","date1","date2","isSame","dateDiff","diff","startOf","getLastDayOfYear","endOf","dayOfYear","daysUnits","goBackForQuantityYears","currentDate","bsStyle","PrimaryButton","SuccessButton","InfoButton","WarningButton","DangerButton","LinkButton","decodeAndParseHash","hash","getUrlHashParams","paramKeys","$_GET","parameterName","token","decodedJwt","jwtDecode","cid","jti","mid","hashParams","otherParams","auth","RESET_THEME","SET_THEME","PASSCODE_INVALID","TWO_FACTOR_DISABLED","SESSION_INVALID","DEVICE_ALREADY_ENROLLED","SESSION_ALREADY_ACTIVE","PASSWORD_INVALID","enrollSelector","enroll","enrollQRCodeSelector","isEnrollUnsuccessSelector","errorSelector","isEnrollSuccessSelector","isEnrollDeviceSuccessSelector","isDeviceEnrolledSelector","isActiveUserNotEnrolledSelector","isUserActiveSelector","isDeviceEnrolled","isUserActive","EnrollDeviceByUserAndPassword","Translated","isActiveUserNotEnrolled","FORM_NAME","enrollDevice","sessionSelector","LOGIN_FAILED","authErrorByStatus","windowMatchMedia","matchMedia","getSystemTheme","darkAlias","lightAlias","addListener","roundLargestRemainder","arr","x","floor","offObject","offKeys","args","arg","concat","join","parent","Parent","multiply","prop","accu","roundItems","arrDef","sumItems","divide","allocations","inputDate","today","tradingService","complianceService","PortfolioManagement","Products","currenciesService","attachments","messageService","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","preloadedState","composeEnhancer","compose","loaded","states","loadedSessionData","loadedSession","withURLLogin","SERVICES_BASIC_AUTH","DMS_BASIC_AUTH","loadStateAndSetupServices","createStore","rootReducer","applyMiddleware","routerMiddleware","thunk","saveSession","EnrollmentInfoBox","itunesIcon","gplayIcon","input","meta","touched","warning","shape","PasswordEyeButton","isPassVisible","setPassVisible","aria-label","eyeOpened","eyeClosed","aria-hidden","inputType","prefix","performanceSelectOptions","additionalPerformanceSelectOptions","createBrowserHistory","LOGOUT_SUCCESS","GET_USER_PROFILE_START","GET_USER_PROFILE_SUCCESS","GET_USER_PROFILE_FAIL","PRE_AUTH_WITH_2FA_COMPLETE","PRE_AUTH_SUCCESS","TERMS_ACCEPTED","RESET_LOGIN","getUserProfileFail","getState","i18next","contactManagementResponse","membersResponse","LOGIN_WITH_URL_SUCCESS","LOGIN_WITH_URL_START","SESSION_CHECKED","sessionChecked","jwtAccessTokenSelector","accessToken","RESET2FA","localStorage","removeItem","faq","pageView","startLanguage","expandFAQBlock","changeGraphView","showDetails","gaSendPageView","gtag","page_path","analiticsSrcScirpt","async","head","analiticsScirpt","innerHTML","listen","actionName","categoryName","labelName","event_category","event_label","loadedState","NAMESPACE_DEFAULT","next","sorterByDateCommon","column","previous","previousValue","direction","sorterStringCommon","toLowerCase","localeCompare","sorterNumberCommon","roles","authSelector","isFistStepDone","contactTypeIdSelector","contactFirstNameSelector","contactTypeId","contactLasNameSelector","isUserNameAndLastNameAvailableSelector","contactFirstName","contactLasName","isUserNameAndLastNameAvailable","passcodeInputs","passcodeArr","focus","changeTanHandler","clonedPasscode","currentTarget","valueLength","min","focusIndex","keyupTanHandler","select","selectionStart","charCode","keyCode","which","setRef","onFocus","onKeyUp","events","SESSION_TIMEOUT_WARNING_DIALOG","parseInt","SetupConfig","SESSION_TIMEOUT_WARNING_DIALOG_COUNTDOWN","AutoLogout","renderModalContent","seconds","timer","modal","showModal","resetTimeout","continueSession","clearSessionTimeout","modalTime","logoutTime","setSessionTimeout","destroy","modalTimeout","logoutTimeout","clearInterval","remainSeconds","Modal","success","onOk","okText","keyboard","setInterval","update","logoutAction","imgName","transformedName","memberPhoto","MEMBER_PHOTO","languageWithoutLocale","languagesAdapt","availableLanguages","changeLocale","langSources","langSource","defaultState","isJWTBaseLogin","initState","isUnenrollSuccess","isUnenrollUnsuccess","combineReducers","connectRouter","nextState","Length","isTwoFactorEnabled","IsTwoFactorEnabled","statusFor2FA","provider","btoa","ContactType","relationshipManagerId","formReducer"],"mappings":"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","file":"static/js/main.a09a5f56.chunk.js","sourcesContent":["import { get } from 'lodash/fp';\r\nimport Service from 'additiv-services';\r\nimport { getDmsUrl, getCustomUrl, getServicesUrl, V11 } from 'additiv-services/dist/setup';\r\nimport { checkStatus } from '../core/generalStatusCheck';\r\n\r\nconst serviceCall = (service, method, argsArray = []) => {\r\n const result = service[method](...argsArray);\r\n const promise = result instanceof Promise ? result : result[0];\r\n\r\n promise\r\n .then(() => {})\r\n .catch((reason) => {\r\n checkStatus(get('response.status', reason));\r\n });\r\n\r\n return result;\r\n};\r\n\r\nclass CustomServiceManager {\r\n static Service(method, argsArray) {\r\n return serviceCall(Service, method, argsArray);\r\n }\r\n\r\n static getMetaDataId() {\r\n return Service.getRequest(`${getDmsUrl()}/documents/metadata`, {\r\n isSecure: true,\r\n });\r\n }\r\n\r\n static getPublicDocument(metadataId, externalId) {\r\n return Service.getRequest(\r\n `${getDmsUrl()}/documents/metadata/${metadataId}/owners/0/externals/${externalId}`,\r\n {\r\n isSecure: true,\r\n }\r\n );\r\n }\r\n\r\n static getLanguages(language) {\r\n return Service.getRequest(`${getServicesUrl()}/languages/${language}`, {\r\n isSecure: true,\r\n });\r\n }\r\n\r\n static generateInvestmentOverviewReport(params) {\r\n return Service.postRequest(`${getServicesUrl()}/templates/generateTemplate`, params, {\r\n isSecure: true,\r\n });\r\n }\r\n\r\n static getWPPosts(params = {}) {\r\n const queries = Object.entries(params);\r\n const urlParams = queries.reduce(\r\n (acc, item) => (item[1] ? `${acc}&${item[0]}=${item[1]}` : ''),\r\n ''\r\n );\r\n\r\n if (urlParams) {\r\n return Service.getRequest(`${getCustomUrl()}/nsnews/posts/?${urlParams}`, {\r\n isSecure: true,\r\n });\r\n }\r\n\r\n return Service.getRequest(`${getCustomUrl()}/nsnews/posts/`, {\r\n isSecure: true,\r\n });\r\n }\r\n\r\n static getWPPostImages(postId) {\r\n return Service.getRequest(`${getCustomUrl()}/nsnews/media?parent=${postId}`, {\r\n isSecure: true,\r\n });\r\n }\r\n\r\n static logIn(username, password) {\r\n return Service.postRequest(`${getServicesUrl()}/authentication/authenticate`, {\r\n UserName: username,\r\n password,\r\n ForceExpiringPreviousSession: false,\r\n });\r\n }\r\n\r\n static validateToken(AccessToken) {\r\n return Service.postRequest(`${getServicesUrl()}/authentication/tokens/validate`, {\r\n AccessToken,\r\n });\r\n }\r\n\r\n static logIn2(_ref2) {\r\n const { username, password, trustedDeviceToken } = _ref2;\r\n\r\n return Service.postRequest(`${getServicesUrl(V11)}/authentication/pre-authenticate`, {\r\n UserName: username,\r\n Password: password,\r\n ForceExpiringPreviousSession: false,\r\n TrustedDeviceToken: trustedDeviceToken,\r\n });\r\n }\r\n\r\n static logout(contactId) {\r\n return Service.postRequest(\r\n `${getServicesUrl()}/contacts/${contactId}/authentication/logoff`,\r\n null,\r\n {\r\n isSecure: true,\r\n }\r\n );\r\n }\r\n}\r\n\r\nexport default CustomServiceManager;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Icon, Dropdown, MenuItem } from 'ui-library';\r\n\r\nconst CellWithMoreActions = ({ value, actions }) => (\r\n }>\r\n {actions &&\r\n actions.map((action) => {action.text})}\r\n \r\n);\r\n\r\nCellWithMoreActions.propTypes = {\r\n value: PropTypes.string,\r\n actions: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n text: PropTypes.string,\r\n onClick: PropTypes.func,\r\n })\r\n ),\r\n};\r\n\r\nCellWithMoreActions.defaultProps = {\r\n value: '',\r\n actions: [],\r\n};\r\n\r\nexport default CellWithMoreActions;\r\n","import React from 'react';\r\nimport { isObject } from 'lodash/fp';\r\nimport PropTypes from 'prop-types';\r\nimport { NumberInput } from 'ui-library';\r\n\r\nconst CellInputText = (numberSeparators) => (data) => {\r\n return isObject(data) ? (\r\n data.value !== '' && (\r\n \r\n )\r\n ) : (\r\n {data}\r\n );\r\n};\r\n\r\nCellInputText.propTypes = {\r\n data: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.shape({\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n disabled: PropTypes.bool,\r\n onChange: PropTypes.func,\r\n }),\r\n ]),\r\n};\r\n\r\nCellInputText.defaultProps = {\r\n data: null,\r\n};\r\n\r\nexport default CellInputText;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { renderers } from 'ui-library';\r\n\r\nconst { CellLinked, CellTooltiped } = renderers;\r\n\r\nfunction CellSwitch(props) {\r\n // eslint-disable-next-line react/destructuring-assignment\r\n if (props.label === undefined) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {CellLinked({\r\n // eslint-disable-next-line react/destructuring-assignment\r\n value: props.label,\r\n // eslint-disable-next-line react/destructuring-assignment\r\n link: props.link,\r\n // eslint-disable-next-line react/destructuring-assignment\r\n maxLength: props.maxLength,\r\n })}\r\n \r\n );\r\n}\r\n\r\nCellSwitch.propTypes = {\r\n label: PropTypes.string,\r\n link: PropTypes.string,\r\n maxLength: PropTypes.number,\r\n};\r\n\r\nCellSwitch.defaultProps = {\r\n label: '',\r\n link: '',\r\n maxLength: undefined,\r\n};\r\n\r\nexport default CellSwitch;\r\n","/* eslint-disable */\r\nimport React from 'react';\r\nimport { getColorClass } from 'utils/formatting';\r\n\r\nconst CellPercent = (getFormattedNumber) => (value) => {\r\n if (value === undefined || value === null) return '- -';\r\n\r\n const num = getFormattedNumber ? getFormattedNumber(value, {\r\n maximumFractionDigits: 2,\r\n minimumFractionDigits: 2,\r\n }) : value;\r\n\r\n const sign = num > 0 ? '+' : '';\r\n\r\n return (\r\n \r\n {sign}{num}%\r\n \r\n );\r\n};\r\n\r\nexport default CellPercent;\r\n","import PropTypes from 'prop-types';\r\nimport { formatCurrency } from 'utils/formatting';\r\n\r\nconst CellValue = (value) => (value === undefined ? null : formatCurrency(value));\r\n\r\nCellValue.propTypes = {\r\n value: PropTypes.number.isRequired,\r\n};\r\n\r\nCellValue.defaultProps = {};\r\n\r\nexport default CellValue;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Icon } from 'ui-library';\r\n\r\nconst CellWithIconAction = ({ icon, size, onChange }) => (\r\n
\r\n {icon && }\r\n
\r\n);\r\n\r\nCellWithIconAction.propTypes = {\r\n icon: PropTypes.string,\r\n size: PropTypes.number,\r\n onChange: PropTypes.func,\r\n};\r\n\r\nCellWithIconAction.defaultProps = {\r\n icon: undefined,\r\n size: undefined,\r\n onChange: () => {},\r\n};\r\n\r\nexport default CellWithIconAction;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { noop } from 'lodash/fp';\r\nimport { Icon } from 'ui-library';\r\n\r\nconst CellWithPlusMinusIcons = ({ onDecrease, onIncrease }) => (\r\n
\r\n {onDecrease && }\r\n {onIncrease && }\r\n
\r\n);\r\n\r\nCellWithPlusMinusIcons.propTypes = {\r\n onDecrease: PropTypes.func,\r\n onIncrease: PropTypes.func,\r\n};\r\n\r\nCellWithPlusMinusIcons.defaultProps = {\r\n onIncrease: noop,\r\n onDecrease: noop,\r\n};\r\n\r\nexport default CellWithPlusMinusIcons;\r\n","import PropTypes from 'prop-types';\r\nimport { isToday, isYesterday, isTomorrow } from 'utils';\r\nimport { formatTime, formatDate } from 'utils/datetime';\r\n\r\nconst CellAdaptedDate = (t) => (date) => {\r\n if (isToday(date)) return formatTime(date);\r\n if (isTomorrow(date)) return t('messages.tomorrow');\r\n if (isYesterday(date)) return t('messages.yesterday');\r\n\r\n return formatDate(date);\r\n};\r\n\r\nCellAdaptedDate.propTypes = {\r\n isReplied: PropTypes.bool,\r\n date: PropTypes.string,\r\n};\r\n\r\nCellAdaptedDate.defaultProps = {\r\n isReplied: true,\r\n date: null,\r\n};\r\n\r\nexport default CellAdaptedDate;\r\n","import PropTypes from 'prop-types';\r\nimport { renderers } from 'ui-library';\r\nimport { isToday, isTomorrow, isYesterday } from 'utils';\r\nimport { formatDate, formatTime } from 'utils/datetime';\r\n\r\nconst { CellWithMessageDate } = renderers;\r\n\r\nconst CellAdaptedMessageDate = (t, getFormattedDate = null, getFormattedTime = null) => ({\r\n date,\r\n isReplied,\r\n}) => {\r\n if (isToday(date)) {\r\n return CellWithMessageDate({\r\n date: getFormattedTime ? getFormattedTime(date) : formatTime(date),\r\n isReplied,\r\n });\r\n }\r\n if (isTomorrow(date)) return CellWithMessageDate({ date: t('messages.tomorrow'), isReplied });\r\n if (isYesterday(date)) return CellWithMessageDate({ date: t('messages.yesterday'), isReplied });\r\n\r\n return CellWithMessageDate({\r\n date: getFormattedDate ? getFormattedDate(date) : formatDate(date),\r\n isReplied,\r\n });\r\n};\r\n\r\nCellAdaptedMessageDate.propTypes = {\r\n isReplied: PropTypes.bool,\r\n date: PropTypes.string,\r\n};\r\n\r\nCellAdaptedMessageDate.defaultProps = {\r\n isReplied: true,\r\n date: null,\r\n};\r\n\r\nexport default CellAdaptedMessageDate;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { renderers } from 'ui-library';\r\n\r\nconst { CellLinked } = renderers;\r\n\r\nfunction CellLink({ label, link }) {\r\n return (\r\n \r\n {CellLinked({\r\n value: label,\r\n link,\r\n })}\r\n \r\n );\r\n}\r\n\r\nCellLink.propTypes = {\r\n label: PropTypes.string,\r\n link: PropTypes.string,\r\n};\r\n\r\nCellLink.defaultProps = {\r\n label: '',\r\n link: '',\r\n};\r\n\r\nexport default CellLink;\r\n","/* eslint-disable */\r\n\r\nwindow.reactAdditiv = {\r\n settings: {\r\n services: {\r\n withJWT: true,\r\n GATEWAY_API_URL: process.env.REACT_APP_GATEWAY_API_URL,\r\n SERVICES_URL_SUFFIX: global.AppConfig.SERVICES_URL_SUFFIX,\r\n DMS_URL_SUFFIX: global.AppConfig.DMS_URL_SUFFIX,\r\n CUSTOM_URL_SUFFIX: global.AppConfig.CUSTOM_URL_SUFFIX,\r\n },\r\n },\r\n};\r\n","import { renderers } from 'ui-library';\r\nimport { CellSwitch, CellPercent, CellWithMoreActions } from 'components/renderers';\r\nimport { sorterByDate, sorterString, sorterNumber } from 'utils/sorting';\r\n\r\n// const { CellWithIcon, CellTooltiped } = renderers;\r\nconst { CellWithIcon } = renderers;\r\n\r\n// TODO: check if IDs for the Asset Classes remain during migration between environments\r\n// API method - /dfs/api/v1.0/assetclasses/en\r\n// { AssetClassId_fromBackOffice: { positionSortingOrder }}\r\nconst ASSET_CLASSES_ORDERS = JSON.parse(global.additionalConfig?.assetClassesOrder || 'null');\r\nconst ASSET_CLASSES_ORDERS_FALLBACK = {\r\n '1': { order: 0 }, // Name: 'CASH',\r\n '14': { order: 1 }, // Name: 'CURRENCY HEDGE',\r\n '2': { order: 2 }, // Name: 'FIXED INCOME',\r\n '10': { order: 3 }, // Name: 'Credit/High Yield/Convertible', ParentId: 2,\r\n '19': { order: 4 }, // Name: 'Investment Grade Bonds', ParentId: 2,\r\n '18': { order: 5 }, // Name: 'Emerging Markets Bonds', ParentId: 2,\r\n '3': { order: 6 }, // Name: 'EQUITIES',\r\n '15': { order: 7 }, // Name: 'Equities Long Only', ParentId: 3,\r\n '16': { order: 8 }, // Name: 'Equities Long/Short', ParentId: 3,\r\n '17': { order: 9 }, // Name: 'Flexible', ParentId: 3,\r\n '11': { order: 10 }, // Name: 'ABSOLUTE RETURN',\r\n '12': { order: 11 }, // Name: 'Global Macro/CTA', ParentId: 11,\r\n '13': { order: 12 }, // Name: 'Relative Value', ParentId: 11,\r\n '22': { order: 13 }, // Name: 'Multi-Strategy Funds', ParentId: 11,\r\n '20': { order: 14 }, // Name: 'GOLD & PRECIOUS METALS',\r\n '4': { order: 15 }, // Name: 'LOAN',\r\n '21': { order: 16 }, // Name: 'LONG TERM COMMITMENT',\r\n '24': { order: 17 }, // Name: 'Private Equity', ParentId: 21,\r\n '25': { order: 18 }, // Name: 'Real Estate', ParentId: 21,\r\n '26': { order: 19 }, // Name: 'Guarantee', ParentId: 21,\r\n '23': { order: 20 }, // Name: 'Others', ParentId: 21,\r\n};\r\n\r\nexport const ASSET_STRATEGY_IDS = [\r\n 1, // Name: 'CASH',\r\n 14, // Name: 'CURRENCY HEDGE',\r\n 2, // Name: 'FIXED INCOME',\r\n 3, // Name: 'EQUITIES',\r\n 11, // Name: 'ABSOLUTE RETURN',\r\n 20, // Name: 'GOLD & PRECIOUS METALS',\r\n 4, // Name: 'LOAN',\r\n 21, // Name: 'LONG TERM COMMITMENT',\r\n];\r\n\r\nexport function getAssetClassOrder(id) {\r\n const assetClassOrder = ASSET_CLASSES_ORDERS || ASSET_CLASSES_ORDERS_FALLBACK;\r\n // const assetClassOrder = ASSET_CLASSES_ORDERS_FALLBACK;\r\n\r\n // 21 is fallback value to set item in the last position of the list\r\n return assetClassOrder[id]?.order || 21;\r\n}\r\n\r\nexport const positionsColumns = (t, getFormattedNumber) => [\r\n {\r\n key: 'name',\r\n title: t('position.columns.name'),\r\n sortable: true,\r\n sorter: sorterString('name.label'),\r\n render: CellSwitch,\r\n },\r\n {\r\n title: t('position.columns.value'),\r\n className: 'text-right',\r\n key: 'valuation',\r\n sorter: sorterNumber('valuation'),\r\n },\r\n {\r\n key: 'performanceYTD',\r\n title: t('position.columns.performanceYTD'),\r\n className: 'text-right',\r\n render: CellPercent(getFormattedNumber),\r\n sorter: sorterNumber('performanceYTD'),\r\n },\r\n {\r\n title: t('position.columns.unrealizedGainLoss'),\r\n key: 'unrealizedGainLoss',\r\n className: 'text-right',\r\n sorter: sorterNumber('unrealizedGainLoss'),\r\n },\r\n {\r\n title: t('position.columns.weight'),\r\n key: 'allocation',\r\n className: 'text-right',\r\n sorter: sorterNumber('allocation'),\r\n },\r\n {\r\n title: t('position.columns.currency'),\r\n key: 'currency',\r\n className: 'currency-cel',\r\n hidden: true,\r\n sorter: sorterString('currency'),\r\n },\r\n {\r\n title: t('position.columns.lastPrice'),\r\n key: 'latestPrice',\r\n hidden: true,\r\n className: 'text-right',\r\n sorter: sorterNumber('latestPrice'),\r\n },\r\n {\r\n title: t('position.columns.lastPriceDate'),\r\n key: 'latestPriceDate',\r\n className: 'text-right',\r\n hidden: true,\r\n sorter: sorterByDate('latestPriceDate'),\r\n },\r\n {\r\n title: t('position.columns.costPrice'),\r\n key: 'costPrice',\r\n className: 'text-right',\r\n hidden: true,\r\n sorter: sorterNumber('costPrice'),\r\n },\r\n {\r\n title: t('position.columns.units'),\r\n key: 'units',\r\n hidden: true,\r\n className: 'text-right',\r\n sorter: sorterNumber('units'),\r\n },\r\n {\r\n title: t('position.columns.valueInSecurityCurrency'),\r\n className: 'text-right',\r\n key: 'valuationInSecurityCurrency',\r\n hidden: true,\r\n sorter: sorterNumber('valuationInSecurityCurrency'),\r\n },\r\n {\r\n title: '',\r\n className: 'text-right table-cell__actions',\r\n key: 'actions',\r\n render: CellWithMoreActions,\r\n width: 40,\r\n minWidth: 40,\r\n titleType: 'columns',\r\n fixed: 'right',\r\n headerRenderer: CellWithIcon,\r\n },\r\n];\r\n\r\nexport const positionsMobileColumns = (t) => [\r\n {\r\n key: 'name',\r\n title: t('position.columns.name'),\r\n sortable: true,\r\n render: CellSwitch,\r\n sorter: sorterString('name'),\r\n },\r\n {\r\n title: t('position.columns.value'),\r\n className: 'text-right',\r\n key: 'valuation',\r\n sorter: sorterNumber('valuation'),\r\n },\r\n];\r\n","import { SubmissionError } from 'redux-form';\r\nimport Cookies from 'universal-cookie';\r\nimport { get } from 'lodash/fp';\r\nimport {\r\n getErrorModelByStatus,\r\n getAuthErrorByStatus,\r\n LOGIN_FAILED_UNEXPECTEDLY,\r\n} from 'error/authErrors';\r\nimport { enrollStatusSelector } from 'components/Profile/selector';\r\nimport {\r\n EXPIRED,\r\n PENDING,\r\n SESSION_EXPIRED,\r\n SUCCESS,\r\n UNEXPECTED_ERROR,\r\n} from 'static/requestResults';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport { contactIdSelector } from '../auth/authSelectors';\r\nimport { getUserProfile } from '../auth/authActions';\r\n\r\nlet checkEnrollStatusTimeout;\r\n\r\nconst cookies = new Cookies();\r\n\r\nexport const UNENROLL_START = 'react-template-project/enroll/UNENROLL_START';\r\nexport const UNENROLL_SUCCESS = 'react-template-project/enroll/UNENROLL_SUCCESS';\r\nexport const UNENROLL_FAIL = 'react-template-project/enroll/UNENROLL_FAIL';\r\nexport const ENROLL_START = 'react-template-project/enroll/ENROLL_START';\r\nexport const ENROLL_SUCCESS = 'react-template-project/enroll/ENROLL_SUCCESS';\r\nexport const ENROLL_FAIL = 'react-template-project/enroll/ENROLL_FAIL';\r\nexport const DEVICE_ENROLL_START = 'react-template-project/enroll/DEVICE_ENROLL_START';\r\nexport const DEVICE_ENROLL_SUCCESS = 'react-template-project/enroll/DEVICE_ENROLL_SUCCESS';\r\nexport const DEVICE_ENROLL_FAIL = 'react-template-project/enroll/DEVICE_ENROLL_FAIL';\r\nexport const CLEAN_ENROLL = 'react-template-project/enroll/CLEAN_ENROLL';\r\n\r\nexport function cleanEnroll() {\r\n return { type: CLEAN_ENROLL };\r\n}\r\n\r\nexport function unenrollStart() {\r\n return { type: UNENROLL_START };\r\n}\r\n\r\nexport function unenrollComplete(payload) {\r\n return { type: UNENROLL_SUCCESS, payload };\r\n}\r\n\r\nexport function unenrollFail(payload) {\r\n return { type: UNENROLL_FAIL, payload };\r\n}\r\n\r\nexport function enrollStart() {\r\n return { type: ENROLL_START };\r\n}\r\n\r\nexport function enrollComplete(payload) {\r\n return { type: ENROLL_SUCCESS, payload };\r\n}\r\n\r\nexport function enrollFail(payload) {\r\n return { type: ENROLL_FAIL, payload };\r\n}\r\n\r\nexport function enrollDeviceStart() {\r\n return { type: DEVICE_ENROLL_START };\r\n}\r\n\r\nexport function enrollDeviceSuccess() {\r\n return { type: DEVICE_ENROLL_SUCCESS };\r\n}\r\n\r\nexport function enrollDeviceFail(payload) {\r\n return { type: DEVICE_ENROLL_FAIL, payload };\r\n}\r\n\r\nexport function cleanEnrollment() {\r\n return (dispatch) => {\r\n clearTimeout(checkEnrollStatusTimeout);\r\n dispatch(cleanEnroll());\r\n };\r\n}\r\n\r\nfunction checkEnrollStatus({ username, enrollmentSessionId, triggerUserProfile }, dispatch) {\r\n dispatch(enrollDeviceStart());\r\n ServiceManager.deviceEnrollment('checkEnroll', [username, enrollmentSessionId])\r\n .then((response) => {\r\n const enrollStatus = enrollStatusSelector(response.data);\r\n const resultType = response.data.Result;\r\n const errorObject = getErrorModelByStatus(resultType);\r\n\r\n if (errorObject !== undefined) {\r\n dispatch(enrollDeviceFail(errorObject));\r\n } else if (resultType === SUCCESS) {\r\n if (enrollStatus === SUCCESS) {\r\n cookies.remove('trustedDeviceToken');\r\n dispatch(enrollDeviceSuccess());\r\n if (triggerUserProfile === true) {\r\n dispatch(getUserProfile());\r\n }\r\n } else if (enrollStatus === PENDING) {\r\n checkEnrollStatusTimeout = setTimeout(() => {\r\n checkEnrollStatus(\r\n {\r\n username,\r\n enrollmentSessionId,\r\n triggerUserProfile,\r\n },\r\n dispatch\r\n );\r\n }, process.env.REACT_APP_QR_CODESTATUS_POLLING_INTERVAL);\r\n } else if (enrollStatus === EXPIRED) {\r\n dispatch(enrollDeviceFail(getErrorModelByStatus(SESSION_EXPIRED)));\r\n }\r\n } else {\r\n dispatch(enrollDeviceFail(getErrorModelByStatus(UNEXPECTED_ERROR)));\r\n }\r\n })\r\n .catch(() => {\r\n dispatch(enrollDeviceFail(getErrorModelByStatus(UNEXPECTED_ERROR)));\r\n });\r\n}\r\n\r\nexport function deactivateTwoFactorAuthentication({ doNotTriggerUserProfile } = {}) {\r\n return (dispatch, getState) => {\r\n const contactId = contactIdSelector(getState());\r\n\r\n return new Promise((resolve, reject) => {\r\n dispatch(unenrollStart());\r\n ServiceManager.deviceEnrollment('unenroll', [\r\n contactId,\r\n {\r\n DisableTwoFactor: true,\r\n },\r\n ])\r\n .then((response) => {\r\n const resultType = response.data.Result;\r\n const errorObject = getErrorModelByStatus(resultType);\r\n\r\n if (errorObject !== undefined) {\r\n dispatch(unenrollFail(errorObject));\r\n reject(errorObject);\r\n } else if (resultType === SUCCESS) {\r\n if (doNotTriggerUserProfile === undefined) {\r\n dispatch(getUserProfile());\r\n }\r\n dispatch(unenrollComplete(response.data));\r\n resolve(response);\r\n } else {\r\n const errorModel = getErrorModelByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n\r\n dispatch(unenrollFail(errorModel));\r\n reject(errorModel);\r\n }\r\n })\r\n .catch(() => {\r\n const errorModel = getErrorModelByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n\r\n dispatch(unenrollFail(errorModel));\r\n reject(errorModel);\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function enrollDeviceByContactId() {\r\n return (dispatch, getState) => {\r\n const contactId = contactIdSelector(getState());\r\n\r\n return new Promise((resolve, reject) => {\r\n dispatch(enrollStart());\r\n ServiceManager.deviceEnrollment('enroll', [contactId])\r\n .then((response) => {\r\n const resultType = response.data.Result;\r\n const errorObject = getErrorModelByStatus(resultType);\r\n\r\n if (errorObject !== undefined) {\r\n dispatch(enrollFail(errorObject));\r\n reject(errorObject);\r\n } else if (resultType === SUCCESS) {\r\n dispatch(enrollComplete(response.data));\r\n checkEnrollStatus(\r\n {\r\n username: get('data.UserName', response),\r\n enrollmentSessionId: get('data.EnrollmentSessionId', response),\r\n triggerUserProfile: true,\r\n },\r\n dispatch\r\n );\r\n resolve(response);\r\n } else {\r\n const errorModel = getErrorModelByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n\r\n reject(enrollFail(errorModel));\r\n dispatch(enrollFail(errorModel));\r\n }\r\n })\r\n .catch(() => {\r\n const errorModel = getErrorModelByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n\r\n dispatch(enrollFail(errorModel));\r\n reject(errorModel);\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function replaceDevice() {\r\n return (dispatch) => {\r\n dispatch(deactivateTwoFactorAuthentication({ doNotTriggerUserProfile: true })).then(() => {\r\n dispatch(enrollDeviceByContactId());\r\n });\r\n };\r\n}\r\n\r\nexport function enrollDeviceByUserAndPassword({ username, password }, dispatch) {\r\n const validatedLogin = /@/.test(username)\r\n ? username\r\n : `${username}@${global.AppConfig.USERNAME_EMAIL_DOMAIN}`;\r\n\r\n return new Promise((resolve, reject) => {\r\n ServiceManager.deviceEnrollment('enrollByUserAndPassword', [\r\n {\r\n username: validatedLogin,\r\n password,\r\n },\r\n ])\r\n .then((response) => {\r\n const resultType = response.data.Result;\r\n const errorObject = getAuthErrorByStatus(resultType);\r\n\r\n if (errorObject !== undefined) {\r\n reject(new SubmissionError(errorObject));\r\n } else if (resultType === SUCCESS) {\r\n dispatch(enrollComplete(response.data));\r\n checkEnrollStatus(\r\n {\r\n username: get('data.UserName', response),\r\n enrollmentSessionId: get('data.EnrollmentSessionId', response),\r\n },\r\n dispatch\r\n );\r\n resolve(response);\r\n } else {\r\n reject(getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY));\r\n }\r\n })\r\n .catch(() => {\r\n reject(getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY));\r\n });\r\n });\r\n}\r\n","export const AUTH_ERROR = 'AuthenticationError';\r\n","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","import { formatMoney, formatNumber } from 'accounting-js';\r\nimport { isNumber, multiply, get } from 'lodash/fp';\r\nimport { isToday, isTomorrow, isYesterday } from './index';\r\nimport { formatDate, formatTime, getDatesDifference } from './datetime';\r\n\r\nexport const NA = 'N/A';\r\nexport const TYPE_CURRENCY = 'currency';\r\nexport const TYPE_PERCENT = 'percent';\r\nexport const TYPE_RATIO = 'ratio';\r\nexport const TYPE_NUMBER = 'number';\r\nexport const TYPE_TEXT = 'text';\r\n\r\nexport const trimLongString = (str, maxLength) =>\r\n str && str.length && str.length > maxLength ? `${str.slice(0, 30)}...` : str;\r\n\r\nexport const VALUE_TYPES = [TYPE_CURRENCY, TYPE_PERCENT, TYPE_NUMBER, TYPE_TEXT, TYPE_RATIO];\r\n\r\nexport const validateStringData = (data) => data || NA;\r\n\r\nexport const validateName = (data) => data || '';\r\n\r\nexport const getAdaptedDate = (date, t) => {\r\n if (date === undefined) return NA;\r\n\r\n if (isToday(date)) return formatTime(date);\r\n if (isTomorrow(date)) return t('messages.tomorrow');\r\n if (isYesterday(date)) return t('messages.yesterday');\r\n\r\n return formatDate(date);\r\n};\r\n\r\nexport const percentIsZero = (num, precision = 2) => {\r\n if (num === 0) return num;\r\n if (Number(num).toFixed(precision) === (0).toFixed(precision)) return '<1';\r\n if (Number(num).toFixed(precision) === `-${(0).toFixed(precision)}`) return '>-1';\r\n\r\n return num;\r\n};\r\n\r\nexport const chartValueFormatCurrency = {\r\n symbol: '$',\r\n precision: 0,\r\n thousand: ',',\r\n decimal: '.',\r\n format: '%v%s',\r\n};\r\n\r\nexport const chartValueFormatPercent = {\r\n symbol: '%',\r\n precision: 2,\r\n thousand: ',',\r\n decimal: '.',\r\n format: '%v%s',\r\n};\r\n\r\nexport const formatCurrency = function (amount, symbol) {\r\n return isNumber(+amount)\r\n ? formatMoney(+amount, {\r\n symbol: symbol || '',\r\n decimal: '.',\r\n thousand: ',',\r\n format: '%s %v',\r\n })\r\n : NA;\r\n};\r\n\r\nexport const formatCurrencyWithPrecision = (amount, precision, symbol) =>\r\n isNumber(+amount)\r\n ? formatMoney(+amount, {\r\n precision,\r\n symbol: symbol || '',\r\n decimal: '.',\r\n thousand: ',',\r\n format: '%s %v',\r\n })\r\n : NA;\r\n\r\nexport const formatPercentageValue = function (amount, precision = 2) {\r\n if (!isNumber(amount)) return NA;\r\n const number =\r\n Math.abs(amount.toFixed(precision)) === Number((0).toFixed(precision)) ? 0 : amount;\r\n\r\n return formatNumber(number, { precision, thousand: '', decimal: ',' });\r\n};\r\n\r\nexport const formatNumberValue = function (amount, precision = 2) {\r\n if (!isNumber(amount)) return NA;\r\n const number =\r\n Math.abs(amount.toFixed(precision)) === Number((0).toFixed(precision)) ? 0 : amount;\r\n\r\n return formatNumber(number, { precision, thousand: ' ', decimal: '.' });\r\n};\r\n\r\nexport const formatPercentage = (amount, { multiplier } = { multiplier: 1 }) =>\r\n typeof amount === 'number' ? `${formatPercentageValue(amount * multiplier)}%` : `${NA} %`;\r\n\r\nexport const getfromDataObject = (data, path) => get(path, data, NA);\r\n\r\nexport const setPercent = (number) => multiply(number, 100);\r\n\r\nexport const formatBigNumber = (value, precision = 2) =>\r\n value === undefined || Number.isNaN(value)\r\n ? NA\r\n : formatMoney(value, {\r\n precision,\r\n decimal: '.',\r\n thousand: ',',\r\n format: '%v',\r\n });\r\n\r\nexport const formatNumberRounding = (value, formatter, precision = 2) => {\r\n if (value === undefined || Number.isNaN(value)) {\r\n return NA;\r\n }\r\n\r\n const getContracted = (num) =>\r\n formatter\r\n ? formatter(value / num, {\r\n maximumFractionDigits: precision,\r\n minimumFractionDigits: precision,\r\n })\r\n : formatBigNumber(value / num);\r\n\r\n if (Math.abs(value) >= 1000000000) {\r\n return `${getContracted(1000000000)}Bn`;\r\n }\r\n\r\n if (Math.abs(value) >= 1000000) {\r\n return `${getContracted(1000000)}M`;\r\n }\r\n\r\n if (Math.abs(value) >= 1000) {\r\n return `${getContracted(1000)}K`;\r\n }\r\n\r\n return formatter ? formatter(value) : formatBigNumber(value);\r\n};\r\n\r\nexport const formatSignPercent = (value) =>\r\n isNumber(value) ? `${value > 0 ? '+' : ''}${formatPercentage(value)}` : `${NA} %`;\r\n\r\nexport const formatSignPercentWithoutDecimals = (value) =>\r\n isNumber(value) ? `${value > 0 ? '+' : ''}${formatPercentageValue(value, 0)}%` : `${NA} %`;\r\n\r\nexport const formatValueByType = (value, typeValue, withSign, formatter) => {\r\n switch (typeValue) {\r\n case TYPE_CURRENCY:\r\n return `${withSign && value > 0 ? '+' : ''}${formatNumberRounding(value, formatter)}`;\r\n case TYPE_PERCENT:\r\n return `${withSign && value > 0 ? '+' : ''}\r\n ${formatter(value, { maximumFractionDigits: 2, minimumFractionDigits: 2 })}%`;\r\n case TYPE_RATIO:\r\n return `${withSign && value > 0 ? '+' : ''}\r\n ${formatter(value, { maximumFractionDigits: 2, minimumFractionDigits: 2 })}`;\r\n case TYPE_NUMBER:\r\n return `${withSign && value > 0 ? '+' : ''}\r\n ${formatter(value, { maximumFractionDigits: 0, minimumFractionDigits: 0 })}`;\r\n default:\r\n return value;\r\n }\r\n};\r\n\r\nexport const getColorClass = (value, className, precision = 2) => {\r\n if (typeof value !== 'number') return `${className}`;\r\n\r\n const number = Number(value.toFixed(precision));\r\n\r\n if (number > 0) {\r\n return `${className} ${className}_positive`;\r\n }\r\n if (number < 0) {\r\n return `${className} ${className}_negative`;\r\n }\r\n\r\n return `${className}`;\r\n};\r\n\r\nexport const yAxisFormatTotal = ({ value }) => formatNumberRounding(value);\r\nexport const yAxisFormatPercent = (value) =>\r\n `${formatNumber(value * 1, {\r\n precision: 2,\r\n thousand: '',\r\n decimal: ',',\r\n })}%`;\r\n\r\nexport const labelFormat = (num, formatter = (n) => n) =>\r\n `${formatter(formatSignPercentWithoutDecimals(num))}`;\r\nexport const allocationPercentFormat = (number) => `${percentIsZero(formatBigNumber(number, 0))}%`;\r\nexport const allocationSAPercentFormat = (number) => `${percentIsZero(formatBigNumber(number, 0))}`;\r\nexport const validateData = (data) => (data || data === 0 ? data : NA);\r\nexport const validateNumber = (data) => data || 0;\r\nexport const formatWithDate = (num, date, getFormattedDate) =>\r\n `${num}
${getFormattedDate ? getFormattedDate(formatDate(date)) : formatDate(date)}`;\r\n\r\nexport const formatProjectionDate = (date, t) => {\r\n const now = new Date();\r\n const start = new Date(now.getFullYear(), now.getMonth(), 1);\r\n const year = getDatesDifference(date, start, 'years');\r\n const months = getDatesDifference(date, start, 'months') - 12 * year;\r\n const yearText = `${t('portfolios.year')}${year > 1 ? 's' : ''}`;\r\n const monthsText = `${t('portfolios.month')}${months > 1 ? 's' : ''}`;\r\n\r\n return `${year} ${yearText} ${months} ${monthsText}`;\r\n};\r\n","var map = {\n\t\"./af\": 777,\n\t\"./af.js\": 777,\n\t\"./ar\": 778,\n\t\"./ar-dz\": 779,\n\t\"./ar-dz.js\": 779,\n\t\"./ar-kw\": 780,\n\t\"./ar-kw.js\": 780,\n\t\"./ar-ly\": 781,\n\t\"./ar-ly.js\": 781,\n\t\"./ar-ma\": 782,\n\t\"./ar-ma.js\": 782,\n\t\"./ar-sa\": 783,\n\t\"./ar-sa.js\": 783,\n\t\"./ar-tn\": 784,\n\t\"./ar-tn.js\": 784,\n\t\"./ar.js\": 778,\n\t\"./az\": 785,\n\t\"./az.js\": 785,\n\t\"./be\": 786,\n\t\"./be.js\": 786,\n\t\"./bg\": 787,\n\t\"./bg.js\": 787,\n\t\"./bm\": 788,\n\t\"./bm.js\": 788,\n\t\"./bn\": 789,\n\t\"./bn.js\": 789,\n\t\"./bo\": 790,\n\t\"./bo.js\": 790,\n\t\"./br\": 791,\n\t\"./br.js\": 791,\n\t\"./bs\": 792,\n\t\"./bs.js\": 792,\n\t\"./ca\": 793,\n\t\"./ca.js\": 793,\n\t\"./cs\": 794,\n\t\"./cs.js\": 794,\n\t\"./cv\": 795,\n\t\"./cv.js\": 795,\n\t\"./cy\": 796,\n\t\"./cy.js\": 796,\n\t\"./da\": 797,\n\t\"./da.js\": 797,\n\t\"./de\": 798,\n\t\"./de-at\": 799,\n\t\"./de-at.js\": 799,\n\t\"./de-ch\": 800,\n\t\"./de-ch.js\": 800,\n\t\"./de.js\": 798,\n\t\"./dv\": 801,\n\t\"./dv.js\": 801,\n\t\"./el\": 802,\n\t\"./el.js\": 802,\n\t\"./en-au\": 803,\n\t\"./en-au.js\": 803,\n\t\"./en-ca\": 804,\n\t\"./en-ca.js\": 804,\n\t\"./en-gb\": 536,\n\t\"./en-gb.js\": 536,\n\t\"./en-ie\": 805,\n\t\"./en-ie.js\": 805,\n\t\"./en-il\": 806,\n\t\"./en-il.js\": 806,\n\t\"./en-in\": 807,\n\t\"./en-in.js\": 807,\n\t\"./en-nz\": 808,\n\t\"./en-nz.js\": 808,\n\t\"./en-sg\": 809,\n\t\"./en-sg.js\": 809,\n\t\"./eo\": 810,\n\t\"./eo.js\": 810,\n\t\"./es\": 811,\n\t\"./es-do\": 812,\n\t\"./es-do.js\": 812,\n\t\"./es-us\": 813,\n\t\"./es-us.js\": 813,\n\t\"./es.js\": 811,\n\t\"./et\": 814,\n\t\"./et.js\": 814,\n\t\"./eu\": 815,\n\t\"./eu.js\": 815,\n\t\"./fa\": 816,\n\t\"./fa.js\": 816,\n\t\"./fi\": 817,\n\t\"./fi.js\": 817,\n\t\"./fil\": 818,\n\t\"./fil.js\": 818,\n\t\"./fo\": 819,\n\t\"./fo.js\": 819,\n\t\"./fr\": 820,\n\t\"./fr-ca\": 821,\n\t\"./fr-ca.js\": 821,\n\t\"./fr-ch\": 822,\n\t\"./fr-ch.js\": 822,\n\t\"./fr.js\": 820,\n\t\"./fy\": 823,\n\t\"./fy.js\": 823,\n\t\"./ga\": 824,\n\t\"./ga.js\": 824,\n\t\"./gd\": 825,\n\t\"./gd.js\": 825,\n\t\"./gl\": 826,\n\t\"./gl.js\": 826,\n\t\"./gom-deva\": 827,\n\t\"./gom-deva.js\": 827,\n\t\"./gom-latn\": 828,\n\t\"./gom-latn.js\": 828,\n\t\"./gu\": 829,\n\t\"./gu.js\": 829,\n\t\"./he\": 830,\n\t\"./he.js\": 830,\n\t\"./hi\": 831,\n\t\"./hi.js\": 831,\n\t\"./hr\": 832,\n\t\"./hr.js\": 832,\n\t\"./hu\": 833,\n\t\"./hu.js\": 833,\n\t\"./hy-am\": 834,\n\t\"./hy-am.js\": 834,\n\t\"./id\": 835,\n\t\"./id.js\": 835,\n\t\"./is\": 836,\n\t\"./is.js\": 836,\n\t\"./it\": 837,\n\t\"./it-ch\": 838,\n\t\"./it-ch.js\": 838,\n\t\"./it.js\": 837,\n\t\"./ja\": 839,\n\t\"./ja.js\": 839,\n\t\"./jv\": 840,\n\t\"./jv.js\": 840,\n\t\"./ka\": 841,\n\t\"./ka.js\": 841,\n\t\"./kk\": 842,\n\t\"./kk.js\": 842,\n\t\"./km\": 843,\n\t\"./km.js\": 843,\n\t\"./kn\": 844,\n\t\"./kn.js\": 844,\n\t\"./ko\": 845,\n\t\"./ko.js\": 845,\n\t\"./ku\": 846,\n\t\"./ku.js\": 846,\n\t\"./ky\": 847,\n\t\"./ky.js\": 847,\n\t\"./lb\": 848,\n\t\"./lb.js\": 848,\n\t\"./lo\": 849,\n\t\"./lo.js\": 849,\n\t\"./lt\": 850,\n\t\"./lt.js\": 850,\n\t\"./lv\": 851,\n\t\"./lv.js\": 851,\n\t\"./me\": 852,\n\t\"./me.js\": 852,\n\t\"./mi\": 853,\n\t\"./mi.js\": 853,\n\t\"./mk\": 854,\n\t\"./mk.js\": 854,\n\t\"./ml\": 855,\n\t\"./ml.js\": 855,\n\t\"./mn\": 856,\n\t\"./mn.js\": 856,\n\t\"./mr\": 857,\n\t\"./mr.js\": 857,\n\t\"./ms\": 858,\n\t\"./ms-my\": 859,\n\t\"./ms-my.js\": 859,\n\t\"./ms.js\": 858,\n\t\"./mt\": 860,\n\t\"./mt.js\": 860,\n\t\"./my\": 861,\n\t\"./my.js\": 861,\n\t\"./nb\": 862,\n\t\"./nb.js\": 862,\n\t\"./ne\": 863,\n\t\"./ne.js\": 863,\n\t\"./nl\": 864,\n\t\"./nl-be\": 865,\n\t\"./nl-be.js\": 865,\n\t\"./nl.js\": 864,\n\t\"./nn\": 866,\n\t\"./nn.js\": 866,\n\t\"./oc-lnc\": 867,\n\t\"./oc-lnc.js\": 867,\n\t\"./pa-in\": 868,\n\t\"./pa-in.js\": 868,\n\t\"./pl\": 869,\n\t\"./pl.js\": 869,\n\t\"./pt\": 870,\n\t\"./pt-br\": 871,\n\t\"./pt-br.js\": 871,\n\t\"./pt.js\": 870,\n\t\"./ro\": 872,\n\t\"./ro.js\": 872,\n\t\"./ru\": 873,\n\t\"./ru.js\": 873,\n\t\"./sd\": 874,\n\t\"./sd.js\": 874,\n\t\"./se\": 875,\n\t\"./se.js\": 875,\n\t\"./si\": 876,\n\t\"./si.js\": 876,\n\t\"./sk\": 877,\n\t\"./sk.js\": 877,\n\t\"./sl\": 878,\n\t\"./sl.js\": 878,\n\t\"./sq\": 879,\n\t\"./sq.js\": 879,\n\t\"./sr\": 880,\n\t\"./sr-cyrl\": 881,\n\t\"./sr-cyrl.js\": 881,\n\t\"./sr.js\": 880,\n\t\"./ss\": 882,\n\t\"./ss.js\": 882,\n\t\"./sv\": 883,\n\t\"./sv.js\": 883,\n\t\"./sw\": 884,\n\t\"./sw.js\": 884,\n\t\"./ta\": 885,\n\t\"./ta.js\": 885,\n\t\"./te\": 886,\n\t\"./te.js\": 886,\n\t\"./tet\": 887,\n\t\"./tet.js\": 887,\n\t\"./tg\": 888,\n\t\"./tg.js\": 888,\n\t\"./th\": 889,\n\t\"./th.js\": 889,\n\t\"./tk\": 890,\n\t\"./tk.js\": 890,\n\t\"./tl-ph\": 891,\n\t\"./tl-ph.js\": 891,\n\t\"./tlh\": 892,\n\t\"./tlh.js\": 892,\n\t\"./tr\": 893,\n\t\"./tr.js\": 893,\n\t\"./tzl\": 894,\n\t\"./tzl.js\": 894,\n\t\"./tzm\": 895,\n\t\"./tzm-latn\": 896,\n\t\"./tzm-latn.js\": 896,\n\t\"./tzm.js\": 895,\n\t\"./ug-cn\": 897,\n\t\"./ug-cn.js\": 897,\n\t\"./uk\": 898,\n\t\"./uk.js\": 898,\n\t\"./ur\": 899,\n\t\"./ur.js\": 899,\n\t\"./uz\": 900,\n\t\"./uz-latn\": 901,\n\t\"./uz-latn.js\": 901,\n\t\"./uz.js\": 900,\n\t\"./vi\": 902,\n\t\"./vi.js\": 902,\n\t\"./x-pseudo\": 903,\n\t\"./x-pseudo.js\": 903,\n\t\"./yo\": 904,\n\t\"./yo.js\": 904,\n\t\"./zh-cn\": 905,\n\t\"./zh-cn.js\": 905,\n\t\"./zh-hk\": 906,\n\t\"./zh-hk.js\": 906,\n\t\"./zh-mo\": 907,\n\t\"./zh-mo.js\": 907,\n\t\"./zh-tw\": 908,\n\t\"./zh-tw.js\": 908\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1887;","import {\r\n ACCESS_DENIED,\r\n CONTACT_LOCKED,\r\n CONTACT_NOT_ACTIVATED,\r\n CONTACT_NOT_PASSWORD_SET,\r\n MTAN_INVALID,\r\n UNEXPECTED_ERROR,\r\n USERNAME_INVALID,\r\n INVALID_CREDENTIALS,\r\n UNEXPECTED_ERROR_OR_INVALID_PASSCODE,\r\n} from '../static/requestResults';\r\nimport { ErrorModel } from './ErrorModel';\r\nimport { AUTH_ERROR } from './errorTypes';\r\n\r\nexport const COMMON_AUTH_ERROR = 'CommonAuthenticationError';\r\nexport const COMMON_ERROR = 'CommonError';\r\n\r\nexport const ACCESS_DENIED_MESSAGE = 'error.accessDenied';\r\nexport const USERNAME_INVALID_MESSAGE = 'error.invalidUsername';\r\nexport const INVALID_CREDENTIALS_MESSAGE = 'error.invalidLoginCredentials';\r\nexport const CONTACT_LOCKED_MESSAGE = 'error.yourAccountLocked';\r\nexport const CONTACT_NOT_ACTIVATED_MESSAGE = 'error.accountNotActivated';\r\nexport const CONTACT_NOT_PASSWORD_SET_MESSAGE = 'error.passwordNotSet';\r\nexport const UNEXPECTED_ERROR_MESSAGE = 'error.unexpectedError';\r\nexport const MTAN_INVALID_MESSAGE = 'error.invalidMtan';\r\nexport const UNEXPECTED_ERROR_OR_INVALID_PASSCODE_MESSAGE =\r\n 'error.invalidPasscodeOrUnexpectedError';\r\n\r\nexport default {\r\n [USERNAME_INVALID]: new ErrorModel({\r\n id: 3,\r\n type: COMMON_AUTH_ERROR,\r\n message: USERNAME_INVALID_MESSAGE,\r\n }),\r\n [INVALID_CREDENTIALS]: new ErrorModel({\r\n id: 26,\r\n type: COMMON_AUTH_ERROR,\r\n message: INVALID_CREDENTIALS_MESSAGE,\r\n }),\r\n [CONTACT_NOT_ACTIVATED]: new ErrorModel({\r\n id: 4,\r\n type: COMMON_AUTH_ERROR,\r\n message: CONTACT_NOT_ACTIVATED_MESSAGE,\r\n }),\r\n [CONTACT_LOCKED]: new ErrorModel({\r\n id: 7,\r\n type: COMMON_AUTH_ERROR,\r\n message: CONTACT_LOCKED_MESSAGE,\r\n }),\r\n [CONTACT_NOT_PASSWORD_SET]: new ErrorModel({\r\n id: 11,\r\n type: COMMON_AUTH_ERROR,\r\n message: CONTACT_NOT_PASSWORD_SET_MESSAGE,\r\n }),\r\n [ACCESS_DENIED]: new ErrorModel({\r\n id: 12,\r\n type: COMMON_AUTH_ERROR,\r\n message: ACCESS_DENIED_MESSAGE,\r\n }),\r\n [UNEXPECTED_ERROR]: new ErrorModel({\r\n id: 15,\r\n type: COMMON_ERROR,\r\n message: UNEXPECTED_ERROR_MESSAGE,\r\n }),\r\n [UNEXPECTED_ERROR_OR_INVALID_PASSCODE]: new ErrorModel({\r\n id: 27, // LAST error id\r\n type: COMMON_ERROR,\r\n message: UNEXPECTED_ERROR_OR_INVALID_PASSCODE_MESSAGE,\r\n }),\r\n [MTAN_INVALID]: new ErrorModel({\r\n id: 25,\r\n type: AUTH_ERROR,\r\n message: MTAN_INVALID_MESSAGE,\r\n }),\r\n};\r\n","import { createSelector } from 'reselect/lib/index';\r\nimport { get } from 'lodash/fp';\r\n\r\nexport const themeSelector = (state) => state.theme;\r\nexport const getThemeSelector = createSelector(themeSelector, (theme) => get('theme', theme));\r\n","import darkCustomVariables from 'clientRequirements/styles/dark/variables-export.css';\r\nimport modernCustomVariables from 'clientRequirements/styles/modern/variables-export.css';\r\n\r\nexport const variables = {\r\n dark: darkCustomVariables,\r\n light: modernCustomVariables,\r\n};\r\n\r\nexport const setThemeVariables = (theme) => {\r\n const vars = variables[theme];\r\n\r\n Object.keys(vars).forEach((key) => {\r\n document.documentElement.style.setProperty(key, vars[key]);\r\n });\r\n};\r\n","import { useSelector } from 'react-redux';\r\nimport React, { useEffect } from 'react';\r\nimport { getThemeSelector } from '../redux/theme/themeSelectors';\r\nimport { setThemeVariables } from '../utils/configureTheme';\r\n\r\nconst withTheme = (Component) => (props) => {\r\n const theme = useSelector(getThemeSelector);\r\n\r\n useEffect(() => {\r\n document.documentElement.setAttribute('data-theme', theme);\r\n setThemeVariables(theme);\r\n }, []);\r\n\r\n return ;\r\n};\r\n\r\nexport default withTheme;\r\n","import React from 'react';\r\nimport { Loader } from 'ui-library';\r\n\r\nexport const Loading = () => ;\r\n","import PropTypes from 'prop-types';\r\nimport React, { useEffect } from 'react';\r\nimport { Redirect } from 'react-router-dom';\r\nimport { connect } from 'react-redux';\r\nimport history from 'services/core/history';\r\n\r\nimport { checkSession as checkSessionAction } from '../redux/auth/authActions';\r\nimport { isAuthenticatedSelector } from '../redux/auth/authSelectors';\r\nimport {\r\n isCurrentSessionCheckedSelector,\r\n isSessionValidSelector,\r\n} from '../redux/session/sessionSelectors';\r\nimport { withAutoLogout } from './withAutoLogout';\r\nimport { Loading } from '../components/Loading';\r\n\r\nexport const withAuthentication = (WrappedComponent) => {\r\n function Authentication(props) {\r\n const { checkSession, isCurrentSessionChecked, isAuthenticated, isSessionValid } = props;\r\n\r\n useEffect(() => {\r\n if (isCurrentSessionChecked !== true) {\r\n checkSession();\r\n }\r\n }, []);\r\n\r\n if (\r\n isAuthenticated === true &&\r\n isCurrentSessionChecked === true &&\r\n isSessionValid === true\r\n ) {\r\n return ;\r\n }\r\n\r\n if (isCurrentSessionChecked === true && isSessionValid === false) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return ;\r\n }\r\n\r\n Authentication.propTypes = {\r\n isAuthenticated: PropTypes.bool.isRequired,\r\n isSessionValid: PropTypes.bool.isRequired,\r\n isCurrentSessionChecked: PropTypes.bool.isRequired,\r\n checkSession: PropTypes.func.isRequired,\r\n };\r\n\r\n const mapStateToProps = (state) => ({\r\n isAuthenticated: isAuthenticatedSelector(state),\r\n isCurrentSessionChecked: isCurrentSessionCheckedSelector(state),\r\n isSessionValid: isSessionValidSelector(state),\r\n });\r\n\r\n const mapDispatchToProps = {\r\n checkSession: checkSessionAction,\r\n };\r\n\r\n return connect(mapStateToProps, mapDispatchToProps)(withAutoLogout(Authentication));\r\n};\r\n","const setHTMLDocumentTitle = (newTitle) => {\r\n document.title = `${newTitle} - NS Connect`;\r\n};\r\n\r\nexport default setHTMLDocumentTitle;\r\n","import RouteWithAppTitle from './RouteWithAppTitle';\r\n\r\nexport default RouteWithAppTitle;\r\n","import React from 'react';\r\nimport { Route } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport setHTMLDocumentTitle from 'utils/setHTMLDocumentTitle';\r\n\r\nconst RouteWithAppTitle = (props) => {\r\n const { title } = props;\r\n\r\n if (title) setHTMLDocumentTitle(title);\r\n\r\n return ;\r\n};\r\n\r\nRouteWithAppTitle.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default RouteWithAppTitle;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const PageNotFound = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n
\r\n

{t('common.PAGE_NOT_FOUND')}

\r\n
\r\n
\r\n );\r\n};\r\n","import { renderers } from 'ui-library';\r\nimport { CellLink, CellPercent, CellWithMoreActions, CellAdaptedDate } from 'components/renderers';\r\nimport { sorterString, sorterByDate, sorterNumber } from 'utils/sorting';\r\nimport history from 'services/core/history';\r\nimport CellPDFView from 'components/renderers/CellPDFView';\r\n\r\nconst {\r\n CellWithIcon,\r\n CellWithSubtext,\r\n CellWithLinkIcon,\r\n CellWithHyperlinkIcon,\r\n CellWithButtonIcon,\r\n} = renderers;\r\n\r\nexport const CURRENT_PAGE = 1;\r\nexport const PAGE_SIZE = 8;\r\nexport const TOTAL_PAGES = 10;\r\n\r\nexport const SORT_DIRECTION_ASC = 'asc';\r\nexport const SORT_DIRECTION_DESC = 'desc';\r\n\r\nexport const PIE = 'pie';\r\nexport const PIE_SA = 'pieSa';\r\nexport const BAR = 'bar';\r\nexport const LIST = 'list';\r\nexport const LINE = 'line';\r\nexport const PROJECTION = 'projection';\r\n\r\nexport const MOBILE_VIEWPORT_MIN_WIDTH = 540;\r\nexport const NOTZ_STUCKI_MAIN_SITE = '//nspgroup.com ';\r\n\r\nexport const LINKEDIN_URL = 'https://www.linkedin.com/company/notz-stucki-group';\r\n\r\nexport const allocationColumns = (t) => [\r\n {\r\n key: 'name',\r\n title: t('Allocation.columns.name'),\r\n sortable: true,\r\n sorter: sorterString('name'),\r\n defaultSortOrder: 'descend',\r\n },\r\n {\r\n key: 'value',\r\n title: t('Allocation.columns.value'),\r\n width: 200,\r\n sortable: true,\r\n className: 'text-right',\r\n sorter: sorterNumber('value'),\r\n },\r\n {\r\n key: 'percent',\r\n title: t('Allocation.columns.allocation'),\r\n width: 150,\r\n sortable: true,\r\n className: 'text-right',\r\n sorter: sorterNumber('percent'),\r\n },\r\n];\r\n\r\nexport const profileColumns = [\r\n {\r\n key: 'Information',\r\n render: CellWithSubtext,\r\n },\r\n {\r\n key: 'Icon',\r\n className: 'text-right',\r\n render: CellWithLinkIcon,\r\n },\r\n];\r\n\r\nexport const LIQUIDITY_TYPE_ID = 1;\r\n\r\nexport const INSTRUMENT_DOCUMENTS_ID = 'InstrumentDocument';\r\n\r\nexport const portfoliosColumns = (t, getFormattedNumber) => [\r\n {\r\n key: 'Name',\r\n title: t('portfolios.columns.name'),\r\n sortable: true,\r\n sorter: sorterString('Name.label'),\r\n render: CellLink,\r\n defaultSortOrder: 'descend',\r\n },\r\n {\r\n key: 'Product',\r\n title: t('portfolios.columns.contractType'),\r\n sorter: sorterString('Product'),\r\n },\r\n {\r\n key: 'Profile',\r\n title: t('portfolios.columns.investmentProfile'),\r\n sorter: sorterString('Profile'),\r\n },\r\n {\r\n key: 'Value',\r\n title: t('portfolios.columns.value'),\r\n className: 'text-right',\r\n render: CellWithSubtext,\r\n },\r\n {\r\n key: 'Performance',\r\n title: t('portfolios.columns.performanceSI'),\r\n className: 'text-right',\r\n width: 160,\r\n sortable: true,\r\n render: CellPercent(getFormattedNumber),\r\n sorter: sorterNumber('Performance'),\r\n },\r\n {\r\n key: 'PerformanceYTD',\r\n title: t('portfolios.columns.performanceYTD'),\r\n className: 'text-right',\r\n width: 160,\r\n sortable: true,\r\n render: CellPercent(getFormattedNumber),\r\n sorter: sorterNumber('PerformanceYTD'),\r\n },\r\n {\r\n key: 'gainYTD',\r\n title: t('portfolios.columns.gainYTD'),\r\n className: 'text-right',\r\n width: 160,\r\n sortable: true,\r\n sorter: sorterNumber('gainYTD'),\r\n },\r\n {\r\n key: 'inceptionDate',\r\n title: t('portfolios.columns.inceptionDate'),\r\n className: 'text-right',\r\n width: 160,\r\n sortable: true,\r\n sorter: sorterNumber('inceptionDate'),\r\n },\r\n {\r\n key: 'currency',\r\n title: t('portfolios.columns.referenceCurrency'),\r\n className: 'text-right',\r\n width: 160,\r\n sortable: true,\r\n sorter: sorterNumber('currency'),\r\n },\r\n {\r\n title: '',\r\n className: 'text-right table-cell__actions',\r\n key: 'Actions',\r\n render: CellWithMoreActions,\r\n width: 30,\r\n minWidth: 30,\r\n titleType: 'columns',\r\n fixed: 'right',\r\n headerRenderer: CellWithIcon,\r\n },\r\n];\r\n\r\nexport const portfoliosMobileColumns = (t, getFormattedNumber) => [\r\n {\r\n key: 'Name',\r\n title: t('portfolios.columns.name'),\r\n sortable: true,\r\n sorter: sorterString('Name.label'),\r\n render: CellLink,\r\n defaultSortOrder: 'descend',\r\n },\r\n {\r\n key: 'Value',\r\n title: t('portfolios.columns.value'),\r\n className: 'text-right',\r\n render: CellWithSubtext,\r\n },\r\n {\r\n key: 'Performance',\r\n title: t('portfolios.columns.performanceSI'),\r\n className: 'text-right',\r\n width: 160,\r\n sortable: true,\r\n render: CellPercent(getFormattedNumber),\r\n sorter: sorterNumber('Performance'),\r\n },\r\n];\r\n\r\nexport const portfolioActions = (id, productName, t) => [\r\n {\r\n text: `${t('portfolios.openPortfolio')}`,\r\n onClick: () => {\r\n history.push(`/portfolios/${id}`);\r\n },\r\n },\r\n];\r\n\r\nexport const lineChartLabels = (t) => ({\r\n months: t('months').split('_'),\r\n shortMonths: t('shortMonths').split('_'),\r\n});\r\n\r\n// TODO: unused code below, delete after approval\r\nexport const relationshipManagerColumns = [\r\n {\r\n key: 'Information',\r\n render: CellWithSubtext,\r\n width: 'calc(100% - 40px)',\r\n },\r\n {\r\n key: 'Icon',\r\n width: 40,\r\n className: 'text-right',\r\n render: CellWithHyperlinkIcon,\r\n },\r\n];\r\n\r\nexport const documentsColumns = (t) => [\r\n {\r\n key: 'Icon',\r\n render: CellWithButtonIcon,\r\n width: 20,\r\n },\r\n {\r\n key: 'Document',\r\n sortable: true,\r\n sorter: sorterString('Name.value'),\r\n width: 185,\r\n render: CellPDFView,\r\n },\r\n {\r\n key: 'Date',\r\n sortable: true,\r\n sorter: sorterByDate('Date'),\r\n width: 103,\r\n className: 'text-right table-cell__date',\r\n render: CellAdaptedDate(t),\r\n },\r\n];\r\n\r\nexport const documentsSorting = { key: 'Date', direction: 'asc' };\r\n\r\nexport const invPrfLineChartValueFormat = {\r\n symbol: '%',\r\n precision: 0,\r\n thousand: ',',\r\n decimal: '.',\r\n format: '%v%s',\r\n};\r\n\r\nexport const invPrfSelectOptions = ['YTD', 'Last 12 months', '2 Years', '5 Years', 'Max'];\r\n\r\nexport const overviewSelectOptions = ['Month', 'Year'];\r\n\r\nexport const datePickerLocale = (t) => ({\r\n lang: {\r\n placeholder: 'Select date',\r\n rangePlaceholder: ['Start date', 'End date'],\r\n today: t('calendar.today'),\r\n now: t('calendar.now'),\r\n backToToday: t('calendar.backToToday'),\r\n ok: t('calendar.ok'),\r\n clear: t('calendar.clear'),\r\n month: t('calendar.month'),\r\n year: t('calendar.year'),\r\n timeSelect: t('calendar.selectTime'),\r\n dateSelect: t('calendar.selectDate'),\r\n monthSelect: t('calendar.chooseMonth'),\r\n yearSelect: t('calendar.chooseYear'),\r\n decadeSelect: t('calendar.chooseDecade'),\r\n yearFormat: 'YYYY',\r\n dateFormat: 'M/D/YYYY',\r\n dayFormat: 'D',\r\n dateTimeFormat: 'M/D/YYYY HH:mm:ss',\r\n monthFormat: 'MMMM',\r\n monthBeforeYear: true,\r\n previousMonth: t('calendar.prevMonth'),\r\n // 'Previous month (PageUp)',\r\n nextMonth: t('calendar.nextMonth'),\r\n // 'Next month (PageDown)',\r\n previousYear: t('calendar.lastYear'),\r\n // 'Last year (Control + left)',\r\n nextYear: t('calendar.nextYear'),\r\n // 'Next year (Control + right)',\r\n previousDecade: t('calendar.lastDecade'),\r\n // 'Last decade',\r\n nextDecade: t('calendar.nextDecade'),\r\n // 'Next decade',\r\n previousCentury: t('calendar.lastCentury'),\r\n // 'Last century',\r\n nextCentury: t('calendar.nextCentury'),\r\n // 'Next century',\r\n },\r\n timePickerLocale: {\r\n placeholder: t('calendar.selectTime'),\r\n // 'Select time',\r\n },\r\n dateFormat: 'YYYY-MM-DD',\r\n dateTimeFormat: 'YYYY-MM-DD HH:mm:ss',\r\n weekFormat: 'YYYY-wo',\r\n monthFormat: 'YYYY-MM',\r\n});\r\n","import {\r\n LocaleService,\r\n getLocaleFromCookie,\r\n getLocaleFromNavigator,\r\n} from 'additiv-intl-formatting';\r\n\r\nconst locales = {\r\n cookie: {\r\n priority: 2,\r\n locale: getLocaleFromCookie('locale'),\r\n },\r\n navigation: {\r\n priority: 3,\r\n locale: getLocaleFromNavigator(),\r\n },\r\n};\r\n\r\nconst localeService = new LocaleService(locales);\r\n\r\nexport default localeService;\r\n","export const dateTimeFormats = {\r\n TWO_DIGIT: '2-digit',\r\n NUMERIC: 'numeric',\r\n};\r\n","import { getDateFormat } from 'additiv-intl-formatting';\r\nimport { dateTimeFormats } from './formatTypes';\r\n\r\nexport function getUTCDate(date) {\r\n const d = new Date(date);\r\n\r\n return new Date(\r\n Date.UTC(\r\n d.getFullYear(),\r\n d.getMonth(),\r\n d.getDate(),\r\n d.getHours(),\r\n d.getMinutes(),\r\n d.getSeconds()\r\n )\r\n );\r\n}\r\n\r\nexport function getNumberSeparators(locale) {\r\n const formattedNum = new Intl.NumberFormat(locale).format(1111.11);\r\n\r\n const [thousandSeparator, decimalSeparator] = [formattedNum[1], formattedNum[5]];\r\n\r\n return {\r\n thousandSeparator,\r\n decimalSeparator,\r\n };\r\n}\r\n\r\nexport function getDateTimeSeparators(locale) {\r\n const formattedDate = new Intl.DateTimeFormat(locale).format(new Date());\r\n const formattedTime = getDateFormat({\r\n locale,\r\n date: getUTCDate(new Date()),\r\n options: {\r\n hour: dateTimeFormats.NUMERIC,\r\n minute: dateTimeFormats.NUMERIC,\r\n },\r\n });\r\n\r\n const [dateSeparator] = formattedDate.match(/[^\\w\\s]/g);\r\n const [timeSeparator] = formattedTime.match(/[^\\w\\s]/g);\r\n\r\n return {\r\n dateSeparator,\r\n timeSeparator,\r\n };\r\n}\r\n","import React, { createContext, useState, useEffect, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { getLocaleFromNavigator } from 'additiv-intl-formatting';\r\n\r\nimport localeService from './LocaleService';\r\nimport { getNumberSeparators } from './utils';\r\n\r\nconst LocaleContext = createContext({});\r\n\r\nconst { Provider, Consumer: LocaleConsumer } = LocaleContext;\r\n\r\nconst LocaleProvider = ({ children }) => {\r\n const [locale, setLocale] = useState(localeService.localization);\r\n\r\n const onLangChange = () => {\r\n localeService.add('navigation', { priority: 3, locale: getLocaleFromNavigator() });\r\n };\r\n\r\n useEffect(() => {\r\n const subscription = localeService.subscribe(setLocale);\r\n\r\n // eslint-disable-next-line no-undef\r\n window.addEventListener('languagechange', onLangChange);\r\n\r\n return () => {\r\n // eslint-disable-next-line no-undef\r\n window.removeEventListener('languagechange', onLangChange);\r\n subscription.unsubscribe();\r\n };\r\n }, []);\r\n\r\n const numberSeparators = useMemo(() => getNumberSeparators(locale.locale), [locale]);\r\n\r\n const value = {\r\n ...locale,\r\n numberSeparators,\r\n };\r\n\r\n return {children};\r\n};\r\n\r\nLocaleProvider.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nLocaleProvider.defaultProps = {\r\n children: null,\r\n};\r\n\r\nexport { LocaleProvider, LocaleConsumer, LocaleContext };\r\n","import { useContext } from 'react';\r\n\r\nimport { LocaleContext } from './LocaleContext';\r\n\r\nexport default () => {\r\n const context = useContext(LocaleContext);\r\n\r\n if (context === undefined) throw new Error('useLocale must be used within a LocaleProvider');\r\n\r\n return context;\r\n};\r\n","import { useCallback, useMemo } from 'react';\r\n// import { getDateFormat, getNumberFormat } from 'additiv-intl-formatting';\r\nimport { getDateFormat } from 'additiv-intl-formatting';\r\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\r\nimport { formatNumberValue } from 'utils/formatting';\r\n\r\nimport { getDateTimeSeparators, getUTCDate } from './utils';\r\nimport { dateTimeFormats } from './formatTypes';\r\nimport useLocale from './useLocale';\r\n\r\nexport default () => {\r\n const { locale } = useLocale();\r\n\r\n const getFormattedDate = useCallback(\r\n (date, options = {}) => {\r\n if (!Date.parse(date)) return date;\r\n\r\n return getDateFormat({\r\n locale,\r\n date: getUTCDate(date),\r\n options: {\r\n // timeZone: 'UTC',\r\n year: dateTimeFormats.NUMERIC,\r\n month: dateTimeFormats.NUMERIC,\r\n day: dateTimeFormats.NUMERIC,\r\n ...options,\r\n },\r\n });\r\n },\r\n [locale]\r\n );\r\n\r\n // hook for case when only HH:mm:ss should be displayed\r\n const getFormattedTime = useCallback(\r\n (date, options = {}) => {\r\n if (!Date.parse(date)) return date;\r\n\r\n return getDateFormat({\r\n locale,\r\n date: getUTCDate(date),\r\n options: {\r\n hour: dateTimeFormats.NUMERIC,\r\n minute: dateTimeFormats.NUMERIC,\r\n ...options,\r\n },\r\n });\r\n },\r\n [locale]\r\n );\r\n\r\n // override original getFormattedNumber and getFormattedCurrency functions due to\r\n // client's request to format numbers ignoring locales\r\n const getFormattedNumber = (number = 0, options = {}) =>\r\n typeof number === 'number'\r\n ? formatNumberValue(number, options?.maximumFractionDigits)\r\n : number;\r\n\r\n const getFormattedCurrency = (number = 0, options = {}) => {\r\n const { currency } = options;\r\n\r\n const formatted = typeof number === 'number' ? formatNumberValue(number, 0) : number;\r\n\r\n return currency ? `${currency} ${formatted}` : formatted;\r\n };\r\n\r\n // const getFormattedNumber = useCallback(\r\n // (number = 0, options = {}) => {\r\n // const formatted =\r\n // typeof number === 'number'\r\n // ? getNumberFormat({\r\n // // locale,\r\n // number,\r\n // options: {\r\n // maximumFractionDigits: 2,\r\n // minimumFractionDigits: 2,\r\n // ...options,\r\n // },\r\n // })\r\n // : number;\r\n //\r\n // return formatted;\r\n // },\r\n // [locale]\r\n // );\r\n //\r\n // const getFormattedCurrency = useCallback(\r\n // (value, options = {}) => {\r\n // const { currency, ...rest } = options;\r\n //\r\n // const formatted = getNumberFormat({\r\n // locale,\r\n // number: value,\r\n // options: {\r\n // maximumFractionDigits: 0,\r\n // minimumFractionDigits: 0,\r\n // ...rest,\r\n // },\r\n // });\r\n //\r\n // return currency ? `${currency} ${formatted}` : formatted;\r\n // },\r\n // [locale]\r\n // );\r\n\r\n const getFormattedPhoneNumber = useCallback(\r\n (phone) => {\r\n // eslint-disable-next-line prefer-template\r\n const parsed = parsePhoneNumberFromString('+' + String(phone).replace(/\\D/g, ''));\r\n\r\n return parsed.formatInternational();\r\n },\r\n [locale]\r\n );\r\n\r\n const getFormattedXAxisFormat = useMemo(() => {\r\n const { dateSeparator, timeSeparator } = getDateTimeSeparators(locale.locale);\r\n\r\n return {\r\n millisecond: `%H${timeSeparator}%M${timeSeparator}%S.%L`,\r\n second: `%H${timeSeparator}%M${timeSeparator}%S`,\r\n minute: `%H${timeSeparator}%M`,\r\n hour: `%H${timeSeparator}%M`,\r\n day: `%d${dateSeparator}%m`,\r\n week: `%d${dateSeparator}%m`,\r\n month: '%b %y',\r\n year: '%Y',\r\n };\r\n }, [locale]);\r\n\r\n return {\r\n getFormattedCurrency,\r\n getFormattedDate,\r\n getFormattedTime,\r\n getFormattedNumber,\r\n getFormattedXAxisFormat,\r\n getFormattedPhoneNumber,\r\n };\r\n};\r\n","import React, { memo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport isEqual from 'lodash/isEqual';\r\nimport {\r\n BarChart,\r\n Table,\r\n LineChart,\r\n // RiskReturnChart,\r\n // BandwidthChart,\r\n // ProjectionChart,\r\n} from 'ui-library';\r\nimport PieChart, { PieChartSA } from 'ui-library/dist/components/Charts/PieChart';\r\nimport {\r\n PIE,\r\n PIE_SA,\r\n BAR,\r\n LIST,\r\n LINE,\r\n // RISKRETURN,\r\n // BANDWIDTH,\r\n // PROJECTION,\r\n allocationColumns,\r\n lineChartLabels,\r\n} from 'constants/constants';\r\nimport { useFormatting } from 'locale';\r\n// import { useDetectedMobileDevice } from '../../hooks/useDetectedMobileDevice';\r\n// import { RISKRETURN_HEIGHT, RISKRETURN_MOBILE_HEIGHT } from '../../constants/constants';\r\n\r\nconst isPropsEqual = (\r\n { data: prevPropsData, chartView: prevChartView },\r\n { data: nextPropsData, chartView: nextChartView }\r\n) => {\r\n const isEqualData = isEqual(prevPropsData, nextPropsData);\r\n const isEqualChartView = prevChartView === nextChartView;\r\n\r\n return isEqualData && isEqualChartView;\r\n};\r\n\r\nfunction ChartType({ chartView, title, currency, t, ...props }) {\r\n const { getFormattedXAxisFormat } = useFormatting();\r\n\r\n // const { isMobileSize } = useDetectedMobileDevice();\r\n\r\n if (chartView === PIE_SA) return ;\r\n if (chartView === PIE) return ;\r\n if (chartView === BAR) return ;\r\n if (chartView === LINE)\r\n return (\r\n \r\n );\r\n if (chartView === LIST) {\r\n return ;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nconst MemoizedChartType = memo(ChartType, isPropsEqual);\r\n\r\nChartType.propTypes = {\r\n title: PropTypes.string,\r\n currency: PropTypes.string,\r\n chartView: PropTypes.string.isRequired,\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nChartType.defaultProps = {\r\n title: '',\r\n currency: null,\r\n};\r\n\r\nexport default MemoizedChartType;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Column, Row } from 'ui-library';\r\n\r\nfunction PageSection({ children, className }) {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n}\r\n\r\nPageSection.propTypes = {\r\n children: PropTypes.node,\r\n className: PropTypes.string,\r\n};\r\n\r\nPageSection.defaultProps = {\r\n children: null,\r\n className: null,\r\n};\r\n\r\nexport default PageSection;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Infobox } from 'ui-library';\r\n\r\nconst WidgetError = ({ message, ...props }) => (\r\n \r\n
{message}
\r\n
\r\n);\r\n\r\nWidgetError.propTypes = {\r\n message: PropTypes.string,\r\n};\r\n\r\nWidgetError.defaultProps = {\r\n message: '',\r\n};\r\n\r\nexport default WidgetError;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Loader } from 'ui-library';\r\nimport WidgetError from './WidgetError';\r\n\r\nexport const Preloader = ({ isLoading, error, children }) => {\r\n if (isLoading) return ;\r\n\r\n if (error !== null) {\r\n return ;\r\n }\r\n\r\n return children;\r\n};\r\n\r\nPreloader.propTypes = {\r\n isLoading: PropTypes.bool.isRequired,\r\n children: PropTypes.oneOfType([PropTypes.element, PropTypes.arrayOf(PropTypes.element)])\r\n .isRequired,\r\n error: PropTypes.shape({\r\n type: PropTypes.string,\r\n message: PropTypes.string,\r\n }),\r\n};\r\n\r\nPreloader.defaultProps = {\r\n error: null,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button } from 'ui-library';\r\n\r\nexport const EmptyContent = ({ data, text, buttonText, onClick, children }) => {\r\n if (data === null || (data && data.length === 0)) {\r\n return [\r\n text &&

{text}

,\r\n buttonText && (\r\n
\r\n \r\n
\r\n ),\r\n ];\r\n }\r\n\r\n return children;\r\n};\r\n\r\nEmptyContent.propTypes = {\r\n data: PropTypes.arrayOf(PropTypes.any),\r\n text: PropTypes.text,\r\n onClick: PropTypes.func,\r\n buttonText: PropTypes.text,\r\n};\r\n\r\nEmptyContent.defaultProps = {\r\n data: null,\r\n text: null,\r\n onClick: () => {},\r\n buttonText: null,\r\n};\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { TabPane, Tabs, Title, ContentBox, TabsExtraItem } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { PIE, BAR, LIST } from 'constants/constants';\r\nimport { useFormatting } from 'locale';\r\nimport ChartType from './ChartType';\r\nimport PageSection from '../PageSection/PageSection';\r\nimport { Preloader } from '../molecules/Preloader';\r\nimport { EmptyContent } from '../molecules/EmptyContent';\r\n\r\nfunction InvestmentAllocation({ data, isLoading, error }) {\r\n const { t } = useTranslation();\r\n const { getFormattedCurrency } = useFormatting();\r\n const [chartView, setChartView] = useState(PIE);\r\n const changeView = (type) => () => setChartView(type);\r\n const numberFormat = (number) =>\r\n getFormattedCurrency(number, {\r\n currency: data.currency,\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n });\r\n const labelFormat = (label, value) =>\r\n `${numberFormat(value)}`;\r\n const tabBarExtraContent = () => (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n {t('dashboard.investmentAllocation.title')}\r\n \r\n \r\n \r\n {data.chart.map((item, i) => (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n ))}\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nInvestmentAllocation.propTypes = {\r\n data: PropTypes.shape({\r\n chart: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string,\r\n data: PropTypes.shape({\r\n [PropTypes.string]: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string,\r\n value: PropTypes.number,\r\n })\r\n ),\r\n }),\r\n })\r\n ),\r\n currency: PropTypes.string,\r\n }),\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n};\r\n\r\nInvestmentAllocation.defaultProps = {\r\n data: { chart: [] },\r\n isLoading: true,\r\n error: null,\r\n};\r\n\r\nexport default InvestmentAllocation;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { EXTERNAL_ORIGIN } from 'pages/pages/News/constants/constants';\r\n\r\nexport const LinkNews = (props) => {\r\n const { link, id, children, origin } = props;\r\n\r\n if (link) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nLinkNews.propTypes = {\r\n id: PropTypes.number,\r\n link: PropTypes.string,\r\n origin: PropTypes.string,\r\n children: PropTypes.node,\r\n};\r\n\r\nLinkNews.defaultProps = {\r\n id: null,\r\n link: null,\r\n children: null,\r\n origin: '',\r\n};\r\n","export const EXTERNAL_ORIGIN = 'external';\r\nexport const INTERNAL_ORIGIN = 'internal';\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Title, Paragraph, ContentBox } from 'ui-library';\r\nimport { getAdaptedDate } from 'utils/formatting';\r\nimport { useFormatting } from 'locale';\r\nimport { LinkNews } from './LinkNews';\r\nimport './NewsItem.css';\r\n\r\nconst NewsItem = (props) => {\r\n const { id, image, title, date, content, link } = props;\r\n const { t } = useTranslation();\r\n const { getFormattedDate } = useFormatting();\r\n\r\n const formattedDate = getFormattedDate(getAdaptedDate(date, t));\r\n\r\n return (\r\n \r\n \r\n {image && (\r\n
\r\n \"news-img\"\r\n
\r\n )}\r\n
\r\n
\r\n {title}\r\n {formattedDate}\r\n
\r\n
\r\n

{content}

\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nNewsItem.propTypes = {\r\n id: PropTypes.number,\r\n image: PropTypes.string,\r\n title: PropTypes.string,\r\n date: PropTypes.string,\r\n content: PropTypes.string,\r\n link: PropTypes.string,\r\n};\r\n\r\nNewsItem.defaultProps = {\r\n id: null,\r\n image: null,\r\n title: null,\r\n date: null,\r\n content: null,\r\n link: null,\r\n};\r\n\r\nexport default NewsItem;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Title } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport NewsItem from './NewsItem';\r\nimport './News.css';\r\n\r\nfunction News({ data, isLoading, error, withLink }) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n
\r\n {withLink ? (\r\n \r\n {t('news.title')}\r\n \r\n ) : (\r\n {t('news.title')}\r\n )}\r\n \r\n
\r\n {data.map((item) => (\r\n \r\n ))}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nNews.propTypes = {\r\n data: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n image: PropTypes.string,\r\n title: PropTypes.string,\r\n date: PropTypes.string,\r\n content: PropTypes.string,\r\n link: PropTypes.string,\r\n })\r\n ),\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n withLink: PropTypes.bool,\r\n};\r\n\r\nNews.defaultProps = {\r\n data: [],\r\n isLoading: true,\r\n error: null,\r\n withLink: false,\r\n};\r\n\r\nexport default News;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { DatePicker } from 'antd';\r\nimport { getFirstDayOfMonth } from 'utils/datetime';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst MonthRangePicker = ({ monthFrom, monthTo, format }) => {\r\n const { t } = useTranslation();\r\n const { MonthPicker } = DatePicker;\r\n const { startDate, setStartDate } = monthFrom;\r\n const { endDate, setEndDate } = monthTo;\r\n\r\n function disabledDate(current) {\r\n return current && getFirstDayOfMonth(current) <= getFirstDayOfMonth(startDate);\r\n }\r\n\r\n const setStartDateWithValidation = (date) => {\r\n if (getFirstDayOfMonth(date) >= getFirstDayOfMonth(endDate)) {\r\n setEndDate(null);\r\n setStartDate(date);\r\n } else {\r\n setStartDate(date);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n setStartDateWithValidation(date)}\r\n placeholder={t(monthFrom.placeholder)}\r\n />\r\n setEndDate(date)}\r\n placeholder={t(monthTo.placeholder)}\r\n disabledDate={disabledDate}\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default MonthRangePicker;\r\n\r\nMonthRangePicker.propTypes = {\r\n monthFrom: PropTypes.shape({\r\n className: PropTypes.string,\r\n placeholder: PropTypes.string,\r\n startDate: PropTypes.shape({}),\r\n setStartDate: PropTypes.func,\r\n }),\r\n monthTo: PropTypes.shape({\r\n className: PropTypes.string,\r\n placeholder: PropTypes.string,\r\n endDate: PropTypes.shape({}),\r\n setEndDate: PropTypes.func,\r\n }),\r\n format: PropTypes.string,\r\n};\r\nMonthRangePicker.defaultProps = {\r\n monthFrom: {\r\n className: '',\r\n placeholder: 'from',\r\n },\r\n monthTo: {\r\n className: '',\r\n placeholder: 'to',\r\n },\r\n format: 'MMM-YY',\r\n};\r\n","import React, { Fragment, useEffect, useState } from 'react';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { useTranslation } from 'react-i18next';\r\nimport PropTypes from 'prop-types';\r\nimport { LineChart, Select, TabPane, Tabs, TabsExtraItem, Title, ContentBox } from 'ui-library';\r\nimport MonthRangePicker from 'components/MonthRangePicker';\r\nimport { useFormatting } from 'locale';\r\nimport { lineChartLabels } from 'constants/constants';\r\nimport { getPerformanceSelectOptions, MONTH_TO_MONTH } from 'filters/investementPerformanceFilters';\r\nimport PageSection from '../PageSection/PageSection';\r\nimport { EmptyContent } from '../molecules/EmptyContent';\r\n\r\nfunction AssetDevelopment({\r\n data,\r\n isLoading,\r\n error,\r\n onFilterChange,\r\n currentFilter,\r\n title,\r\n chartValueFormat,\r\n yAxisFormat,\r\n currency,\r\n setFilterDates,\r\n}) {\r\n const [startDate, setStartDate] = useState(null);\r\n const [endDate, setEndDate] = useState(null);\r\n const { t } = useTranslation();\r\n const { getFormattedXAxisFormat } = useFormatting();\r\n\r\n useEffect(() => {\r\n if (startDate && endDate) {\r\n setFilterDates({ startDate, endDate });\r\n }\r\n }, [startDate, endDate]);\r\n\r\n useEffect(() => {\r\n if (currentFilter !== MONTH_TO_MONTH) {\r\n setStartDate(null);\r\n setEndDate(null);\r\n }\r\n }, [currentFilter]);\r\n\r\n const monthFrom = {\r\n startDate,\r\n setStartDate,\r\n placeholder: 'dashboard.assetDevelopment.filters.from',\r\n };\r\n const monthTo = {\r\n endDate,\r\n setEndDate,\r\n placeholder: 'dashboard.assetDevelopment.filters.to',\r\n };\r\n\r\n const renderTabs = () => (\r\n \r\n {currentFilter === MONTH_TO_MONTH && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n >\r\n \r\n {/* eslint-disable-next-line react/prop-types */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n {title}\r\n \r\n {renderTabs()}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nAssetDevelopment.propTypes = {\r\n data: PropTypes.shape({\r\n performance: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n date: PropTypes.arrayOf([PropTypes.number, PropTypes.number]),\r\n tooltipFormat: PropTypes.func,\r\n })\r\n ),\r\n assets: PropTypes.arrayOf({\r\n date: PropTypes.arrayOf([PropTypes.number, PropTypes.number]),\r\n tooltipFormat: PropTypes.func,\r\n }),\r\n }),\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n onFilterChange: PropTypes.func.isRequired,\r\n currentFilter: PropTypes.string.isRequired,\r\n title: PropTypes.string.isRequired,\r\n yAxisFormat: PropTypes.shape({\r\n performance: PropTypes.func,\r\n assets: PropTypes.func,\r\n }).isRequired,\r\n chartValueFormat: PropTypes.shape({\r\n performance: PropTypes.shape({\r\n symbol: PropTypes.string,\r\n precision: PropTypes.number,\r\n thousand: PropTypes.string,\r\n decimal: PropTypes.string,\r\n format: PropTypes.string,\r\n }),\r\n assets: PropTypes.shape({\r\n symbol: PropTypes.string,\r\n precision: PropTypes.number,\r\n thousand: PropTypes.string,\r\n decimal: PropTypes.string,\r\n format: PropTypes.string,\r\n }),\r\n }).isRequired,\r\n currency: PropTypes.string.isRequired,\r\n setFilterDates: PropTypes.func,\r\n};\r\n\r\nAssetDevelopment.defaultProps = {\r\n data: undefined,\r\n isLoading: true,\r\n error: null,\r\n setFilterDates: () => {},\r\n};\r\n\r\nexport default AssetDevelopment;\r\n","class Error {\r\n constructor({ type, message, ...additionalData }) {\r\n this.type = type || 'SERVER_ERROR';\r\n this.message = message;\r\n this.additionalData = additionalData;\r\n }\r\n\r\n get getError() {\r\n return {\r\n type: this.type,\r\n message: this.message,\r\n additionalData: this.additionalData,\r\n };\r\n }\r\n}\r\n\r\nexport default Error;\r\n","import Error from '../models/Error';\r\n\r\nconst AdapterError = (err) =>\r\n new Error({\r\n type: 'ADAPTER_ERROR',\r\n message: 'Unexpected error',\r\n ...err,\r\n });\r\n\r\nexport default AdapterError;\r\n","import Error from '../models/Error';\r\n\r\nconst ServerError = (err) =>\r\n new Error({\r\n type: 'SERVER_ERROR',\r\n message: `Server error ${err.message ? `: ${err.message}` : ''}`,\r\n ...err,\r\n });\r\n\r\nexport default ServerError;\r\n","import { useState, useEffect } from 'react';\r\nimport { MOBILE_VIEWPORT_MIN_WIDTH } from 'constants/constants';\r\n\r\nconst detectIsMobile = () => document.body.clientWidth <= MOBILE_VIEWPORT_MIN_WIDTH;\r\n\r\nexport const useDetectedMobileDevice = () => {\r\n const [isMobileSize, setMobileSize] = useState(detectIsMobile());\r\n\r\n useEffect(() => {\r\n const handleResize = () => setMobileSize(detectIsMobile());\r\n\r\n window.addEventListener('resize', handleResize);\r\n\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, []);\r\n\r\n return { isMobileSize };\r\n};\r\n","import {\r\n YTD,\r\n YEARS1,\r\n YEARS3,\r\n YEARS5,\r\n SINCE_INCEPTION,\r\n MONTH_TO_MONTH,\r\n ONE_YEAR_BEFORE,\r\n TWO_YEARS_BEFORE,\r\n THREE_YEARS_BEFORE,\r\n} from 'filters/investementPerformanceFilters';\r\nimport {\r\n compareDates,\r\n dateFormat,\r\n formatDate,\r\n getFirstDayOfYear,\r\n getLastDayOfMonth,\r\n getSecondDayOfYear,\r\n getYearDates,\r\n isSameDay,\r\n subtractUnits,\r\n} from 'utils/datetime';\r\n\r\nexport const isNeedToAddFlatLine = (filter, chartStartDate, date) => {\r\n return (\r\n (filter === YTD ||\r\n filter === YEARS1 ||\r\n filter === YEARS3 ||\r\n filter === YEARS5 ||\r\n filter === SINCE_INCEPTION ||\r\n filter === MONTH_TO_MONTH) &&\r\n compareDates(date, chartStartDate)\r\n );\r\n};\r\n\r\nexport const adaptStartDate = (chartStartDate, date) => {\r\n // if data exist in date exists\r\n if (isSameDay(chartStartDate, date)) return chartStartDate;\r\n // if no data and it's XXXX-01-01, return XXXX-01-02 because of Jan 1st is day-off\r\n if (isSameDay(chartStartDate, getFirstDayOfYear())) return getSecondDayOfYear();\r\n\r\n return chartStartDate;\r\n};\r\n\r\nexport const getPeriodByFilter = (filter, format = 'YYYY-MM-DD') => {\r\n let filterPeriod = {\r\n startDate: '',\r\n endDate: formatDate(new Date(), format),\r\n };\r\n\r\n switch (filter) {\r\n case YTD:\r\n filterPeriod.startDate = `${getFirstDayOfYear(new Date(), format)}`;\r\n break;\r\n case YEARS1:\r\n filterPeriod.startDate = subtractUnits(new Date(), 1, 'years', format);\r\n break;\r\n case YEARS3:\r\n filterPeriod.startDate = subtractUnits(new Date(), 3, 'years', format);\r\n break;\r\n case YEARS5:\r\n filterPeriod.startDate = subtractUnits(new Date(), 5, 'years', format);\r\n break;\r\n case SINCE_INCEPTION:\r\n delete filterPeriod.startDate;\r\n delete filterPeriod.endDate;\r\n break;\r\n case ONE_YEAR_BEFORE:\r\n filterPeriod = getYearDates(1);\r\n break;\r\n case TWO_YEARS_BEFORE:\r\n filterPeriod = getYearDates(2);\r\n break;\r\n case THREE_YEARS_BEFORE:\r\n filterPeriod = getYearDates(3);\r\n break;\r\n default:\r\n delete filterPeriod.startDate;\r\n delete filterPeriod.endDate;\r\n }\r\n\r\n return filterPeriod;\r\n};\r\n\r\nexport const getPerformancePeriodByFilterOrDates = (filter, filterDates) =>\r\n filter === MONTH_TO_MONTH\r\n ? {\r\n startDate: getLastDayOfMonth(filterDates.startDate, dateFormat),\r\n endDate: getLastDayOfMonth(filterDates.endDate, dateFormat),\r\n }\r\n : getPeriodByFilter(filter, dateFormat);\r\n","import { isEqual } from 'lodash/fp';\r\n\r\nexport const adaptPlotsAmount = (data, isMobileSize) => {\r\n const PLOTS_MAX_COUNT = isMobileSize ? 200 : 500;\r\n const { length } = data;\r\n\r\n if (length <= PLOTS_MAX_COUNT) return data;\r\n\r\n const delta = Math.ceil(length / PLOTS_MAX_COUNT);\r\n const selected = [];\r\n\r\n for (let i = 0; i < length; i += delta) {\r\n selected.push(data[i]);\r\n }\r\n\r\n const last = data.slice(-1)[0];\r\n const selectedLast = selected.slice(-1)[0];\r\n\r\n if (!isEqual(last, selectedLast)) selected.push(selectedLast);\r\n\r\n return selected;\r\n};\r\n","import { getTimestamp, subtractUnits } from 'utils/datetime';\r\nimport { formatCurrencyWithPrecision, formatWithDate } from 'utils/formatting';\r\nimport { isNeedToAddFlatLine, adaptStartDate } from 'utils/charts';\r\nimport { adaptPlotsAmount } from 'utils/adaptPlotsAmount';\r\n\r\nconst adaptDate = (Date) => getTimestamp(Date);\r\n\r\nexport const adaptInvestmentOverviewPerformance = (\r\n rawData,\r\n currency,\r\n chartStartDate,\r\n filter,\r\n isMobileSize,\r\n getFormattedNumber,\r\n getFormattedCurrency,\r\n getFormattedDate\r\n) => {\r\n const data = adaptPlotsAmount(rawData, isMobileSize);\r\n\r\n const adaptedInvestmentOverviewPerformance = {\r\n performance: [\r\n {\r\n data: [],\r\n tooltipFormat: (number, date) =>\r\n formatWithDate(`${getFormattedNumber(number)}%`, date, getFormattedDate),\r\n },\r\n ],\r\n assets: [\r\n {\r\n data: [],\r\n tooltipFormat: (number, date) =>\r\n formatWithDate(\r\n getFormattedCurrency\r\n ? getFormattedCurrency(number, { currency: currency.CurrencyCode })\r\n : formatCurrencyWithPrecision(number, 0, currency.CurrencyCode),\r\n date,\r\n getFormattedDate\r\n ),\r\n },\r\n ],\r\n };\r\n\r\n data.forEach(({ Value, Amount, Date: date }, idx) => {\r\n if (idx === 0) {\r\n const start = adaptStartDate(chartStartDate, date);\r\n\r\n if (isNeedToAddFlatLine(filter, start, date)) {\r\n const timestampStart = adaptDate(start);\r\n\r\n adaptedInvestmentOverviewPerformance.performance[0].data.push([timestampStart, 0]);\r\n adaptedInvestmentOverviewPerformance.assets[0].data.push([timestampStart, 0]);\r\n\r\n adaptedInvestmentOverviewPerformance.performance[0].data.push([\r\n adaptDate(subtractUnits(date, 1, 'days')),\r\n 0,\r\n ]);\r\n adaptedInvestmentOverviewPerformance.assets[0].data.push([\r\n adaptDate(subtractUnits(date, 1, 'days')),\r\n 0,\r\n ]);\r\n }\r\n }\r\n\r\n const timestampStart = adaptDate(date);\r\n\r\n const adaptedValue = Math.round(Value * 10000) / 100;\r\n\r\n adaptedInvestmentOverviewPerformance.performance[0].data.push([\r\n timestampStart,\r\n adaptedValue,\r\n ]);\r\n\r\n adaptedInvestmentOverviewPerformance.assets[0].data.push([timestampStart, Amount]);\r\n });\r\n\r\n return adaptedInvestmentOverviewPerformance;\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { formatNumberRounding } from 'utils/formatting';\r\nimport PropTypes from 'prop-types';\r\nimport AssetDevelopment from 'components/organisms/AssetDevelopment';\r\nimport useFormatting from 'locale/useFormatting';\r\nimport { SINCE_INCEPTION } from 'filters/investementPerformanceFilters';\r\nimport { GA_ACTIONS, GA_CATEGORIES, sendGAEvent } from 'utils/analytics';\r\nimport { useWithInvestmentOverviewPerformance } from '../hooks/useWithInvestmentOverviewPerformance';\r\n\r\nconst chartValueFormat = {\r\n performance: {\r\n symbol: '%',\r\n precision: 2,\r\n thousand: ',',\r\n decimal: '.',\r\n format: '%v%s',\r\n },\r\n assets: {\r\n symbol: 'K',\r\n precision: 0,\r\n thousand: '.',\r\n decimal: ',',\r\n format: '%v%s',\r\n },\r\n};\r\n\r\nconst AssetDevelopmentComponent = ({ clientId, currency, isLoading }) => {\r\n const { t } = useTranslation();\r\n const [currentFilter, setCurrentFilter] = useState(SINCE_INCEPTION);\r\n const [filterDates, setFilterDates] = useState({});\r\n const setCurrentFilterWithGA = (filter) => {\r\n sendGAEvent(GA_ACTIONS.changePerformanceFilter, GA_CATEGORIES.dashboard, filter);\r\n setCurrentFilter(filter);\r\n };\r\n const performance = useWithInvestmentOverviewPerformance(\r\n currentFilter,\r\n clientId,\r\n currency,\r\n isLoading,\r\n filterDates\r\n );\r\n\r\n const { getFormattedNumber } = useFormatting();\r\n const yAxisFormat = {\r\n performance: ({ value }) => `${getFormattedNumber(value)}%`,\r\n assets: ({ value }) => formatNumberRounding(value, getFormattedNumber),\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nAssetDevelopmentComponent.propTypes = {\r\n currency: PropTypes.string.isRequired,\r\n clientId: PropTypes.number.isRequired,\r\n isLoading: PropTypes.bool.isRequired,\r\n};\r\n\r\nAssetDevelopmentComponent.defaultProps = {};\r\n\r\nexport default AssetDevelopmentComponent;\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { useFormatting, useLocale } from 'locale';\r\nimport { getLastDayOfMonth } from 'utils/datetime';\r\nimport { MONTH_TO_MONTH } from 'filters/investementPerformanceFilters';\r\nimport { useDetectedMobileDevice } from 'hooks/useDetectedMobileDevice';\r\nimport { getPerformancePeriodByFilterOrDates } from 'utils/charts';\r\nimport { adaptInvestmentOverviewPerformance } from '../adapters/adaptInvestmentOverviewPerformance';\r\n\r\nconst getParamsByFilter = ({ startDate, endDate }, language) => {\r\n return startDate === undefined ? {} : { from: startDate, to: endDate, language };\r\n};\r\n\r\nexport const useWithInvestmentOverviewPerformance = (\r\n filter,\r\n clientId,\r\n currency,\r\n isLoadingCurrency,\r\n filterDates\r\n) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState({\r\n assets: [{}],\r\n performance: [{}],\r\n });\r\n const { i18n } = useTranslation();\r\n const { locale } = useLocale();\r\n const { getFormattedNumber, getFormattedCurrency, getFormattedDate } = useFormatting();\r\n const { isMobileSize } = useDetectedMobileDevice();\r\n\r\n useEffect(() => {\r\n const isMonthToMothLoadAllowed =\r\n filter === MONTH_TO_MONTH &&\r\n !!filterDates.startDate &&\r\n !!filterDates.endDate &&\r\n getLastDayOfMonth(filterDates.startDate) < getLastDayOfMonth(filterDates.endDate);\r\n const isDataLoadAllowed =\r\n !isLoadingCurrency && filter !== MONTH_TO_MONTH ? true : isMonthToMothLoadAllowed;\r\n\r\n if (isDataLoadAllowed) {\r\n const params = getParamsByFilter(\r\n getPerformancePeriodByFilterOrDates(filter, filterDates),\r\n i18n.language\r\n );\r\n\r\n setLoading(true);\r\n ServiceManager.portfolioManagement('getInvestmentOverviewPerformance', [\r\n clientId,\r\n params,\r\n ])\r\n .then((response) => {\r\n try {\r\n setData(\r\n adaptInvestmentOverviewPerformance(\r\n response.data.Values,\r\n currency,\r\n params.from,\r\n filter,\r\n isMobileSize,\r\n getFormattedNumber,\r\n getFormattedCurrency,\r\n getFormattedDate\r\n )\r\n );\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }\r\n }, [\r\n filter,\r\n locale,\r\n clientId,\r\n i18n.language,\r\n isLoadingCurrency,\r\n filterDates.startDate,\r\n filterDates.endDate,\r\n ]);\r\n\r\n return { data, isLoading, error };\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n// import { Link } from 'react-router-dom';\r\nimport {\r\n formatSignPercent,\r\n formatValueByType,\r\n getColorClass,\r\n TYPE_TEXT,\r\n VALUE_TYPES,\r\n} from 'utils/formatting';\r\nimport { useFormatting } from 'locale';\r\nimport { getClassNames } from '../../utils';\r\nimport { OVERVIEW_SIZE_LAGRE, OVERVIEW_SIZES } from './constants';\r\n\r\nfunction OverviewItem({\r\n title,\r\n htmlTitle,\r\n value,\r\n size,\r\n type,\r\n colored,\r\n percent,\r\n // link,\r\n // linkLabel,\r\n currency,\r\n}) {\r\n const { getFormattedNumber } = useFormatting();\r\n\r\n const className = getClassNames(\r\n getColorClass(colored ? value : 0, 'overview-item__value'),\r\n `overview-item__value_${size}`\r\n );\r\n\r\n return (\r\n
\r\n {title && (\r\n
\r\n {title}\r\n
\r\n )}\r\n
\r\n \r\n {formatValueByType(value, type, colored, getFormattedNumber)}\r\n \r\n {currency !== null && {currency}}\r\n {percent !== null && (\r\n \r\n {formatSignPercent(percent)}\r\n \r\n )}\r\n
\r\n {/* {link && ( */}\r\n {/* */}\r\n {/* {linkLabel} */}\r\n {/* */}\r\n {/* )} */}\r\n
\r\n );\r\n}\r\n\r\nOverviewItem.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n htmlTitle: PropTypes.string,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\r\n size: PropTypes.oneOf(OVERVIEW_SIZES),\r\n type: PropTypes.oneOf(VALUE_TYPES),\r\n colored: PropTypes.bool,\r\n percent: PropTypes.number,\r\n // link: PropTypes.string,\r\n // linkLabel: PropTypes.string,\r\n currency: PropTypes.string,\r\n};\r\n\r\nOverviewItem.defaultProps = {\r\n htmlTitle: '',\r\n size: OVERVIEW_SIZE_LAGRE,\r\n type: TYPE_TEXT,\r\n colored: false,\r\n percent: null,\r\n // link: null,\r\n // linkLabel: null,\r\n currency: '',\r\n};\r\n\r\nexport default OverviewItem;\r\n","export const TYPE_CURRENCY = 'currency';\r\nexport const TYPE_PERCENT = 'percent';\r\nexport const TYPE_NUMBER = 'number';\r\nexport const TYPE_TEXT = 'text';\r\n\r\nexport const OVERVIEW_SIZE_SMALL = 'small';\r\nexport const OVERVIEW_SIZE_LAGRE = 'large';\r\n\r\nexport const OVERVIEW_SIZES = [OVERVIEW_SIZE_SMALL, OVERVIEW_SIZE_LAGRE];\r\n\r\n// TODO: unused code below, delete after approval\r\nexport const VALUE_TYPES = [TYPE_CURRENCY, TYPE_PERCENT, TYPE_NUMBER, TYPE_TEXT];\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction OverviewPanel({ children }) {\r\n return
{children}
;\r\n}\r\n\r\nOverviewPanel.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nOverviewPanel.defaultProps = {\r\n children: null,\r\n};\r\n\r\nexport default OverviewPanel;\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { getClassNames } from 'utils';\r\nimport { formatValueByType, getColorClass } from 'utils/formatting';\r\nimport classNames from 'classnames';\r\nimport { useFormatting } from 'locale';\r\nimport { OVERVIEW_SIZE_LAGRE, OVERVIEW_SIZES, TYPE_TEXT, VALUE_TYPES } from './constants';\r\n\r\nfunction OverviewItem({ title, htmlTitle, value, size, type, colored, currency, hideOnMobile }) {\r\n const { getFormattedNumber } = useFormatting();\r\n\r\n const className = getClassNames(\r\n getColorClass(colored ? value : 0, 'overview-item__value'),\r\n `overview-item__value_${size}`\r\n );\r\n\r\n const hideOnMobileClassName = useMemo(\r\n () =>\r\n classNames('overview-item', {\r\n 'hide-on-mobile': hideOnMobile,\r\n }),\r\n [hideOnMobile]\r\n );\r\n\r\n return (\r\n
\r\n {title && (\r\n \r\n {title}\r\n \r\n )}\r\n
\r\n \r\n {formatValueByType(value, type, colored, getFormattedNumber)}\r\n \r\n {currency !== null && {currency}}\r\n
\r\n
\r\n );\r\n}\r\n\r\nOverviewItem.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n htmlTitle: PropTypes.string,\r\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\r\n size: PropTypes.oneOf(OVERVIEW_SIZES),\r\n type: PropTypes.oneOf(VALUE_TYPES),\r\n colored: PropTypes.bool,\r\n currency: PropTypes.string,\r\n hideOnMobile: PropTypes.bool,\r\n};\r\n\r\nOverviewItem.defaultProps = {\r\n htmlTitle: '',\r\n size: OVERVIEW_SIZE_LAGRE,\r\n type: TYPE_TEXT,\r\n colored: false,\r\n currency: '',\r\n hideOnMobile: false,\r\n};\r\n\r\nexport default OverviewItem;\r\n","export const TYPE_CURRENCY = 'currency';\r\nexport const TYPE_PERCENT = 'percent';\r\nexport const TYPE_NUMBER = 'number';\r\nexport const TYPE_TEXT = 'text';\r\n\r\nexport const VALUE_TYPES = [TYPE_CURRENCY, TYPE_PERCENT, TYPE_NUMBER, TYPE_TEXT];\r\n\r\nexport const OVERVIEW_SIZE_SMALL = 'small';\r\nexport const OVERVIEW_SIZE_LAGRE = 'large';\r\n\r\nexport const OVERVIEW_SIZES = [OVERVIEW_SIZE_SMALL, OVERVIEW_SIZE_LAGRE];\r\n","import React from 'react';\r\nimport { Title, ContentBox } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { OverviewPanel } from 'components/Overview';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport PropTypes from 'prop-types';\r\nimport { NA } from 'static/na';\r\nimport OverviewItem from './OverviewItem';\r\nimport { TYPE_CURRENCY, TYPE_PERCENT, TYPE_NUMBER, TYPE_TEXT } from './constants';\r\n\r\nfunction Overview({ data, isLoading, error, performanceYTD }) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n {t('overview.title')}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nOverview.propTypes = {\r\n data: PropTypes.shape({\r\n currency: PropTypes.string,\r\n totalValue: PropTypes.number,\r\n performanceValue: PropTypes.number,\r\n inceptionDate: PropTypes.string,\r\n gainYTD: PropTypes.number,\r\n }).isRequired,\r\n isLoading: PropTypes.bool.isRequired,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n performanceYTD: PropTypes.number,\r\n};\r\n\r\nOverview.defaultProps = {\r\n error: null,\r\n performanceYTD: null,\r\n};\r\n\r\nexport default Overview;\r\n","export const SERVER_RESPONSE_WITH_ERROR = 'Server response with error';\r\nexport const DATA_IS_NOT_AVAILABLE = 'Data is not available';\r\nexport const NA = 'N/A';\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ContentBox, Title } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { Button } from 'components/Button';\r\nimport { GA_ACTIONS, GA_CATEGORIES, sendGAEvent } from 'utils/analytics';\r\n\r\nfunction RelationshipManager({ data, isLoading, error, title }) {\r\n const { t } = useTranslation();\r\n const [showPhone, setPhone] = useState(false);\r\n\r\n return (\r\n \r\n \r\n {title ? (\r\n {t(title)}\r\n ) : (\r\n {t('dashboard.relationshipManager.title')}\r\n )}\r\n \r\n
\r\n {data.Img && \"}\r\n
\r\n {data.Name}\r\n
\r\n {data.Contacts && (\r\n {\r\n sendGAEvent(\r\n GA_ACTIONS.viewRM,\r\n GA_CATEGORIES.contactRM,\r\n 'send_email'\r\n );\r\n }}\r\n href={data.Contacts[0].Icon.href}\r\n className=\"paragraph_secondary\"\r\n >\r\n {t('messages.sendMessage')}\r\n \r\n )}\r\n {data.PhoneNumber && !showPhone && (\r\n setPhone(true)}\r\n >\r\n {t('dashboard.relationshipManager.callNow')}\r\n \r\n )}\r\n {data.PhoneNumber && showPhone && (\r\n {\r\n sendGAEvent(\r\n GA_ACTIONS.viewRM,\r\n GA_CATEGORIES.contactRM,\r\n 'click_and_call'\r\n );\r\n }}\r\n href={`tel:${data.PhoneNumber}`}\r\n className=\"call-now\"\r\n >\r\n {data.PhoneNumber}\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nRelationshipManager.propTypes = {\r\n data: PropTypes.shape({\r\n Contacts: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n Information: PropTypes.shape({\r\n title: PropTypes.string,\r\n subtitle: PropTypes.string,\r\n }),\r\n Icon: PropTypes.shape({\r\n type: PropTypes.string,\r\n href: PropTypes.string,\r\n size: PropTypes.number,\r\n }),\r\n })\r\n ),\r\n Img: PropTypes.string,\r\n Name: PropTypes.string,\r\n PhoneNumber: PropTypes.string,\r\n }).isRequired,\r\n isLoading: PropTypes.bool.isRequired,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n title: PropTypes.string,\r\n};\r\n\r\nRelationshipManager.defaultProps = {\r\n title: null,\r\n error: null,\r\n};\r\n\r\nexport default RelationshipManager;\r\n","import RelationshipManager from './RelationshipManager';\r\n\r\nexport default RelationshipManager;\r\n","import { find, isNil } from 'lodash';\r\nimport { validateStringData, validateName, NA } from 'utils/formatting';\r\nimport getAvatarPath from '../components/RelationshipManager/getAvatarPath';\r\n\r\nconst getPortfoliosCount = (data) => {\r\n const portfolios = find(data, { PortfolioType: 'Real' });\r\n\r\n return isNil(portfolios) ? NA : portfolios.Count;\r\n};\r\n\r\nconst adaptRMData = (data, t, getFormattedPhoneNumber) => {\r\n if (isNil(data)) {\r\n return {};\r\n }\r\n\r\n const getPhoneNumber = (phoneNumber) => {\r\n if (phoneNumber) {\r\n return getFormattedPhoneNumber(phoneNumber);\r\n }\r\n\r\n return null;\r\n };\r\n const validateRMEmail = (email) => ({\r\n Information: {\r\n title: t('dashboard.relationshipManager.email'),\r\n subtitle: validateStringData(email),\r\n },\r\n Icon: {\r\n type: 'envolope',\r\n size: 20,\r\n href: `mailto:${email}`,\r\n },\r\n });\r\n const validateRMPhone = (phoneNumber) => ({\r\n Information: {\r\n title: t('dashboard.relationshipManager.phone'),\r\n subtitle: validateStringData(phoneNumber),\r\n },\r\n Icon: {\r\n type: 'phone-call',\r\n size: 20,\r\n href: getPhoneNumber(phoneNumber),\r\n },\r\n });\r\n\r\n const validatedContacts = [];\r\n\r\n if (data.Email) {\r\n validatedContacts.push(validateRMEmail(data.Email));\r\n }\r\n\r\n if (data.Phone) {\r\n validatedContacts.push(validateRMPhone(data.Phone));\r\n }\r\n\r\n return {\r\n Img: getAvatarPath(data.Email),\r\n Name: `${validateName(data.FirstName)} ${validateName(data.LastName)}`,\r\n PhoneNumber: getPhoneNumber(data.Phone),\r\n Contacts: validatedContacts,\r\n };\r\n};\r\n\r\nexport const adaptProfile = (data, members, t, getFormattedPhoneNumber) => ({\r\n clientProfile: [\r\n {\r\n Information: {\r\n title: t('dashboard.profile.clientRiskProfile'),\r\n subtitle: validateStringData(data.ChosenRiskCategory),\r\n },\r\n Icon: { type: 'form', size: 20, href: 'risk-profile' },\r\n },\r\n {\r\n Information: {\r\n title: t('dashboard.profile.totalPortfolios'),\r\n subtitle: getPortfoliosCount(data.Investments),\r\n },\r\n Icon: { type: '' },\r\n },\r\n ],\r\n RMProfile: adaptRMData(members[0], t, getFormattedPhoneNumber),\r\n lastLogin: data.LastLogin,\r\n});\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { useFormatting } from 'locale';\r\nimport { adaptProfile } from '../adapters/adaptProfile';\r\n\r\nexport const useWithClientProfile = (clientId) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState({ clientProfile: {}, RMProfile: {} });\r\n const { i18n } = useTranslation();\r\n const { t } = useTranslation();\r\n const { getFormattedPhoneNumber } = useFormatting();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n\r\n ServiceManager.contactManagement('getClientProfile', [clientId, `${i18n.language}`])\r\n .then((response) => {\r\n ServiceManager.contactManagement('getContactMembers', [clientId])\r\n .then((responseMember) => {\r\n try {\r\n setData(\r\n adaptProfile(\r\n response.data,\r\n responseMember.data,\r\n t,\r\n getFormattedPhoneNumber\r\n )\r\n );\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, [i18n.language]);\r\n\r\n return { data, isLoading, error };\r\n};\r\n","export const portfolioTypeIds = {\r\n MAIN: 1,\r\n VIRTUAL: 2,\r\n SLICE: 3,\r\n};\r\n","// Finds Inception date for Dashboard overview widget.\r\n// If Account has multiple portfolios, uses the oldest date\r\nexport const getAccountInceptionDate = (portfolios) => {\r\n let oldestDate = new Date();\r\n\r\n portfolios.forEach((portfolio) => {\r\n if (portfolio.createDate) {\r\n const createDate = new Date(portfolio.createDate);\r\n\r\n if (createDate < oldestDate) {\r\n oldestDate = createDate;\r\n }\r\n }\r\n });\r\n\r\n return oldestDate;\r\n};\r\n","import { getfromDataObject, validateStringData } from 'utils/formatting';\r\nimport { portfolioTypeIds } from 'constants/portfolioTypeIds';\r\nimport { getAccountInceptionDate } from '../utils';\r\n\r\nconst getOverviewGainYTD = (portfolios) => {\r\n let gainYTD = 0;\r\n\r\n portfolios.forEach((item) => {\r\n gainYTD += item.gainYTD;\r\n });\r\n\r\n return gainYTD;\r\n};\r\n\r\nexport const adaptInvestmentOverview = (\r\n data,\r\n portfolioActions,\r\n t,\r\n getFormattedCurrency,\r\n getFormattedDate\r\n) => {\r\n let positions;\r\n const currency = data.BaseCurrency.CurrencyCode;\r\n\r\n if (data && data.Positions) {\r\n positions = data.Positions;\r\n } else if (data && data.ConsolidatedPositions) {\r\n positions = data.ConsolidatedPositions;\r\n }\r\n\r\n const portfolios =\r\n data.Portfolios !== undefined\r\n ? data.Portfolios.filter((item) => item.PortfolioTypeId === portfolioTypeIds.MAIN).map(\r\n (item) => {\r\n const customAttr = JSON.parse(item.CustomAttributes);\r\n\r\n return {\r\n Name: { label: item.Name, link: `/portfolios/${item.Id}` },\r\n Product: getfromDataObject(item, 'Product.Name'),\r\n Profile: validateStringData(item.RiskCategory.Name),\r\n Value: getFormattedCurrency(item.CurrentValue, {\r\n currency: item.Currency.CurrencyCode,\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n }),\r\n Performance: item.CurrentPerformance\r\n ? item.CurrentPerformance * 100\r\n : undefined,\r\n Actions: {\r\n value: 'action',\r\n actions: portfolioActions(item.Id, item.Product.Name, t),\r\n },\r\n gainYTD: customAttr.GainLossYTD || 0,\r\n createDate: item.CreateDate,\r\n };\r\n }\r\n )\r\n : [];\r\n\r\n return {\r\n overview: {\r\n currency,\r\n totalValue: data.CurrentValue,\r\n performanceValue: data.CurrentPerformance * 100,\r\n gainYTD: getOverviewGainYTD(portfolios),\r\n inceptionDate: getFormattedDate(getAccountInceptionDate(portfolios)),\r\n },\r\n positions,\r\n portfolios,\r\n };\r\n};\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { portfolioActions } from 'constants/constants';\r\nimport { useFormatting, useLocale } from 'locale';\r\nimport { adaptInvestmentOverview } from '../adapters/adaptInvestmentOverview';\r\n\r\nexport const useWithInvestmentOverview = (clientId) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState({\r\n overview: {},\r\n investmentAllocation: { chart: [{ data: { pie: {}, bar: {}, list: {} } }] },\r\n });\r\n const { i18n } = useTranslation();\r\n const { t } = useTranslation();\r\n const { getFormattedCurrency, getFormattedDate } = useFormatting();\r\n const { locale } = useLocale();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n const params = { language: i18n.language };\r\n\r\n ServiceManager.portfolioManagement('getInvestmentOverview', [clientId, params])\r\n .then((response) => {\r\n try {\r\n setData(\r\n adaptInvestmentOverview(\r\n response.data,\r\n portfolioActions,\r\n t,\r\n getFormattedCurrency,\r\n getFormattedDate\r\n )\r\n );\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, [i18n.language, locale]);\r\n\r\n return { data, isLoading, error };\r\n};\r\n","import { checkNullData } from 'utils';\r\nimport { formatDate, dateTimeFormat } from 'utils/datetime';\r\nimport { INTERNAL_ORIGIN } from '../constants/constants';\r\n\r\nconst getValueByKey = (object, key) => {\r\n const value = object.Content.find((item) => item.Key === key);\r\n\r\n return value !== undefined ? value.Value : null;\r\n};\r\n\r\nexport const adaptNews = ({ data }) => {\r\n if (checkNullData(data)) return [];\r\n\r\n return {\r\n posts: data.map((item) => ({\r\n id: item.Id,\r\n date: formatDate(getValueByKey(item, 'date'), dateTimeFormat, 'DD.MM.YYYY HH:mm'),\r\n title: getValueByKey(item, 'title'),\r\n image: getValueByKey(item, 'image'),\r\n content: getValueByKey(item, 'body'),\r\n link: getValueByKey(item, 'link'),\r\n origin: INTERNAL_ORIGIN,\r\n })),\r\n };\r\n};\r\n","import React from 'react';\r\nimport DOMPurify from 'dompurify';\r\n\r\nconst tagsSettings = {\r\n iframe: (node) => {\r\n const src = node.getAttribute('src') || '';\r\n\r\n if (!src.startsWith('https://www.youtube.com/embed/')) {\r\n node.parentNode.removeChild(node);\r\n }\r\n },\r\n};\r\n\r\nDOMPurify.addHook('uponSanitizeElement', (node, data) => tagsSettings[data.tagName]?.(node));\r\n\r\nexport const innerHTMLRender = (text = '') => (\r\n \r\n);\r\n\r\nexport const sanitizeString = (str = '') => {\r\n if (typeof str === 'string') {\r\n return str\r\n .replace(/(\\r\\n|\\n|\\r)/gm, '')\r\n .replace(/(&#(\\d+);)/g, (match, capture, charCode) => String.fromCharCode(charCode));\r\n }\r\n\r\n return '';\r\n};\r\n","import { innerHTMLRender } from 'utils/innerHTMLRender';\r\nimport { EXTERNAL_ORIGIN } from '../constants/constants';\r\nimport { checkNullData } from '../../../../utils';\r\nimport { dateTimeFormat, formatDate } from '../../../../utils/datetime';\r\n\r\nexport const adaptWPNews = ({ data, totalPages }) => {\r\n if (checkNullData(data) || checkNullData(data)) return [];\r\n\r\n return {\r\n posts: data.map((item) => ({\r\n id: item.id,\r\n date: formatDate(item?.date, dateTimeFormat, 'YYYY-MM-DD HH:mm:ss'),\r\n title: innerHTMLRender(item?.title?.rendered),\r\n image: item?.image,\r\n content: innerHTMLRender(item?.excerpt?.rendered),\r\n fullContent: innerHTMLRender(item?.content?.rendered),\r\n originLink: decodeURIComponent(item?.link),\r\n origin: EXTERNAL_ORIGIN,\r\n })),\r\n totalPages,\r\n };\r\n};\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport commonContent from 'additiv-services/dist/services/core/commonContent';\r\nimport CustomServiceManager from 'services/custom/CustomServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { adaptNews } from '../adapters/adaptNews';\r\nimport { adaptWPNews } from '../adapters/adaptWPNews';\r\n\r\n// TODO: move newsTags to AppConfig as an option or other config file\r\nconst newsTags = {\r\n general: 818,\r\n en: 828,\r\n de: 847,\r\n fr: 849,\r\n it: 846,\r\n es: 848,\r\n pt: 850,\r\n};\r\n\r\nconst getPostImage = (media) => {\r\n if (!Array.isArray(media)) {\r\n return '';\r\n }\r\n\r\n const mediaSizes =\r\n // eslint-disable-next-line dot-notation\r\n media.find((attachment) => attachment['media_type'] === 'image')?.['media_details']\r\n ?.sizes || {};\r\n\r\n return mediaSizes.medium?.['source_url'];\r\n};\r\n\r\nconst getAdaptedWpNewsData = async (language) => {\r\n const tags = `${newsTags[language]}%2c${newsTags.general}`;\r\n const postsData = await CustomServiceManager.getWPPosts({ per_page: 20, tags });\r\n const postsWithImages = postsData\r\n ? await Promise.all(\r\n postsData.data.map((post) =>\r\n CustomServiceManager.getWPPostImages(post.id).then(({ data }) => ({\r\n ...post,\r\n image: getPostImage(data),\r\n }))\r\n )\r\n ).then((data) => ({\r\n data,\r\n totalPages: postsData.headers['x-wp-totalpages'],\r\n }))\r\n : [];\r\n\r\n return adaptWPNews(postsWithImages);\r\n};\r\n\r\nconst getAdaptedDfsNewsData = async (dfsNews, page, i18n) => {\r\n const postsData = await commonContent.getNews(2, i18n?.language);\r\n\r\n return adaptNews(postsData);\r\n};\r\n\r\n// TODO: implement pagination or infinite scrolling\r\nexport const useNews = () => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [newsList, setNewsList] = useState([]);\r\n const { i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n setError(null);\r\n Promise.allSettled([getAdaptedWpNewsData(i18n.language), getAdaptedDfsNewsData(i18n)])\r\n .then(([wp, dfs]) => {\r\n try {\r\n const newPosts = [];\r\n\r\n if (wp.status === 'fulfilled' && wp.value?.posts) {\r\n newPosts.push(...wp.value.posts);\r\n }\r\n if (dfs.status === 'fulfilled' && dfs.value?.posts) {\r\n newPosts.push(...dfs.value.posts);\r\n }\r\n\r\n setNewsList(newPosts.sort((a, b) => new Date(b.date) - new Date(a.date)));\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, [i18n.language]);\r\n\r\n return { data: newsList, isLoading, error };\r\n};\r\n","// some locale letters are detected by regexp as non-word characters\r\nexport const toPascalCase = (string) => {\r\n return string.replace(/(\\w)(.*)/g, (g0, g1, g2) => {\r\n return g1.toLocaleUpperCase() + g2.toLocaleLowerCase();\r\n });\r\n};\r\n","import { BAR, LIST, PIE } from 'constants/constants';\r\nimport {\r\n checkNullData,\r\n getParent,\r\n roundAllocations,\r\n sortAssetsByOrderPropOrAllocation,\r\n} from 'utils';\r\nimport {\r\n allocationPercentFormat,\r\n formatCurrencyWithPrecision,\r\n formatPercentage,\r\n NA,\r\n} from 'utils/formatting';\r\nimport { toPascalCase } from 'utils/toPascalCase';\r\nimport {\r\n getAssetClassOrder,\r\n ASSET_STRATEGY_IDS,\r\n} from '../../Portfolios/pages/SinglePortfolioView/constants';\r\n\r\nconst adaptChartTypes = (data, currency) => ({\r\n [PIE]: { data },\r\n [BAR]: {\r\n data: [\r\n {\r\n data: data.map(({ value }) => value),\r\n },\r\n ],\r\n labels: data.map((item) => `${item.name} ${allocationPercentFormat(item.percent)}`),\r\n },\r\n [LIST]: {\r\n data: data.map((item) => ({\r\n name: item.name,\r\n value: formatCurrencyWithPrecision(item.value, 0, currency),\r\n percent: allocationPercentFormat(item.percent),\r\n children: item.children,\r\n })),\r\n },\r\n});\r\n\r\n// TODO: refactor the groups logic\r\nconst getAllocationsGroups = (positions, assetClasses, currencyPortfolio, t) => {\r\n // roundedAllocations: Array({id: [positionId], value: [allocationValue]})\r\n const roundedAllocations = roundAllocations(positions, 100, 1);\r\n\r\n const getPositionAllocation = (position) => {\r\n const roundedAllocation = roundedAllocations.find(({ id }) => id === position.Security.Id);\r\n\r\n return roundedAllocation ? roundedAllocation.value : position.Allocation * 100;\r\n };\r\n const groups = positions.reduce(\r\n (obj, item) => {\r\n const result = { ...obj };\r\n const positionAllocation = getPositionAllocation(item);\r\n\r\n if (item.Security.AssetClass) {\r\n // Asset class level\r\n const assetClassParent = getParent(item.Security.AssetClass);\r\n const typeName =\r\n ASSET_STRATEGY_IDS.indexOf(assetClassParent.Id) >= 0\r\n ? toPascalCase(assetClassParent.Name)\r\n : assetClassParent.Name;\r\n\r\n result.type[typeName] = obj.type[typeName] || {};\r\n const type = result.type[typeName];\r\n\r\n type.sortingOrder = getAssetClassOrder(assetClassParent.Id);\r\n type.percentage = (type.percentage || 0) + positionAllocation;\r\n type.amount = (type.amount || 0) + item.InvestmentValue;\r\n\r\n // Sub-Asset class level\r\n const assetParent =\r\n assetClasses[\r\n assetClasses.findIndex((i) => i.children.includes(assetClassParent.Id))\r\n ];\r\n const assetName = assetParent ? assetParent.Name : assetClassParent.Name;\r\n\r\n result.asset[assetName] = obj.asset[assetName] || {\r\n children: [],\r\n };\r\n const asset = result.asset[assetName];\r\n const assetInd = asset.children.findIndex(\r\n (child) => child.id === item.Security.AssetClass.Id\r\n );\r\n\r\n asset.id = assetParent ? assetParent.Id : item.Security.AssetClass.Id;\r\n asset.sortingOrder = getAssetClassOrder(asset.id);\r\n asset.percentage = (asset.percentage || 0) + positionAllocation;\r\n asset.amount = (asset.amount || 0) + item.InvestmentValue;\r\n\r\n if (assetInd !== -1) {\r\n asset.children[assetInd].percent += roundedAllocations.find(\r\n ({ id }) => id === item.Security.Id\r\n ).value;\r\n asset.children[assetInd].value += item.InvestmentValue\r\n ? item.InvestmentValue\r\n : 0;\r\n } else {\r\n asset.children.push({\r\n id: item.Security.AssetClass.Id,\r\n name: toPascalCase(item.Security.AssetClass.Name),\r\n percent: roundedAllocations.find(({ id }) => id === item.Security.Id).value,\r\n value: item.InvestmentValue ? item.InvestmentValue : 0,\r\n });\r\n }\r\n }\r\n\r\n if (item.Security.Currency !== undefined) {\r\n const currencyName = item.Security.Currency.Name;\r\n\r\n result.currency[currencyName] = obj.currency[currencyName] || {};\r\n const currency = result.currency[currencyName];\r\n\r\n currency.percentage = (currency.percentage || 0) + positionAllocation;\r\n currency.amount = (currency.amount || 0) + item.InvestmentValue;\r\n }\r\n\r\n return result;\r\n },\r\n {\r\n type: {},\r\n asset: {},\r\n currency: {},\r\n }\r\n );\r\n\r\n const gruopArrays = Object.keys(groups).map((groupKey) => {\r\n const group = groups[groupKey];\r\n\r\n const sorted = Object.keys(group)\r\n .map((key) => {\r\n return {\r\n ...group[key],\r\n id: group[key].id,\r\n name: key,\r\n value: group[key].amount,\r\n percent: group[key].percentage,\r\n children: group[key].children\r\n ? group[key].children\r\n .map((item) => ({\r\n ...item,\r\n percent: allocationPercentFormat(item.percent),\r\n value: item.value\r\n ? formatCurrencyWithPrecision(\r\n item.value,\r\n 0,\r\n currencyPortfolio\r\n )\r\n : NA,\r\n }))\r\n .sort(sortAssetsByOrderPropOrAllocation)\r\n : undefined,\r\n label: formatPercentage(group[key].percentage * 100),\r\n };\r\n })\r\n .sort(sortAssetsByOrderPropOrAllocation);\r\n\r\n return sorted;\r\n });\r\n\r\n return {\r\n chart: [\r\n {\r\n name: 'Asset Classes',\r\n title: t('allocationTabs.strategyAllocation'),\r\n data: adaptChartTypes(gruopArrays[1], currencyPortfolio),\r\n },\r\n {\r\n name: 'Type',\r\n title: t('allocationTabs.subStrategy'),\r\n data: adaptChartTypes(gruopArrays[0], currencyPortfolio),\r\n },\r\n {\r\n name: 'Currency',\r\n title: t('allocationTabs.currencies'),\r\n data: adaptChartTypes(gruopArrays[2], currencyPortfolio),\r\n },\r\n ],\r\n currency: currencyPortfolio,\r\n };\r\n};\r\n\r\nconst traversalTree = (current, childrenArr) => {\r\n // substategy level\r\n childrenArr.push(current.Data.Id);\r\n\r\n if (current.Children) {\r\n current.Children.forEach((child) => {\r\n traversalTree(child, childrenArr);\r\n });\r\n }\r\n};\r\n\r\nconst flatArray = (array) => {\r\n const flatted = [];\r\n\r\n array.forEach((item) => {\r\n const { length } = flatted;\r\n\r\n // strategy level\r\n flatted.push({ ...item.Data, children: [] });\r\n traversalTree(item, flatted[length].children);\r\n });\r\n\r\n return flatted;\r\n};\r\n\r\nexport const adaptParentsAllocations = (positions, assetClasses, currency, t) => {\r\n if (checkNullData(positions)) return { chart: [{ data: { pie: {}, bar: {}, list: {} } }] };\r\n const flatAssetClasses = flatArray(assetClasses);\r\n\r\n return getAllocationsGroups(positions, flatAssetClasses, currency, t);\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { ContentBox, Title } from 'ui-library';\r\nimport { CellPercent } from 'components/renderers';\r\nimport { useTranslation } from 'react-i18next';\r\nimport './PortfoliosCard.css';\r\n\r\nconst PortfoliosCard = ({ Name: { label, link }, Performance, Profile, Value }) => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n
\r\n {label}\r\n
\r\n
\r\n {Value}\r\n
\r\n
\r\n {t('dashboard.profile.title')}\r\n {Profile}\r\n
\r\n\r\n
{CellPercent(Performance)}
\r\n
\r\n \r\n );\r\n};\r\n\r\nPortfoliosCard.propTypes = {\r\n Name: PropTypes.shape({\r\n label: PropTypes.string,\r\n link: PropTypes.string,\r\n }).isRequired,\r\n Performance: PropTypes.number.isRequired,\r\n Profile: PropTypes.string.isRequired,\r\n Value: PropTypes.string.isRequired,\r\n};\r\n\r\nPortfoliosCard.defaultProps = {};\r\nexport default PortfoliosCard;\r\n","import PortfoliosCard from './PortfoliosCard';\r\n\r\nexport default PortfoliosCard;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Title } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport PageSection from 'components/PageSection';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport PortfoliosCard from './component/PortfoliosCard';\r\nimport './PortfoliosList.css';\r\n\r\nconst PortfoliosList = ({ data, isLoading, error }) => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n {t('portfolios.title')}\r\n \r\n \r\n
\r\n {data.map((item) => (\r\n \r\n ))}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nPortfoliosList.propTypes = {\r\n data: PropTypes.arrayOf(PropTypes.object),\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n};\r\nPortfoliosList.defaultProps = {\r\n data: [],\r\n isLoading: true,\r\n error: null,\r\n};\r\n\r\nexport default PortfoliosList;\r\n","import PortfoliosList from './PortfoliosList';\r\n\r\nexport default PortfoliosList;\r\n","// NOTICE: this is custom hook used for Dashboard overview widget only\r\nimport { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { YTD } from 'filters/investementPerformanceFilters';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport { getPeriodByFilter } from 'utils';\r\nimport ServerError from 'errors/ServerError';\r\n\r\nconst usePerformanceYTD = ({ isLoadingCurrency, clientId }) => {\r\n const [performanceData, setData] = useState();\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const { i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (!isLoadingCurrency) {\r\n setLoading(true);\r\n\r\n const { startDate, endDate } = getPeriodByFilter(YTD, 'MM/DD/YYYY');\r\n\r\n setLoading(true);\r\n ServiceManager.portfolioManagement('getInvestmentOverviewPerformance', [\r\n clientId,\r\n {\r\n from: startDate,\r\n to: endDate,\r\n language: i18n.language,\r\n },\r\n ])\r\n .then(({ data }) => {\r\n if (data?.Values?.length) {\r\n setData(\r\n Math.round(data.Values[data.Values.length - 1].Value * 10000) / 100\r\n );\r\n }\r\n\r\n setLoading(false);\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }\r\n }, [isLoadingCurrency, clientId]);\r\n\r\n return { value: performanceData, isLoading, error };\r\n};\r\n\r\nexport default usePerformanceYTD;\r\n","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport PropTypes from 'prop-types';\r\nimport history from 'services/core/history';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Column, Row, PageVariant } from 'ui-library';\r\nimport InvestmentAllocation from 'components/organisms/InvestmentAllocation';\r\nimport News from 'components/organisms/News';\r\nimport { contactIdSelector } from 'redux/auth/authSelectors';\r\nimport AssetDevelopmentComponent from './components/AssetDevelopmentComponent';\r\nimport Overview from './components/Overview/Overview';\r\nimport RelationshipManager from './components/RelationshipManager';\r\nimport { useWithClientProfile } from './hooks/useWithClientProfile';\r\nimport { useWithInvestmentOverview } from './hooks/useWithInvestmentOverview';\r\nimport { useNews } from '../News/hooks/useNews';\r\nimport { useParentsAllocations } from './hooks/useParentsAllocations';\r\nimport PortfoliosList from './components/PortfoliosCard';\r\nimport './Dashboard.css';\r\nimport usePerformanceYTD from './hooks/usePerformanceYTD';\r\n\r\nfunction Dashboard(props) {\r\n const { contactId: clientId } = props;\r\n const {\r\n data,\r\n isLoading: isLoadingInvestmentOverview,\r\n error: errorInvestmentOverview,\r\n } = useWithInvestmentOverview(clientId);\r\n const { investmentAllocation, isLoadingAllocation, errorAllocation } = useParentsAllocations(\r\n data.positions,\r\n isLoadingInvestmentOverview,\r\n data.overview.currency\r\n );\r\n const {\r\n data: { RMProfile },\r\n isLoading: isLoadingProfile,\r\n error: errorProfile,\r\n } = useWithClientProfile(clientId);\r\n\r\n const performanceYTD = usePerformanceYTD({ isLoadingInvestmentOverview, clientId });\r\n\r\n const news = useNews();\r\n const { t } = useTranslation();\r\n\r\n if (clientId === undefined) {\r\n return (\r\n {\r\n history.push('/');\r\n }}\r\n />\r\n );\r\n }\r\n\r\n const oRelationManagerRowClick = ({ Icon }) => ({\r\n onClick: () => Icon.href && window.open(Icon.href, '_self'),\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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nDashboard.propTypes = {\r\n match: PropTypes.shape({\r\n params: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n }),\r\n }).isRequired,\r\n contactId: PropTypes.number.isRequired,\r\n};\r\n\r\nDashboard.defaultProps = {};\r\n\r\nconst mapStateToProps = (state) => ({\r\n contactId: contactIdSelector(state),\r\n});\r\n\r\nexport default connect(mapStateToProps)(Dashboard);\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { adaptParentsAllocations } from '../adapters/adaptParentsAllocations';\r\n\r\nexport const useParentsAllocations = (data, isLoading, currency) => {\r\n const [errorAllocation, setError] = useState(null);\r\n const [isLoadingAllocation, setLoading] = useState(true);\r\n const [investmentAllocation, setData] = useState({\r\n chart: [{ data: { pie: {}, bar: {}, list: {} } }],\r\n });\r\n const { i18n, t } = useTranslation();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n\r\n if (!isLoading) {\r\n ServiceManager.commonService('getAssetClasses', [i18n.language])\r\n .then(({ data: assetClasses }) => {\r\n try {\r\n setData(adaptParentsAllocations(data, assetClasses, currency, t));\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setData(adaptParentsAllocations(data, [], currency, t));\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }\r\n }, [isLoading, i18n.language]);\r\n\r\n return { investmentAllocation, isLoadingAllocation, errorAllocation };\r\n};\r\n","import React from 'react';\r\nimport { Redirect, Route, Switch } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport Dashboard from './Dashboard';\r\n\r\nconst Router = (props) => {\r\n const {\r\n match: { path },\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nRouter.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nRouter.defaultProps = {};\r\n\r\nRouter.displayName = 'Router';\r\n\r\nexport default Router;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport News from 'components/organisms/News';\r\nimport { useNews } from './hooks/useNews';\r\n\r\nfunction NewsPage() {\r\n const news = useNews();\r\n\r\n return ;\r\n}\r\n\r\nNewsPage.propTypes = {\r\n match: PropTypes.shape({ params: { id: PropTypes.string.isRequired } }).isRequired,\r\n};\r\n\r\nNewsPage.defaultProps = {};\r\n\r\nexport default NewsPage;\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport CustomServiceManager from 'services/custom/CustomServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { adaptWPNews } from '../adapters/adaptWPNews';\r\n\r\nconst getAdaptedNewsData = async (i18n, params) => {\r\n const wpNewsPost = await CustomServiceManager.getWPPosts(params);\r\n\r\n return adaptWPNews(wpNewsPost);\r\n};\r\n\r\nexport const useWPNewsPost = (newsItem, params) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [newsList, setNewsList] = useState([]);\r\n const { i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (newsItem === undefined) {\r\n setLoading(true);\r\n setError(null);\r\n getAdaptedNewsData(i18n, params)\r\n .then((data) => {\r\n try {\r\n setNewsList(data.posts);\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n } else {\r\n setLoading(false);\r\n setNewsList([newsItem]);\r\n }\r\n }, [i18n.language]);\r\n\r\n return { data: newsList, isLoading, error };\r\n};\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ContentBox, Title, Row, Column, BreadCrumbs } from 'ui-library';\r\nimport PropTypes from 'prop-types';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport { useWPNewsPost } from '../../hooks/useWPNewsPost';\r\n\r\nfunction SingleWPNewsView(props) {\r\n const {\r\n location: { query },\r\n match: {\r\n params: { newsId },\r\n },\r\n t,\r\n } = props;\r\n const { data, isLoading, error } = useWPNewsPost(query, { include: newsId });\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {t('dashboard.title')}\r\n {t('news.title')}\r\n \r\n \r\n {data?.[0]?.title}\r\n \r\n
\r\n
\r\n \r\n {t('news.origin')}\r\n \r\n
\r\n
\r\n \r\n \r\n
{data?.[0]?.date}
\r\n
\r\n {data?.[0]?.fullContent}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nSingleWPNewsView.propTypes = {\r\n location: PropTypes.shape({\r\n query: {\r\n id: PropTypes.number,\r\n image: PropTypes.string,\r\n title: PropTypes.string,\r\n date: PropTypes.string,\r\n content: PropTypes.string,\r\n },\r\n }).isRequired,\r\n match: PropTypes.shape({\r\n params: { newsId: PropTypes.string.isRequired },\r\n }).isRequired,\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nSingleWPNewsView.defaultProps = {};\r\n\r\nexport default SingleWPNewsView;\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport commonContent from 'additiv-services/dist/services/core/commonContent';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { adaptNews } from '../adapters/adaptNews';\r\n\r\nconst getAdaptedNewsData = async (i18n) => {\r\n const dfsNews = await commonContent.getNews(2, i18n?.language);\r\n\r\n const dfsNewsAdapted = adaptNews(dfsNews);\r\n\r\n return dfsNewsAdapted.posts;\r\n};\r\n\r\nexport const useNewsPost = (newsItem, id, params) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [newsList, setNewsList] = useState([]);\r\n const { i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (newsItem === undefined) {\r\n setLoading(true);\r\n setError(null);\r\n getAdaptedNewsData(i18n, params)\r\n .then((data) => {\r\n try {\r\n setNewsList(data);\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n } else {\r\n setLoading(false);\r\n setNewsList([newsItem]);\r\n }\r\n }, [i18n.language]);\r\n\r\n return { data: newsList, isLoading, error };\r\n};\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ContentBox, Title, Row, Column, BreadCrumbs, Paragraph } from 'ui-library';\r\nimport PropTypes from 'prop-types';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport { useFormatting, dateTimeFormats } from 'locale';\r\nimport { useNewsPost } from '../../hooks/useNewsPost';\r\n\r\nfunction SingleNewsView(props) {\r\n const {\r\n location: { query },\r\n match: {\r\n params: { newsId },\r\n },\r\n t,\r\n } = props;\r\n const { data, isLoading, error } = useNewsPost(query);\r\n const newsItem = data.find((item) => item.id === Number(newsId)) || { title: '' };\r\n\r\n const { getFormattedDate } = useFormatting();\r\n const formattedDate = getFormattedDate(newsItem.date, {\r\n hour: dateTimeFormats.NUMERIC,\r\n minute: dateTimeFormats.NUMERIC,\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {t('dashboard.title')}\r\n {t('news.title')}\r\n \r\n \r\n {newsItem.title}\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {formattedDate}\r\n \r\n \r\n {newsItem.content}\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nSingleNewsView.propTypes = {\r\n location: PropTypes.shape({\r\n query: {\r\n id: PropTypes.number,\r\n image: PropTypes.string,\r\n title: PropTypes.string,\r\n date: PropTypes.string,\r\n content: PropTypes.string,\r\n },\r\n }).isRequired,\r\n match: PropTypes.shape({\r\n params: { newsId: PropTypes.string.isRequired },\r\n }).isRequired,\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nSingleNewsView.defaultProps = {};\r\n\r\nexport default SingleNewsView;\r\n","import { useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport history from 'services/core/history';\r\n\r\nconst withLanguageChange = (Component) => (props) => {\r\n const { t, i18n } = useTranslation();\r\n\r\n const languageChanged = () => {\r\n history.push('/news');\r\n };\r\n\r\n useEffect(() => {\r\n i18n.on('languageChanged', languageChanged);\r\n\r\n return () => i18n.off('languageChanged', languageChanged);\r\n }, []);\r\n\r\n return Component({ ...props, t });\r\n};\r\n\r\nexport default withLanguageChange;\r\n","import React from 'react';\r\nimport { Redirect, Route, Switch } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport News from './News';\r\nimport SingleWPNewsView from './pages/SingleNewsView/SingleWPNewsView';\r\nimport SingleNewsView from './pages/SingleNewsView/SingleNewsView';\r\nimport withLanguageChange from './pages/hocs/withLanguageChange';\r\n\r\nconst Router = (props) => {\r\n const {\r\n match: { path },\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\nRouter.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nRouter.defaultProps = {};\r\n\r\nRouter.displayName = 'Router';\r\n\r\nexport default Router;\r\n","import CustomServiceManager from './CustomServiceManager';\r\nimport { INSTRUMENT_DOCUMENTS_ID } from '../../constants/constants';\r\n\r\nexport const getSecurityFactsheet = async (securityDetails) => {\r\n const { data: metaData } = await CustomServiceManager.getMetaDataId();\r\n const { Id: metaDataId } =\r\n metaData && metaData.find((item) => item.DocumentReferenceId === INSTRUMENT_DOCUMENTS_ID);\r\n\r\n if (securityDetails.Factsheet) {\r\n const { data } = await CustomServiceManager.getPublicDocument(\r\n metaDataId,\r\n securityDetails?.Factsheet\r\n );\r\n\r\n return data;\r\n }\r\n\r\n return '';\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { OVERVIEW_SIZE_SMALL, OverviewItem, OverviewPanel } from 'components/Overview';\r\nimport { TYPE_CURRENCY, TYPE_PERCENT, TYPE_TEXT } from 'utils/formatting';\r\n\r\nfunction Overview({\r\n currency,\r\n positionCurrency,\r\n positionValue,\r\n units,\r\n quantity,\r\n price,\r\n priceDate,\r\n costPrice,\r\n portfolioAllocation,\r\n onDownload,\r\n isFactsheet,\r\n isDownLoading,\r\n}) {\r\n const { t } = useTranslation();\r\n const showFullView = Number(quantity) > 0;\r\n\r\n return (\r\n
\r\n {isFactsheet && (\r\n // eslint-disable-next-line react/button-has-type\r\n \r\n {t('overview.downloadFactsheet')}\r\n \r\n )}\r\n \r\n
\r\n \r\n {showFullView && }\r\n
\r\n
\r\n {showFullView && (\r\n \r\n )}\r\n \r\n
\r\n {showFullView && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n
\r\n
\r\n );\r\n}\r\n\r\nOverview.propTypes = {\r\n currency: PropTypes.string,\r\n positionCurrency: PropTypes.string,\r\n positionValue: PropTypes.number,\r\n units: PropTypes.string,\r\n quantity: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n price: PropTypes.number,\r\n costPrice: PropTypes.number,\r\n portfolioAllocation: PropTypes.number,\r\n onDownload: PropTypes.func,\r\n isFactsheet: PropTypes.bool,\r\n priceDate: PropTypes.string.isRequired,\r\n isDownLoading: PropTypes.bool,\r\n};\r\n\r\nOverview.defaultProps = {\r\n isDownLoading: false,\r\n currency: '',\r\n positionCurrency: '',\r\n positionValue: undefined,\r\n units: '',\r\n quantity: 0,\r\n price: undefined,\r\n costPrice: undefined,\r\n portfolioAllocation: undefined,\r\n onDownload: () => {},\r\n isFactsheet: false,\r\n};\r\n\r\nexport default Overview;\r\n","import { find } from 'lodash/fp';\r\nimport { getfromDataObject, validateData, validateNumber, NA } from 'utils/formatting';\r\n\r\nexport const adaptPortfolioDetails = (data, positionId, getFormatedDate, getFormattedNumber) => {\r\n const positions = data.Positions || [];\r\n const item = positions.length ? find(['Id', Number(positionId)], positions) : '';\r\n const customAttr = item.CustomAttributes ? JSON.parse(item.CustomAttributes) : {};\r\n\r\n return {\r\n securityId: item ? item.Security.Id : null,\r\n portfolioName: getfromDataObject(data, 'Name'),\r\n productId: getfromDataObject(data.Product, 'Id'),\r\n quantity: item ? item.Quantity || 0 : 0,\r\n units: item\r\n ? getFormattedNumber(validateNumber(item.Quantity), {\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n })\r\n : 0,\r\n currency: validateData(\r\n item ? item.Security.Currency.CurrencyCode : data.Currency.CurrencyCode\r\n ),\r\n currencyId: validateData(item ? item.Security.Currency.Id : data.Currency.Id),\r\n positionCurrency: validateData(data.Currency.CurrencyCode),\r\n tradingPrice: item ? validateNumber(item.BuyPrice) : 0,\r\n priceDate: item.customAttr?.LastPriceDate\r\n ? getFormatedDate(item.customAttr.LastPriceDate)\r\n : NA,\r\n FxRate: item ? validateNumber(item.FxRate) : 0,\r\n factor: item && item?.Security.Factor ? validateNumber(item?.Security.Factor) : 1,\r\n portfolioAllocation: item ? validateNumber(item.Allocation) * 100 : 0,\r\n costPrice: item ? validateNumber(item.BuyPrice) : 0,\r\n performanceSP: validateNumber(customAttr.performanceSI),\r\n performanceYTD: validateNumber(customAttr.performanceYTD),\r\n };\r\n};\r\n","import { filter } from 'lodash/fp';\r\nimport { validateNumber } from 'utils/formatting';\r\n\r\nconst calcRoundingLot = (data) => (Math.log10(data) < 0 ? Math.abs(Math.log10(data)) : 0);\r\n\r\nexport const adaptSecurities = (data, { positionId }) => {\r\n const security = filter({ Id: Number(positionId) }, data.Securities);\r\n\r\n return {\r\n securityId: security.Id,\r\n name: security[0] ? security[0].Name : '',\r\n price: security[0] ? validateNumber(security[0].TradingPrice) : 0,\r\n tradingUnit: security[0] ? validateNumber(security[0].TradingUnit) : 0,\r\n roundingLot:\r\n security[0] && security[0].RoundingLot && security[0].RoundingLot > 0\r\n ? calcRoundingLot(security[0].RoundingLot)\r\n : 0,\r\n };\r\n};\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\n\r\nconst securityDetailsAdapter = (data) => {\r\n const customAttr = data.CustomAttributes ? JSON.parse(data.CustomAttributes) : {};\r\n\r\n return {\r\n ...data,\r\n performanceYTD: Math.round(customAttr.performanceYTD * 10000) / 100,\r\n };\r\n};\r\n\r\nexport const useSecurityDetails = (securityId) => {\r\n const [securityDetails, setData] = useState(null);\r\n const [isLoading, setLoading] = useState(false);\r\n const [isError, setError] = useState(null);\r\n const { i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (securityId) {\r\n setLoading(true);\r\n\r\n ServiceManager.instrumentsService('getSecurity', [securityId, i18n.language])\r\n .then((response) => {\r\n setData(securityDetailsAdapter(response.data));\r\n setLoading(false);\r\n })\r\n .catch((error) => {\r\n setError(error);\r\n setLoading(false);\r\n });\r\n }\r\n }, [securityId]);\r\n\r\n return { securityDetails, isLoading, isError };\r\n};\r\n","import React, { useCallback, useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Link } from 'react-router-dom';\r\nimport {\r\n Accordion,\r\n AccordionPanel as Panel,\r\n ContentBox,\r\n Title,\r\n Row,\r\n Column,\r\n BreadCrumbs,\r\n Button,\r\n} from 'ui-library';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { contactIdSelector } from 'redux/auth/authSelectors';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport history from 'services/core/history';\r\nimport { createBlobFile, openDocumentUrl } from 'utils/documentUtils';\r\nimport { getSecurityFactsheet } from 'services/custom/getSecurityFactsheet';\r\nimport { useFormatting } from 'locale';\r\n\r\nimport { GA_ACTIONS, GA_CATEGORIES, sendGAEvent } from 'utils/analytics';\r\nimport Overview from './components/Overview';\r\nimport { adaptPortfolioDetails } from './adapters/adaptPortfolioDetails';\r\nimport { adaptSecurities } from './adapters/adaptSecurities';\r\nimport { usePortfolioDetails } from '../../../common/hooks/usePortfolioDetails';\r\nimport { useSecuritiesSearch } from '../../../common/hooks/useSecuritiesSearch';\r\nimport { useSecurityDetails } from '../../../common/hooks/useSecurityDetails';\r\n\r\nfunction PositionDetailsOverview(props) {\r\n const {\r\n match: {\r\n params: { positionId, portfolioId, productId, tabId },\r\n },\r\n contactId: clientId,\r\n } = props;\r\n\r\n const [isDownLoading, setLoading] = useState(false);\r\n\r\n const {\r\n dataPortfolioDetails,\r\n isLoadingPortfolioDetails,\r\n errorPortfolioDetails,\r\n } = usePortfolioDetails(adaptPortfolioDetails, clientId, portfolioId, positionId);\r\n\r\n const { getFormattedDate } = useFormatting();\r\n const { i18n } = useTranslation();\r\n\r\n const { securityDetails } = useSecurityDetails(dataPortfolioDetails.securityId);\r\n const securityPriceDate = getFormattedDate(securityDetails?.PriceHistory[0]?.Date);\r\n\r\n const onDownloadFactsheet = useCallback(() => {\r\n setLoading(true);\r\n getSecurityFactsheet(securityDetails, i18n.language)\r\n .then((data) => {\r\n const newBlob = createBlobFile(data);\r\n\r\n openDocumentUrl(newBlob);\r\n sendGAEvent(GA_ACTIONS.factsheet, GA_CATEGORIES.download, newBlob.fileName);\r\n setLoading(false);\r\n })\r\n .catch((error) => {\r\n // eslint-disable-next-line no-console\r\n console.log(error);\r\n setLoading(false);\r\n });\r\n }, [securityDetails]);\r\n\r\n const { dataSecurities, isLoadingSecurities, errorSecurities } = useSecuritiesSearch(\r\n adaptSecurities,\r\n portfolioId,\r\n productId,\r\n null,\r\n positionId\r\n );\r\n\r\n const { t } = useTranslation();\r\n const defaultActiveKeyList = tabId === '1' ? ['1'] : ['1', '2'];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {t('portfolios.title')}\r\n \r\n {dataPortfolioDetails.portfolioName}\r\n \r\n \r\n \r\n {securityDetails?.Name}\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n history.goBack()}\r\n >\r\n {t('position.back')}\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nPositionDetailsOverview.propTypes = {\r\n match: PropTypes.shape({\r\n params: {\r\n portfolioId: PropTypes.string.isRequired,\r\n positionId: PropTypes.string.isRequired,\r\n productId: PropTypes.string.isRequired,\r\n tabId: PropTypes.string.isRequired,\r\n },\r\n url: PropTypes.string,\r\n path: PropTypes.string,\r\n }).isRequired,\r\n contactId: PropTypes.number.isRequired,\r\n};\r\n\r\nPositionDetailsOverview.defaultProps = {};\r\n\r\nconst mapStateToProps = (state) => ({\r\n contactId: contactIdSelector(state),\r\n});\r\n\r\nexport default connect(mapStateToProps)(PositionDetailsOverview);\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { useFormatting } from 'locale';\r\n\r\nexport const usePortfolioDetails = (adaptPortfolioDetails, clientId, portfolioId, positionId) => {\r\n const [errorPortfolioDetails, setError] = useState(null);\r\n const [isLoadingPortfolioDetails, setLoading] = useState(true);\r\n const [dataPortfolioDetails, setData] = useState({ title: '', positions: [], overview: {} });\r\n const { i18n } = useTranslation();\r\n const { getFormattedDate, getFormattedNumber } = useFormatting();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n const params = { language: i18n.language };\r\n\r\n ServiceManager.portfolioManagement('getPortfolioDetails', [portfolioId, clientId, params])\r\n .then((response) => {\r\n try {\r\n setData(\r\n adaptPortfolioDetails(\r\n response.data,\r\n positionId,\r\n getFormattedDate,\r\n getFormattedNumber\r\n )\r\n );\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, [clientId, portfolioId, positionId, i18n.language]);\r\n\r\n return { dataPortfolioDetails, isLoadingPortfolioDetails, errorPortfolioDetails };\r\n};\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\n\r\nexport const useSecuritiesSearch = (adaptSecurities, portfolioId, productId, data, positionId) => {\r\n const [errorSecurities, setError] = useState(null);\r\n const [isLoadingSecurities, setLoading] = useState(true);\r\n const [dataSecurities, setData] = useState([]);\r\n const [totalSecurities, setTotalSecurities] = useState(0);\r\n const { i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n ServiceManager.instrumentsService('searchSecurities', [\r\n productId,\r\n data || {\r\n Page: 1,\r\n PageSize: 1000,\r\n },\r\n { language: i18n.language },\r\n ])\r\n .then((response) => {\r\n try {\r\n setData(\r\n adaptSecurities(response.data, {\r\n portfolioId,\r\n productId,\r\n positionId,\r\n })\r\n );\r\n setTotalSecurities(response.data.TotalNumberOfResults || 0);\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, [portfolioId, productId, data, i18n.language]);\r\n\r\n return {\r\n dataSecurities,\r\n totalSecurities,\r\n isLoadingSecurities,\r\n errorSecurities,\r\n };\r\n};\r\n","import React, { useState } from 'react';\r\nimport { TabPane, Tabs, TabsExtraItem } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport PropTypes from 'prop-types';\r\nimport { allocationPercentFormat } from 'utils/formatting';\r\nimport { BAR, LIST } from 'constants/constants';\r\nimport ChartType from 'components/organisms/ChartType';\r\nimport { useDetectedMobileDevice } from 'hooks/useDetectedMobileDevice';\r\nimport { useFormatting } from 'locale';\r\n\r\nfunction Allocation({ data, isLoading, error }) {\r\n const { t } = useTranslation();\r\n const { isMobileSize } = useDetectedMobileDevice();\r\n const { getFormattedCurrency } = useFormatting();\r\n const [chartView, setChartView] = useState(BAR);\r\n\r\n const changeView = (type) => () => setChartView(type);\r\n const numberFormat = (number) =>\r\n getFormattedCurrency(number, {\r\n currency: data.currency,\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n });\r\n const labelFormat = (label, value) =>\r\n `${numberFormat(value)}`;\r\n\r\n const percentFormat = isMobileSize ? undefined : allocationPercentFormat;\r\n\r\n const tabBarExtraContent = () => (\r\n <>\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n {data.chart.map((item, i) => (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n ))}\r\n \r\n
\r\n );\r\n}\r\n\r\nAllocation.propTypes = {\r\n data: PropTypes.shape({\r\n chart: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string,\r\n data: PropTypes.shape({\r\n [PropTypes.string]: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string,\r\n value: PropTypes.number,\r\n })\r\n ),\r\n }),\r\n })\r\n ),\r\n currency: PropTypes.string,\r\n }),\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n};\r\n\r\nAllocation.defaultProps = {\r\n data: { chart: [] },\r\n isLoading: true,\r\n error: null,\r\n};\r\n\r\nexport default Allocation;\r\n","import React, { Fragment } from 'react';\r\nimport { OverviewItem, OverviewPanel } from 'components/Overview';\r\nimport { TYPE_CURRENCY, TYPE_PERCENT } from 'utils/formatting';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nfunction Overview({ data }) {\r\n const { t } = useTranslation();\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\nOverview.propTypes = {\r\n data: PropTypes.shape({\r\n currency: PropTypes.string,\r\n portfolioValue: PropTypes.number,\r\n strategy: PropTypes.string,\r\n product: PropTypes.string,\r\n performance: PropTypes.number,\r\n sharpRatio: PropTypes.number,\r\n expectedReturn: PropTypes.number,\r\n expectedRisk: PropTypes.number,\r\n firstInvestment: PropTypes.string,\r\n performanceYTD: PropTypes.number,\r\n firstInvestmentDate: PropTypes.string,\r\n }),\r\n};\r\n\r\nOverview.defaultProps = {\r\n data: {},\r\n};\r\n\r\nexport default Overview;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Table } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport { CURRENT_PAGE, PAGE_SIZE, TOTAL_PAGES } from 'constants/constants';\r\nimport { useDetectedMobileDevice } from 'hooks/useDetectedMobileDevice';\r\nimport { useFormatting } from 'locale';\r\nimport { positionsColumns, positionsMobileColumns } from '../constants';\r\n\r\nfunction Positions({ data, isLoading, error }) {\r\n const { t } = useTranslation();\r\n const { isMobileSize } = useDetectedMobileDevice();\r\n const { getFormattedNumber } = useFormatting();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nPositions.propTypes = {\r\n data: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string,\r\n data: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n Name: PropTypes.string,\r\n Product: PropTypes.string,\r\n Profile: PropTypes.string,\r\n Value: PropTypes.string,\r\n Performance: PropTypes.string,\r\n Icon: PropTypes.string,\r\n subRows: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n Name: PropTypes.string,\r\n Product: PropTypes.string,\r\n Profile: PropTypes.string,\r\n Value: PropTypes.string,\r\n Performance: PropTypes.string,\r\n Icon: PropTypes.string,\r\n })\r\n ),\r\n })\r\n ),\r\n })\r\n ),\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n};\r\n\r\nPositions.defaultProps = {\r\n data: [],\r\n isLoading: true,\r\n error: null,\r\n};\r\n\r\nexport default Positions;\r\n","import React, { Fragment, useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Column, TabPane, Tabs, Row, Label as LabelUI, Select, TabsExtraItem } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport { formatBigNumber } from 'utils/formatting';\r\nimport { MONTH_TO_MONTH, getPerformanceSelectOptions } from 'filters/investementPerformanceFilters';\r\nimport { LINE } from 'constants/constants';\r\nimport ChartType from 'components/organisms/ChartType';\r\nimport MonthRangePicker from 'components/MonthRangePicker';\r\n\r\nfunction Analysis({ data, performanceFilter, onFilterChange, setPerformanceDates }) {\r\n const { t } = useTranslation();\r\n const [startDate, setStartDate] = useState(null);\r\n const [endDate, setEndDate] = useState(null);\r\n\r\n useEffect(() => {\r\n if (startDate && endDate) {\r\n setPerformanceDates({ startDate, endDate });\r\n }\r\n }, [startDate, endDate]);\r\n\r\n useEffect(() => {\r\n if (performanceFilter !== MONTH_TO_MONTH) {\r\n setStartDate(null);\r\n setEndDate(null);\r\n }\r\n }, [performanceFilter]);\r\n\r\n const monthFrom = {\r\n startDate,\r\n setStartDate,\r\n placeholder: 'dashboard.assetDevelopment.filters.from',\r\n };\r\n const monthTo = {\r\n endDate,\r\n setEndDate,\r\n placeholder: 'dashboard.assetDevelopment.filters.to',\r\n };\r\n\r\n const labelFormat = (label, values = {}) => {\r\n const valuesFormatted =\r\n values.new !== undefined\r\n ? `${formatBigNumber(values.new)}% (${t('confirmation.toDate')} ${formatBigNumber(\r\n values.curr\r\n )}%)`\r\n : `${formatBigNumber(values.curr)}%`;\r\n\r\n return [, valuesFormatted];\r\n };\r\n\r\n return (\r\n \r\n {performanceFilter === MONTH_TO_MONTH && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n >\r\n {Object.keys(data).map((key) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nAnalysis.propTypes = {\r\n data: PropTypes.shape({\r\n [LINE]: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n name: PropTypes.string,\r\n data: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.number)),\r\n })\r\n ),\r\n }),\r\n performanceFilter: PropTypes.string,\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.oneOf([PropTypes.bool, PropTypes.string]),\r\n onFilterChange: PropTypes.func.isRequired,\r\n setPerformanceDates: PropTypes.func.isRequired,\r\n};\r\n\r\nAnalysis.defaultProps = {\r\n data: { chart: [] },\r\n performanceFilter: undefined,\r\n isLoading: true,\r\n error: null,\r\n};\r\n\r\nconst areEqual = (prevProps, nextProps) => JSON.stringify(prevProps) === JSON.stringify(nextProps);\r\nconst AnalysisWithMemo = React.memo(Analysis, areEqual);\r\n\r\nexport default AnalysisWithMemo;\r\n","/* eslint-disable no-param-reassign,no-multi-assign */\r\nimport { isUndefined } from 'lodash/fp';\r\nimport { getParent, roundAllocations, sortAssetsByOrderPropOrAllocation } from 'utils';\r\nimport { allocationPercentFormat, formatPercentage, NA } from 'utils/formatting';\r\nimport { BAR, LIST } from 'constants/constants';\r\nimport { toPascalCase } from 'utils/toPascalCase';\r\nimport { ASSET_STRATEGY_IDS, getAssetClassOrder } from '../../SinglePortfolioView/constants';\r\n\r\nconst adaptChartTypes = (data, currency, chartTypesList, getFormattedCurrency) => ({\r\n [BAR]: chartTypesList.includes(BAR)\r\n ? {\r\n data: [\r\n {\r\n data: data.map(({ value }) => value),\r\n },\r\n ],\r\n labels: data.map((item) => `${item.name} ${allocationPercentFormat(item.percent)}`),\r\n }\r\n : undefined,\r\n [LIST]: chartTypesList.includes(LIST)\r\n ? {\r\n data: data.map((item) => ({\r\n name: item.name,\r\n value: getFormattedCurrency(item.value, {\r\n currency,\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n }),\r\n percent: allocationPercentFormat(item.percent),\r\n children: item.children,\r\n })),\r\n }\r\n : undefined,\r\n});\r\n\r\nconst getAmount = (amount, percentage, investmentValuePortfolioCurrency, securitiesValue) => {\r\n if (investmentValuePortfolioCurrency) {\r\n return (amount || 0) + investmentValuePortfolioCurrency;\r\n }\r\n if (!isUndefined(securitiesValue)) {\r\n return (percentage * securitiesValue) / 100;\r\n }\r\n\r\n return amount || 0;\r\n};\r\n\r\nconst getChildren = (\r\n name,\r\n allocation,\r\n investmentValuePortfolioCurrency,\r\n securitiesValue,\r\n id,\r\n percent\r\n) => {\r\n const val =\r\n investmentValuePortfolioCurrency ||\r\n (!isUndefined(securitiesValue) ? allocation * securitiesValue : undefined);\r\n\r\n return {\r\n id,\r\n name,\r\n percent: isUndefined(percent) ? allocation * 100 : percent,\r\n value: isUndefined(val) ? 0 : val,\r\n };\r\n};\r\n\r\nconst getPercentage = (percentage, allocation) => (percentage || 0) + allocation;\r\n\r\nexport const buildAllocationGroup = (positions, currencyPortfolio, t, securitiesValue) => {\r\n const percents = roundAllocations(positions, 100, 1);\r\n\r\n return positions.reduce(\r\n (obj, item) => {\r\n const result = { ...obj };\r\n\r\n const allocation = percents.find(({ id }) => id === item.Security.Id)\r\n ? percents.find(({ id }) => id === item.Security.Id).value\r\n : item.Allocation * 100;\r\n\r\n const assetClass = item.Security.AssetClass;\r\n\r\n if (assetClass) {\r\n // strategy level\r\n const assetId = assetClass.Id;\r\n const assetName = getParent(assetClass).Name;\r\n const asset = (result.asset[assetName] = result.asset[assetName] || {\r\n children: [],\r\n sortingOrder: getAssetClassOrder(assetId),\r\n });\r\n\r\n asset.percentage = getPercentage(asset.percentage, allocation);\r\n asset.amount = getAmount(\r\n asset.amount,\r\n asset.percentage,\r\n item.InvestmentValuePortfolioCurrency,\r\n securitiesValue\r\n );\r\n\r\n const assetInd = asset.children.findIndex((child) => child.id === assetClass.Id);\r\n const child = getChildren(\r\n assetClass.Name,\r\n item.Allocation,\r\n item.InvestmentValuePortfolioCurrency,\r\n securitiesValue,\r\n assetClass.Id,\r\n percents.find(({ id }) => id === item.Security.Id).value\r\n );\r\n\r\n if (assetInd !== -1) {\r\n asset.children[assetInd].percent += child.percent;\r\n asset.children[assetInd].value += child.value;\r\n } else {\r\n asset.children.push(child);\r\n }\r\n\r\n // sub-strategy level\r\n const typeName =\r\n ASSET_STRATEGY_IDS.indexOf(assetClass.Id) >= 0\r\n ? toPascalCase(assetClass.Name)\r\n : assetClass.Name;\r\n const type = (result.type[typeName] = result.type[typeName] || {\r\n sortingOrder: getAssetClassOrder(assetId),\r\n });\r\n\r\n type.percentage = getPercentage(type.percentage, allocation);\r\n type.amount = getAmount(\r\n type.amount,\r\n type.percentage,\r\n item.InvestmentValuePortfolioCurrency,\r\n securitiesValue\r\n );\r\n }\r\n\r\n if (item.Security.Currency !== undefined) {\r\n const currencyName = item.Security.Currency.Name;\r\n const currency = (obj.currency[currencyName] = obj.currency[currencyName] || {});\r\n\r\n currency.percentage = getPercentage(currency.percentage, allocation);\r\n currency.amount = getAmount(\r\n currency.amount,\r\n currency.percentage,\r\n item.InvestmentValuePortfolioCurrency,\r\n securitiesValue\r\n );\r\n }\r\n\r\n return result;\r\n },\r\n {\r\n asset: {},\r\n type: {},\r\n currency: {},\r\n }\r\n );\r\n};\r\n\r\nexport const adaptAllocationGroups = (\r\n { positions, currency, t, securitiesValue, chartTypesList = [BAR, LIST] },\r\n getFormattedCurrency\r\n) => {\r\n const groups = buildAllocationGroup(positions, currency, t, securitiesValue);\r\n\r\n const gruopArrays = Object.keys(groups).map((groupKey) => {\r\n const group = groups[groupKey];\r\n\r\n return Object.keys(group)\r\n .map((key) => ({\r\n sortingOrder: group[key].sortingOrder,\r\n name: key,\r\n value: group[key].amount,\r\n percent: group[key].percentage,\r\n children: group[key].children\r\n ? group[key].children.map((item) => ({\r\n percent: allocationPercentFormat(item.percent),\r\n name: item.name ? toPascalCase(item.name) : NA,\r\n value: item.value\r\n ? getFormattedCurrency(item.value, {\r\n currency,\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n })\r\n : NA,\r\n }))\r\n : undefined,\r\n label: formatPercentage(group[key].percentage),\r\n }))\r\n .sort(sortAssetsByOrderPropOrAllocation);\r\n });\r\n\r\n return [\r\n {\r\n name: t('allocationTabs.strategyAllocation'),\r\n data: adaptChartTypes(gruopArrays[0], currency, chartTypesList, getFormattedCurrency),\r\n },\r\n {\r\n name: t('allocationTabs.subStrategy'),\r\n data: adaptChartTypes(gruopArrays[1], currency, chartTypesList, getFormattedCurrency),\r\n },\r\n {\r\n name: t('allocationTabs.currencies'),\r\n data: adaptChartTypes(gruopArrays[2], currency, chartTypesList, getFormattedCurrency),\r\n },\r\n ];\r\n};\r\n","import { roundAllocations } from 'utils';\r\n\r\nexport const getAllocations = (data) => {\r\n const roundedAllocations = data.length ? roundAllocations(data, 1000, 1000) : [];\r\n\r\n return roundedAllocations\r\n .map(({ id, value }) => ({\r\n Allocation: Number(value),\r\n InstrumentId: id,\r\n Notes: [],\r\n IsNotAdvised: false,\r\n }))\r\n .filter(({ Allocation }) => Allocation !== 0);\r\n};\r\n","import history from 'services/core/history';\r\nimport { LIQUIDITY_TYPE_ID } from 'constants/constants';\r\nimport { getfromDataObject } from 'utils/formatting';\r\n\r\nexport const isLiquidity = (item) => getfromDataObject(item, 'Type.Id') === LIQUIDITY_TYPE_ID;\r\n\r\nexport const redirectToReadOnlyPositionDetails = (baseUrl, positionId, tabId) =>\r\n history.push(`${baseUrl}/${positionId}/${tabId}/overview`);\r\n","import { getParent, roundAllocations, sum, sortAssetsByOrderPropOrAllocation } from 'utils';\r\nimport {\r\n formatBigNumber,\r\n getfromDataObject,\r\n NA,\r\n percentIsZero,\r\n validateData,\r\n validateNumber,\r\n} from 'utils/formatting';\r\nimport { isLiquidity, redirectToReadOnlyPositionDetails } from '../../common/utils';\r\nimport { getAssetClassOrder } from '../constants';\r\n\r\nconst groupBySubStrategy = (data) => {\r\n if (data && data.length) {\r\n data.forEach((position) => {\r\n let childCurrentType = '';\r\n const groupingIndexes = [];\r\n\r\n position.children.forEach((child, index) => {\r\n if (childCurrentType !== child.subAssetClass) {\r\n childCurrentType = child.subAssetClass;\r\n groupingIndexes.push({ index, type: childCurrentType });\r\n }\r\n });\r\n\r\n groupingIndexes.forEach((groupIndexObj, index) => {\r\n if (\r\n (groupIndexObj.index === 0 &&\r\n position.children[groupIndexObj.index + index].grouping === undefined) ||\r\n (groupIndexObj.index !== 0 &&\r\n position.children[groupIndexObj.index + index - 1].grouping === undefined &&\r\n position.children[groupIndexObj.index + index].grouping === undefined)\r\n )\r\n position.children.splice(groupIndexObj.index + index, 0, {\r\n name: { label: groupIndexObj.type, link: '', maxLength: 75 },\r\n grouping: '',\r\n actions: {},\r\n });\r\n });\r\n });\r\n }\r\n\r\n return data;\r\n};\r\n\r\nexport const groupPortfolioPositions = (\r\n data,\r\n portfolioCurrency,\r\n baseUrl,\r\n t,\r\n getFormattedNumber,\r\n getFormattedCurrency,\r\n getFormattedDate\r\n) => {\r\n const roundedAllocation = data.length && roundAllocations(data);\r\n const groupToValues = data.reduce((obj, item) => {\r\n const securityData = item.Security;\r\n const accumulator = { ...obj };\r\n const roundedAlloc = roundedAllocation.find((n) => n.id === securityData.Id).value;\r\n\r\n const accParent = getParent(item.Security.AssetClass);\r\n const currency = validateData(securityData.Currency.CurrencyCode);\r\n const name = validateData(securityData.Name);\r\n const customAttr = item.CustomAttributes ? JSON.parse(item.CustomAttributes) : {};\r\n const isLiquidityPosition = isLiquidity(securityData);\r\n\r\n accumulator[accParent.Name] = obj[accParent.Name] || [];\r\n accumulator[accParent.Name].push({\r\n sortingOrder: getAssetClassOrder(getfromDataObject(item.Security.AssetClass, 'Id')), // sub-strategies order property\r\n parentId: accParent.Id,\r\n isin: validateData(securityData.Isin),\r\n securityId: validateNumber(securityData.Id),\r\n url: '',\r\n name: {\r\n label: name,\r\n link: isLiquidityPosition ? undefined : `${baseUrl}/${item.Id}/2/overview`,\r\n maxLength: 75,\r\n },\r\n allocationData: roundedAlloc,\r\n allocation: `${percentIsZero(roundedAlloc)}%`,\r\n currency,\r\n units: getFormattedNumber(validateNumber(item.Quantity), {\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n }),\r\n performance:\r\n isLiquidityPosition || !customAttr.performanceSI\r\n ? null\r\n : Math.round(customAttr.performanceSI * 10000) / 100,\r\n performanceYTD:\r\n isLiquidityPosition || !customAttr.performanceYTD\r\n ? null\r\n : Math.round(customAttr.performanceYTD * 10000) / 100,\r\n latestPrice: getFormattedNumber(validateNumber(item.ValuationPrice), {\r\n maximumFractionDigits: 2,\r\n minimumFractionDigits: 2,\r\n }),\r\n latestPriceDate: customAttr.LastPriceDate\r\n ? getFormattedDate(customAttr.LastPriceDate)\r\n : NA,\r\n valuation: getFormattedCurrency(validateNumber(item.InvestmentValuePortfolioCurrency), {\r\n currency: portfolioCurrency,\r\n }),\r\n subAssetClass: getfromDataObject(item.Security.AssetClass, 'Name'),\r\n type: getfromDataObject(item.Security.Type, 'Name'),\r\n // API gives customAttr.UnrealizedGainLoss as a string,\r\n // so we transform it to the number format to apply formatting\r\n unrealizedGainLoss:\r\n isLiquidityPosition || !customAttr.UnrealizedGainLoss\r\n ? null\r\n : getFormattedNumber(customAttr.UnrealizedGainLoss, {\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n }),\r\n costPrice: getFormattedNumber(item.BuyPrice, {\r\n maximumFractionDigits: 2,\r\n minimumFractionDigits: 2,\r\n }),\r\n valuationInSecurityCurrency: getFormattedCurrency(\r\n validateNumber(item.InvestmentValueSecurityCurrency),\r\n { currency: item.Security.Currency.CurrencyCode }\r\n ),\r\n valuationData: validateNumber(item.InvestmentValuePortfolioCurrency),\r\n performanceCCY: validateNumber(item.MonetaryPerformance),\r\n actions: isLiquidity(securityData)\r\n ? {}\r\n : {\r\n value: 'action',\r\n actions: [\r\n {\r\n text: t('portfolios.showMoreDetails'),\r\n onClick: () => redirectToReadOnlyPositionDetails(baseUrl, item.Id, 1),\r\n },\r\n {\r\n text: t('portfolios.showPerformance'),\r\n onClick: () => redirectToReadOnlyPositionDetails(baseUrl, item.Id, 2),\r\n },\r\n ],\r\n },\r\n });\r\n\r\n return accumulator;\r\n }, {});\r\n\r\n let groups = Object.keys(groupToValues).map((key) => {\r\n const groupMembersData = groupToValues[key];\r\n\r\n const allocation = getFormattedNumber(\r\n percentIsZero(formatBigNumber(sum(groupMembersData, 'allocationData')))\r\n );\r\n\r\n return {\r\n id: groupMembersData[0].parentId,\r\n sortingOrder: getAssetClassOrder(groupMembersData[0].parentId), // strategies order property\r\n valuation: getFormattedCurrency(sum(groupMembersData, 'valuationData'), {\r\n currency: portfolioCurrency,\r\n }),\r\n allocation: `${allocation}%`,\r\n allocationData: sum(groupMembersData, 'allocationData'),\r\n name: key,\r\n children: groupMembersData.sort(sortAssetsByOrderPropOrAllocation), // sub-strategies level sorting\r\n icon: 'action',\r\n costPrice: groupMembersData.costPrice,\r\n actions: {},\r\n lastPriceDate: groupMembersData.latestPriceDate,\r\n };\r\n });\r\n\r\n groups = groups\r\n .map((groupItem) => {\r\n const resultGroupItem = { ...groupItem };\r\n\r\n resultGroupItem.valuation = groupItem.valuation;\r\n\r\n resultGroupItem.children = resultGroupItem.children.map((groupMemberItem) => {\r\n const resultGroupMemberItem = groupMemberItem;\r\n\r\n resultGroupMemberItem.valuation = groupMemberItem.valuation;\r\n resultGroupMemberItem.icon = 'action';\r\n\r\n return resultGroupMemberItem;\r\n });\r\n\r\n return resultGroupItem;\r\n })\r\n .sort(sortAssetsByOrderPropOrAllocation); // strategies level sorting\r\n\r\n return groupBySubStrategy(groups);\r\n};\r\n","import { getfromDataObject, NA } from 'utils/formatting';\r\nimport { adaptAllocationGroups } from '../../common/adapters/adaptAllocationGroups';\r\nimport { getAllocations } from '../../common/adapters/adaptAllocations';\r\nimport { groupPortfolioPositions } from './groupPortfolioPositions';\r\n\r\nexport const adaptPortfolioDetails = (\r\n data,\r\n t,\r\n getFormattedDate,\r\n getFormattedNumber,\r\n getFormattedCurrency\r\n) => {\r\n let currency;\r\n let currencyId;\r\n const productID = getfromDataObject(data, 'Product.Id');\r\n const baseUrl = `/portfolios/${data.Id}/position/${productID}`;\r\n\r\n if (data && data.Currency) {\r\n currency = data.Currency.CurrencyCode;\r\n currencyId = data.Currency.Id;\r\n } else if (data && data.BaseCurrency) {\r\n currency = data.BaseCurrency.CurrencyCode;\r\n currencyId = data.BaseCurrency.Id;\r\n }\r\n\r\n const customAttr = data.CustomAttributes ? JSON.parse(data.CustomAttributes) : {};\r\n\r\n return {\r\n backTitle: getfromDataObject(data, 'Name'),\r\n title: getfromDataObject(data, 'Name'),\r\n currency,\r\n currencyId,\r\n updateDate: customAttr.UpdateDate ? getFormattedDate(customAttr.UpdateDate) : NA,\r\n overview: {\r\n portfolioValue: data.CurrentValue || 0,\r\n currency,\r\n strategy: getfromDataObject(data, 'RiskCategory.Name'),\r\n product: getfromDataObject(data, 'Product.Name'),\r\n performance: Math.round(customAttr.performanceSI * 10000) / 100,\r\n performanceYTD: Math.round(customAttr.performanceYTD * 10000) / 100,\r\n },\r\n constraints: data.OptimisationConstraint || {},\r\n investmentAllocations: getAllocations(data.Positions),\r\n investmentAllocation: {\r\n chart: adaptAllocationGroups(\r\n {\r\n positions: data.Positions || data.ConsolidatedPositions,\r\n currency,\r\n t,\r\n },\r\n getFormattedCurrency\r\n ),\r\n currency,\r\n },\r\n productId: productID,\r\n positionsRaw: data.Positions,\r\n positions: groupPortfolioPositions(\r\n data.Positions,\r\n currency,\r\n baseUrl,\r\n t,\r\n getFormattedNumber,\r\n getFormattedCurrency,\r\n getFormattedDate\r\n ),\r\n riskReturn: [+(data.Risk * 100), +(data.Return * 100)],\r\n HistoricalPerformance: data.HistoricalPerformance,\r\n };\r\n};\r\n","import { checkNullData } from 'utils';\r\nimport { getTimestamp, getDatesDifference } from 'utils/datetime';\r\nimport { adaptPlotsAmount } from 'utils/adaptPlotsAmount';\r\n\r\nexport const filterHistoricalPerformanceByDates = (\r\n historicalPerformance,\r\n { startDate, endDate }\r\n) => {\r\n const performanceValues = historicalPerformance.Values || [];\r\n\r\n if (!startDate && !endDate) {\r\n return performanceValues;\r\n }\r\n\r\n const filteredValues = [];\r\n\r\n // eslint-disable-next-line no-plusplus\r\n for (let i = 0; i < performanceValues.length; i++) {\r\n if (\r\n getDatesDifference(performanceValues[i].Date, startDate, 'days') >= 0 &&\r\n getDatesDifference(performanceValues[i].Date, endDate, 'days') <= 0\r\n ) {\r\n filteredValues.push(performanceValues[i]);\r\n }\r\n }\r\n\r\n return filteredValues;\r\n};\r\n\r\nexport const adaptPerformancePlots = (data, isMobileSize) => {\r\n if (checkNullData(data)) return [];\r\n\r\n const values = adaptPlotsAmount(data, isMobileSize);\r\n const adaptedData = [];\r\n const basePerformance = values[0].Value;\r\n\r\n values.forEach(({ Value, Date }) => {\r\n const graphPerformance = (Value + 1) / (basePerformance + 1) - 1;\r\n\r\n adaptedData.push([getTimestamp(Date), Math.round(graphPerformance * 10000) / 100]);\r\n });\r\n\r\n return adaptedData;\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { formatWithDate } from 'utils/formatting';\r\nimport { SINCE_INCEPTION } from 'filters/investementPerformanceFilters';\r\nimport { LINE } from 'constants/constants';\r\nimport { useFormatting } from 'locale';\r\nimport { useDetectedMobileDevice } from 'hooks/useDetectedMobileDevice';\r\nimport { GA_ACTIONS, GA_CATEGORIES, sendGAEvent } from 'utils/analytics';\r\nimport { getPerformancePeriodByFilterOrDates } from 'utils/charts';\r\nimport {\r\n adaptPerformancePlots,\r\n filterHistoricalPerformanceByDates,\r\n} from '../adapters/adaptPerformanceAndRiskCompare';\r\n\r\nexport const usePerformanceAndRiskCompare = (portfolio, isLoading, defaultFilter, filterDates) => {\r\n const { t } = useTranslation();\r\n const { isMobileSize } = useDetectedMobileDevice();\r\n const [performanceFilter, setPerformanceFilter] = useState(defaultFilter || SINCE_INCEPTION);\r\n const [isLoadingPerformanceAndRisk, setLoading] = useState(true);\r\n const [errorPerformanceAndRisk, setError] = useState(null);\r\n const [performance, setPerformance] = useState({\r\n title: t('confirmation.performance'),\r\n data: [],\r\n });\r\n\r\n const { getFormattedNumber, getFormattedDate } = useFormatting();\r\n\r\n const yAxisFormat = ({ value }) => `${getFormattedNumber(value)}%`;\r\n const tooltipFormat = (number, date) =>\r\n formatWithDate(`${getFormattedNumber(number)}%`, date, getFormattedDate);\r\n\r\n useEffect(() => {\r\n if (!isLoading && portfolio.HistoricalPerformance) {\r\n setError(null);\r\n setLoading(true);\r\n const dates = getPerformancePeriodByFilterOrDates(performanceFilter, filterDates);\r\n const filteredPerformance = filterHistoricalPerformanceByDates(\r\n portfolio.HistoricalPerformance[0],\r\n dates\r\n );\r\n const performanceData = filteredPerformance.length\r\n ? [\r\n {\r\n name: t('confirmation.current'),\r\n data: adaptPerformancePlots(filteredPerformance, isMobileSize),\r\n tooltipFormat,\r\n },\r\n ]\r\n : [];\r\n\r\n setPerformance({\r\n title: t('confirmation.performance'),\r\n data: performanceData,\r\n optional: {\r\n tooltipFormat,\r\n yAxisFormat,\r\n },\r\n });\r\n setLoading(false);\r\n }\r\n }, [isLoading, portfolio, performanceFilter, filterDates]);\r\n\r\n const onPerformanceChange = useCallback((param) => {\r\n sendGAEvent(GA_ACTIONS.changePerformanceFilter, GA_CATEGORIES.portfolio, param);\r\n setLoading(true);\r\n setPerformanceFilter(param);\r\n }, []);\r\n\r\n return {\r\n performanceAndRisk: {\r\n [LINE]: {\r\n ...performance,\r\n error: errorPerformanceAndRisk,\r\n isLoading: isLoadingPerformanceAndRisk,\r\n },\r\n },\r\n errorPerformanceAndRisk,\r\n isLoadingPerformanceAndRisk,\r\n performanceFilter,\r\n onPerformanceChange,\r\n };\r\n};\r\n","import React, { useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Link } from 'react-router-dom';\r\nimport {\r\n Accordion,\r\n AccordionPanel as Panel,\r\n ContentBox,\r\n Title,\r\n Row,\r\n Column,\r\n BreadCrumbs,\r\n} from 'ui-library';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\n// import { contactIdSelector, roleIdSelector } from 'redux/auth/authSelectors'; [NS-720] temporary disabled\r\nimport { contactIdSelector } from 'redux/auth/authSelectors';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { YTD } from 'filters/investementPerformanceFilters';\r\n// import ReportGenerationButton from './components/ReportGenerationButton'; [NS-720] temporary disabled\r\nimport Allocation from './components/Allocation';\r\nimport Overview from './components/Overview';\r\nimport Positions from './components/Positions';\r\nimport Analysis from '../common/components/Analysis';\r\nimport { usePortfolioDetails } from './hooks/usePortfolioDetails';\r\nimport { useAnalysisDetails } from '../common/hooks/useAnalysisDetails';\r\n\r\nfunction SinglePortfolioView(props) {\r\n const {\r\n match: {\r\n params: { portfolioId },\r\n },\r\n } = props;\r\n // const { contactId: clientId, roleId } = props; [NS-720] temporary disabled\r\n const { contactId: clientId } = props;\r\n const [performanceDates, setPerformanceDates] = useState({});\r\n const { data, isLoading, error } = usePortfolioDetails(clientId, portfolioId);\r\n const { analysisData, onPerformanceChange, performanceFilter } = useAnalysisDetails(\r\n data,\r\n isLoading,\r\n YTD,\r\n performanceDates\r\n );\r\n\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('portfolios.title')}\r\n \r\n \r\n {data.title}\r\n \r\n

\r\n {t('portfolios.updated')}\r\n  \r\n {data.updateDate}\r\n

\r\n {/* [NS-720] temporary disabled */}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nSinglePortfolioView.propTypes = {\r\n match: PropTypes.shape({\r\n params: {\r\n portfolioId: PropTypes.string.isRequired,\r\n },\r\n path: PropTypes.string,\r\n }).isRequired,\r\n contactId: PropTypes.number.isRequired,\r\n // roleId: PropTypes.number, [NS-720] temporary disabled\r\n};\r\n\r\nSinglePortfolioView.defaultProps = {\r\n // roleId: null, [NS-720] temporary disabled\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n contactId: contactIdSelector(state),\r\n // roleId: roleIdSelector(state), [NS-720] temporary disabled\r\n});\r\n\r\nexport default connect(mapStateToProps)(SinglePortfolioView);\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { useFormatting, useLocale } from 'locale';\r\nimport { adaptPortfolioDetails } from '../adapters/adaptPortfolioDetails';\r\n\r\nexport const usePortfolioDetails = (clientId, portfolioId) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState({\r\n investmentAllocation: { chart: [{ data: { pie: {}, bar: {}, list: {} } }] },\r\n positions: [],\r\n positionsRaw: [],\r\n });\r\n const { i18n } = useTranslation();\r\n const { t } = useTranslation();\r\n const { locale } = useLocale();\r\n const { getFormattedDate, getFormattedNumber, getFormattedCurrency } = useFormatting();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n const params = { language: i18n.language };\r\n\r\n (async () => {\r\n try {\r\n const response = await ServiceManager.portfolioManagement('getPortfolioDetails', [\r\n portfolioId,\r\n clientId,\r\n params,\r\n ]);\r\n const { ModelPortfolioId } = response.data;\r\n\r\n if (response.data && response.data.Positions) {\r\n response.data.Positions.sort(function (a, b) {\r\n return parseFloat(b.Allocation) - parseFloat(a.Allocation);\r\n });\r\n }\r\n\r\n let modelData = {};\r\n\r\n if (ModelPortfolioId) {\r\n modelData = await ServiceManager.portfolioManagement('getModelPortfolio', [\r\n ModelPortfolioId,\r\n params,\r\n ]);\r\n }\r\n\r\n try {\r\n setData(\r\n adaptPortfolioDetails(\r\n { ...modelData.data, ...response.data },\r\n t,\r\n getFormattedDate,\r\n getFormattedNumber,\r\n getFormattedCurrency\r\n )\r\n );\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n } catch (err) {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n }\r\n })();\r\n }, [i18n.language, locale]);\r\n\r\n return { data, isLoading, error };\r\n};\r\n","import { usePerformanceAndRiskCompare } from './usePerformanceAndRiskCompare';\r\n\r\nexport const useAnalysisDetails = (portfolio, isLoading, defaultFilter, performanceDates) => {\r\n const {\r\n performanceAndRisk: analysisData,\r\n performanceFilter,\r\n onPerformanceChange,\r\n } = usePerformanceAndRiskCompare(portfolio, isLoading, defaultFilter, performanceDates);\r\n\r\n return {\r\n analysisData,\r\n performanceFilter,\r\n onPerformanceChange,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { ContentBox, Table, Title } from 'ui-library';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useFormatting } from 'locale';\r\nimport { portfoliosColumns, portfoliosMobileColumns } from 'constants/constants';\r\nimport { useDetectedMobileDevice } from 'hooks/useDetectedMobileDevice';\r\nimport PageSection from '../PageSection';\r\nimport { Preloader } from '../molecules/Preloader';\r\nimport { EmptyContent } from '../molecules/EmptyContent';\r\n\r\nfunction Portfolios({ data, isLoading, error, withLink }) {\r\n const { t } = useTranslation();\r\n const { isMobileSize } = useDetectedMobileDevice();\r\n const { getFormattedNumber } = useFormatting();\r\n\r\n return (\r\n \r\n \r\n {withLink ? (\r\n \r\n {t('portfolios.title')}\r\n \r\n ) : (\r\n {t('portfolios.title')}\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nPortfolios.propTypes = {\r\n data: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n Name: { label: PropTypes.string, link: PropTypes.string },\r\n Product: PropTypes.string,\r\n Profile: PropTypes.string,\r\n Value: PropTypes.string,\r\n Performance: PropTypes.string,\r\n Icon: PropTypes.string,\r\n })\r\n ),\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.string,\r\n withLink: PropTypes.bool,\r\n};\r\n\r\nPortfolios.defaultProps = {\r\n data: [],\r\n isLoading: true,\r\n error: null,\r\n withLink: false,\r\n};\r\n\r\nexport default Portfolios;\r\n","import { getfromDataObject, validateStringData, NA } from 'utils/formatting';\r\n\r\nimport { portfolioTypeIds } from 'constants/portfolioTypeIds';\r\n\r\nconst filterPortfolios = (portfolios) =>\r\n portfolios.filter((item) => item.PortfolioTypeId === portfolioTypeIds.MAIN);\r\n\r\nexport const adaptPortfolios = (\r\n data,\r\n portfolioActions,\r\n t,\r\n getFormattedCurrency,\r\n getFormattedDate,\r\n getFormattedNumber\r\n) => {\r\n if (!data.Portfolios) return [];\r\n\r\n const portfolios = filterPortfolios(data.Portfolios);\r\n\r\n return portfolios.map((item) => {\r\n const customAttr = JSON.parse(item?.CustomAttributes);\r\n\r\n return {\r\n Name: { label: validateStringData(item.Name), link: `/portfolios/${item.Id}` },\r\n Product: getfromDataObject(item, 'Product.Name'),\r\n Profile: validateStringData(item.RiskCategory.Name),\r\n Value: {\r\n title: getFormattedCurrency(item.CurrentValue, {\r\n currency: item.Currency.CurrencyCode,\r\n }),\r\n subtitle: t('portfolios.columns.asOf', {\r\n date: customAttr.UpdateDate ? getFormattedDate(customAttr.UpdateDate) : NA,\r\n }),\r\n },\r\n Performance: customAttr.performanceSI\r\n ? Math.round(customAttr.performanceSI * 10000) / 100\r\n : undefined,\r\n PerformanceYTD: customAttr.performanceYTD\r\n ? Math.round(customAttr.performanceYTD * 10000) / 100\r\n : undefined,\r\n gainYTD: getFormattedNumber(customAttr.GainLossYTD, {\r\n maximumFractionDigits: 0,\r\n minimumFractionDigits: 0,\r\n }),\r\n inceptionDate: item.CreateDate ? getFormattedDate(item.CreateDate) : undefined,\r\n currency: item.Currency ? item.Currency.Name : undefined,\r\n\r\n Actions: {\r\n value: 'action',\r\n actions: portfolioActions(item.Id, item.Product.Name, t),\r\n },\r\n };\r\n });\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport PortfoliosTable from 'components/organisms/Portfolios';\r\nimport { contactIdSelector } from 'redux/auth/authSelectors';\r\nimport { usePortfolios } from './hooks/usePortfolios';\r\n\r\nfunction Portfolios(props) {\r\n // eslint-disable-next-line react/prop-types\r\n const { contactId: clientId } = props;\r\n const portfolios = usePortfolios(clientId);\r\n\r\n return ;\r\n}\r\n\r\nPortfolios.propTypes = {\r\n match: PropTypes.shape({ params: { id: PropTypes.string.isRequired } }).isRequired,\r\n};\r\n\r\nPortfolios.defaultProps = {};\r\n\r\nconst mapStateToProps = (state) => ({\r\n contactId: contactIdSelector(state),\r\n});\r\n\r\nexport default connect(mapStateToProps)(Portfolios);\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { portfolioActions } from 'constants/constants';\r\nimport { useFormatting, useLocale } from 'locale';\r\nimport { adaptPortfolios } from '../adapters/adaptPortfolios';\r\n\r\nexport const usePortfolios = (clientId) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState({});\r\n const { i18n, t } = useTranslation();\r\n const { getFormattedDate, getFormattedCurrency, getFormattedNumber } = useFormatting();\r\n const { locale } = useLocale();\r\n\r\n useEffect(() => {\r\n setLoading(true);\r\n const params = { language: i18n.language };\r\n\r\n ServiceManager.portfolioManagement('getInvestmentOverview', [clientId, params])\r\n .then((response) => {\r\n try {\r\n setData(\r\n adaptPortfolios(\r\n response.data,\r\n portfolioActions,\r\n t,\r\n getFormattedCurrency,\r\n getFormattedDate,\r\n getFormattedNumber\r\n )\r\n );\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, [locale, i18n.language]);\r\n\r\n return { data, isLoading, error };\r\n};\r\n","import React from 'react';\r\nimport { Redirect, Switch } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport RouteWithAppTitle from 'components/RouteWithAppTitle';\r\nimport PositionDetailsOverview from './pages/SinglePortfolioView/pages/PositionDetails/PositionDetailsOverview';\r\nimport SinglePortfolioView from './pages/SinglePortfolioView';\r\nimport Portfolios from './Portfolios';\r\n\r\nconst Router = (props) => {\r\n const {\r\n match: { path },\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\nRouter.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nRouter.defaultProps = {};\r\n\r\nRouter.displayName = 'Router';\r\n\r\nexport default Router;\r\n","import React, { Component } from 'react';\r\nimport history from 'services/core/history';\r\nimport PropTypes from 'prop-types';\r\nimport { Title, Button } from 'ui-library';\r\nimport { Loading } from 'components/Loading';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\n\r\nimport { userSelect } from './selectors';\r\n\r\nimport './UserActivation.css';\r\n\r\nexport class UserActivation extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n view: 0,\r\n activationKey: undefined,\r\n user: undefined,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const {\r\n match: {\r\n params: { activationKey },\r\n },\r\n } = this.props;\r\n\r\n ServiceManager.security('activateUser', [activationKey])\r\n .then((data) => {\r\n const user = userSelect(data);\r\n\r\n this.setState({\r\n view: 1,\r\n activationKey,\r\n user,\r\n });\r\n })\r\n .catch(() => {\r\n this.setState({\r\n view: 2,\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n const { view, user, activationKey } = this.state;\r\n const { t } = this.props;\r\n\r\n switch (view) {\r\n case 0:\r\n return ;\r\n case 1:\r\n return (\r\n
\r\n {t('activation.activationSuccess')}\r\n

\r\n {user.username\r\n ? t('activation.usernameAccountCreated', {\r\n username: user.username,\r\n })\r\n : t('activation.youtAccountCreated')}\r\n

\r\n {user.isPasswordSet ? (\r\n {\r\n history.push('/login');\r\n }}\r\n >\r\n {t('activation.Login')}\r\n \r\n ) : (\r\n {\r\n history.push(\r\n `/reset-password/${user.username}/${activationKey}`\r\n );\r\n }}\r\n >\r\n {t('activation.setPassword')}\r\n \r\n )}\r\n
\r\n );\r\n case 2:\r\n return (\r\n
\r\n {t('activation.activationError')}\r\n

{`${t('activation.activationFailed')} `}

\r\n
\r\n );\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nUserActivation.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string,\r\n url: PropTypes.string,\r\n isExact: PropTypes.bool,\r\n params: PropTypes.shape({\r\n activationKey: PropTypes.string,\r\n }),\r\n }).isRequired,\r\n t: PropTypes.func.isRequired,\r\n};\r\n\r\nUserActivation.defaultProps = {};\r\n\r\nUserActivation.displayName = 'UserActivation';\r\n","export const userSelect = (data) => ({\r\n isPasswordSet: data.IsPasswordSet,\r\n username: data.UserName,\r\n contactId: data.ContactId,\r\n});\r\n","import { useEffect, useState, useCallback } from 'react';\r\nimport DocumentsService from 'additiv-services/dist/services/core/documents';\r\nimport { useTranslation } from 'react-i18next';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport { addDaysToDate, subtractUnits } from 'utils/datetime';\r\nimport { createBlobFile, openDocumentUrl } from 'utils/documentUtils';\r\nimport ServerError from 'errors/ServerError';\r\nimport { useFormatting } from 'locale';\r\nimport { GA_ACTIONS, GA_CATEGORIES, sendGAEvent } from 'utils/analytics';\r\nimport { adaptDocuments, getNames } from '../adapters/adaptDocument';\r\n\r\nexport default (clientId) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState([]);\r\n const [names, setNames] = useState([]);\r\n const [dataChecked, setDataChecked] = useState([]);\r\n const { t } = useTranslation();\r\n const { getFormattedDate } = useFormatting();\r\n\r\n const config = {\r\n ownerIds: [clientId],\r\n // Set startSate to solve NS-687\r\n startDate: subtractUnits(new Date(), 100, 'years'),\r\n endDate: addDaysToDate(new Date(), 1),\r\n };\r\n\r\n const onClientListChecked = ({ id, name }) => ({ target: { checked } }) => {\r\n if (checked) setDataChecked((oldArray) => [...oldArray, { id, name }]);\r\n else {\r\n setDataChecked((oldArray) => {\r\n const index = oldArray.findIndex((item) => item.id === id);\r\n\r\n return [...oldArray.slice(0, index), ...oldArray.slice(index + 1)];\r\n });\r\n }\r\n };\r\n\r\n const downloadDocument = useCallback((documentId, contactId) => {\r\n DocumentsService.downloadDocument(documentId, contactId)\r\n .then((response) => {\r\n try {\r\n const newBlob = createBlobFile(response.data);\r\n\r\n sendGAEvent(GA_ACTIONS.document, GA_CATEGORIES.download, newBlob.fileName);\r\n openDocumentUrl(newBlob);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n DocumentsService.getDocuments(config)\r\n .then((response) => {\r\n try {\r\n const adaptedData = adaptDocuments(\r\n response.data,\r\n downloadDocument,\r\n t,\r\n getFormattedDate\r\n );\r\n\r\n setData(\r\n adaptedData.map((item) => ({\r\n ...item,\r\n showToCustomer: {\r\n ...item.showToCustomer,\r\n onChecked: onClientListChecked(item),\r\n },\r\n }))\r\n );\r\n setNames(getNames(adaptedData));\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, []);\r\n\r\n return {\r\n data,\r\n dataChecked,\r\n names,\r\n isLoading,\r\n error,\r\n };\r\n};\r\n","import { checkNullData, stripHtmlTags } from 'utils';\r\nimport { dateTimeFormats } from 'locale';\r\n\r\nexport const getNames = (data) => {\r\n const listOfNames = new Set();\r\n\r\n data.forEach((val) => listOfNames.add(val.name));\r\n\r\n return [...listOfNames];\r\n};\r\n\r\nexport const adaptDocuments = (data, downloadDocument, t, getFormattedDate) => {\r\n if (checkNullData(data)) return [];\r\n\r\n return data.map(\r\n ({\r\n Id,\r\n OwnerId,\r\n ValidTill,\r\n CreateDate,\r\n ExternalId,\r\n OriginalFilename,\r\n RetrieveFileAsName,\r\n DocumentMetadata: {\r\n Name,\r\n IsActive,\r\n OutputFilename,\r\n ShowToCustomer,\r\n DmsDocumentCategoryName,\r\n },\r\n }) => {\r\n if (checkNullData(data)) return [];\r\n\r\n const documentName = RetrieveFileAsName || stripHtmlTags(Name || OutputFilename);\r\n\r\n return {\r\n id: Id,\r\n showToCustomer: {\r\n value: '',\r\n selected: ShowToCustomer,\r\n },\r\n name: documentName,\r\n nameCol: {\r\n link: `/documents/${Id}/owner/${OwnerId}`,\r\n value: documentName,\r\n onDownload: downloadDocument,\r\n },\r\n valid: getFormattedDate(ValidTill, {\r\n hour: dateTimeFormats.NUMERIC,\r\n minute: dateTimeFormats.NUMERIC,\r\n second: dateTimeFormats.NUMERIC,\r\n }),\r\n isActive: t(`advisoryDashboard.documents.${IsActive ? 'yes' : 'no'}`),\r\n filename: OriginalFilename || '',\r\n category: DmsDocumentCategoryName || '',\r\n contactId: OwnerId,\r\n externalId: ExternalId,\r\n createDate: getFormattedDate(CreateDate, {\r\n hour: dateTimeFormats.NUMERIC,\r\n minute: dateTimeFormats.NUMERIC,\r\n second: dateTimeFormats.NUMERIC,\r\n }),\r\n icon: '',\r\n };\r\n }\r\n );\r\n};\r\n","import { CellPDFView } from 'components/renderers';\r\nimport { sorterByDate, sorterString } from 'utils/sorting';\r\n\r\nexport default (t) => [\r\n {\r\n key: 'nameCol',\r\n title: t('clientDashboard.documents.name'),\r\n width: 200,\r\n render: CellPDFView,\r\n sortable: true,\r\n sorter: sorterString('nameCol.value'),\r\n },\r\n {\r\n key: 'createDate',\r\n title: t('clientDashboard.documents.createDate'),\r\n width: 160,\r\n minWidth: 160,\r\n sorter: sorterByDate('createDate'),\r\n sortable: true,\r\n className: 'table-cell__date',\r\n },\r\n {\r\n key: 'icon',\r\n title: '',\r\n titleType: 'columns',\r\n width: 20,\r\n className: 'text-right',\r\n },\r\n];\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport { contactIdSelector } from 'redux/auth/authSelectors';\r\nimport { ContentBox, Table, Title } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\n\r\nimport useDocuments from './hooks/useDocument';\r\nimport getColumns from './constants';\r\n\r\nimport './Documents.css';\r\n\r\n// eslint-disable-next-line react/prop-types\r\nfunction Documents({ contactId: clientId, t }) {\r\n const { data, isLoading, error } = useDocuments(clientId);\r\n\r\n return (\r\n \r\n \r\n {t('dashboard.documents.title')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nDocuments.propTypes = {\r\n match: PropTypes.shape({ params: { id: PropTypes.string.isRequired } }).isRequired,\r\n};\r\n\r\nDocuments.defaultProps = {};\r\n\r\nconst mapStateToProps = (state) => ({\r\n contactId: contactIdSelector(state),\r\n});\r\n\r\nexport default connect(mapStateToProps)(Documents);\r\n","import { useEffect, useState } from 'react';\r\nimport DocumentsService from 'additiv-services/dist/services/core/documents';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport adaptDocument from '../adapters/adaptDocument';\r\n\r\nexport const file = (data) => ({\r\n // eslint-disable-next-line no-undef\r\n stringFile: atob(data.File),\r\n fileType: data.CustomAttributes,\r\n fileName: data.OriginalFilename,\r\n});\r\n\r\nexport default (documentId, contactId) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState([]);\r\n\r\n useEffect(() => {\r\n setError(null);\r\n setLoading(true);\r\n\r\n DocumentsService.downloadDocument(documentId, contactId)\r\n .then((response) => {\r\n try {\r\n setData(adaptDocument(response.data));\r\n\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }, []);\r\n\r\n return { data, isLoading, error };\r\n};\r\n","import { stripHtmlTags } from 'utils';\r\n\r\nexport default ({ File, DocumentMetadata: { Name, OutputFilename } }) => ({\r\n name: stripHtmlTags(Name || OutputFilename),\r\n file: `data:application/pdf;base64,${File}`,\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport { ContentBox, Title, BreadCrumbs } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport PageSection from 'components/PageSection';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport useDocument from './hooks/useDocument';\r\n\r\nfunction DocumentView(props) {\r\n const { t } = useTranslation();\r\n const {\r\n match: {\r\n params: { documentId, ownerId },\r\n },\r\n } = props;\r\n const { data, isLoading, error } = useDocument(documentId, ownerId);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {t('advisoryDashboard.title')}\r\n \r\n {t('advisoryDashboard.documents.title')}\r\n \r\n \r\n \r\n {data.name}\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nDocumentView.propTypes = {\r\n location: PropTypes.shape({\r\n query: {\r\n id: PropTypes.number,\r\n image: PropTypes.string,\r\n title: PropTypes.string,\r\n date: PropTypes.string,\r\n content: PropTypes.string,\r\n },\r\n }).isRequired,\r\n match: PropTypes.shape({\r\n params: { newsId: PropTypes.string.isRequired },\r\n }).isRequired,\r\n};\r\n\r\nDocumentView.defaultProps = {};\r\n\r\nexport default DocumentView;\r\n","import React from 'react';\r\nimport { Redirect, Route, Switch } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport Documents from './Documents';\r\nimport DocumentView from './pages/DocumentView';\r\n\r\nconst Router = (props) => {\r\n const {\r\n match: { path },\r\n } = props;\r\n const withProps = (Component) => (defProps) => ;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nRouter.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nRouter.defaultProps = {};\r\n\r\nRouter.displayName = 'Router';\r\n\r\nexport default Router;\r\n","export const NsTopDomain = 'nspgroup.com';\r\nexport const NsConnect = `//nsconnect.${NsTopDomain}`;\r\n","import React from 'react';\r\nimport { ContentBox } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport PlayStoreQrCode from '../images/play_store_qr.png';\r\nimport AppStoreQrCode from '../images/app_store_qr.png';\r\nimport { NsConnect, NsTopDomain } from '../const';\r\nimport '../Activation.css';\r\n// eslint-disable-next-line react/prop-types\r\nfunction ActivationPageEN() {\r\n return (\r\n \r\n \r\n

\r\n NS Partners provides you with an online access to your portfolio(s) directly on\r\n a dedicated secured website and application: NS Connect.\r\n

\r\n

\r\n The successful completion of the IT integration of transactional flows with our\r\n main banking partners has made possible such a service. Assets prices are also\r\n regularly updated. Please note the website and the app are not intended for\r\n direct transactions. In addition, we remind you that only bank documents shall\r\n be used for all your tax and regulatory reporting needs.\r\n

\r\n

You will find below the procedure to follow to benefit from this service.

\r\n

\r\n For increased security, we have chosen for both the website and application a\r\n two-factor authentication method.\r\n

\r\n

\r\n Once you have set your password via the link provided to this effect in the\r\n email you just received from no-reply@{NsTopDomain}\r\n, please proceed as\r\n explained below.\r\n

\r\n

1. For access through the application

\r\n

\r\n Download the NS Connect app from the AppStore or GooglePlay on your smartphone\r\n or tablet. You can also scan the QR code below.\r\n

\r\n

\r\n

\r\n
\r\n \"App\r\n
AppStore
\r\n
\r\n
\r\n \"Play\r\n
GooglePlay
\r\n
\r\n
\r\n

\r\n Enter your username and password. Your smartphone or tablet will use the Facial\r\n Recognition ("Face ID") option to authenticate you.\r\n

\r\n

2. For access through the website

\r\n

\r\n Go to  \r\n \r\n nsconnect.{NsTopDomain}\r\n \r\n  (do not use Internet Explorer as a browser).\r\n

\r\n

Enter your username and password.

\r\n

\r\n You will be prompted to download the Futurae app (Futurae Technologies AG) from\r\n the App Store or GooglePlay on your smartphone or tablet. This will allow you to\r\n authenticate yourself. Please simply follow the steps indicated as you proceed\r\n on NS Connect, summarized hereafter.\r\n

\r\n

\r\n For the first use only, you are invited to register your smartphone or tablet on\r\n the Futurae app. To do this, re-enter your username and password on your\r\n computer, then open the Futurae application on your device and scan the QR code\r\n that appears on your computer.\r\n

\r\n

Your device is registered, you are now ready to log in.

\r\n

Enter your username and password.

\r\n

\r\n Then enter the 6-digit code that will be given to you when opening the Futurae\r\n application on your smartphone or tablet. This will systematically be necessary\r\n for each connection, in order to identify you.\r\n

\r\n

\r\n Do not hesitate to call your relationship manager or one of our employees,\r\n especially during the first connection and the first uses of the product.\r\n

\r\n
\r\n
\r\n );\r\n}\r\n\r\nActivationPageEN.defaultProps = {};\r\n\r\nexport default ActivationPageEN;\r\n","import React from 'react';\r\nimport { ContentBox } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport PlayStoreQrCode from '../images/play_store_qr.png';\r\nimport AppStoreQrCode from '../images/app_store_qr.png';\r\nimport { NsConnect, NsTopDomain } from '../const';\r\n// eslint-disable-next-line react/prop-types\r\nimport '../Activation.css';\r\n\r\nfunction ActivationPageFR() {\r\n return (\r\n \r\n \r\n

\r\n NS Partners met à votre disposition un accès pour la consultation de l’ensemble\r\n de vos comptes confiés en gestion directement sur un site internet dédié et sur\r\n une application mobile: NS Connect.\r\n

\r\n

\r\n L’aboutissement du travail d’intégration informatique des flux transactionnels\r\n avec nos principaux partenaires bancaires a rendu possible un tel service. Les\r\n prix des actifs investis sont également régulièrement mis à jour. Le site et\r\n l’application n’ont pas pour but d’effectuer directement des transactions. De\r\n plus, nous vous rappelons que seuls les documents des banques font foi pour tous\r\n vos besoins de rapports fiscaux et réglementaires.\r\n

\r\n

\r\n Nous avons le plaisir de vous indiquer ci-après la marche à suivre pour\r\n bénéficier de ce service. Pour une sécurité renforcée, nous avons choisi, que ce\r\n soit pour le site ou l’application, une méthode d’authentification à deux\r\n facteurs.\r\n

\r\n

\r\n Après avoir initialisé votre mot de passe grâce au lien fournit à cet effet via le\r\n mail que vous venez de recevoir de no-reply@{NsTopDomain}, veuillez procéder comme\r\n suit:\r\n

\r\n\r\n

1. Pour l’accès par l’application

\r\n

\r\n Téléchargez l’application NS Connect depuis l’AppStore ou GooglePlay sur votre\r\n smartphone ou tablette. Vous pouvez également scanner le code QR ci-dessous.\r\n

\r\n
\r\n
\r\n \"App\r\n
AppStore
\r\n
\r\n
\r\n \"Play\r\n
GooglePlay
\r\n
\r\n
\r\n

\r\n Saisissez votre nom d’utilisateur et mot de passe. Votre smartphone ou tablette\r\n utilisera l’option Reconnaissance Facial ("Face ID") pour vous\r\n authentifier.\r\n

\r\n\r\n

2. Pour l’accès par le site

\r\n

\r\n Rendez-vous sur la page  \r\n \r\n nsconnect.{NsTopDomain}\r\n \r\n  (ne pas utiliser Internet Explorer comme browser).\r\n

\r\n

\r\n Vous serez invité à télécharger l’application Futurae (Futurae Technologies AG)\r\n depuis l’AppSstore ou GooglePlay sur votre smartphone ou tablette. Celle-ci vous\r\n permettra de vous authentifier.\r\n

\r\n

\r\n Saisissez votre nom d’utilisateur et choisissez votre mot de passe. Vous serez\r\n invité à télécharger l’application Futurae (Futurae Technologies AG) sur votre\r\n smartphone ou tablette. Celle-ci permettra de vous identifier lors de vos\r\n connexions. Il vous suffit de suivre les étapes indiquées à l’écran, et résumées\r\n ci-après.\r\n

\r\n

\r\n Pour la première utilisation uniquement, vous devez enregistrer votre smartphone\r\n ou tablette. Pour ce faire, saisissez votre nom d’utilisateur et mot de passe\r\n sur votre ordinateur puis ouvrez l’application Futurae sur votre appareil et\r\n scannez le QR code qui apparait sur votre ordinateur.\r\n

\r\n

\r\n Votre appareil est désormais reconnu, vous êtes maintenant prêt pour vous\r\n connecter.\r\n

\r\n

Saisissez votre nom d’utilisateur et votre mot de passe.

\r\n

\r\n Puis entrez le code à 6 chiffres qui vous sera donné en ouvrant l’application\r\n Futurae sur votre smartphone ou tablette. Ceci vous sera systématiquement\r\n demandé à chaque connexion, afin de vous identifier.\r\n

\r\n\r\n

\r\n N’hésitez pas à faire appel à nos collaborateurs et à votre chargé de relation,\r\n notamment lors de la première connexion et des premières utilisations du\r\n produit.\r\n

\r\n
\r\n
\r\n );\r\n}\r\n\r\nActivationPageFR.defaultProps = {};\r\n\r\nexport default ActivationPageFR;\r\n","import React from 'react';\r\nimport { ContentBox } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport PlayStoreQrCode from '../images/play_store_qr.png';\r\nimport AppStoreQrCode from '../images/app_store_qr.png';\r\nimport { NsConnect, NsTopDomain } from '../const';\r\n// eslint-disable-next-line react/prop-types\r\nimport '../Activation.css';\r\n\r\nfunction ActivationPageDE() {\r\n return (\r\n \r\n \r\n

\r\n NS Partners bietet Ihnen einen direkten Online-Zugang zu Ihrem Portfolio/Ihren\r\n Portfolios über eine entsprechende Website und App: NS Connect.\r\n

\r\n

\r\n Der erfolgreiche Abschluss der IT-Integration der Transaktionsströme mit unseren\r\n wichtigsten Bankpartnern hat diesen Service ermöglicht. Auch die Daten der\r\n Vermögenswerte werden regelmässig aktualisiert. Die Website und die App sind\r\n nicht für direkte Transaktionen bestimmt. Wir möchten Sie auch daran erinnern,\r\n dass für Ihre steuerlichen und aufsichtsrechtlichen Meldungen ausschliesslich\r\n Bankbelege zu verwenden sind.\r\n

\r\n

\r\n Nachstehend ist das Verfahren beschrieben, mit dem Sie diesen Service nutzen\r\n können.\r\n

\r\n

\r\n Um Ihnen eine erhöhte Sicherheit zu bieten, haben wir sowohl die Website als\r\n auch die App mit einer Zwei-Faktor-Authentifizierung ausgestattet.\r\n

\r\n

\r\n Sie haben gerade eine E-Mail von no-reply@{NsTopDomain} erhalten. Nachdem\r\n Sie über den darin enthaltenen Link Ihr Passwort festgelegt haben, gehen Sie\r\n bitte wie nachstehend beschrieben vor.\r\n

\r\n\r\n

1. Zugang über die App

\r\n

\r\n Laden Sie die NS Connect App aus dem App Store oder von Google Play auf Ihr\r\n Smartphone oder Tablet. Sie können dazu auch den unten angezeigten QR-Code\r\n scannen.\r\n

\r\n
\r\n
\r\n \"App\r\n
App Store
\r\n
\r\n\r\n
\r\n \"Play\r\n
Google Play
\r\n
\r\n
\r\n

\r\n Geben Sie Ihren Benutzernamen und Ihr Passwort ein. Ihr Smartphone oder Tablet\r\n verwendet die Gesichtserkennung ("Face ID"), um Sie zu\r\n authentifizieren.\r\n

\r\n\r\n

2. Zugang über die Website

\r\n

\r\n Rufen Sie folgende Seite auf:  \r\n \r\n nsconnect.{NsTopDomain}\r\n \r\n  (verwenden Sie nicht den Internet Explorer als Browser).\r\n

\r\n

Geben Sie Ihren Benutzernamen und Ihr Passwort ein.

\r\n

\r\n Sie werden aufgefordert, die Futurae-App (Futurae Technologies AG) aus dem App\r\n Store oder von Google Play auf Ihr Smartphone oder Tablet herunterzuladen. Mit\r\n dieser App können Sie sich authentifizieren. Folgen Sie bitte einfach den in NS\r\n Connect angezeigten Schritten, die nachstehend zusammengefasst werden.\r\n

\r\n

\r\n Bei der ersten Nutzung werden Sie aufgefordert, Ihr Smartphone oder Tablet in\r\n der Futurae-App zu registrieren. Geben Sie dazu auf Ihrem Computer erneut Ihren\r\n Benutzernamen und Ihr Passwort ein, öffnen Sie anschliessend die Futurae-App auf\r\n Ihrem Gerät und scannen Sie den von Ihrem Computer angezeigten QR-Code.\r\n

\r\n

Ihr Gerät ist nun registriert und Sie können sich einloggen.

\r\n

Geben Sie Ihren Benutzernamen und Ihr Passwort ein.

\r\n\r\n

\r\n Geben Sie dann den 6-stelligen Code ein, den Sie beim Öffnen der Futurae-App auf\r\n Ihrem Smartphone oder Tablet erhalten. Dieser Code wird bei jeder Verbindung\r\n systematisch abgefragt, um Sie zu identifizieren.\r\n

\r\n

\r\n Bitte wenden Sie sich bei Fragen an Ihren Kundenberater oder einen unserer\r\n Mitarbeiter, insbesondere \\ bei Ihrer ersten Anmeldung und Verwendung des\r\n Produkts.\r\n

\r\n
\r\n
\r\n );\r\n}\r\n\r\nActivationPageDE.defaultProps = {};\r\n\r\nexport default ActivationPageDE;\r\n","import React from 'react';\r\nimport { ContentBox } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport PlayStoreQrCode from '../images/play_store_qr.png';\r\nimport AppStoreQrCode from '../images/app_store_qr.png';\r\nimport { NsConnect, NsTopDomain } from '../const';\r\n// eslint-disable-next-line react/prop-types\r\nimport '../Activation.css';\r\n\r\nfunction ActivationPageIT() {\r\n return (\r\n \r\n \r\n

\r\n NS Partners vi fornisce un accesso on line al vostro portafoglio(i) direttamente\r\n su un'app e un sito web appositi: NS Connect.\r\n

\r\n

\r\n Tale servizio è stato reso possibile grazie a l'automatizzazione e a l'integrazione\r\n informatica relativa dei flussi transazionali con i nostri principali partner bancari.\r\n L'app e il sito web non sono progettati per eseguire delle transazioni in diretta.\r\n Vi ricordiamo inoltre che solamente i documenti bancari saranno utilizzati per\r\n l'insieme delle vostre esigenze fiscali e di notificazione normativa.\r\n

\r\n

Di seguito troverete la procedura da seguire per attivare questo servizio.

\r\n

\r\n Per una maggiore sicurezza, sia per il sito web che per l'app abbiamo\r\n selezionato un metodo di autenticazione a due fattori.\r\n

\r\n

\r\n Una volta impostata la vostra password tramite il link fornito a tal scopo nell'e-mail\r\n che avete appena ricevuto da no-reply@{NsTopDomain}, vi preghiamo di procedere come\r\n illustrato di seguito.\r\n

\r\n\r\n

1. Per l'accesso via l'app Scaricate da Play Store o App Store l'app NS Connect sul vostro\r\n smartphone o tablet. Avete anche la possibilità di scannerizzare il codice QR riportato di\r\n seguito.\r\n

\r\n\r\n
\r\n
\r\n \"Play\r\n
Play Store
\r\n
\r\n
\r\n \"App\r\n
App Store
\r\n
\r\n
\r\n\r\n

Digitate il vostro nome d'utente e la password.

\r\n

\r\n Il vostro smartphone o tablet utilizzerà l'opzione di riconoscimento facciale\r\n ("Face ID") per l'autoidentificazione.\r\n

\r\n\r\n

2. Per l'accesso via il sito web

\r\n

\r\n Andate sulla pagina  \r\n \r\n nsconnect.{NsTopDomain}\r\n \r\n  (non utilizzate Internet Explorer come browser).\r\n

\r\n

Digitate il vostro nome d'utente e la password.

\r\n

\r\n Vi verrà richiesto di scaricare da App Store o GooglePlay l'app\r\n Futurae (Futurae Technologies AG) sul vostro smartphone o tablet.\r\n Così facendo avrete la possibilità di procedere alla vostra autentificazione.\r\n Vi preghiamo di seguire i passaggi indicati mano a mano che proseguite su NS Connect\r\n qui di seguito riassunti.\r\n

\r\n

\r\n Unicamente per il primo utilizzo, siete invitati a registrare il vostro smartphone o tablet\r\n sull'app Futurae. Per procedere in tal senso, digitate il vostro nome utente e la password\r\n sul vostro computer, in seguito accedete all'app Futurae dal vostro dispositivo e scannerizzare\r\n il codice QR che appare sul vostro computer.\r\n

\r\n

\r\n Il vostro dispositivo è adesso registrato, potete quindi effettuare il vostro login.\r\n

\r\n

Digitate il vostro nome d'utente e la password.

\r\n\r\n

\r\n In seguito digitate il codice di 6 cifre che vi sarà fornito al momento dell'accesso all'app\r\n Futurae dal vostro smartphone o tablet. Tale passaggio vi sarà chiesto sistematicamente ad ogni\r\n connessione per procedere alla vostra identificazione.\r\n

\r\n

\r\n

\r\n Non esitate a contattare il vostro relationship manager soprattutto nel corso della prima connessione\r\n e durante le prime fasi di utilizzo del prodotto.\r\n

\r\n

\r\n
\r\n
\r\n );\r\n}\r\n\r\nActivationPageIT.defaultProps = {};\r\n\r\nexport default ActivationPageIT;\r\n","import React from 'react';\r\nimport { ContentBox } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport PlayStoreQrCode from '../images/play_store_qr.png';\r\nimport AppStoreQrCode from '../images/app_store_qr.png';\r\nimport { NsConnect, NsTopDomain } from '../const';\r\n// eslint-disable-next-line react/prop-types\r\nimport '../Activation.css';\r\n\r\nfunction ActivationPagePR() {\r\n return (\r\n \r\n \r\n

\r\n A NS Partners disponibiliza-lhe acesso online à(s) sua(s) carteira(s)\r\n diretamente através de um site Web e aplicação específca: NS Connect.\r\n

\r\n

\r\n Este serviço foi possível graças à integração informática dos fluxos transacionais\r\n com os nossos principais parceiros da banca. Os dados dos ativos são atualizados\r\n regularmente. O site Web e a aplicação, não se destinam a efetuar transações.\r\n Gostaríamos de recordar que apenas os documentos bancários, deverão ser usados\r\n para efeitos de cumprimento das obrigações fiscais e regulatórias.\r\n

\r\n

\r\n Em seguida, apresentamos-lhe os passos a seguir para beneficiar deste serviço.\r\n

\r\n

\r\n Para garantir uma maior segurança, optámos pelo método de autentificação de dois fatores,\r\n tanto para o site Web como para a aplicação.\r\n

\r\n

\r\n Depois de definir a password através da ligação fornecida para o efeito, no email que acabou de\r\n receber da no-reply@{NsTopDomain}, siga os passos indicados abaixo.\r\n

\r\n\r\n

1. Para aceder através da aplicação

\r\n

\r\n Transfira a aplicação NS Connect a partir da AppStore ou GooglePlay ara o seu smartphone ou tablet.\r\n Também pode ler o código QR abaixo.\r\n

\r\n
\r\n
\r\n \"App\r\n
AppStore
\r\n
\r\n
\r\n \"Play\r\n
GooglePlay
\r\n
\r\n
\r\n

\r\n Insira o nome de utilizador e a password. O seu smartphone ou tablet,\r\n utilizará a opção de reconhecimento facial ("Face ID") ara proceder\r\n à sua autenticação.\r\n

\r\n\r\n

2. Para aceder através do sítio Web

\r\n

\r\n Vá à seguinte página:  \r\n \r\n nsconnect.{NsTopDomain}\r\n \r\n  (não utilize o navegador Internet Explorer).\r\n

\r\n

Insira o nome de utilizador e a password.

\r\n

\r\n Ser-lhe-á pedido que transfira a aplicação Futurae (Futurae Technologies AG) da AppStore\r\n ou GooglePlay para o seu smartphone ou tablet.\r\n Tal servirá para proceder à sua autenticação. Queira seguir os passos\r\n indicados na NS Connect, resumidos abaixo.\r\n

\r\n

\r\n Apenas aquando da primeira utilização, será convidado a registar o seu smartphone ou tablet\r\n na aplicação Futurae. Para tal, volte a introduzir o nome de utilizador e palavra-passe no seu\r\n computador, em seguida, abra a aplicação Futurae no seu dispositivo e leia o código QR que aparece\r\n no computador.\r\n

\r\n

O seu dispositivo está registado e já pode iniciar sessão.

\r\n

Insira o nome de utilizador e a password.

\r\n

\r\n De seguida, insira o código de 6 dígitos indicado quando abre a aplicação Futurae, no seu smartphone\r\n ou tablet. Sempre que quiser iniciar sessão terá de indicar este código para fins de autenticação.\r\n

\r\n

\r\n Não hesite em contactar o seu gestor ou um dos nossos funcionários,\r\n especialmente da primeira vez que se ligar e utilizar o produto.\r\n

\r\n
\r\n
\r\n );\r\n}\r\n\r\nActivationPagePR.defaultProps = {};\r\n\r\nexport default ActivationPagePR;\r\n","import React from 'react';\r\nimport { ContentBox } from 'ui-library';\r\nimport PageSection from 'components/PageSection/PageSection';\r\nimport PlayStoreQrCode from '../images/play_store_qr.png';\r\nimport AppStoreQrCode from '../images/app_store_qr.png';\r\nimport { NsConnect, NsTopDomain } from '../const';\r\n// eslint-disable-next-line react/prop-types\r\nimport '../Activation.css';\r\n\r\nfunction ActivationPageES() {\r\n return (\r\n \r\n \r\n

\r\n NS Partners le ofrece un acceso directo a su(s) cartera(s) a través de un sitio\r\n web dedicado y una aplicación móvil: NS Connect.\r\n

\r\n

\r\n Este servicio ha sido posible gracias a la integración informática de los flujos\r\n de transacciones con nuestras principales contrapartes bancarias. Los precios de\r\n los activos también están actualizados regularmente. El sitio web y la\r\n aplicación móvil no permiten realizar transacciones. Además, le recordamos que\r\n solo se utilizarán documentos bancarios para todos sus requisitos de declaración\r\n fiscal y reglamentaria.\r\n

\r\n

\r\n Consulte abajo el procedimiento que deberá seguir para beneficiarse de este\r\n servicio.\r\n

\r\n

\r\n Para una mayor seguridad, hemos elegido un método de doble autenticación tanto\r\n para el sitio web como para la aplicación.\r\n

\r\n

\r\n Cuando haya configurado su contraseña a través del enlace proporcionado en el\r\n correo electrónico que acaba de recibir de no-reply@{NsTopDomain}\r\n , proceda según se explica abajo.\r\n

\r\n\r\n

1. Para acceder a través de la aplicación

\r\n

\r\n Descargue la aplicación NS Connect en Play Store o App Store en su smartphone o\r\n tableta. También puede escanear el código QR que figura abajo.\r\n

\r\n
\r\n
\r\n \"Play\r\n
Play Store
\r\n
\r\n
\r\n \"App\r\n
App Store
\r\n
\r\n
\r\n

\r\n Introduzca su nombre de usuario y contraseña. Su smartphone o tableta utilizarán\r\n la opción de reconocimiento facial ("Face ID") para autenticarle.\r\n

\r\n\r\n

2. Para acceder a través del sitio web

\r\n

\r\n Vaya a la página siguiente:  \r\n \r\n nsconnect.{NsTopDomain}\r\n \r\n  (no utilice el navegador Internet Explorer).\r\n

\r\n

Introduzca su nombre de usuario y contraseña.

\r\n

\r\n Se le pedirá que descargue la aplicación Futurae (Futurae Technologies AG) en la\r\n App Store o GooglePlay de su smartphone o tableta. Esto le permitirá\r\n autenticarse. Siga los pasos que se indican según avanza en NS Connect, los\r\n cuales se resumen a continuación.\r\n

\r\n

\r\n La primera vez que lo use, se le pedirá que registre su smartphone o tableta en\r\n la aplicación Futurae. Para ello, vuelva a introducir su nombre de usuario y\r\n contraseña en su ordenador. A continuación, abra la aplicación Futurae en su\r\n dispositivo y escanee el código QR que aparecerá en su ordenador.\r\n

\r\n

Su dispositivo está registrado y usted ya está listo para iniciar sesión.

\r\n\r\n

Introduzca su nombre de usuario y contraseña.

\r\n

\r\n A continuación, introduzca el código de seis dígitos que le facilita la\r\n aplicación Futurae cuando se abre en su smartphone o tableta. Esa etapa será\r\n necesaria a cada conexión, para identificarle.\r\n

\r\n

\r\n No dude en ponerse en contacto con su gestor de cartera o con cualquier de\r\n nuestros empleados, especialmente durante la primera conexión y las primeras\r\n veces que use el producto.\r\n

\r\n
\r\n
\r\n );\r\n}\r\n\r\nActivationPageES.defaultProps = {};\r\n\r\nexport default ActivationPageES;\r\n","import React from 'react';\r\nimport { AccordionPanel as Panel, ContentBox, Title, Accordion } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { innerHTMLRender } from 'utils/innerHTMLRender';\r\nimport PageSection from '../../../components/PageSection';\r\nimport { faqContent } from './content';\r\n\r\nconst Faq = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n \r\n {t('faq.title')}\r\n \r\n {faqContent(t).map((item) => (\r\n \r\n {innerHTMLRender(item.content)}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Faq;\r\n","// eslint-disable-next-line no-unused-vars\r\nimport React from 'react';\r\n\r\nexport const faqContent = (t) => [\r\n {\r\n title: 'faq.typesOfPersonalDataAvailable.heading',\r\n content: `

${t('faq.typesOfPersonalDataAvailable.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.whereDataStored.heading',\r\n content: `

${t('faq.whereDataStored.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.whenDataUpdated.heading',\r\n content: `

${t('faq.whenDataUpdated.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.datesUsedForChartSelections.heading',\r\n content: `

${t('faq.datesUsedForChartSelections.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.startDateRefers.heading',\r\n content: `

${t('faq.startDateRefers.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.anotherEmail.heading',\r\n content: `

${t('faq.anotherEmail.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.subscribeToNews.heading',\r\n content: `

${t('faq.subscribeToNews.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.seeLiveData.heading',\r\n content: `

${t('faq.seeLiveData.paragraph')}

`,\r\n },\r\n {\r\n title: 'faq.secureMyConnection.heading',\r\n content: `\r\n

\r\n ${t('faq.secureMyConnection.paragraph.weUseAppropriateTech')}\r\n
\r\n ${t('faq.secureMyConnection.paragraph.basicSecurityRecommended')}\r\n

\r\n
    \r\n
  • ${t('faq.secureMyConnection.list.selectKnownProvider')}
  • \r\n
  • ${t('faq.secureMyConnection.list.preferSecureWifi')}
  • \r\n
  • ${t('faq.secureMyConnection.list.installAntivirus')}
  • \r\n
  • ${t('faq.secureMyConnection.list.updateFireWall')}
  • \r\n
  • ${t('faq.secureMyConnection.list.installOsUpdates')}
  • \r\n
  • ${t('faq.secureMyConnection.list.installTrustedSoftware')}
  • \r\n
  • ${t('faq.secureMyConnection.list.useLatestBrowserVersion')}
  • \r\n
  • ${t('faq.secureMyConnection.list.checkCertificate')}
  • \r\n
  • ${t('faq.secureMyConnection.list.logOutFormSession')}
  • \r\n
  • ${t('faq.secureMyConnection.list.cleanCache')}
  • \r\n
\r\n `,\r\n },\r\n {\r\n title: 'faq.portfolioPerformanceCalculation.heading',\r\n content: `\r\n

\r\n ${t('faq.portfolioPerformanceCalculation.paragraph.accordingTWR')}\r\n
\r\n ${t('faq.portfolioPerformanceCalculation.paragraph.thisMethodCalculates')}\r\n

\r\n `,\r\n },\r\n {\r\n title: 'faq.assetPerformanceCalculation.heading',\r\n content: `\r\n

\r\n ${t('faq.assetPerformanceCalculation.paragraph.assetsAreInstruments')}\r\n
\r\n ${t('faq.assetPerformanceCalculation.paragraph.calculatedAsFollows')}\r\n
\r\n ${t('faq.assetPerformanceCalculation.paragraph.costPriceWeighted')}\r\n

\r\n `,\r\n },\r\n {\r\n title: 'faq.strategyDictionary.heading',\r\n content: `\r\n

\r\n ${t('faq.strategyDictionary.cash')}: \r\n ${t('faq.strategyDefinition.cash')}\r\n

\r\n

\r\n ${t('faq.strategyDictionary.currencyHedge')}: \r\n ${t('faq.strategyDefinition.currencyHedge')}\r\n

\r\n

\r\n ${t('faq.strategyDictionary.fixedIncome')}: \r\n ${t('faq.strategyDefinition.fixedIncome')}\r\n

\r\n

\r\n ${t('faq.strategyDictionary.equities')}: \r\n ${t('faq.strategyDefinition.equities')}\r\n

\r\n

\r\n ${t('faq.strategyDictionary.absoluteReturn')}: \r\n ${t('faq.strategyDefinition.absoluteReturn')}\r\n

\r\n

\r\n ${t('faq.strategyDictionary.gold')}: \r\n ${t('faq.strategyDefinition.gold')}\r\n

\r\n

\r\n ${t('faq.strategyDictionary.loan')}: \r\n ${t('faq.strategyDefinition.loan')}\r\n\r\n

\r\n ${t('faq.strategyDictionary.longTermCommitment')}: \r\n ${t('faq.strategyDefinition.longTermCommitment')}\r\n

\r\n `,\r\n },\r\n {\r\n title: 'faq.subSrategyDictionary.heading',\r\n content: `\r\n

\r\n ${t('faq.subSrategyDictionary.cash')}: \r\n ${t('faq.subSrategyDefinition.cash')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.currencyHedge')}: \r\n ${t('faq.subSrategyDefinition.currencyHedge')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.credit')}: \r\n ${t('faq.subSrategyDefinition.credit')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.globalBonds')}: \r\n ${t('faq.subSrategyDefinition.globalBonds')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.emergingBonds')}:\r\n ${t('faq.subSrategyDefinition.emergingBonds')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.equitiesLong')}:\r\n ${t('faq.subSrategyDefinition.equitiesLong')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.equitiesLongShort')}:\r\n ${t('faq.subSrategyDefinition.equitiesLongShort')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.flexible')}:\r\n ${t('faq.subSrategyDefinition.flexible')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.globalMacro')}:\r\n ${t('faq.subSrategyDefinition.globalMacro')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.relativeValue')}:\r\n ${t('faq.subSrategyDefinition.relativeValue')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.multiStrategyBonds')}:\r\n ${t('faq.subSrategyDefinition.multiStrategyBonds')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.gold')}:\r\n ${t('faq.subSrategyDefinition.gold')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.loan')}:\r\n ${t('faq.subSrategyDefinition.loan')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.privateEquity')}:\r\n ${t('faq.subSrategyDefinition.privateEquity')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.realEstate')}:\r\n ${t('faq.subSrategyDefinition.realEstate')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.guarantee')}:\r\n ${t('faq.subSrategyDefinition.guarantee')}\r\n

\r\n

\r\n ${t('faq.subSrategyDictionary.others')}:\r\n ${t('faq.subSrategyDefinition.others')}\r\n

\r\n `,\r\n },\r\n];\r\n","export const validate = (values) => {\r\n const errors = {};\r\n\r\n if (values.password !== undefined && !values.password) {\r\n errors.password = 'resetPassword.providePassword';\r\n }\r\n\r\n if (\r\n values.password &&\r\n values.confirmPassword !== undefined &&\r\n values.confirmPassword !== values.password\r\n ) {\r\n errors.confirmPassword = 'resetPassword.passwordDontMatch';\r\n }\r\n\r\n return errors;\r\n};\r\n","import {\r\n ACTIVATION_KEY_INVALID,\r\n PASSWORD_SAME_ALREADY_SET,\r\n PASSWORD_SET_ACTIVE,\r\n} from 'static/requestResults';\r\nimport commonErrorMessageToErrorModelXref from './commonErrors';\r\nimport { ErrorModel } from './ErrorModel';\r\n\r\nexport const RESET_PASSWORD_ERROR = 'ResetPasswordError';\r\n\r\nconst ACTIVATION_KEY_INVALID_MESSAGE = 'error.activationKeyInvalidMessage';\r\nconst THE_SAME_PASSWORD_WAS_USED_MESSAGE = 'error.samePasswordWasUsedMessage';\r\nconst PASSWORD_SET_ACTIVE_MESSAGE = 'error.passwordSerActiveMessage';\r\n\r\nconst errorMessageToErrorModelXref = {\r\n ...commonErrorMessageToErrorModelXref,\r\n [ACTIVATION_KEY_INVALID]: new ErrorModel({\r\n id: 21,\r\n type: RESET_PASSWORD_ERROR,\r\n message: ACTIVATION_KEY_INVALID_MESSAGE,\r\n }),\r\n [PASSWORD_SAME_ALREADY_SET]: new ErrorModel({\r\n id: 22,\r\n type: RESET_PASSWORD_ERROR,\r\n message: THE_SAME_PASSWORD_WAS_USED_MESSAGE,\r\n }),\r\n [PASSWORD_SET_ACTIVE]: new ErrorModel({\r\n id: 23,\r\n type: RESET_PASSWORD_ERROR,\r\n message: PASSWORD_SET_ACTIVE_MESSAGE,\r\n }),\r\n};\r\n\r\nexport const getErrorModelByStatus = (status) => errorMessageToErrorModelXref[status];\r\n","import React, { Component } from 'react';\r\nimport { Title, Button, TextInput, Infobox } from 'ui-library';\r\nimport { isEmpty, isUndefined } from 'lodash/fp';\r\nimport PropTypes from 'prop-types';\r\nimport { SUCCESS } from 'static/requestResults';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport history from 'services/core/history';\r\nimport { validate } from './validation';\r\nimport { selectResult } from './selectors';\r\nimport { getErrorModelByStatus } from '../../../error/errors';\r\n\r\nexport class ResetPassword extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n view: 0,\r\n password: undefined,\r\n confirmPassword: undefined,\r\n errors: {},\r\n generalErrors: undefined,\r\n isGeneralError: false,\r\n };\r\n\r\n this.changePasswordInputHandler = this.changePasswordInputHandler.bind(this);\r\n this.changeConfirmPasswordInputHandler = this.changeConfirmPasswordInputHandler.bind(this);\r\n }\r\n\r\n handleSubmit = (e) => {\r\n e.preventDefault();\r\n\r\n const {\r\n match: {\r\n params: { activationKey },\r\n },\r\n } = this.props;\r\n const { password, confirmPassword } = this.state;\r\n const initAllValues = { ...this.state };\r\n\r\n Object.keys(initAllValues).forEach((key) => {\r\n initAllValues[key] = isUndefined(initAllValues[key]) ? null : initAllValues[key];\r\n });\r\n\r\n const errors = validate(initAllValues);\r\n\r\n this.setState({\r\n ...initAllValues,\r\n errors,\r\n });\r\n\r\n if (isEmpty(errors)) {\r\n ServiceManager.Security('changePassword', [activationKey, password, confirmPassword])\r\n .then((response) => {\r\n const resultType = selectResult(response.data);\r\n const error = getErrorModelByStatus(resultType);\r\n\r\n if (error !== undefined) {\r\n this.setState({\r\n isGeneralError: true,\r\n generalErrorMessage: error.message,\r\n });\r\n } else if (resultType === SUCCESS) {\r\n this.setState({\r\n view: 1,\r\n isGeneralError: false,\r\n });\r\n } else {\r\n this.setState({\r\n isGeneralError: true,\r\n generalErrorMessage: undefined,\r\n });\r\n }\r\n })\r\n .catch(() => {\r\n this.setState({\r\n isGeneralError: true,\r\n generalErrorMessage: undefined,\r\n });\r\n });\r\n }\r\n\r\n return false;\r\n };\r\n\r\n updateState(fieldName, value) {\r\n this.setState((prevState) => ({\r\n [fieldName]: value,\r\n errors: validate({\r\n ...prevState,\r\n [fieldName]: value,\r\n }),\r\n }));\r\n }\r\n\r\n changePasswordInputHandler(e) {\r\n this.setState({ isGeneralError: false });\r\n this.updateState('password', e.target.value);\r\n }\r\n\r\n changeConfirmPasswordInputHandler(e) {\r\n this.setState({ isGeneralError: false });\r\n this.updateState('confirmPassword', e.target.value);\r\n }\r\n\r\n render() {\r\n const { view, errors, isGeneralError, generalErrorMessage } = this.state;\r\n const { t } = this.props;\r\n\r\n if (view === 0) {\r\n return (\r\n
\r\n {t('resetPassword.passwordCreation')}\r\n {isGeneralError && (\r\n \r\n {generalErrorMessage === undefined\r\n ? t('resetPassword.somethingWrong')\r\n : t(generalErrorMessage)}\r\n \r\n )}\r\n

{t('resetPassword.enterNewPassword')}

\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\r\n
\r\n {t('resetPassword.newPasswordIsSet')}\r\n

{t('resetPassword.passwordIsReadyToUse')}

\r\n {\r\n history.push('/login');\r\n }}\r\n >\r\n {t('resetPassword.goToLogin')}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nResetPassword.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n match: PropTypes.shape({\r\n path: PropTypes.string,\r\n url: PropTypes.string,\r\n isExact: PropTypes.bool,\r\n params: PropTypes.object,\r\n }),\r\n};\r\n\r\nResetPassword.defaultProps = {\r\n match: {},\r\n};\r\n\r\nResetPassword.displayName = 'ResetPassword';\r\n","export const selectResult = (data) => data.Result;\r\n","import { withTranslation } from 'react-i18next';\r\nimport { ResetPassword } from './ResetPassword';\r\n\r\nexport default withTranslation()(ResetPassword);\r\n","import React, { Fragment } from 'react';\r\n\r\nfunction DefaultContent() {\r\n return (\r\n \r\n DFS.BackOffice\r\n
\r\n Copyright ©\r\n {' '}\r\n {new Date().getFullYear()}\r\n {' '}\r\n additiv AG. All rights reserved.\r\n
\r\n );\r\n}\r\n\r\nexport default DefaultContent;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Link } from 'react-router-dom';\r\nimport DefaultContent from './DefaultContent';\r\nimport '../Footer.css';\r\n\r\n/** Use the mini footer when required. */\r\n\r\nfunction FooterMini({\r\n children, link, title, logo,\r\n}) {\r\n const logoLink = typeof link !== 'string' ? link : {title};\r\n\r\n return (\r\n
\r\n
\r\n {children}\r\n {logoLink}\r\n
\r\n
\r\n );\r\n}\r\n\r\nFooterMini.propTypes = {\r\n /** @ignore */\r\n children: PropTypes.node,\r\n /** Logo link */\r\n link: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\r\n /** Alternative text for logo image and title attribute for the link */\r\n title: PropTypes.string,\r\n /** Source for the Logo */\r\n logo: PropTypes.node,\r\n};\r\n\r\nFooterMini.defaultProps = {\r\n children: ,\r\n link: '/',\r\n title: 'notz stucki',\r\n logo: 'notz stucki',\r\n};\r\n\r\nexport default FooterMini;\r\n","import LanguageSwitcher from './LanguageSwitcher';\r\n\r\nexport default LanguageSwitcher;\r\n","import React from 'react';\r\nimport { Select } from 'ui-library';\r\nimport './LanguageSwitcher.css';\r\nimport { useLanguageSwitcher } from '../../hooks/useLanguageSwitcher';\r\n\r\nconst LanguageSwitcher = () => {\r\n const { languages, language, changeLanguage, t } = useLanguageSwitcher();\r\n\r\n if (languages.length) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nexport default LanguageSwitcher;\r\n","import React from 'react';\r\nimport FooterMini from 'lib/ui-library/Footer/FooterMini';\r\nimport { useTranslation } from 'react-i18next';\r\nimport LanguageSwitcher from 'translations/component/LanguageSwitcher';\r\nimport footerLogo from 'clientRequirements/images/icon_NS.png';\r\nimport './Footer.css';\r\nimport { LINKEDIN_URL, NOTZ_STUCKI_MAIN_SITE } from 'constants/constants';\r\nimport linkedinIcon from 'styles/icons/linkedin.svg';\r\n\r\nexport const Footer = () => {\r\n const { t } = useTranslation();\r\n const footerLink = (\r\n
\r\n \r\n {t('footer.productName')}\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\r\nFooter.displayName = 'Footer';\r\n","import React, { useEffect, useRef } from 'react';\r\n\r\nconst ScrollTop = () => {\r\n const scrollTopElement = useRef(null);\r\n\r\n const scrollTop = () => {\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth',\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n let visible = false;\r\n\r\n function checkScrollHeight() {\r\n if (\r\n window.innerHeight <= window.pageYOffset * 1.2 &&\r\n !visible &&\r\n scrollTopElement.current\r\n ) {\r\n scrollTopElement.current.classList.add('visible');\r\n visible = true;\r\n } else if (\r\n window.innerHeight > window.pageYOffset * 1.2 &&\r\n visible &&\r\n scrollTopElement.current\r\n ) {\r\n scrollTopElement.current.classList.remove('visible');\r\n visible = false;\r\n }\r\n }\r\n\r\n window.addEventListener('scroll', checkScrollHeight);\r\n\r\n return () => window.removeEventListener('scroll', () => {});\r\n }, []);\r\n\r\n return (\r\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions\r\n
\r\n ↑\r\n
\r\n BACK TO THE TOP\r\n
\r\n );\r\n};\r\n\r\nexport default ScrollTop;\r\n","import React from 'react';\r\nimport LogoImage from 'clientRequirements/images/icon_NS.png';\r\nimport './Logo.css';\r\n\r\nexport const Logo = () => (\r\n
\r\n \"Notz\r\n
\r\n);\r\n","import React, { Fragment, useCallback, useMemo, useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Header as HeaderUILibrary,\r\n Navigation,\r\n NavigationLink as NavLink,\r\n Toggle,\r\n} from 'ui-library';\r\nimport { Logo } from 'components/Logo';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { setTheme } from 'redux/theme/themeActions';\r\nimport { getThemeSelector } from 'redux/theme/themeSelectors';\r\nimport { setThemeVariables } from 'utils/configureTheme';\r\nimport DetectorSystemTheme from 'services/core/DetectorSystemTheme';\r\nimport { NOTZ_STUCKI_MAIN_SITE } from '../../../constants/constants';\r\n\r\nexport const Header = ({ isAuthenticated, onRightButtonClick, pathname, profile }) => {\r\n const { t, i18n } = useTranslation();\r\n const [profileOpen, setProfileOpen] = useState(false);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const toggleNavigation = () => {\r\n setIsOpen(!isOpen);\r\n };\r\n const closeNavigation = () => {\r\n setIsOpen(false);\r\n };\r\n const current = useMemo(() => pathname.split('/')[1], [pathname]);\r\n const navigation = useMemo(\r\n () => [\r\n {\r\n title: t('MainMenu.DashboardMenuItem'),\r\n link: '/dashboard',\r\n active: current === 'dashboard',\r\n },\r\n {\r\n title: t('MainMenu.PortfoliosMenuItem'),\r\n link: '/portfolios',\r\n active: current === 'portfolios',\r\n },\r\n {\r\n title: t('MainMenu.Documents'),\r\n link: '/documents',\r\n active: current === 'documents',\r\n },\r\n { title: t('MainMenu.NewsMenuItem'), link: '/news', active: current === 'news' },\r\n { title: t('MainMenu.Faq'), link: '/faq', active: current === 'faq' },\r\n ],\r\n [pathname, i18n.language]\r\n );\r\n\r\n const dispatch = useDispatch();\r\n const theme = useSelector(getThemeSelector);\r\n const defaultChecked = useMemo(() => theme === 'dark', [theme]);\r\n const changeTheme = useCallback(\r\n (value) => {\r\n const newTheme = value ? 'dark' : 'light';\r\n\r\n dispatch(setTheme(newTheme));\r\n setThemeVariables(newTheme);\r\n document.documentElement.setAttribute('data-theme', newTheme);\r\n },\r\n [setTheme, setThemeVariables]\r\n );\r\n\r\n const detectorTheme = (e) => {\r\n changeTheme(e.matches);\r\n };\r\n\r\n useEffect(() => {\r\n DetectorSystemTheme.subscribe(detectorTheme);\r\n\r\n return () => {\r\n DetectorSystemTheme.unsubscribe(detectorTheme);\r\n };\r\n }, []);\r\n const profileInfo = useMemo(\r\n () => ({\r\n ...profile,\r\n withEdit: false,\r\n withAlert: true,\r\n logoutText: t('dashboard.profile.logout'),\r\n onLogout: () => {\r\n setProfileOpen(false);\r\n onRightButtonClick();\r\n },\r\n additionalInfo: (\r\n <>\r\n \r\n {t('dashboard.profile.riskProfile')}\r\n {': '}\r\n \r\n {profile.riskProfile}\r\n
\r\n \r\n {t(\r\n profile.portfolios > 1\r\n ? 'dashboard.profile.portfolios'\r\n : 'dashboard.profile.portfolio'\r\n )}\r\n {': '}\r\n \r\n {profile.portfolios}\r\n
\r\n

{t('dashboard.turnOnDarkMode')}

\r\n \r\n
\r\n \r\n ),\r\n visible: profileOpen,\r\n onVisibleChange: setProfileOpen,\r\n }),\r\n [profile, profileOpen, defaultChecked, setTheme]\r\n );\r\n const navigationTablet = useMemo(\r\n () => (\r\n \r\n {t('MainMenu.DashboardMenuItem')}\r\n {t('MainMenu.PortfoliosMenuItem')}\r\n {t('MainMenu.Documents')}\r\n {t('MainMenu.NewsMenuItem')}\r\n {t('MainMenu.Faq')}\r\n \r\n ),\r\n [isOpen, pathname, closeNavigation]\r\n );\r\n const leftButton = { type: isAuthenticated === true ? 'menu' : null, label: null };\r\n const rightButton = { type: isAuthenticated === true ? 'login' : null, label: null };\r\n\r\n return (\r\n \r\n (\r\n \r\n {children}\r\n \r\n )}\r\n title=\"Notz Stucki\"\r\n navigation={isAuthenticated && navigation}\r\n leftButton={leftButton}\r\n rightButton={rightButton}\r\n profileInfo={isAuthenticated && profileInfo}\r\n navigationTablet={navigationTablet}\r\n onLeftButtonClick={toggleNavigation}\r\n content={}\r\n />\r\n \r\n );\r\n};\r\n\r\nHeader.propTypes = {\r\n pathname: PropTypes.string.isRequired,\r\n onRightButtonClick: PropTypes.func.isRequired,\r\n isAuthenticated: PropTypes.bool.isRequired,\r\n profile: PropTypes.shape({\r\n name: PropTypes.string,\r\n image: PropTypes.string,\r\n portfolios: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n riskProfile: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nHeader.defaultProps = {};\r\n\r\nHeader.displayName = 'Header';\r\n","// import { validateStringData, validateName } from 'utils/formatting';\r\n// import { validateStringData } from 'utils/formatting';\r\n\r\n// import avatar from 'assets/images/avatar/AdvisorMale.jpg';\r\n\r\n// export const adaptProfile = (data, imageData) => ({\r\nexport const adaptProfile = (dataProfile, clientName) => ({\r\n name: clientName,\r\n // name: `${validateName(data.FirstName)} ${validateName(data.LastName)}`,\r\n // image: imageData.ImageContentBase64\r\n // ? `data:image/jpeg;base64,${imageData.ImageContentBase64}`\r\n // : avatar,\r\n // riskProfile: validateStringData(data.ChosenRiskCategory),\r\n portfolios: dataProfile.Investments.reduce((acc, { Count }) => acc + Count, 0),\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { contactIdSelector, isAuthenticatedSelector } from 'redux/auth/authSelectors';\r\nimport { connect } from 'react-redux';\r\nimport { logout } from 'redux/auth/authActions';\r\nimport history from 'services/core/history';\r\nimport { Header } from '../components/Header';\r\nimport { useWithClientProfile } from './hooks/useWithClientProfile';\r\n\r\nconst HeaderContainer = ({ contactId, isAuthenticated, ...props }) => {\r\n const { data } = useWithClientProfile(contactId, isAuthenticated);\r\n\r\n return
;\r\n};\r\n\r\nHeaderContainer.propTypes = {\r\n contactId: PropTypes.number.isRequired,\r\n isAuthenticated: PropTypes.bool.isRequired,\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n isAuthenticated: isAuthenticatedSelector(state),\r\n contactId: contactIdSelector(state),\r\n});\r\n\r\nconst mapDispatchToProps = {\r\n logout,\r\n};\r\n\r\nconst mergeProps = (stateProps, dispatchProps, ownProps) =>\r\n Object.assign({}, ownProps, stateProps, {\r\n onRightButtonClick: () => {\r\n if (stateProps.isAuthenticated === true) {\r\n dispatchProps.logout();\r\n } else {\r\n history.push('/login');\r\n }\r\n },\r\n });\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps, mergeProps)(HeaderContainer);\r\n","import { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport AdapterError from 'errors/AdapterError';\r\nimport ServerError from 'errors/ServerError';\r\nimport { adaptProfile } from '../adapters/adaptProfile';\r\n\r\nexport const useWithClientProfile = (contactId, isAuthenticated) => {\r\n const [error, setError] = useState(null);\r\n const [isLoading, setLoading] = useState(true);\r\n const [data, setData] = useState({ name: '', image: '' });\r\n const { i18n } = useTranslation();\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (isAuthenticated) {\r\n setLoading(true);\r\n\r\n Promise.all([\r\n ServiceManager.contactManagement('getClientProfile', [\r\n contactId,\r\n `${i18n.language}`,\r\n ]),\r\n ServiceManager.products('getAccounts', [contactId, `${i18n.language}`]),\r\n ])\r\n .then((response) => response.map((item) => item.data))\r\n .then((response) => {\r\n try {\r\n const clientName =\r\n JSON.parse(response[1][0].Attributes)?.ClientName || 'N/A';\r\n\r\n setData(adaptProfile(response[0], clientName, t));\r\n // setUnreadMessages(response[1].Total !== 0);\r\n setLoading(false);\r\n } catch (err) {\r\n throw new AdapterError(err);\r\n }\r\n })\r\n .catch((err) => {\r\n setError(err.type !== undefined ? err : new ServerError(err));\r\n setLoading(false);\r\n });\r\n }\r\n }, [isAuthenticated, i18n.language]);\r\n\r\n return {\r\n data,\r\n error,\r\n isLoading,\r\n };\r\n};\r\n","import React, { Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Footer } from 'components/Footer';\r\nimport ScrollTop from 'components/ScrollTop';\r\nimport { HeaderContainer as Header } from '../containers';\r\n\r\nexport const RootTemplate = ({ children, ...props }) => (\r\n \r\n
\r\n
{children}
\r\n \r\n
\r\n \r\n);\r\n\r\nRootTemplate.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n};\r\n\r\nRootTemplate.defaultProps = {};\r\n\r\nRootTemplate.displayName = 'RootTemplate';\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst TermsText = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n

\r\n

    \r\n {/* 1 */}\r\n

    \r\n
  1. {t('termsOfUse.legalNotice')}
  2. \r\n

    \r\n
      \r\n
    1. \r\n {t('termsOfUse.paragraph1')}\r\n
    2. \r\n
    3. \r\n {t('termsOfUse.paragraph2')}\r\n
      \r\n
      \r\n {t('termsOfUse.paragraph3')}\r\n
    4. \r\n
    5. \r\n {t('termsOfUse.paragraph4')}\r\n
      \r\n
      \r\n {t('termsOfUse.paragraph5')}\r\n
      \r\n
      \r\n {t('termsOfUse.paragraph6')}\r\n
      \r\n
      \r\n {t('termsOfUse.paragraph7')}\r\n
      \r\n
      \r\n {t('termsOfUse.paragraph8')}\r\n
    6. \r\n
    7. \r\n {t('termsOfUse.paragraph9')}\r\n
      \r\n
      \r\n {t('termsOfUse.paragraph10')}\r\n
    8. \r\n
    9. \r\n {t('termsOfUse.paragraph11')}\r\n
    10. \r\n
    \r\n\r\n {/* 2 */}\r\n

    \r\n
  3. {t('termsOfUse.dataProtectionPolicy')}
  4. \r\n

    \r\n\r\n {/* 3 */}\r\n

    {t('termsOfUse.generalConsiderations')}

    \r\n

    \r\n {t('termsOfUse.paragraph12')}\r\n https://www.notzstucki.com/\r\n

    \r\n\r\n {/* 4 */}\r\n

    {t('termsOfUse.basicPrinciplesPrivacyPolicy')}

    \r\n

    {t('termsOfUse.paragraph13')}

    \r\n

    {t('termsOfUse.paragraph14')}

    \r\n

    {t('termsOfUse.paragraph15')}

    \r\n

    {t('termsOfUse.paragraph16')}

    \r\n

    {t('termsOfUse.paragraph17')}

    \r\n

    {t('termsOfUse.paragraph18')}

    \r\n\r\n {/* 5 */}\r\n

    {t('termsOfUse.personalDataUse')}

    \r\n
      \r\n
    1. {t('termsOfUse.paragraph19')}
    2. \r\n
    3. {t('termsOfUse.paragraph20')}
    4. \r\n
    5. {t('termsOfUse.paragraph21')}
    6. \r\n
    7. {t('termsOfUse.paragraph22')}
    8. \r\n
    9. {t('termsOfUse.paragraph23')}
    10. \r\n
    \r\n\r\n {/* 6 */}\r\n

    {t('termsOfUse.personalDataRights')}

    \r\n

    {t('termsOfUse.paragraph24')}

    \r\n

    {t('termsOfUse.paragraph25')}

    \r\n

    {t('termsOfUse.paragraph26')}

    \r\n

    {t('termsOfUse.paragraph27')}

    \r\n

    {t('termsOfUse.paragraph28')}

    \r\n\r\n {/* 7 */}\r\n

    {t('termsOfUse.dataDuration')}

    \r\n

    {t('termsOfUse.paragraph29')}

    \r\n

    {t('termsOfUse.paragraph30')}

    \r\n

    {t('termsOfUse.paragraph31')}

    \r\n\r\n {/* 8 */}\r\n

    {t('termsOfUse.dataController')}

    \r\n

    {t('termsOfUse.paragraph32')}

    \r\n

    {t('termsOfUse.paragraph33')}

    \r\n\r\n {/* 9 */}\r\n

    {t('termsOfUse.linkToThirdParty')}

    \r\n

    {t('termsOfUse.paragraph34')}

    \r\n\r\n {/* 10 */}\r\n

    \r\n
  5. {t('termsOfUse.cookiePolicy')}
  6. \r\n

    \r\n

    {t('termsOfUse.paragraph35')}

    \r\n

    {t('termsOfUse.paragraph36')}

    \r\n\r\n {/* 11 */}\r\n

    {t('termsOfUse.whatAreCookies')}

    \r\n

    {t('termsOfUse.paragraph37')}

    \r\n
      \r\n {t('termsOfUse.paragraph38')}\r\n
    • {t('termsOfUse.paragraph39')}
    • \r\n
    • {t('termsOfUse.paragraph40')}
    • \r\n
    • {t('termsOfUse.paragraph41')}
    • \r\n
    \r\n

    {t('termsOfUse.paragraph42')}

    \r\n

    {t('termsOfUse.paragraph43')}

    \r\n\r\n

    {t('termsOfUse.typesOfCookies')}

    \r\n
      \r\n {t('termsOfUse.paragraph44')}\r\n
    1. {t('termsOfUse.paragraph45')}
    2. \r\n

      {t('termsOfUse.paragraph46')}

      \r\n

      {t('termsOfUse.paragraph47')}

      \r\n
    3. {t('termsOfUse.paragraph48')}
    4. \r\n
        \r\n
      • {t('termsOfUse.paragraph49')}
      • \r\n
      • {t('termsOfUse.paragraph50')}
      • \r\n
      • {t('termsOfUse.paragraph51')}
      • \r\n
      • {t('termsOfUse.paragraph52')}
      • \r\n
      • {t('termsOfUse.paragraph53')}
      • \r\n
      \r\n
    \r\n\r\n
    \r\n
    \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \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('termsOfUse.nameOfCookie')}\r\n \r\n \r\n \r\n {t('termsOfUse.length')}\r\n \r\n \r\n \r\n {t('termsOfUse.description')}\r\n \r\n
\r\n \r\n {t('termsOfUse.paragraph54')}\r\n \r\n \r\n \r\n {t('termsOfUse.paragraph55')}\r\n \r\n \r\n \r\n {t('termsOfUse.paragraph56')}\r\n \r\n
\r\n \r\n {t('termsOfUse.paragraph57')}\r\n \r\n \r\n \r\n {t('termsOfUse.paragraph58')}\r\n \r\n \r\n \r\n {t('termsOfUse.paragraph59')}\r\n \r\n
\r\n \r\n {t('termsOfUse.paragraph60')}\r\n \r\n \r\n \r\n {t('termsOfUse.paragraph61')}\r\n \r\n \r\n \r\n {t('termsOfUse.paragraph62')}\r\n \r\n
\r\n \r\n \r\n\r\n
\r\n
\r\n\r\n

\r\n {t('termsOfUse.furtherInfo')}\r\n \r\n {' '}\r\n https://www.google.com/analytics/learn/privacy.html?hl=es\r\n \r\n

\r\n\r\n
\r\n
\r\n\r\n {/* 12 */}\r\n

{t('termsOfUse.cookieConfiguration')}

\r\n

{t('termsOfUse.paragraph63')}

\r\n

{t('termsOfUse.paragraph64')}

\r\n

{t('termsOfUse.paragraph65')}

\r\n

{t('termsOfUse.paragraph66')}

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

Microsoft

\r\n \r\n https://windows.microsoft.com/es-es/windows-vista/block-or-allow-cookies\r\n \r\n\r\n
\r\n
\r\n\r\n

Safari

\r\n \r\n https://support.apple.com/kb/HT1677?viewlocale=es_ES\r\n \r\n\r\n
\r\n
\r\n\r\n

Google Chrome

\r\n \r\n https://support.google.com/chrome/answer/95647?hl=es\r\n \r\n\r\n
\r\n
\r\n\r\n

Firefox

\r\n \r\n https://support.mozilla.org/es/kb/habilitar-y-deshabilitar-cookies-que-los-sitios-we\r\n \r\n \r\n

\r\n \r\n );\r\n};\r\n\r\nexport default TermsText;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from '../Button';\r\nimport TermsText from './TermsText';\r\n\r\nconst TermsOfUse = ({ setTerms }) => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n

{t('termsOfUse.disclaimer')}

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

\r\n {t('termsOfUse.disclaimerDescription')}\r\n

\r\n setTerms()}\r\n >\r\n {t('termsOfUse.accept')}\r\n \r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nTermsOfUse.propTypes = {\r\n setTerms: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default TermsOfUse;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { connect } from 'react-redux';\r\nimport TermsOfUse from '../../../components/TermsOfUse/TermsOfUse';\r\nimport { userSelector } from '../../../redux/auth/authSelectors';\r\nimport { setTermsAccepted } from '../../../redux/auth/authActions';\r\n\r\nconst WithTermsOfUsePopUp = ({ children, user, ...props }) => (\r\n <>\r\n {!user?.isTermsAccepted && }\r\n
{children}
\r\n \r\n);\r\n\r\nconst mapStateToProps = (state) => ({\r\n user: userSelector(state),\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n setTerms: () => dispatch(setTermsAccepted(true)),\r\n});\r\n\r\nWithTermsOfUsePopUp.propTypes = {\r\n user: PropTypes.shape({\r\n isTermsAccepted: PropTypes.bool,\r\n }).isRequired,\r\n children: PropTypes.shape({}).isRequired,\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(WithTermsOfUsePopUp);\r\n","import React from 'react';\r\nimport { withAuthentication } from 'hocs';\r\nimport { Redirect, Route, Switch } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport { withTranslation } from 'react-i18next';\r\nimport RouteWithAppTitle from 'components/RouteWithAppTitle';\r\nimport { PageNotFound } from './pages/404';\r\nimport Dashboard from './pages/Dashboard/Router';\r\nimport News from './pages/News/Router';\r\nimport Portfolios from './pages/Portfolios/Router';\r\nimport { UserActivation } from './pages/UserActivation';\r\nimport Documents from './pages/Documents';\r\nimport ActivationEn from './pages/Activation/en';\r\nimport ActivationFr from './pages/Activation/fr';\r\nimport ActivationDe from './pages/Activation/de';\r\nimport ActivationIt from './pages/Activation/it';\r\nimport ActivationPr from './pages/Activation/pr';\r\nimport ActivationEs from './pages/Activation/es';\r\nimport Faq from './pages/Faq';\r\nimport ResetPassword from './pages/ResetPassword';\r\nimport { RootTemplate } from './templates';\r\nimport WithTermsOfUse from './containers/hocs/WithTermsOfUse';\r\n\r\nexport const RootRouter = ({ match: { path }, location: { pathname } }) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nRootRouter.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string,\r\n }).isRequired,\r\n location: PropTypes.shape({\r\n pathname: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nRootRouter.defaultProps = {};\r\n\r\nRootRouter.displayName = 'Router';\r\n","// api respose statuses\r\nexport const PRE_AUTH = 'preAuth';\r\nexport const TO_ENROLL_DEVICE = 'gotoDeviceEnrollment';\r\nexport const ENROLL_DEVICE = 'enrollYourDevice';\r\nexport const AUTH_PASSCODE = 'enterPasscode';\r\nexport const AUTH_ALLOW = 'authAllow';\r\n// export const AUTH_MTAN = 'enterPasscode';\r\n// export const AUTH_QRCODE = 'enterPasscode';\r\n\r\nexport const TITLE_VIEWS = {\r\n [PRE_AUTH]: 'login.LOGIN',\r\n [TO_ENROLL_DEVICE]: 'login.LOGIN',\r\n [ENROLL_DEVICE]: 'enrollDevice.twoFactorActivation',\r\n [AUTH_PASSCODE]: 'login.passCode',\r\n}\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Infobox, Title } from 'ui-library';\r\nimport historyRouter from 'services/core/history';\r\nimport { DEVICE_NOT_ENROLLED, PENDING, SUCCESS } from \"static/requestResults\";\r\nimport UserAndPassword from 'components/Form/UserAndPassword';\r\nimport { useTranslation } from 'react-i18next';\r\nimport EnrollementInfoBox from '../../../../../components/EnrollmentInfoBox/EnrollementInfoBox';\r\nimport ServiceManager from \"../../../../../services/core/ServiceManager\";\r\nimport { get } from \"lodash/fp\";\r\nimport { getErrorModelByStatus, LOGIN_FAILED_UNEXPECTEDLY } from \"../../../../../error/authErrors\";\r\n\r\nexport const FORM_NAME = 'login';\r\nexport const LOGIN_FORM_VIEW = 'LOGIN_FORM_VIEW';\r\nexport const ENROLL_DEVICE_VIEW = 'ENROLL_DEVICE_VIEW';\r\n\r\nconst renderForgotLink = (t) => (\r\n {\r\n historyRouter.push('/forgot-password');\r\n }}\r\n type=\"secondary\"\r\n >\r\n {t('login.FORGOT_PASSWORD')}\r\n \r\n);\r\n\r\nconst LoginForm = (props) => {\r\n const {\r\n error,\r\n submitting,\r\n handleSubmit,\r\n onLogin2FA,\r\n qrCode,\r\n onEnroll,\r\n isEnrollSuccess,\r\n isEnrollDeviceSuccess,\r\n isEnrollUnsuccess,\r\n } = props;\r\n const { t } = useTranslation();\r\n const [view, setView] = useState(LOGIN_FORM_VIEW);\r\n const [errorContent, setError] = useState(null);\r\n\r\n const login = () => {\r\n const { reset } = props;\r\n\r\n reset();\r\n setView(LOGIN_FORM_VIEW);\r\n };\r\n\r\n if (error !== undefined && error !== null) {\r\n if (typeof error === 'string') {\r\n setError(\r\n
\r\n \r\n {t(error)}\r\n \r\n
\r\n );\r\n } else if (\r\n typeof error === 'object' &&\r\n error.type === DEVICE_NOT_ENROLLED &&\r\n view !== ENROLL_DEVICE_VIEW\r\n ) {\r\n setView(ENROLL_DEVICE_VIEW);\r\n } else if (isEnrollUnsuccess === true) {\r\n setError(\r\n
\r\n {t(error.message)}\r\n
\r\n );\r\n }\r\n }\r\n\r\n if (isEnrollDeviceSuccess === true && view !== LOGIN_FORM_VIEW) {\r\n return (\r\n
\r\n {t('enrollDevice.deviceHasBeenEnrolled')}\r\n

{t('enrollDevice.readyToUse')}

\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n if (isEnrollSuccess && view !== LOGIN_FORM_VIEW) {\r\n return (\r\n
\r\n

{t('enrollDevice.title')}

\r\n

{`${t('enrollDevice.scanQRCode')}:`}

\r\n
\r\n
\r\n );\r\n }\r\n let newProps = null;\r\n\r\n if (view === LOGIN_FORM_VIEW) {\r\n newProps = {\r\n title: 'login.LOGIN',\r\n bottomLinks: renderForgotLink(t),\r\n error: errorContent,\r\n submitLabel: 'login.LOGIN',\r\n onSubmit: onLogin2FA,\r\n };\r\n }\r\n if (view === ENROLL_DEVICE_VIEW) {\r\n newProps = {\r\n title: 'login.LOGIN',\r\n info: EnrollementInfoBox,\r\n submitLabel: 'common.CONTINUE_MSG',\r\n onSubmit: onEnroll,\r\n };\r\n }\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nLoginForm.propTypes = {\r\n error:\r\n PropTypes.string ||\r\n PropTypes.shape({\r\n message: PropTypes.string,\r\n type: PropTypes.string,\r\n }),\r\n submitting: PropTypes.bool.isRequired,\r\n reset: PropTypes.func.isRequired,\r\n handleSubmit: PropTypes.func.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n t: PropTypes.func.isRequired,\r\n title: PropTypes.string,\r\n};\r\n\r\nLoginForm.defaultProps = {\r\n error: undefined,\r\n title: null,\r\n};\r\n\r\nLoginForm.displayName = 'LoginForm';\r\n\r\nexport default LoginForm;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Field, reduxForm } from 'redux-form';\r\nimport { Button } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FieldRenderer } from 'components/Field';\r\nimport { PasswordFieldRenderer } from 'components/Field/PasswordRenderer';\r\nimport { connect } from 'react-redux';\r\nimport { FORM_NAME } from '../components/LoginForm/LoginFormNew';\r\nimport { validateLoginForm } from '../utils/validation';\r\n\r\nconst LoginForm = ({ isSubmitting, submitLabel, onSubmit, handleSubmit, bottomLinks }) => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {bottomLinks}\r\n
\r\n \r\n );\r\n};\r\n\r\nLoginForm.propTypes = {\r\n isSubmitting: PropTypes.bool.isRequired,\r\n submitLabel: PropTypes.string.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n handleSubmit: PropTypes.func.isRequired,\r\n bottomLinks: PropTypes.instanceOf(Object),\r\n};\r\n\r\nLoginForm.defaultProps = {\r\n bottomLinks: null,\r\n};\r\n\r\nLoginForm.displayName = 'LoginForm';\r\n\r\nconst WrappedIntoReduxForm = reduxForm({\r\n form: FORM_NAME,\r\n validate: validateLoginForm,\r\n})(LoginForm);\r\n\r\nexport default connect()(WrappedIntoReduxForm);\r\n","import React, { useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button } from 'ui-library';\r\nimport { Passcode } from 'components/molecules';\r\nimport './FuturaePasscode.css';\r\n\r\nexport const FuturaePasscode = ({ onSubmit, onChange, isLoading, infoText, passcodeLength }) => {\r\n const [passcode, setPasscode] = useState('');\r\n const changeTanHandler = (value) => {\r\n setPasscode(value);\r\n onChange(value);\r\n };\r\n const { t } = useTranslation();\r\n\r\n const submit = (event) => {\r\n event.preventDefault();\r\n onSubmit(passcode);\r\n };\r\n\r\n return (\r\n
\r\n
\r\n

{t(infoText)}

\r\n\r\n \r\n\r\n
\r\n \r\n {isLoading ? t('login.validating') : t('login.confirm')}\r\n \r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nFuturaePasscode.propTypes = {\r\n passcodeLength: PropTypes.number,\r\n onSubmit: PropTypes.func.isRequired,\r\n onChange: PropTypes.func,\r\n onCancel: PropTypes.func,\r\n error: PropTypes.string,\r\n isLoading: PropTypes.bool,\r\n infoText: PropTypes.string,\r\n};\r\n\r\nFuturaePasscode.defaultProps = {\r\n passcodeLength: 6,\r\n onChange: () => {},\r\n onCancel: () => {},\r\n error: undefined,\r\n isLoading: false,\r\n infoText: 'login.enterTheCode',\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Loading } from 'components/Loading';\r\nimport { Button } from 'components/Button';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { LOGIN_FAILED_UNEXPECTEDLY } from 'error/authErrors';\r\nimport { FuturaePasscode } from './FuturaePasscode';\r\n\r\nconst MobileAppApprove = (props) => {\r\n const {\r\n isPreAuthLoading,\r\n isLoading,\r\n error,\r\n onPreAuth,\r\n validatePasscode,\r\n passcodeLength,\r\n contactId,\r\n onBackToLogin,\r\n } = props;\r\n\r\n useEffect(() => {\r\n if (!contactId) {\r\n onPreAuth();\r\n }\r\n }, []);\r\n const { t } = useTranslation();\r\n\r\n // const { passcodeLength, provider, onLogin, t } = this.props;\r\n // const Passcode = provider === MTAN ? MTanPasscode : FuturaePasscode;\r\n const Passcode = FuturaePasscode;\r\n\r\n if (error?.type === LOGIN_FAILED_UNEXPECTEDLY) {\r\n return (\r\n
\r\n \r\n {t('forgotPassword.backToLogin')}\r\n \r\n
\r\n );\r\n }\r\n\r\n return isPreAuthLoading ? (\r\n \r\n ) : (\r\n \r\n );\r\n};\r\n\r\nMobileAppApprove.propTypes = {\r\n isPreAuthLoading: PropTypes.bool.isRequired,\r\n isLoading: PropTypes.bool.isRequired,\r\n error: PropTypes.shape({ type: PropTypes.string, message: PropTypes.string }).isRequired,\r\n onPreAuth: PropTypes.func.isRequired,\r\n validatePasscode: PropTypes.func.isRequired,\r\n passcodeLength: PropTypes.number.isRequired,\r\n contactId: PropTypes.number.isRequired,\r\n onBackToLogin: PropTypes.func.isRequired,\r\n};\r\n\r\nMobileAppApprove.defaultProps = {};\r\n\r\nMobileAppApprove.displayName = 'LoginPasscode';\r\n\r\nexport default MobileAppApprove;\r\n","import { cookies } from 'redux/auth/authActions';\r\nimport { DEVICE_NOT_ENROLLED, SUCCESS } from 'static/requestResults';\r\nimport CustomServiceManager from 'services/custom/CustomServiceManager';\r\nimport { getAuthErrorByStatus, LOGIN_FAILED_UNEXPECTEDLY } from 'error/authErrors';\r\nimport { AUTH_PASSCODE, AUTH_ALLOW, TO_ENROLL_DEVICE } from '../constants';\r\n\r\nexport async function preAuth(username, password, callback) {\r\n try {\r\n const result = { error: {} };\r\n const trustedDeviceToken = cookies.get('trustedDeviceToken');\r\n\r\n const { data } = await CustomServiceManager.logIn2({\r\n username,\r\n password,\r\n trustedDeviceToken,\r\n });\r\n\r\n const preAuthResult = data.Result;\r\n const errorObject = getAuthErrorByStatus(preAuthResult);\r\n\r\n if (errorObject !== undefined) {\r\n // eslint-disable-next-line no-underscore-dangle\r\n const responseError = errorObject._error;\r\n\r\n if (responseError.type === DEVICE_NOT_ENROLLED) {\r\n result.status = TO_ENROLL_DEVICE;\r\n } else {\r\n // eslint-disable-next-line no-underscore-dangle\r\n result.error = errorObject._error.type\r\n ? responseError\r\n : { type: 'error', message: responseError };\r\n }\r\n } else if (preAuthResult === SUCCESS) {\r\n result.contactId = data.CampaignContact.ContactId;\r\n\r\n const session = data.Session;\r\n\r\n if (session !== undefined) {\r\n result.sessionId = session.SessionId;\r\n result.jwtAccessToken = session.JwtAccessToken;\r\n result.status = AUTH_ALLOW;\r\n } else {\r\n result.status = AUTH_PASSCODE;\r\n }\r\n } else {\r\n result.error = { type: DEVICE_NOT_ENROLLED };\r\n }\r\n callback(result);\r\n } catch {\r\n callback({\r\n error: {\r\n type: LOGIN_FAILED_UNEXPECTEDLY,\r\n message: getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY)._error,\r\n },\r\n });\r\n }\r\n}\r\n","import ServiceManager from 'services/core/ServiceManager';\r\nimport {\r\n getAuthErrorByStatus,\r\n getErrorModelByStatus,\r\n LOGIN_FAILED_UNEXPECTEDLY,\r\n} from 'error/authErrors';\r\nimport {\r\n EXPIRED,\r\n PENDING,\r\n SESSION_EXPIRED,\r\n SUCCESS,\r\n UNEXPECTED_ERROR,\r\n} from 'static/requestResults';\r\nimport { cookies } from 'redux/auth/authActions';\r\nimport { AUTH_PASSCODE, ENROLL_DEVICE } from '../constants';\r\n\r\nasync function checkEnrollStatus({ username, enrollmentSessionId, qrCode }, callback) {\r\n const result = {};\r\n\r\n try {\r\n const { data } = await ServiceManager.deviceEnrollment('checkEnroll', [\r\n username,\r\n enrollmentSessionId,\r\n ]);\r\n\r\n const enrollResult = data.Result;\r\n const enrollStatus = data.Status;\r\n const enrollError = getErrorModelByStatus(enrollResult);\r\n\r\n if (enrollError !== undefined) {\r\n result.error = enrollError;\r\n } else if (enrollResult !== SUCCESS) {\r\n result.error = getErrorModelByStatus(UNEXPECTED_ERROR);\r\n } else if (enrollStatus === SUCCESS) {\r\n cookies.remove('trustedDeviceToken');\r\n result.enrollStatusTimeout = undefined;\r\n result.qrCode = undefined;\r\n result.status = AUTH_PASSCODE;\r\n } else if (enrollStatus === PENDING) {\r\n result.qrCode = qrCode;\r\n result.enrollStatusTimeout = setTimeout(() => {\r\n checkEnrollStatus(\r\n {\r\n username,\r\n enrollmentSessionId,\r\n qrCode,\r\n },\r\n callback\r\n );\r\n }, process.env.REACT_APP_QR_CODESTATUS_POLLING_INTERVAL);\r\n } else if (enrollStatus === EXPIRED) {\r\n result.status = EXPIRED;\r\n result.error = getErrorModelByStatus(SESSION_EXPIRED);\r\n }\r\n callback(result);\r\n } catch {\r\n result.error = getErrorModelByStatus(SESSION_EXPIRED);\r\n callback(result);\r\n }\r\n}\r\n\r\nexport async function enrollDeviceByUserAndPassword(username, password, callback) {\r\n const result = {};\r\n\r\n try {\r\n const { data } = await ServiceManager.deviceEnrollment('enrollByUserAndPassword', [\r\n {\r\n username,\r\n password,\r\n },\r\n ]);\r\n\r\n const enrollStatus = data.Result;\r\n const errorObject = getAuthErrorByStatus(enrollStatus);\r\n\r\n if (errorObject !== undefined) {\r\n // eslint-disable-next-line no-underscore-dangle\r\n result.error = errorObject._errror;\r\n } else if (enrollStatus === SUCCESS) {\r\n result.qrCode = data.AsynchronousParameters?.ActivationQrCodeUrl;\r\n result.status = ENROLL_DEVICE;\r\n checkEnrollStatus(\r\n {\r\n username,\r\n enrollmentSessionId: data.EnrollmentSessionId,\r\n qrCode: result.qrCode,\r\n },\r\n callback\r\n );\r\n } else {\r\n result.enrollError = getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n }\r\n callback(result);\r\n } catch {\r\n result.enrollError = getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n callback(result);\r\n }\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Infobox, Title } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const EnrollQRCode = ({\r\n qrCode,\r\n enrollError,\r\n // activatePassCodeMode,\r\n enrollStatusTimeout,\r\n}) => {\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n let cleanUp = () => {};\r\n\r\n if (enrollStatusTimeout !== undefined) {\r\n cleanUp = clearTimeout(enrollStatusTimeout);\r\n }\r\n\r\n return cleanUp;\r\n }, []);\r\n\r\n return (\r\n <>\r\n {enrollError !== undefined && enrollError !== null && (\r\n
\r\n {t(enrollError)}\r\n
\r\n )}\r\n

\r\n {t('enrollDevice.scanQRCode')}\r\n
\r\n {t('enrollDevice.ifYourMobileIsOffline')}\r\n
\r\n
\r\n

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

\r\n
\r\n \r\n );\r\n};\r\n\r\nEnrollQRCode.propTypes = {\r\n qrCode: PropTypes.string,\r\n enrollStatusTimeout: PropTypes.number,\r\n enrollError: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\r\n};\r\n\r\nEnrollQRCode.defaultProps = {\r\n qrCode: null,\r\n enrollStatusTimeout: null,\r\n enrollError: null,\r\n};\r\n\r\nEnrollQRCode.displayName = 'EnrollQRCode';\r\n\r\nexport default EnrollQRCode;\r\n","import ServiceManager from 'services/core/ServiceManager';\r\nimport { getErrorModelByStatus } from 'error/authErrors';\r\nimport {\r\n SUCCESS,\r\n UNEXPECTED_ERROR,\r\n UNEXPECTED_ERROR_OR_INVALID_PASSCODE,\r\n} from 'static/requestResults';\r\n\r\nexport async function validatePasscode({ passcode, contactId, isTrustedDevice = false }, callback) {\r\n const result = {};\r\n\r\n try {\r\n const { data } = await ServiceManager.Security('authenticate', [\r\n contactId,\r\n { passcode, setTrusted: isTrustedDevice },\r\n ]);\r\n\r\n const resultStatus = data.Result;\r\n const error = getErrorModelByStatus(resultStatus);\r\n\r\n if (error !== undefined) {\r\n result.error = { type: 'error', message: error.message };\r\n } else if (resultStatus === SUCCESS) {\r\n result.sessionId = data.Session.SessionId;\r\n result.jwtAccessToken = data.Session.JwtAccessToken;\r\n } else {\r\n result.error = getErrorModelByStatus(UNEXPECTED_ERROR).message;\r\n }\r\n\r\n callback(result);\r\n } catch {\r\n callback(getErrorModelByStatus(UNEXPECTED_ERROR_OR_INVALID_PASSCODE).message);\r\n }\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Title } from 'ui-library';\r\nimport LoginLogoSvgLight from 'clientRequirements/images/logo-mobile.svg';\r\n\r\nconst LoginContentPane = ({ children }) => (\r\n
\r\n
\r\n \r\n <img src={LoginLogoSvgLight} alt=\"Notz Stucki\" />\r\n \r\n
\r\n
{children}
\r\n
\r\n
\r\n
\r\n);\r\n\r\nLoginContentPane.propTypes = {\r\n children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired,\r\n};\r\n\r\nexport default LoginContentPane;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport EnrollementInfoBox from 'components/EnrollmentInfoBox';\r\n\r\nconst ToEnrollDevice = ({ isSubmitting, onSubmit }) => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nToEnrollDevice.propTypes = {\r\n isSubmitting: PropTypes.bool.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n};\r\n\r\nToEnrollDevice.defaultProps = {};\r\n\r\nToEnrollDevice.displayName = 'ToEnrollDevice';\r\n\r\nexport default ToEnrollDevice;\r\n","import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Infobox, Title } from 'ui-library';\r\nimport { get, getOr } from 'lodash/fp';\r\nimport { connect } from 'react-redux';\r\nimport history from 'services/core/history';\r\nimport { AUTH_COMPLETE, getUserProfile } from 'redux/auth/authActions';\r\nimport { isLoginDoneSelector } from 'redux/auth/authSelectors';\r\nimport { getUrlTokenCredentials } from 'utils/url';\r\nimport { GA_ACTIONS, GA_CATEGORIES, sendGAEvent } from 'utils/analytics';\r\nimport {\r\n PRE_AUTH,\r\n TO_ENROLL_DEVICE,\r\n ENROLL_DEVICE,\r\n AUTH_PASSCODE,\r\n AUTH_ALLOW,\r\n TITLE_VIEWS,\r\n} from '../constants';\r\nimport LoginForm from '../components2/LoginForm';\r\nimport MobileAppApprove from '../components2/MobileAppApprove';\r\nimport { preAuth } from '../api/preAuth';\r\nimport { enrollDeviceByUserAndPassword } from '../api/enrollDevice';\r\nimport { EnrollQRCode } from '../components2/EnrollQRCode';\r\nimport { validatePasscode } from '../api/validatePassCode';\r\nimport { validateUsername } from '../utils/validation';\r\nimport LoginContentPane from '../components2/LoginContentPane';\r\nimport ToEnrollDevice from '../components2/ToEnrollDevice';\r\n\r\nconst LoginContainer = (props) => {\r\n const { t } = useTranslation();\r\n const [loginData, setLoginData] = useState({\r\n error: {},\r\n status: PRE_AUTH,\r\n validatedUsername: null,\r\n password: null,\r\n contactId: null,\r\n isSubmitting: false,\r\n isLoading: false,\r\n });\r\n const { isLoginDone } = props;\r\n\r\n const {\r\n urlAccessToken,\r\n urlContactId,\r\n roleId,\r\n isURLLogin,\r\n sessionId,\r\n } = getUrlTokenCredentials();\r\n\r\n useEffect(() => {\r\n if (loginData.error?.message === 'error.invalidLoginCredentials') {\r\n sendGAEvent(GA_ACTIONS.login, GA_CATEGORIES.error, 'invalid_login_credentials');\r\n }\r\n }, [loginData.error]);\r\n\r\n useEffect(() => {\r\n if (isURLLogin) {\r\n props.onAuthComplete({\r\n sessionId,\r\n jwtAccessToken: urlAccessToken,\r\n contactId: urlContactId,\r\n roleId,\r\n });\r\n }\r\n }, [isURLLogin]);\r\n\r\n useEffect(() => {\r\n if (isLoginDone) {\r\n const { router } = props;\r\n const fromPathname = getOr(undefined, 'location.state.from.pathname', router);\r\n\r\n if (fromPathname && fromPathname !== '/login' && fromPathname !== '/') {\r\n history.push(fromPathname);\r\n } else {\r\n history.push('/dashboard');\r\n }\r\n }\r\n }, [isLoginDone]);\r\n\r\n const submitFormHandlers = {\r\n [PRE_AUTH]: {\r\n onSubmit: ({ username, password }) => {\r\n const validatedUsername = validateUsername(username);\r\n\r\n setLoginData((state) => ({\r\n status: state.status,\r\n isSubmitting: true,\r\n validatedUsername,\r\n password,\r\n }));\r\n\r\n preAuth(validatedUsername, password, (result) => {\r\n if (result.status === AUTH_ALLOW) {\r\n props.onAuthComplete({\r\n sessionId: result.sessionId,\r\n jwtAccessToken: result.jwtAccessToken,\r\n contactId: result.contactId,\r\n });\r\n props.handleGetUserProfile();\r\n props.redirectToDashboard();\r\n } else {\r\n setLoginData((state) => ({\r\n ...state,\r\n ...result,\r\n isSubmitting: false,\r\n }));\r\n }\r\n });\r\n },\r\n submitLabel: t('login.LOGIN'),\r\n bottomLinks: (\r\n {\r\n history.push('/forgot-password');\r\n }}\r\n type=\"secondary\"\r\n >\r\n {t('login.FORGOT_PASSWORD')}\r\n \r\n ),\r\n },\r\n\r\n [TO_ENROLL_DEVICE]: {\r\n onSubmit: () => {\r\n setLoginData((state) => ({\r\n ...state,\r\n isSubmitting: true,\r\n }));\r\n\r\n enrollDeviceByUserAndPassword(\r\n loginData.validatedUsername,\r\n loginData.password,\r\n (result) => {\r\n setLoginData((state) => ({\r\n ...state,\r\n ...result,\r\n isSubmitting: false,\r\n }));\r\n }\r\n );\r\n },\r\n },\r\n\r\n [AUTH_PASSCODE]: {\r\n onPreAuth: () => {\r\n setLoginData((state) => ({ ...state, isPreAuthLoading: true }));\r\n preAuth(loginData.validatedUsername, loginData.password, (result) => {\r\n setLoginData((state) => ({\r\n ...state,\r\n ...result,\r\n isPreAuthLoading: false,\r\n }));\r\n });\r\n },\r\n validatePasscode: (passcode) => {\r\n setLoginData((state) => ({ ...state, isLoading: true }));\r\n\r\n validatePasscode(\r\n {\r\n passcode,\r\n contactId: loginData.contactId,\r\n },\r\n (result) => {\r\n if (result.sessionId && result.jwtAccessToken) {\r\n props.onAuthComplete({\r\n sessionId: result.sessionId,\r\n jwtAccessToken: result.jwtAccessToken,\r\n contactId: loginData.contactId,\r\n });\r\n props.handleGetUserProfile();\r\n props.redirectToDashboard();\r\n } else {\r\n setLoginData((state) => ({\r\n ...state,\r\n ...result,\r\n isLoading: false,\r\n }));\r\n }\r\n }\r\n );\r\n },\r\n onBackToLogin: () => {\r\n setLoginData({\r\n error: {},\r\n status: PRE_AUTH,\r\n validatedUsername: null,\r\n password: null,\r\n contactId: null,\r\n isSubmitting: false,\r\n isLoading: false,\r\n });\r\n },\r\n },\r\n };\r\n const currentHandler = submitFormHandlers[loginData.status];\r\n\r\n const loginViews = {\r\n [PRE_AUTH]: (handler) => (\r\n \r\n ),\r\n [TO_ENROLL_DEVICE]: (handler) => ,\r\n [ENROLL_DEVICE]: () => ,\r\n [AUTH_PASSCODE]: (handler) => ,\r\n };\r\n const loginView = loginViews[loginData.status];\r\n const currentTitle = TITLE_VIEWS[loginData.status];\r\n\r\n return (\r\n \r\n {t(currentTitle)}\r\n {loginData.error?.type && (\r\n
\r\n {t(loginData.error?.message)}\r\n
\r\n )}\r\n
{loginView(currentHandler)}
\r\n
\r\n );\r\n};\r\n\r\nconst mapStateToProps = (state) => ({\r\n router: get('router', state),\r\n isLoginDone: isLoginDoneSelector(state),\r\n});\r\n\r\nconst mapDispatchToProps = (dispatch) => ({\r\n handleGetUserProfile: () => dispatch(getUserProfile()),\r\n onAuthComplete: (payload) => dispatch({ type: AUTH_COMPLETE, payload }),\r\n redirectToDashboard: () => {\r\n history.push('/dashboard');\r\n },\r\n});\r\n\r\nLoginContainer.propTypes = {\r\n onAuthComplete: PropTypes.func.isRequired,\r\n handleGetUserProfile: PropTypes.func.isRequired,\r\n redirectToDashboard: PropTypes.func.isRequired,\r\n isLoginDone: PropTypes.bool.isRequired,\r\n router: PropTypes.shape({}).isRequired,\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(LoginContainer);\r\n","import React, { Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Footer } from 'components/Footer';\r\n\r\nexport const NoHeaderTemplate = ({ children }) => (\r\n \r\n
{children}
\r\n
\r\n \r\n);\r\n\r\nNoHeaderTemplate.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n};\r\n\r\nNoHeaderTemplate.defaultProps = {};\r\n\r\nNoHeaderTemplate.displayName = 'NoHeaderTemplate';\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Route, Switch } from 'react-router-dom';\r\nimport LoginContainer from './containers/LoginContainer';\r\nimport { NoHeaderTemplate } from '../../templates/NoHeaderTemplate';\r\n\r\nconst Router = ({ match: { path } }) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nRouter.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string,\r\n }).isRequired,\r\n location: PropTypes.shape({\r\n pathname: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nRouter.defaultProps = {};\r\n\r\nRouter.displayName = 'Router';\r\n\r\nexport default Router;\r\n","import React from 'react';\r\nimport history from 'services/core/history';\r\nimport { Button, Title } from 'ui-library';\r\nimport { useTranslation } from 'react-i18next';\r\nimport LogoImage from 'clientRequirements/images/logo-mobile.svg';\r\n\r\nexport function ForgotPassword() {\r\n const { t } = useTranslation();\r\n\r\n const gotoLogin = () => {\r\n history.push('/login');\r\n };\r\n\r\n return (\r\n
\r\n
\r\n \r\n <img src={LogoImage} alt=\"NS Partners\" />\r\n \r\n
\r\n
\r\n

{t('ForgotPassword.Title')}

\r\n

{t('ForgotPassword.toResetPassContactRM')}

\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Route, Switch } from 'react-router-dom';\r\nimport { ForgotPassword } from './ForgotPasswordAskRM';\r\nimport { NoHeaderTemplate } from '../../templates/NoHeaderTemplate';\r\n\r\nconst Router = ({ match: { path } }) => (\r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nRouter.propTypes = {\r\n match: PropTypes.shape({\r\n path: PropTypes.string,\r\n }).isRequired,\r\n location: PropTypes.shape({\r\n pathname: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nRouter.defaultProps = {};\r\n\r\nRouter.displayName = 'ForgotPasswordRouter';\r\n\r\nexport default Router;\r\n","// validation params probably auth domain\r\nimport CustomServiceManager from 'services/custom/CustomServiceManager';\r\n\r\nexport const validateUrlParams = async (targetObject, propertiesToCheck) => {\r\n if (typeof propertiesToCheck !== 'object' || propertiesToCheck?.length === 0) return false;\r\n\r\n for (let i = 0; i < propertiesToCheck.length; i += 1) {\r\n if (!targetObject[propertiesToCheck[i]]) {\r\n return false;\r\n }\r\n }\r\n\r\n const { data: validationData } = await CustomServiceManager.validateToken(\r\n targetObject.urlAccessToken\r\n );\r\n\r\n return validationData.Result === 'Success';\r\n};\r\n","// general domain - function for all places to update state as callback from service manager\r\nexport const updateStateApi = (setError, setData) => (response) => {\r\n if (response.error) {\r\n setError(response.error);\r\n } else {\r\n setData(response.data);\r\n }\r\n};\r\n","import { useEffect, useState } from 'react';\r\nimport { getDownloadDocumentUrlCredentials } from 'utils/url';\r\nimport { validateUrlParams } from 'pages/pages/DocumentsPreview/api/auth';\r\nimport { updateStateApi } from 'pages/pages/DocumentsPreview/api/common';\r\n\r\nconst useDocumentLoadFromUrl = (service, requiredPropsList) => {\r\n const [document, setDocument] = useState();\r\n const [isLoading, setLoading] = useState(true);\r\n const [error, setError] = useState();\r\n\r\n useEffect(() => {\r\n (async () => {\r\n const urlParams = getDownloadDocumentUrlCredentials(requiredPropsList);\r\n\r\n if (await validateUrlParams(urlParams, requiredPropsList)) {\r\n await service(urlParams, updateStateApi(setError, setDocument));\r\n }\r\n\r\n setLoading(false);\r\n })();\r\n }, []);\r\n\r\n return { isLoading, error, document };\r\n};\r\n\r\nexport default useDocumentLoadFromUrl;\r\n","// document domain\r\nimport { setup } from 'additiv-services';\r\nimport DocumentsService from 'additiv-services/dist/services/core/documents';\r\nimport { createBlobFile } from 'utils/documentUtils';\r\nimport CustomServiceManager from 'services/custom/CustomServiceManager';\r\nimport { INSTRUMENT_DOCUMENTS_ID } from 'constants/constants';\r\n\r\nexport const getDocumentWithUrlParams = async (\r\n { urlAccessToken, contactId, documentId },\r\n callback\r\n) => {\r\n try {\r\n setup({ jwt: urlAccessToken });\r\n\r\n const { data } = await DocumentsService.downloadDocument(documentId, contactId);\r\n\r\n callback({ data: createBlobFile(data) });\r\n\r\n setup({ jwt: undefined });\r\n } catch (e) {\r\n callback({ error: { type: 'api', message: 'unexpected error' } });\r\n }\r\n};\r\n\r\nexport const getFactsheetWithUrlParams = async (\r\n { urlAccessToken, docname: factsheetName },\r\n callback\r\n) => {\r\n try {\r\n setup({ jwt: urlAccessToken });\r\n\r\n const { data: metaData } = await CustomServiceManager.getMetaDataId();\r\n const { Id: metaDataId } =\r\n metaData &&\r\n metaData.find((item) => item.DocumentReferenceId === INSTRUMENT_DOCUMENTS_ID);\r\n\r\n const { data } = await CustomServiceManager.getPublicDocument(metaDataId, factsheetName);\r\n\r\n callback({ data: createBlobFile(data) });\r\n\r\n setup({ jwt: undefined });\r\n } catch (e) {\r\n callback({ error: { type: 'api', message: 'unexpected error' } });\r\n }\r\n};\r\n","import React, { useMemo, useState } from 'react';\r\nimport { Page } from 'react-pdf';\r\nimport { Document } from 'react-pdf/dist/esm/entry.webpack';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport { useTranslation } from 'react-i18next';\r\nimport useDocumentLoadFromUrl from '../hooks/useDocumentLoadFromUrl';\r\nimport { getFactsheetWithUrlParams } from '../api/documents';\r\n\r\nconst FACTSHEET_URL_PROPS = ['auth', 'docname'];\r\n\r\nconst MobileAppDownloadFactsheet = () => {\r\n const [pagesCount, setPagesCount] = useState(null);\r\n const { t } = useTranslation();\r\n const { isLoading, error, document } = useDocumentLoadFromUrl(\r\n getFactsheetWithUrlParams,\r\n FACTSHEET_URL_PROPS\r\n );\r\n\r\n const pages = useMemo(() => {\r\n if (!pagesCount) return [];\r\n\r\n const pagesArray = [];\r\n\r\n // eslint-disable-next-line no-plusplus\r\n for (let i = 0; i < pagesCount; i++) {\r\n pagesArray.push('');\r\n }\r\n\r\n return pagesArray;\r\n }, [pagesCount]);\r\n\r\n return (\r\n \r\n \r\n {\r\n setPagesCount(numPages);\r\n }}\r\n >\r\n {pages.map((el, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default MobileAppDownloadFactsheet;\r\n","import MobileAppDownloadFactsheet from './MobileAppDownloadFactsheet';\r\n\r\nexport default MobileAppDownloadFactsheet;\r\n","import React, { useMemo, useState } from 'react';\r\nimport { Page } from 'react-pdf';\r\nimport { Document } from 'react-pdf/dist/esm/entry.webpack';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Preloader } from 'components/molecules/Preloader';\r\nimport { EmptyContent } from 'components/molecules/EmptyContent';\r\nimport useDocumentLoadFromUrl from '../hooks/useDocumentLoadFromUrl';\r\nimport { getDocumentWithUrlParams } from '../api/documents';\r\n\r\nconst DOCUMENT_URL_PROPS = ['auth', 'documentId'];\r\n\r\nconst MobileAppDownloadDocument = () => {\r\n const [pagesCount, setPagesCount] = useState(null);\r\n const { t } = useTranslation();\r\n const { isLoading, error, document } = useDocumentLoadFromUrl(\r\n getDocumentWithUrlParams,\r\n DOCUMENT_URL_PROPS\r\n );\r\n\r\n const pages = useMemo(() => {\r\n if (!pagesCount) return [];\r\n\r\n const pagesArray = [];\r\n\r\n // eslint-disable-next-line no-plusplus\r\n for (let i = 0; i < pagesCount; i++) {\r\n pagesArray.push('');\r\n }\r\n\r\n return pagesArray;\r\n }, [pagesCount]);\r\n\r\n return (\r\n \r\n \r\n {\r\n setPagesCount(numPages);\r\n }}\r\n >\r\n {pages.map((el, index) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default MobileAppDownloadDocument;\r\n","import MobileAppDownloadDocument from './MobileAppDownloadDocument';\r\n\r\nexport default MobileAppDownloadDocument;\r\n","import React, { Suspense } from 'react';\r\nimport { Route, Router, Switch } from 'react-router-dom';\r\nimport history from 'services/core/history';\r\nimport withTheme from 'hocs/withTheme';\r\nimport { Loading } from 'components/Loading';\r\nimport { RootRouter } from 'pages';\r\nimport LoginRouter from 'pages/pages/Login/Router';\r\nimport { ForgotPassword } from 'pages/pages/ForgotPassword';\r\nimport MobileAppDownloadFactsheet from 'pages/pages/DocumentsPreview/MobileAppFactsheetDownload';\r\nimport MobileAppDownloadDocument from 'pages/pages/DocumentsPreview/MobileAppDocumentDownload';\r\nimport RouteWithAppTitle from 'components/RouteWithAppTitle';\r\nimport 'styles/core/wrapper.css';\r\nimport 'styles/custom/wrapper.css';\r\n\r\nconst App = () => (\r\n }>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n);\r\n\r\nexport default withTheme(App);\r\n","export const resourceAdapt = (resources) => {\r\n try {\r\n if (Array.isArray(resources) && resources.length > 0 && resources[0].Resources) {\r\n return resources[0].Resources.reduce((accumulator, currentValue) => {\r\n if (currentValue?.Name) {\r\n accumulator[currentValue.Name] = currentValue?.ResourceValues?.[0]?.Value;\r\n }\r\n\r\n return accumulator;\r\n }, {});\r\n }\r\n\r\n return {};\r\n } catch {\r\n return {};\r\n }\r\n};\r\n","import ServiceManager from 'services/core/ServiceManager';\r\nimport { resourceAdapt } from '../adaptors/resourceAdapt';\r\n\r\nclass Backend {\r\n constructor() {\r\n this.resourceName = null;\r\n this.lang = {};\r\n this.saveManager = {};\r\n this.resourceAdapt = resourceAdapt;\r\n }\r\n\r\n init(services, backendOptions) {\r\n this.resourceName = backendOptions.resourceName;\r\n if (typeof backendOptions.SaveManager === 'function') {\r\n const nameSpace = services.resourceStore?.options?.ns?.[0] ?? 'translation';\r\n\r\n this.saveManager = new backendOptions.SaveManager(nameSpace);\r\n }\r\n }\r\n\r\n read(language, namespace, callback) {\r\n this.lang[language] = {};\r\n const localResource = this.resourcesFromSessionStorage?.[language] ?? {};\r\n\r\n if (Object.keys(localResource).length !== 0) {\r\n callback(null, this.resourcesFromSessionStorage[language]);\r\n } else {\r\n this.loadResource(language, namespace, callback);\r\n }\r\n }\r\n\r\n saveToSessionStorage(resources) {\r\n if (this.saveManager?.save) {\r\n this.saveManager.save({\r\n ...this.resourcesFromSessionStorage,\r\n ...resources,\r\n });\r\n }\r\n }\r\n\r\n get resourcesFromSessionStorage() {\r\n if (this.saveManager?.load) {\r\n return this.saveManager.load();\r\n }\r\n\r\n return {};\r\n }\r\n\r\n loadResource(language, namespace, callback) {\r\n ServiceManager.commonContent('getResourceSetsByName', [this.resourceName, language])\r\n .then(({ data }) => {\r\n this.lang[language] = this.resourceAdapt(data);\r\n callback(null, this.lang[language]);\r\n this.saveToSessionStorage({ [language]: this.lang[language] });\r\n })\r\n .catch((e) => {\r\n callback(e, false);\r\n });\r\n }\r\n}\r\n\r\nBackend.type = 'backend';\r\n\r\nexport default Backend;\r\n","import StoreManager from '../models/StoreManager';\r\n\r\nclass SessionStoreManager extends StoreManager {\r\n constructor(storeName) {\r\n super();\r\n this.storeName = storeName;\r\n }\r\n\r\n save(data) {\r\n try {\r\n sessionStorage.setItem(this.storeName, JSON.stringify(data));\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n load() {\r\n try {\r\n return JSON.parse(sessionStorage.getItem(this.storeName));\r\n } catch {\r\n return {};\r\n }\r\n }\r\n}\r\n\r\nexport default SessionStoreManager;\r\n","class StoreManager {\r\n // eslint-disable-next-line class-methods-use-this\r\n save() {\r\n throw new Error('save should be implemented');\r\n }\r\n\r\n // eslint-disable-next-line class-methods-use-this\r\n load() {\r\n throw new Error('load should be implemented');\r\n }\r\n}\r\n\r\nexport default StoreManager;\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\n\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport Backend from './utils/Backend';\r\nimport SessionStoreManager from './utils/SessionStoreManager';\r\n// not like to use this?\r\n// have a look at the Quick start guide\r\n// for passing in lng and translations on init\r\n\r\nconst RESOURCE_NAME = 'Web-Client-Cockpit';\r\n\r\ni18n\r\n // load translation using /resourcesets/{name}/?language={language}\r\n .use(Backend)\r\n // detect user language\r\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\r\n .use(LanguageDetector)\r\n // pass the i18n instance to react-i18next.\r\n .use(initReactI18next)\r\n // init i18next\r\n // for all options read: https://www.i18next.com/overview/configuration-options\r\n .init({\r\n fallbackLng: 'en',\r\n keySeparator: false,\r\n locale: 'US',\r\n react: {\r\n wait: true,\r\n },\r\n backend: {\r\n resourceName: RESOURCE_NAME,\r\n SaveManager: SessionStoreManager,\r\n },\r\n debug: process.env.NODE_ENV === 'development',\r\n interpolation: {\r\n escapeValue: false, // not needed for react as it escapes by default\r\n },\r\n });\r\n\r\nexport default i18n;\r\n","import 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport { initAnalitics } from 'utils/analytics';\r\nimport './configs/config';\r\nimport { ConnectedRouter } from 'connected-react-router';\r\nimport history from 'services/core/history';\r\nimport store from './store';\r\nimport App from './App';\r\n\r\nimport './translations/i18n';\r\nimport { LocaleProvider } from './locale';\r\n\r\nconst MEASUREMENT_ID = window.AppConfig?.GOOGLEANALYTIC_MEASUREMENTID;\r\n\r\ninitAnalitics(MEASUREMENT_ID, history);\r\n\r\nif (!document.documentMode) {\r\n ReactDOM.render(\r\n // eslint-disable-next-line react/jsx-filename-extension\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n );\r\n}\r\n","import FileSaver from 'file-saver';\r\n\r\nexport const file = (data) => ({\r\n stringFile: global.atob(data.File),\r\n fileType: data.CustomAttributes,\r\n fileName: data.RetrieveFileAsName || data.OriginalFilename,\r\n});\r\n\r\nexport const createBlobFile = (data) => {\r\n const fileData = file(data);\r\n const byteString = fileData.stringFile;\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const dataBuffer = new Uint8Array(buffer);\r\n\r\n for (let i = 0; i < byteString.length; i += 1) {\r\n dataBuffer[i] = byteString.charCodeAt(i);\r\n }\r\n\r\n return {\r\n file: new Blob([buffer], {\r\n type: data.MimeType || fileData.fileType,\r\n }),\r\n fileName: fileData.fileName,\r\n };\r\n};\r\n\r\nexport const onDownloadDocument = (BlobFile) => {\r\n FileSaver.saveAs(BlobFile.file, BlobFile.fileName);\r\n};\r\n\r\nexport const openDocumentUrl = (BlobFile) => {\r\n const url = URL.createObjectURL(BlobFile.file);\r\n const anchorElement = document.createElement('a');\r\n\r\n anchorElement.setAttribute('href', url);\r\n anchorElement.setAttribute('download', BlobFile.fileName);\r\n anchorElement.setAttribute('target', '_blank');\r\n anchorElement.style.display = 'none';\r\n document.body.appendChild(anchorElement);\r\n anchorElement.click();\r\n document.body.removeChild(anchorElement);\r\n\r\n // window.open(url, 'preview', 'resizable,scrollbars,status=no');\r\n};\r\n","import moment from 'moment';\r\nimport 'moment/locale/en-gb';\r\n\r\nrequire('moment-timezone');\r\n\r\nexport const timeFormat = 'HH:mm';\r\nexport const timeFormat12 = 'hh:mm A';\r\nexport const dateFormat = 'YYYY-MM-DD';\r\nexport const dateYearFormat = 'YYYY';\r\nexport const dateTimeFormat = 'YYYY-MM-DD HH:mm';\r\nexport const dateTimeSecondsFormat = 'YYYY-MM-DD HH:mm:ss';\r\nexport const DATE_FORMAT_BACK = moment.HTML5_FMT.DATETIME_LOCAL_SECONDS;\r\n\r\nexport const importLocale = (lang) => {\r\n try {\r\n // eslint-disable-next-line global-require,import/no-dynamic-require\r\n require(`moment/locale/${lang}`);\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.warn(err);\r\n }\r\n};\r\n\r\nexport const detectTZ = () => moment.tz.guess();\r\n\r\nexport const formatDate = (date, outputFormat = dateFormat, inputFormat) =>\r\n moment.utc(date, inputFormat).local().format(outputFormat);\r\n\r\nexport const formatTime = (date, outputFormat = timeFormat) =>\r\n moment.utc(date).local().format(outputFormat);\r\n\r\nexport const getTimestamp = (date, initFormat = moment.HTML5_FMT.DATETIME_LOCAL_SECONDS) =>\r\n +moment(date, initFormat);\r\n\r\nexport const subtractUnits = (date, quantity, unit, outputFormat = dateFormat) =>\r\n moment(date).subtract(quantity, unit).format(outputFormat);\r\n\r\nexport const compareDates = (date1, date2) => moment(date1) > moment(date2);\r\n\r\nexport const isSameDay = (date1, date2) => moment(date1).isSame(date2);\r\n\r\nexport const getDaysOfYear = (date) => moment(date).dayOfYear();\r\n\r\nexport const getDatesDifference = (date, dateDiff, units) => moment(date).diff(dateDiff, units);\r\n\r\nexport const getFirstDayOfYear = (date, outputFormat = dateFormat) =>\r\n moment(date).startOf('year').format(outputFormat);\r\n\r\nexport const getLastDayOfYear = (date, outputFormat = dateFormat) =>\r\n moment(date).endOf('year').format(outputFormat);\r\n\r\nexport const getFirstDayOfMonth = (date, outputFormat = dateFormat) =>\r\n moment(date).startOf('month').format(outputFormat);\r\n\r\nexport const getLastDayOfMonth = (date, outputFormat = dateFormat) =>\r\n moment(date).endOf('month').format(outputFormat);\r\n\r\nexport const getSecondDayOfYear = (outputFormat = dateFormat) =>\r\n moment().dayOfYear(2).format(outputFormat);\r\n\r\nexport const setYearToDate = (date, year, outputFormat = dateFormat) =>\r\n moment(date).set('year', year).format(outputFormat);\r\n\r\nexport const addMinutesToDate = (date, minuteUnits, outputFormat = dateFormat) =>\r\n moment(date).add(minuteUnits, 'minutes').format(outputFormat);\r\n\r\nexport const addDaysToDate = (date, daysUnits, outputFormat = dateFormat) =>\r\n moment(date).add(daysUnits, 'days').format(outputFormat);\r\n\r\nexport const adaptDate = (Date) => getTimestamp(Date);\r\n\r\nexport const getYearDates = (goBackForQuantityYears = 0) => {\r\n const currentDate = moment();\r\n const year = subtractUnits(currentDate, goBackForQuantityYears, 'year', dateYearFormat);\r\n const startDate = getLastDayOfMonth(getFirstDayOfYear(year));\r\n const endDate = getLastDayOfYear(year);\r\n\r\n return { startDate, endDate };\r\n};\r\nexport const localResources = (func) => func(moment);\r\n","/* eslint react/button-has-type:off */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const Button = ({ type, children, className, bsStyle, ...props }) => (\r\n \r\n);\r\n\r\nButton.propTypes = {\r\n children: PropTypes.string,\r\n type: PropTypes.string,\r\n className: PropTypes.string,\r\n bsStyle: PropTypes.string,\r\n};\r\n\r\nButton.defaultProps = {\r\n children: '',\r\n type: 'button',\r\n className: '',\r\n bsStyle: 'btn-default',\r\n};\r\n\r\nButton.displayName = 'Button';\r\n","import React from 'react';\r\nimport { Button } from './Button';\r\n\r\nconst PrimaryButton = (props) => \r\n {bottomLinks}\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nUserAndPassword.propTypes = {\r\n bottomLinks: PropTypes.instanceOf(Object),\r\n error: PropTypes.func,\r\n submitting: PropTypes.bool.isRequired,\r\n handleSubmit: PropTypes.func.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n // rememberMe: PropTypes.func,\r\n info: PropTypes.string,\r\n title: PropTypes.string,\r\n submitLabel: PropTypes.string.isRequired,\r\n};\r\n\r\nUserAndPassword.defaultProps = {\r\n bottomLinks: null,\r\n // rememberMe: null,\r\n error: null,\r\n info: null,\r\n title: null,\r\n};\r\n\r\nUserAndPassword.displayName = 'UserAndPassword';\r\n\r\nexport default UserAndPassword;\r\n","import { createSelector } from 'reselect/lib/index';\r\nimport { get } from 'lodash/fp';\r\nimport { isUserActiveSelector, userSelector } from '../auth/authSelectors';\r\n\r\nexport const enrollSelector = (state) => state.enroll;\r\nexport const enrollQRCodeSelector = createSelector(enrollSelector, (enroll) =>\r\n get('qrCode', enroll)\r\n);\r\nexport const isLoadingSelector = createSelector(\r\n enrollSelector,\r\n (enroll) => get('isLoading', enroll) !== 0\r\n);\r\nexport const isUnenrollUnsuccessSelector = createSelector(\r\n enrollSelector,\r\n (enroll) => get('isUnenrollUnsuccess', enroll) === true\r\n);\r\nexport const isEnrollUnsuccessSelector = createSelector(\r\n enrollSelector,\r\n (enroll) => get('isEnrollUnsuccess', enroll) === true\r\n);\r\nexport const errorSelector = createSelector(enrollSelector, (enroll) => get('error', enroll));\r\nexport const isEnrollSuccessSelector = createSelector(enrollSelector, (enroll) =>\r\n get('isEnrollSuccess', enroll)\r\n);\r\nexport const isEnrollDeviceSuccessSelector = createSelector(enrollSelector, (enroll) =>\r\n get('isEnrollDeviceSuccess', enroll)\r\n);\r\nexport const isUnenrollSuccessSelector = createSelector(enrollSelector, (enroll) =>\r\n get('isUnenrollSuccess', enroll)\r\n);\r\nexport const isDeviceEnrolledSelector = createSelector(userSelector, (user) =>\r\n get('isDeviceEnrolled', user)\r\n);\r\nexport const isActiveUserNotEnrolledSelector = createSelector(\r\n isDeviceEnrolledSelector,\r\n isUserActiveSelector,\r\n (isDeviceEnrolled, isUserActive) => isDeviceEnrolled && isUserActive\r\n);\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Infobox, Title } from 'ui-library';\r\n\r\nimport UserAndPassword from 'components/Form/UserAndPassword';\r\nimport { ErrorModel } from 'error/ErrorModel';\r\n\r\nexport const FORM_NAME = 'EnrollDeviceByUserAndPassword';\r\n\r\nclass EnrollDeviceByUserAndPassword extends Component {\r\n componentWillUnmount() {\r\n const { cleanEnrollment } = this.props;\r\n\r\n cleanEnrollment();\r\n }\r\n\r\n render() {\r\n const {\r\n t,\r\n error,\r\n submitting,\r\n handleSubmit,\r\n onSubmit,\r\n qrCode,\r\n login,\r\n isEnrollSuccess,\r\n isEnrollDeviceSuccess,\r\n isEnrollUnsuccess,\r\n } = this.props;\r\n\r\n if (isEnrollDeviceSuccess === true) {\r\n return (\r\n
\r\n {t('enrollDevice.deviceHasBeenEnrolled')}\r\n

{t('enrollDevice.readyToUse')}

\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n let errorContent = null;\r\n\r\n if (error !== undefined && error !== null) {\r\n if (isEnrollUnsuccess === true) {\r\n errorContent = (\r\n
\r\n {t(error.message)}\r\n
\r\n );\r\n }\r\n if (typeof error === 'string') {\r\n errorContent = (\r\n
\r\n {t(error)}\r\n
\r\n );\r\n }\r\n }\r\n\r\n const info = (\r\n
\r\n \r\n {t('enrollDevice.accountRequires2FA')}\r\n {' '}\r\n \r\n {t('enrollDevice.googlePlay')}\r\n \r\n {' '}\r\n {t('enrollDevice.storeDeviceOr')}\r\n {' '}\r\n \r\n {t('enrollDevice.appleStore')}\r\n \r\n {'. '}\r\n {t('enrollDevice.securityReasonsNotification')}\r\n \r\n
\r\n );\r\n\r\n if (isEnrollSuccess) {\r\n return (\r\n
\r\n

\r\n {t('enrollDevice.title')}\r\n

\r\n

{`${t('enrollDevice.scanQRCode')}:`}

\r\n
\r\n
\r\n );\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nEnrollDeviceByUserAndPassword.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n submitting: PropTypes.bool.isRequired,\r\n handleSubmit: PropTypes.func.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n cleanEnrollment: PropTypes.func.isRequired,\r\n qrCode: PropTypes.string.isRequired,\r\n isEnrollSuccess: PropTypes.bool.isRequired,\r\n isEnrollDeviceSuccess: PropTypes.bool.isRequired,\r\n error: PropTypes.objectOf(ErrorModel),\r\n login: PropTypes.func.isRequired,\r\n isEnrollUnsuccess: PropTypes.bool.isRequired,\r\n};\r\n\r\nEnrollDeviceByUserAndPassword.defaultProps = {\r\n error: undefined,\r\n};\r\n\r\nEnrollDeviceByUserAndPassword.displayName = 'EnrollDeviceByUserAndPassword';\r\n\r\nexport default EnrollDeviceByUserAndPassword;\r\n","import { connect } from 'react-redux';\r\nimport { reduxForm } from 'redux-form';\r\nimport {\r\n enrollQRCodeSelector,\r\n errorSelector,\r\n isActiveUserNotEnrolledSelector,\r\n isEnrollDeviceSuccessSelector,\r\n isEnrollSuccessSelector,\r\n isEnrollUnsuccessSelector,\r\n} from 'redux/enroll/enrollSelectors';\r\nimport { cleanEnrollment, enrollDeviceByUserAndPassword } from 'redux/enroll/enrollActions';\r\nimport { withTranslation } from 'react-i18next';\r\nimport EnrollDeviceByUserAndPassword, { FORM_NAME } from './EnrollDeviceByUserAndPassword';\r\nimport { validate } from '../validation';\r\n\r\nconst mapStateToProps = (state) => ({\r\n isActiveUserNotEnrolled: isActiveUserNotEnrolledSelector(state),\r\n qrCode: enrollQRCodeSelector(state),\r\n isEnrollSuccess: isEnrollSuccessSelector(state),\r\n isEnrollDeviceSuccess: isEnrollDeviceSuccessSelector(state),\r\n error: errorSelector(state),\r\n isEnrollUnsuccess: isEnrollUnsuccessSelector(state),\r\n});\r\n\r\nconst mapDispatchToProps = {\r\n onSubmit: enrollDeviceByUserAndPassword,\r\n cleanEnrollment,\r\n};\r\n\r\nconst Translated = withTranslation()(EnrollDeviceByUserAndPassword);\r\n\r\nconst WrappedIntoReduxForm = reduxForm({\r\n form: FORM_NAME,\r\n validate,\r\n})(Translated);\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(WrappedIntoReduxForm);\r\n","export const validate = (values) => {\r\n const errors = {};\r\n\r\n if (!values.username) {\r\n errors.username = 'validation.requireUsername';\r\n }\r\n\r\n if (!values.password) {\r\n errors.password = 'validation.requirePassword';\r\n }\r\n\r\n return errors;\r\n};\r\n","/* eslint-disable */\r\nimport React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button, Infobox } from 'ui-library';\r\nimport historyRouter from 'services/core/history';\r\nimport { DEVICE_NOT_ENROLLED } from 'static/requestResults';\r\nimport UserAndPassword from 'components/Form/UserAndPassword';\r\nimport EnrollDeviceByUserAndPassword from '../EnrollDeviceByUserAndPassword_old/EnrollDeviceByUserAndPasswordContainer';\r\n\r\nexport const FORM_NAME = 'login';\r\nexport const LOGIN_FORM_VIEW = 'LOGIN_FORM_VIEW';\r\nexport const ENROLL_DEVICE_VIEW = 'ENROLL_DEVICE_VIEW';\r\n\r\nconst renderForgotLink = (t) => (\r\n {\r\n historyRouter.push('/forgot-password');\r\n }}\r\n type=\"secondary\"\r\n >\r\n {t('login.FORGOT_PASSWORD')}\r\n \r\n);\r\n\r\nclass LoginForm extends Component {\r\n constructor() {\r\n super();\r\n\r\n this.state = {\r\n view: LOGIN_FORM_VIEW,\r\n };\r\n }\r\n\r\n enrollDevice = () => {\r\n this.setState({\r\n view: ENROLL_DEVICE_VIEW,\r\n });\r\n\r\n return false;\r\n };\r\n\r\n login = () => {\r\n const { reset } = this.props;\r\n\r\n reset();\r\n this.setState({\r\n view: LOGIN_FORM_VIEW,\r\n });\r\n };\r\n\r\n render() {\r\n const { t, error, submitting, handleSubmit, onSubmit, title } = this.props;\r\n const { view } = this.state;\r\n\r\n let errorContent = null;\r\n\r\n if (error !== undefined && error !== null) {\r\n if (typeof error === 'string') {\r\n errorContent = (\r\n
\r\n \r\n {t(error)}\r\n \r\n
\r\n );\r\n } else if (typeof error === 'object') {\r\n switch (error.type) {\r\n case DEVICE_NOT_ENROLLED:\r\n errorContent = (\r\n
\r\n \r\n {t('login.2FARequired')}\r\n {' '}\r\n \r\n {t('login.EnrollDevice')}\r\n \r\n .\r\n \r\n
\r\n );\r\n break;\r\n default:\r\n }\r\n }\r\n }\r\n\r\n if (view === LOGIN_FORM_VIEW) {\r\n return (\r\n \r\n );\r\n }\r\n if (view === ENROLL_DEVICE_VIEW) {\r\n return ;\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n\r\nLoginForm.propTypes = {\r\n error:\r\n PropTypes.string ||\r\n PropTypes.shape({\r\n message: PropTypes.string,\r\n type: PropTypes.string,\r\n }),\r\n submitting: PropTypes.bool.isRequired,\r\n reset: PropTypes.func.isRequired,\r\n handleSubmit: PropTypes.func.isRequired,\r\n onSubmit: PropTypes.func.isRequired,\r\n t: PropTypes.func.isRequired,\r\n title: PropTypes.string,\r\n};\r\n\r\nLoginForm.defaultProps = {\r\n error: undefined,\r\n title: null,\r\n};\r\n\r\nLoginForm.displayName = 'LoginForm';\r\n\r\nexport default LoginForm;\r\n","import { createSelector } from 'reselect/lib/index';\r\nimport { get } from 'lodash/fp';\r\n\r\nexport const sessionSelector = (state) => state.session;\r\n\r\nexport const isCurrentSessionCheckedSelector = createSelector(\r\n sessionSelector,\r\n (value) => get('isCurrentSessionChecked', value) === true\r\n);\r\n\r\nexport const isSessionValidSelector = createSelector(\r\n sessionSelector,\r\n (value) => get('isSessionValid', value) === true\r\n);\r\n","import {\r\n ACCESS_DENIED,\r\n CONTACT_LOCKED,\r\n CONTACT_NOT_ACTIVATED,\r\n CONTACT_NOT_PASSWORD_SET,\r\n DEVICE_ALREADY_ENROLLED,\r\n DEVICE_NOT_ENROLLED,\r\n EXPIRED,\r\n PASSCODE_INVALID,\r\n PASSWORD_INVALID,\r\n SESSION_ALREADY_ACTIVE,\r\n SESSION_EXPIRED,\r\n SESSION_INVALID,\r\n TWO_FACTOR_DISABLED,\r\n USERNAME_INVALID,\r\n INVALID_CREDENTIALS,\r\n} from '../static/requestResults';\r\nimport commonErrorMessageToErrorModelXref, {\r\n ACCESS_DENIED_MESSAGE,\r\n CONTACT_LOCKED_MESSAGE,\r\n CONTACT_NOT_ACTIVATED_MESSAGE,\r\n CONTACT_NOT_PASSWORD_SET_MESSAGE,\r\n USERNAME_INVALID_MESSAGE,\r\n INVALID_CREDENTIALS_MESSAGE,\r\n} from './commonErrors';\r\nimport { ErrorModel } from './ErrorModel';\r\nimport { AUTH_ERROR } from './errorTypes';\r\n\r\nexport const LOGIN_FAILED_UNEXPECTEDLY = 'LoginFailedUnexpectedly';\r\n\r\nconst LOGIN_FAILED_UNEXPECTEDLY_MESSAGE = 'error.unexpectedLoginFail';\r\nconst DEVICE_NOT_ENROLLED_MESSAGE = 'error.deviceNotEnrolledMsg';\r\nconst LOGIN_FAILED = 'error.loginFailed';\r\nconst PASSCODE_INVALID_MESSAGE = 'error.passCodeInvalidMsg';\r\nconst SESSION_EXPIRED_MESSAGE = 'error.sessionExpired';\r\nconst SESSION_INVALID_MESSAGE = 'error.sessionInvalid';\r\nconst TWO_FACTOR_DISABLED_MESSAGE = 'error.twoFactorDisabledMsg';\r\nconst DEVICE_ALREADY_ENROLLED_MESSAGE = 'error.deviceAlreadyEnrolledMsg';\r\nconst EXPIRED_MESSAGE = 'error.expiredMsg';\r\nconst PASSWORD_INVALID_MESSAGE = 'error.passwordInvalidMsg';\r\nconst SESSION_ALREADY_ACTIVE_MESSAGE = 'error.sessionAlreadyActiveMsg';\r\n\r\nconst errorMessageToErrorModelXref = {\r\n ...commonErrorMessageToErrorModelXref,\r\n [PASSCODE_INVALID]: new ErrorModel({\r\n id: 1,\r\n type: AUTH_ERROR,\r\n message: PASSCODE_INVALID_MESSAGE,\r\n }),\r\n [PASSWORD_INVALID]: new ErrorModel({\r\n id: 2,\r\n type: AUTH_ERROR,\r\n message: PASSWORD_INVALID_MESSAGE,\r\n }),\r\n [SESSION_EXPIRED]: new ErrorModel({\r\n id: 5,\r\n type: AUTH_ERROR,\r\n key: SESSION_EXPIRED,\r\n message: SESSION_EXPIRED_MESSAGE,\r\n }),\r\n [SESSION_ALREADY_ACTIVE]: new ErrorModel({\r\n id: 6,\r\n type: AUTH_ERROR,\r\n message: SESSION_ALREADY_ACTIVE_MESSAGE,\r\n }),\r\n [DEVICE_NOT_ENROLLED]: new ErrorModel({\r\n id: 8,\r\n type: AUTH_ERROR,\r\n message: DEVICE_NOT_ENROLLED_MESSAGE,\r\n }),\r\n [SESSION_INVALID]: new ErrorModel({\r\n id: 9,\r\n type: AUTH_ERROR,\r\n message: SESSION_INVALID_MESSAGE,\r\n }),\r\n [TWO_FACTOR_DISABLED]: new ErrorModel({\r\n id: 10,\r\n type: AUTH_ERROR,\r\n message: TWO_FACTOR_DISABLED_MESSAGE,\r\n }),\r\n [DEVICE_ALREADY_ENROLLED]: new ErrorModel({\r\n id: 13,\r\n type: AUTH_ERROR,\r\n message: DEVICE_ALREADY_ENROLLED_MESSAGE,\r\n }),\r\n [EXPIRED]: new ErrorModel({\r\n id: 14,\r\n type: AUTH_ERROR,\r\n message: EXPIRED_MESSAGE,\r\n }),\r\n [LOGIN_FAILED_UNEXPECTEDLY]: new ErrorModel({\r\n id: 24,\r\n type: AUTH_ERROR,\r\n message: LOGIN_FAILED_UNEXPECTEDLY_MESSAGE,\r\n }),\r\n};\r\n\r\nexport const getErrorModelByStatus = (status) => errorMessageToErrorModelXref[status];\r\n\r\nconst authErrorByStatus = {\r\n [LOGIN_FAILED_UNEXPECTEDLY]: {\r\n _error: LOGIN_FAILED_UNEXPECTEDLY_MESSAGE,\r\n },\r\n [USERNAME_INVALID]: {\r\n username: USERNAME_INVALID_MESSAGE,\r\n _error: LOGIN_FAILED,\r\n },\r\n [INVALID_CREDENTIALS]: {\r\n _error: INVALID_CREDENTIALS_MESSAGE,\r\n },\r\n [CONTACT_LOCKED]: {\r\n username: CONTACT_LOCKED_MESSAGE,\r\n _error: LOGIN_FAILED,\r\n },\r\n [PASSWORD_INVALID]: {\r\n password: PASSWORD_INVALID_MESSAGE,\r\n _error: LOGIN_FAILED,\r\n },\r\n [CONTACT_NOT_PASSWORD_SET]: {\r\n password: CONTACT_NOT_PASSWORD_SET_MESSAGE,\r\n _error: LOGIN_FAILED,\r\n },\r\n [CONTACT_NOT_ACTIVATED]: {\r\n _error: CONTACT_NOT_ACTIVATED_MESSAGE,\r\n },\r\n [ACCESS_DENIED]: {\r\n _error: ACCESS_DENIED_MESSAGE,\r\n },\r\n [SESSION_ALREADY_ACTIVE]: {\r\n password: SESSION_ALREADY_ACTIVE_MESSAGE,\r\n _error: LOGIN_FAILED,\r\n },\r\n [DEVICE_NOT_ENROLLED]: {\r\n _error: {\r\n type: DEVICE_NOT_ENROLLED,\r\n message: DEVICE_NOT_ENROLLED_MESSAGE,\r\n },\r\n },\r\n [DEVICE_ALREADY_ENROLLED]: {\r\n _error: DEVICE_ALREADY_ENROLLED_MESSAGE,\r\n },\r\n};\r\n\r\nexport const getAuthErrorByStatus = (status) => authErrorByStatus[status];\r\n","const windowMatchMedia = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)');\r\n\r\nclass DetectorSystemTheme {\r\n static getSystemTheme = ({ darkAlias = 'dark', lightAlias = 'light' } = {}) =>\r\n windowMatchMedia?.matches ? darkAlias : lightAlias;\r\n\r\n static subscribe = (callback) => {\r\n if (windowMatchMedia?.addEventListener) {\r\n windowMatchMedia.addEventListener('change', callback);\r\n // Safari support\r\n } else if (windowMatchMedia?.addListener) {\r\n windowMatchMedia.addListener(callback);\r\n }\r\n };\r\n\r\n static unsubscribe = (callback) => {\r\n if (windowMatchMedia?.addEventListener) {\r\n windowMatchMedia.addEventListener('change', callback);\r\n // Safari support\r\n } else if (windowMatchMedia?.addListener) {\r\n windowMatchMedia.addListener(callback);\r\n }\r\n };\r\n}\r\n\r\nexport default DetectorSystemTheme;\r\n","/* eslint-disable no-plusplus */\r\nexport function roundLargestRemainder(arr, target = 10000) {\r\n const off = target - arr.reduce((acc, x) => acc + Math.floor(x), 0);\r\n const offObject = arr.reduce((acc, n, i) => ({ ...acc, [i]: n - Math.floor(n) }), {});\r\n const offKeys = Object.keys(offObject)\r\n .sort((a, b) => offObject[b] - offObject[a])\r\n .map((index) => +index);\r\n\r\n return arr.map((n, i) => Math.floor(n) + (off > offKeys.indexOf(i) && offKeys.includes(i)));\r\n}\r\n\r\nexport function roundSmallestError(arr, target = 10000) {\r\n const errorFactor = (actual, rounded) => Math.abs(rounded - actual) / actual;\r\n\r\n const { length } = arr;\r\n const rounded = arr.map((n) => Math.floor(n));\r\n const off = Math.abs(target - rounded.reduce((acc, x) => acc + x, 0));\r\n const errors = [...Array(length).keys()].map((i) => [errorFactor(arr[i], rounded[i] + 1), i]);\r\n const rank = [...errors].sort((a, b) => a[0] - b[0]);\r\n\r\n [...Array(off).keys()].forEach((i) => {\r\n if (rank[i]) rounded[rank[i][1]] += 1;\r\n });\r\n\r\n return rounded;\r\n}\r\n\r\n/*\r\nexport function roundSmallestError(arr, target = 10000) {\r\n const errorFactor = (oldNum, newNum) => Math.abs(oldNum - newNum) / oldNum;\r\n const { length } = arr;\r\n const values = arr.map((n) => Math.round(n));\r\n let total = arr.reduce((a, n) => a + Math.round(n), 0);\r\n const change = total < target ? 1 : -1;\r\n\r\n while (total !== target) {\r\n let next;\r\n let j = 0;\r\n\r\n values.forEach((item, i) => {\r\n next = i === length - 1 ? 0 : i + 1;\r\n\r\n const factor1 = errorFactor(arr[i], item + change);\r\n const factor2 = errorFactor(arr[next], values[next] + change);\r\n\r\n if (factor1 > factor2) {\r\n j = next;\r\n }\r\n });\r\n\r\n values[j] += change;\r\n total += change;\r\n }\r\n\r\n const marginOfErrors = values.map((item, i) => item && errorFactor(arr[i], item));\r\n\r\n for (let i = 0; i < length; i++) {\r\n for (let j = 0; j < length; j++) {\r\n if (j !== i) {\r\n const roundUpFactor = errorFactor(arr[i], values[i] + 1)\r\n + errorFactor(arr[j], values[j] - 1);\r\n const roundDownFactor = errorFactor(arr[i], values[i] - 1)\r\n + errorFactor(arr[j], values[j] + 1);\r\n const sumMargin = marginOfErrors[i] + marginOfErrors[j];\r\n\r\n if (roundUpFactor < sumMargin) {\r\n values[i] += 1;\r\n values[j] -= 1;\r\n marginOfErrors[i] = values[i] && errorFactor(arr[i], values[i]);\r\n marginOfErrors[j] = values[j] && errorFactor(arr[j], values[j]);\r\n }\r\n\r\n if (roundDownFactor < sumMargin) {\r\n values[i] -= 1;\r\n values[j] += 1;\r\n marginOfErrors[i] = values[i] && errorFactor(arr[i], values[i]);\r\n marginOfErrors[j] = values[j] && errorFactor(arr[j], values[j]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return values;\r\n}\r\n*/\r\n","import {\r\n THREE_YEARS_BEFORE,\r\n TWO_YEARS_BEFORE,\r\n ONE_YEAR_BEFORE,\r\n SINCE_INCEPTION,\r\n YEARS1,\r\n YEARS3,\r\n YEARS5,\r\n YTD,\r\n} from 'filters/investementPerformanceFilters';\r\nimport { roundLargestRemainder } from './rounding';\r\nimport { formatDate, subtractUnits, getFirstDayOfYear, getYearDates } from './datetime';\r\n\r\nexport const checkNullData = (data) =>\r\n data === undefined || data === null || data === '' || data.length === 0;\r\n\r\nexport const getClassNames = (...args) =>\r\n args\r\n .map((arg) =>\r\n arg && typeof arg === 'object' ? Object.keys(arg).filter((item) => arg[item]) : arg\r\n )\r\n .reduce((acc, val) => acc.concat(val), [])\r\n .filter((item) => item)\r\n .join(' ');\r\n\r\nexport const getPeriodByFilter = (filter, format = 'YYYY-MM-DD') => {\r\n let filterPeriod = {\r\n startDate: '',\r\n endDate: formatDate(new Date(), format),\r\n };\r\n\r\n switch (filter) {\r\n case YTD:\r\n filterPeriod.startDate = `${getFirstDayOfYear()}`;\r\n break;\r\n case YEARS1:\r\n filterPeriod.startDate = subtractUnits(new Date(), 1, 'years');\r\n break;\r\n case YEARS3:\r\n filterPeriod.startDate = subtractUnits(new Date(), 3, 'years');\r\n break;\r\n case YEARS5:\r\n filterPeriod.startDate = subtractUnits(new Date(), 5, 'years');\r\n break;\r\n case SINCE_INCEPTION:\r\n delete filterPeriod.startDate;\r\n delete filterPeriod.endDate;\r\n break;\r\n case ONE_YEAR_BEFORE:\r\n filterPeriod = getYearDates(1);\r\n break;\r\n case TWO_YEARS_BEFORE:\r\n filterPeriod = getYearDates(2);\r\n break;\r\n case THREE_YEARS_BEFORE:\r\n filterPeriod = getYearDates(3);\r\n break;\r\n default:\r\n delete filterPeriod.startDate;\r\n delete filterPeriod.endDate;\r\n }\r\n\r\n return filterPeriod;\r\n};\r\n\r\nexport const getParent = (data) => {\r\n let parent = data;\r\n\r\n while (parent.Parent) {\r\n parent = parent.Parent;\r\n }\r\n\r\n return parent;\r\n};\r\n\r\nconst multiply = (a, b) => +(a * b).toFixed(10);\r\n\r\nexport const sum = (data, prop) => data.reduce((accu, item) => accu + Number(item[prop]), 0);\r\n\r\nexport const roundItems = (arrDef, multiplier = 10000, sumItems = multiplier) => {\r\n if (arrDef.length === 0) return arrDef;\r\n const arr = arrDef.map((item) => multiply(item, multiplier));\r\n\r\n return roundLargestRemainder(arr, sumItems);\r\n};\r\n\r\nexport const roundAllocations = (\r\n positions,\r\n multiplier = 10000,\r\n divide = 100,\r\n sumItems = multiplier\r\n) => {\r\n const allocations = positions.map(({ Allocation }) => Allocation);\r\n\r\n return roundItems(allocations, multiplier, sumItems).map((n, i) => ({\r\n id: positions[i].Security.Id || positions[i].Id,\r\n value: n / divide,\r\n }));\r\n};\r\n\r\nexport const sortAssetsByOrderPropOrAllocation = (a, b) => {\r\n if (a.sortingOrder !== undefined) {\r\n return a.sortingOrder - b.sortingOrder;\r\n }\r\n\r\n return b.percent - a.percent;\r\n};\r\n\r\nexport const stripHtmlTags = (string) => string.replace(/<[^>]*>?/gm, '');\r\n\r\nexport const isToday = (inputDate) => {\r\n const date = new Date(inputDate);\r\n const today = new Date();\r\n\r\n return (\r\n date.getDate() === today.getDate() &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear()\r\n );\r\n};\r\n\r\nexport const isYesterday = (inputDate) => {\r\n const date = new Date(inputDate);\r\n const today = new Date();\r\n\r\n return (\r\n date.getDate() === today.getDate() - 1 &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear()\r\n );\r\n};\r\n\r\nexport const isTomorrow = (inputDate) => {\r\n const date = new Date(inputDate);\r\n const today = new Date();\r\n\r\n return (\r\n date.getDate() === today.getDate() + 1 &&\r\n date.getMonth() === today.getMonth() &&\r\n date.getFullYear() === today.getFullYear()\r\n );\r\n};\r\n\r\nexport const isEmpty = (data) => {\r\n if (data === undefined || data == null || data.length === 0) {\r\n return true;\r\n }\r\n\r\n if (\r\n ['function', 'number', 'boolean'].includes(typeof data) ||\r\n Object.prototype.toString.call(data) === '[object Date]'\r\n ) {\r\n return false;\r\n }\r\n\r\n if (typeof data === 'object') {\r\n if (Object.keys(data) && Object.keys(data).length > 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n","import { get } from 'lodash/fp';\r\nimport contactManagement from 'additiv-services/dist/services/core/contactManagement';\r\nimport instrumentsService from 'additiv-services/dist/services/core/instruments';\r\nimport PortfolioManagement from 'additiv-services/dist/services/core/portfolioManagement';\r\nimport Performance from 'additiv-services/dist/services/core/performance';\r\nimport Products from 'additiv-services/dist/services/core/products';\r\nimport Security, { security } from 'additiv-services/dist/services/core/security';\r\nimport commonService from 'additiv-services/dist/services/core/common';\r\nimport commonContent from 'additiv-services/dist/services/core/commonContent';\r\nimport currenciesService from 'additiv-services/dist/services/core/currencies';\r\nimport tradingService from 'additiv-services/dist/services/core/trading';\r\nimport complianceService from 'additiv-services/dist/services/core/compliance';\r\nimport attachments from 'additiv-services/dist/services/core/attachments';\r\nimport deviceEnrollment from 'additiv-services/dist/services/core/deviceEnrollment';\r\nimport messageService from 'additiv-services/dist/services/core/messages';\r\nimport Service from 'additiv-services/dist/services/core/service';\r\nimport { checkStatus } from './generalStatusCheck';\r\n\r\nconst serviceCall = (service, method, argsArray = []) => {\r\n const result = service[method](...argsArray);\r\n const promise = result instanceof Promise ? result : result[0];\r\n\r\n promise\r\n .then(() => {})\r\n .catch((reason) => {\r\n checkStatus(get('response.status', reason));\r\n });\r\n\r\n return result;\r\n};\r\n\r\nclass ServiceManager {\r\n static Service(method, argsArray) {\r\n return serviceCall(Service, method, argsArray);\r\n }\r\n\r\n static tradingService(method, argsArray) {\r\n return serviceCall(tradingService, method, argsArray);\r\n }\r\n\r\n static compliance(method, argsArray) {\r\n return serviceCall(complianceService, method, argsArray);\r\n }\r\n\r\n static contactManagement(method, argsArray) {\r\n return serviceCall(contactManagement, method, argsArray);\r\n }\r\n\r\n static instrumentsService(method, argsArray) {\r\n return serviceCall(instrumentsService, method, argsArray);\r\n }\r\n\r\n static performance(method, argsArray) {\r\n return serviceCall(Performance, method, argsArray);\r\n }\r\n\r\n static portfolioManagement(method, argsArray) {\r\n return serviceCall(PortfolioManagement, method, argsArray);\r\n }\r\n\r\n static products(method, argsArray) {\r\n return serviceCall(Products, method, argsArray);\r\n }\r\n\r\n static security(method, argsArray) {\r\n return serviceCall(security, method, argsArray);\r\n }\r\n\r\n static Security(method, argsArray) {\r\n return serviceCall(Security, method, argsArray);\r\n }\r\n\r\n static commonService(method, argsArray) {\r\n return serviceCall(commonService, method, argsArray);\r\n }\r\n\r\n static currenciesService(method, argsArray) {\r\n return serviceCall(currenciesService, method, argsArray);\r\n }\r\n\r\n static commonContent(method, argsArray) {\r\n return serviceCall(commonContent, method, argsArray);\r\n }\r\n\r\n static attachments(method, argsArray) {\r\n return serviceCall(attachments, method, argsArray);\r\n }\r\n\r\n static messageService(method, argsArray) {\r\n return serviceCall(messageService, method, argsArray);\r\n }\r\n\r\n static deviceEnrollment(method, argsArray) {\r\n return serviceCall(deviceEnrollment, method, argsArray);\r\n }\r\n}\r\n\r\nexport default ServiceManager;\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events,jsx-a11y/interactive-supports-focus */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst CellPDFView = ({ value, onDownload }, { id, contactId }) => {\r\n if (value === undefined) return null;\r\n\r\n return (\r\n onDownload(id, contactId)}>\r\n {value}\r\n \r\n );\r\n};\r\n\r\nCellPDFView.propTypes = {\r\n value: PropTypes.string,\r\n onDownload: PropTypes.func,\r\n};\r\n\r\nCellPDFView.defaultProps = {\r\n value: '',\r\n onDownload: () => {},\r\n};\r\n\r\nexport default CellPDFView;\r\n","/* eslint no-underscore-dangle:off */\r\nimport { compose, createStore, applyMiddleware } from 'redux';\r\nimport { save, load } from 'redux-localstorage-simple';\r\nimport { save as saveSession, load as loadedSession } from 'middleware/redux-sessionstorage';\r\nimport { get } from 'lodash/fp';\r\nimport { setup } from 'additiv-services';\r\nimport thunk from 'redux-thunk';\r\nimport { routerMiddleware } from 'connected-react-router';\r\nimport rootReducer from './rootReducer';\r\nimport history from './services/core/history';\r\nimport { $_GET } from './utils/url';\r\n\r\nglobal.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ = undefined;\r\nconst composeEnhancer = global.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\r\n\r\nconst loadStateAndSetupServices = () => {\r\n const loaded = load({ states: ['auth', 'theme'] });\r\n const loadedSessionData = loadedSession({ states: ['session'] });\r\n const jwt = get('auth.user.jwt', loaded);\r\n const withURLLogin = $_GET('contactId') && $_GET('accessToken') === undefined;\r\n const {\r\n withJWT,\r\n SERVICES_BASIC_AUTH,\r\n DMS_BASIC_AUTH,\r\n GATEWAY_API_URL,\r\n DMS_URL_SUFFIX,\r\n SERVICES_URL_SUFFIX,\r\n } = global.reactAdditiv.settings.services;\r\n\r\n setup({\r\n jwt: withURLLogin ? undefined : jwt,\r\n withJWT,\r\n SERVICES_BASIC_AUTH,\r\n DMS_BASIC_AUTH,\r\n GATEWAY_API_URL,\r\n DMS_URL_SUFFIX,\r\n SERVICES_URL_SUFFIX,\r\n });\r\n\r\n if (withURLLogin) {\r\n return {};\r\n }\r\n\r\n return {\r\n ...loaded,\r\n ...loadedSessionData,\r\n };\r\n};\r\n\r\nexport default ((preloadedState) =>\r\n createStore(\r\n rootReducer,\r\n preloadedState,\r\n composeEnhancer(\r\n applyMiddleware(\r\n routerMiddleware(history),\r\n thunk,\r\n save({ states: ['auth', 'theme'] }),\r\n saveSession({ states: ['session'] })\r\n )\r\n )\r\n ))(loadStateAndSetupServices());\r\n","// TODO: move this logic to action.\r\nimport { logout } from 'redux/auth/authActions';\r\nimport store from 'store';\r\n\r\nexport const checkStatus = (status) => {\r\n if (status === 401 || status === 400) {\r\n store.dispatch(logout());\r\n }\r\n};\r\n","import EnrollmentInfoBox from './EnrollementInfoBox';\r\n\r\nexport default EnrollmentInfoBox;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport itunesIcon from 'clientRequirements/images/itunes_icon.svg';\r\nimport gplayIcon from 'clientRequirements/images/gplay_icon.svg';\r\n\r\nconst EnrollementInfoBox = () => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n
\r\n {t('enrollDevice.accountRequires2FA')}\r\n
\r\n \r\n \"Temporary\r\n {' '}\r\n App Store\r\n \r\n \r\n \"Temporary\r\n {' '}\r\n Google Play\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default EnrollementInfoBox;\r\n","module.exports = __webpack_public_path__ + \"static/media/icon_NS.b36bf0fa.png\";","export const validateUsername = (username) =>\r\n /@/.test(username) ? username : `${username}@${global.AppConfig.USERNAME_EMAIL_DOMAIN}`;\r\n\r\nexport const validateLoginForm = (values) => {\r\n const errors = {};\r\n\r\n if (!values.username) {\r\n errors.username = 'validation.requireUsername';\r\n }\r\n\r\n if (!values.password) {\r\n errors.password = 'validation.requirePassword';\r\n }\r\n\r\n return errors;\r\n};\r\n","module.exports = __webpack_public_path__ + \"static/media/logo-mobile.b2ead5eb.svg\";","import React from 'react';\r\nimport { TextInput } from 'ui-library';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\n// TODO: deal with unused vars\r\nexport const FieldRenderer = ({\r\n input,\r\n label,\r\n type,\r\n id,\r\n // eslint-disable-next-line no-unused-vars\r\n name,\r\n // eslint-disable-next-line no-unused-vars\r\n autoComplete,\r\n // eslint-disable-next-line no-unused-vars\r\n meta: { touched, error, warning, submitting },\r\n}) => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nFieldRenderer.propTypes = {\r\n autoComplete: PropTypes.string,\r\n input: PropTypes.node.isRequired,\r\n label: PropTypes.string.isRequired,\r\n name: PropTypes.string,\r\n type: PropTypes.string.isRequired,\r\n id: PropTypes.string.isRequired,\r\n meta: PropTypes.shape({\r\n touched: PropTypes.bool,\r\n error: PropTypes.string,\r\n warning: PropTypes.string,\r\n submitting: PropTypes.bool,\r\n }),\r\n};\r\n\r\nFieldRenderer.defaultProps = {\r\n autoComplete: 'on',\r\n name: null,\r\n meta: PropTypes.shape({}),\r\n};\r\n\r\nFieldRenderer.displayName = 'FieldRenderer';\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport eyeOpened from '../../clientRequirements/images/eyeOpened.png';\r\nimport eyeClosed from '../../clientRequirements/images/eyeСlosed.png';\r\nimport { Button } from '../Button';\r\n\r\nconst PasswordEyeButton = ({ isPassVisible, setPassVisible }) => {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n setPassVisible(!isPassVisible)}\r\n className=\"eye-button\"\r\n aria-label={t(isPassVisible ? 'login.showPassword' : 'login.hidePassword')}\r\n >\r\n \r\n \r\n );\r\n};\r\n\r\nPasswordEyeButton.propTypes = {\r\n isPassVisible: PropTypes.bool.isRequired,\r\n setPassVisible: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default PasswordEyeButton;\r\n","import React, { useState } from 'react';\r\nimport { TextInput } from 'ui-library';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport PasswordEyeButton from 'components/PasswordEyeButton';\r\n\r\n// this Component is a duplicate of FieldRenderer,\r\n// but enhanced by PasswordEyeButton icon\r\nexport const PasswordFieldRenderer = ({\r\n input,\r\n label,\r\n type,\r\n id,\r\n meta: { touched, error, submitting },\r\n ...props\r\n}) => {\r\n const { t } = useTranslation();\r\n const [isPassVisible, setPassVisible] = useState(false);\r\n let inputType = type;\r\n\r\n if (!inputType) {\r\n inputType = isPassVisible ? 'text' : 'password';\r\n }\r\n\r\n return (\r\n \r\n }\r\n label={label}\r\n placeholder={label}\r\n error={touched === true ? t(error) : undefined}\r\n id={id}\r\n type={inputType}\r\n disabled={submitting}\r\n />\r\n );\r\n};\r\n\r\nPasswordFieldRenderer.propTypes = {\r\n autoComplete: PropTypes.string,\r\n input: PropTypes.node.isRequired,\r\n label: PropTypes.string.isRequired,\r\n name: PropTypes.string,\r\n type: PropTypes.string.isRequired,\r\n id: PropTypes.string.isRequired,\r\n meta: PropTypes.shape({\r\n touched: PropTypes.bool,\r\n error: PropTypes.string,\r\n warning: PropTypes.string,\r\n submitting: PropTypes.bool,\r\n }),\r\n};\r\n\r\nPasswordFieldRenderer.defaultProps = {\r\n autoComplete: 'on',\r\n name: null,\r\n meta: PropTypes.shape({}),\r\n};\r\n\r\nPasswordFieldRenderer.displayName = 'PasswordFieldRenderer';\r\n","import { dateYearFormat, subtractUnits } from 'utils/datetime';\r\n\r\nexport const filterNamespace = 'dashboard.assetDevelopment.filters';\r\n\r\nexport const YTD = 'YTD';\r\nexport const YEARS1 = 'YEARS1';\r\nexport const YEARS3 = 'YEARS3';\r\nexport const YEARS5 = 'YEARS5';\r\nexport const ONE_YEAR_BEFORE = 'OneYearBefore';\r\nexport const TWO_YEARS_BEFORE = 'TwoYearsBefore';\r\nexport const THREE_YEARS_BEFORE = 'ThreeYearsBefore';\r\nexport const SINCE_INCEPTION = 'SinceInception';\r\nexport const MONTH_TO_MONTH = 'MonthToMonth';\r\n\r\nexport const performanceSelectOptions = [\r\n { value: YTD },\r\n { value: YEARS1 },\r\n { value: YEARS3 },\r\n { value: YEARS5 },\r\n { value: SINCE_INCEPTION },\r\n];\r\n\r\nexport const additionalPerformanceSelectOptions = (t) => [\r\n {\r\n value: ONE_YEAR_BEFORE,\r\n label: subtractUnits(new Date(), 1, 'year', dateYearFormat),\r\n },\r\n {\r\n value: TWO_YEARS_BEFORE,\r\n label: subtractUnits(new Date(), 2, 'year', dateYearFormat),\r\n },\r\n {\r\n value: THREE_YEARS_BEFORE,\r\n label: subtractUnits(new Date(), 3, 'year', dateYearFormat),\r\n },\r\n {\r\n value: MONTH_TO_MONTH,\r\n label: t(`${filterNamespace}.MonthToMonth`),\r\n },\r\n];\r\n\r\nexport const getPerformanceSelectOptions = (t) => [\r\n ...performanceSelectOptions.map((item) => ({\r\n ...item,\r\n label: t(`${filterNamespace}.${item.value}`),\r\n })),\r\n ...additionalPerformanceSelectOptions(t),\r\n];\r\n","import { createBrowserHistory } from 'history';\r\n\r\nexport default createBrowserHistory({\r\n /* pass a configuration object here if needed */\r\n});\r\n","/* eslint-disable import/no-cycle */\r\nimport { reset, SubmissionError } from 'redux-form';\r\nimport Cookies from 'universal-cookie';\r\nimport { get } from 'lodash/fp';\r\nimport i18next from 'i18next';\r\nimport ServiceManager from 'services/core/ServiceManager';\r\nimport { SUCCESS } from 'static/requestResults';\r\nimport { FORM_NAME } from 'pages/pages/Login/components/LoginForm/LoginForm';\r\nimport {\r\n getErrorModelByStatus,\r\n getAuthErrorByStatus,\r\n LOGIN_FAILED_UNEXPECTEDLY,\r\n} from 'error/authErrors';\r\nimport history from 'services/core/history';\r\nimport CustomServiceManager from 'services/custom/CustomServiceManager';\r\nimport { contactIdSelector, jwtAccessTokenSelector } from './authSelectors';\r\n\r\nexport const LOGIN_SUCCESS = 'react-template-project/auth/LOGIN_SUCCESS';\r\nexport const LOGOUT_SUCCESS = 'react-template-project/auth/LOGOUT_SUCCESS';\r\nexport const GET_USER_PROFILE_START = 'react-template-project/auth/GET_USER_PROFILE_START';\r\nexport const GET_USER_PROFILE_SUCCESS = 'react-template-project/auth/GET_USER_PROFILE_SUCCESS';\r\nexport const GET_USER_PROFILE_FAIL = 'react-template-project/auth/GET_USER_PROFILE_FAIL';\r\nexport const PRE_AUTH_WITH_2FA_COMPLETE = 'react-template-project/auth/PRE_AUTH_WITH_2FA_COMPLETE';\r\nexport const LOGIN_WITHOUT_2FA_SUCCESS = 'react-template-project/auth/LOGIN_WITHOUT_2FA_SUCCESS';\r\nexport const PRE_AUTH_SUCCESS = 'react-template-project/auth/PRE_AUTH_SUCCESS';\r\nexport const AUTH_COMPLETE = 'react-template-project/auth/AUTH_COMPLETE';\r\nexport const REMEMBER_ME = 'react-template-project/auth/REMEMBER_ME';\r\nexport const TERMS_ACCEPTED = 'termsAccepted';\r\n\r\nexport const RESET_LOGIN = 'react-template-project/auth/RESET_LOGIN';\r\n\r\nexport const cookies = new Cookies();\r\n\r\nexport function setTermsAccepted() {\r\n return { type: TERMS_ACCEPTED };\r\n}\r\n\r\nexport function loginWithout2FASuccess(payload) {\r\n return { type: LOGIN_WITHOUT_2FA_SUCCESS, payload };\r\n}\r\n\r\nexport function preAuthWith2FAComplete() {\r\n return { type: PRE_AUTH_WITH_2FA_COMPLETE };\r\n}\r\n\r\nexport function authComplete(payload) {\r\n return { type: AUTH_COMPLETE, payload };\r\n}\r\n\r\nexport function loginSuccess(payload) {\r\n return { type: LOGIN_SUCCESS, payload };\r\n}\r\n\r\nexport function getUserProfileStart() {\r\n return { type: GET_USER_PROFILE_START };\r\n}\r\n\r\nexport function getUserProfileSuccess(payload) {\r\n return { type: GET_USER_PROFILE_SUCCESS, payload };\r\n}\r\n\r\nexport function getUserProfileFail() {\r\n return { type: GET_USER_PROFILE_FAIL };\r\n}\r\n\r\nexport function logoutSuccess() {\r\n return { type: LOGOUT_SUCCESS };\r\n}\r\n\r\nexport function preAuthComplete(payload) {\r\n return { type: PRE_AUTH_SUCCESS, payload };\r\n}\r\n\r\nexport function rememberMyDevice(payload) {\r\n return { type: REMEMBER_ME, payload };\r\n}\r\n\r\nexport function resetLogin() {\r\n return { type: RESET_LOGIN };\r\n}\r\n\r\nexport function getUserProfile() {\r\n return (dispatch, getState) => {\r\n const state = getState();\r\n const contactId = contactIdSelector(state);\r\n\r\n dispatch(getUserProfileStart());\r\n\r\n return new Promise((resolve, reject) => {\r\n ServiceManager.contactManagement('getClientProfile', [contactId, i18next.language])\r\n .then((contactManagementResponse) => {\r\n ServiceManager.contactManagement('getContactMembers', [contactId])\r\n .then((membersResponse) => {\r\n dispatch(\r\n getUserProfileSuccess({\r\n ...contactManagementResponse.data,\r\n members: membersResponse.data,\r\n })\r\n );\r\n resolve(contactManagementResponse);\r\n })\r\n .catch((reason) => {\r\n const errorModel = getErrorModelByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n\r\n dispatch(getUserProfileFail(errorModel));\r\n reject(reason);\r\n });\r\n })\r\n .catch((reason) => {\r\n const errorModel = getErrorModelByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n\r\n dispatch(getUserProfileFail(errorModel));\r\n reject(reason);\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function login({ username, password }, dispatch) {\r\n const validatedLogin = /@/.test(username)\r\n ? username\r\n : `${username}@${global.AppConfig.USERNAME_EMAIL_DOMAIN}`;\r\n\r\n return ServiceManager.Security('logIn', [validatedLogin, password]).then((response) => {\r\n const resultType = response.data.Result;\r\n const errorObject = getAuthErrorByStatus(resultType);\r\n\r\n if (errorObject !== undefined) {\r\n throw new SubmissionError(errorObject);\r\n } else if (resultType === SUCCESS) {\r\n dispatch(getUserProfile()).then(() => {\r\n dispatch(\r\n loginSuccess({\r\n ...response.data,\r\n username,\r\n password,\r\n })\r\n );\r\n });\r\n dispatch(reset(FORM_NAME));\r\n }\r\n throw new SubmissionError(getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY));\r\n });\r\n}\r\n\r\nexport const LOGIN_WITH_URL_SUCCESS = 'react-template-project/auth/LOGIN_WITH_URL_SUCCESS';\r\nexport const LOGIN_WITH_URL_START = 'react-template-project/auth/LOGIN_WITH_URL_START';\r\n\r\nexport function loginWithURLSuccess() {\r\n return { type: LOGIN_WITH_URL_SUCCESS };\r\n}\r\n\r\nexport function loginWithURLStart(payload) {\r\n return { type: LOGIN_WITH_URL_START, payload };\r\n}\r\n\r\nexport function loginByURL({ urlContactId, urlAccessToken, roleId }) {\r\n return (dispatch) =>\r\n new Promise((resolve) => {\r\n dispatch(loginWithURLStart({ contactId: urlContactId, jwt: urlAccessToken, roleId }));\r\n dispatch(getUserProfile()).then(() => {\r\n dispatch(loginWithURLSuccess());\r\n resolve();\r\n });\r\n });\r\n}\r\n\r\nexport const SESSION_CHECKED = 'react-template-project/session/SESSION_CHECKED';\r\n\r\nexport function sessionChecked(payload) {\r\n return { type: SESSION_CHECKED, payload };\r\n}\r\n\r\nexport function checkSession() {\r\n return (dispatch, getState) => {\r\n const state = getState();\r\n const jwtAccessToken = jwtAccessTokenSelector(state);\r\n\r\n return new Promise((resolve) => {\r\n const [promise] = ServiceManager.Security('validateToken', [\r\n { accessToken: jwtAccessToken },\r\n ]);\r\n\r\n promise\r\n .then((response) => {\r\n const resultType = get('data.Result', response);\r\n\r\n dispatch(\r\n sessionChecked({\r\n isCurrentSessionChecked: true,\r\n isSessionValid: resultType === 'Success',\r\n })\r\n );\r\n resolve();\r\n })\r\n .catch(() => {\r\n dispatch(\r\n sessionChecked({\r\n isCurrentSessionChecked: false,\r\n isSessionValid: false,\r\n })\r\n );\r\n\r\n resolve();\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function login2FA({ username, password, rememberMe }, dispatch) {\r\n const validatedLogin = /@/.test(username)\r\n ? username\r\n : `${username}@${global.AppConfig.USERNAME_EMAIL_DOMAIN}`;\r\n\r\n return new Promise((resolve, reject) => {\r\n const trustedDeviceToken = cookies.get('trustedDeviceToken');\r\n\r\n ServiceManager.Security('logIn2', [\r\n { username: validatedLogin, password, trustedDeviceToken },\r\n ])\r\n .then((logIn2Response) => {\r\n const resultType = get('data.Result', logIn2Response);\r\n const errorObject = getAuthErrorByStatus(resultType);\r\n\r\n if (errorObject !== undefined) {\r\n reject(new SubmissionError(errorObject));\r\n } else if (resultType === SUCCESS) {\r\n const isTwoFactorEnabled = get(\r\n 'data.CampaignContact.IsTwoFactorEnabled',\r\n logIn2Response\r\n );\r\n const session = get('data.Session', logIn2Response);\r\n\r\n dispatch(\r\n preAuthComplete({\r\n ...logIn2Response.data,\r\n username,\r\n rememberMe,\r\n })\r\n );\r\n if (isTwoFactorEnabled === false || session !== undefined) {\r\n dispatch(reset(FORM_NAME));\r\n dispatch(\r\n authComplete({\r\n sessionId: get('data.Session.SessionId', logIn2Response),\r\n jwtAccessToken: get('data.Session.JwtAccessToken', logIn2Response),\r\n })\r\n );\r\n dispatch(reset(FORM_NAME));\r\n resolve();\r\n dispatch(getUserProfile());\r\n } else {\r\n dispatch(preAuthWith2FAComplete());\r\n dispatch(reset(FORM_NAME));\r\n resolve();\r\n }\r\n } else {\r\n reject(new SubmissionError(getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY)));\r\n }\r\n })\r\n .catch(() => {\r\n const errorObject = getAuthErrorByStatus(LOGIN_FAILED_UNEXPECTEDLY);\r\n\r\n reject(new SubmissionError(errorObject));\r\n });\r\n });\r\n}\r\n\r\nexport function status2FASuccess(data) {\r\n return (dispatch) => {\r\n const trustedDeviceToken = get('TrustedDeviceToken', data);\r\n\r\n if (trustedDeviceToken !== undefined && trustedDeviceToken !== null) {\r\n const date = new Date();\r\n const expirationDays = process.env.REACT_APP_COOKIES_EXPIRES_IN_DAYS;\r\n\r\n date.setTime(date.getTime() + expirationDays * 24 * 60 * 60 * 1000);\r\n cookies.set('trustedDeviceToken', trustedDeviceToken, {\r\n path: '/',\r\n expires: date,\r\n });\r\n }\r\n dispatch(\r\n authComplete({\r\n sessionId: get('Session.SessionId', data),\r\n jwtAccessToken: get('Session.JwtAccessToken', data),\r\n })\r\n );\r\n dispatch(getUserProfile());\r\n dispatch(reset(FORM_NAME));\r\n };\r\n}\r\n\r\nexport const RESET2FA = 'react-template-project/auth/RESET2FA';\r\nexport function reset2FA() {\r\n return { type: RESET2FA };\r\n}\r\n\r\nexport function logout() {\r\n return async (dispatch, getState) => {\r\n try {\r\n const contactId = getState().auth?.user?.contactId;\r\n\r\n if (contactId) {\r\n await CustomServiceManager.logout(contactId);\r\n }\r\n\r\n global.localStorage.removeItem('auth');\r\n dispatch(logoutSuccess());\r\n history.push({\r\n pathname: '/login',\r\n });\r\n } catch {\r\n console.log('logout error');\r\n }\r\n };\r\n}\r\n","export const GA_CATEGORIES = {\r\n dashboard: 'Dashboard',\r\n portfolio: 'Portfolio',\r\n download: 'Download',\r\n faq: 'FAQ',\r\n language: 'Language',\r\n contactRM: 'contact_RM',\r\n error: 'error',\r\n};\r\n\r\nexport const GA_ACTIONS = {\r\n pageView: 'page_view',\r\n startLanguage: 'start_language',\r\n changeLanguage: 'change_language',\r\n viewRM: 'view_RM',\r\n expandFAQBlock: 'expand_block',\r\n changeGraphView: 'change_graph_view',\r\n changePerformanceFilter: 'change_performance_filter',\r\n factsheet: 'factsheet',\r\n document: 'document',\r\n showDetails: 'show_details',\r\n login: 'login',\r\n};\r\n\r\nexport const gaSendPageView = ({ pathname }) => {\r\n if (window.gtag) {\r\n window.gtag('event', GA_ACTIONS.pageView, {\r\n page_path: pathname,\r\n });\r\n }\r\n};\r\n\r\nexport const initAnalitics = (id, history) => {\r\n if (id) {\r\n const analiticsSrcScirpt = document.createElement('script');\r\n\r\n analiticsSrcScirpt.src = `https://www.googletagmanager.com/gtag/js?id=${id}`;\r\n analiticsSrcScirpt.async = true;\r\n document.head.appendChild(analiticsSrcScirpt);\r\n\r\n const analiticsScirpt = document.createElement('script');\r\n\r\n analiticsScirpt.innerHTML = `\r\n window.dataLayer = window.dataLayer || [];\r\n function gtag(){dataLayer.push(arguments);}\r\n gtag('js', new Date());\r\n\r\n gtag('config', '${id}');\r\n `;\r\n\r\n document.head.appendChild(analiticsScirpt);\r\n\r\n if (history) {\r\n history.listen(gaSendPageView);\r\n }\r\n }\r\n};\r\n\r\nexport const sendGAEvent = (actionName, categoryName, labelName) => {\r\n if (window.gtag) {\r\n window.gtag('event', actionName, {\r\n event_category: categoryName,\r\n event_label: labelName,\r\n });\r\n }\r\n};\r\n","const NAMESPACE_DEFAULT = 'redux_sessionstorage';\r\nconst NAMESPACE_SEPARATOR_DEFAULT = '_';\r\n\r\nexport const load = ({ states }) => {\r\n const loadedState = {};\r\n\r\n states.forEach((value) => {\r\n loadedState[value] = {\r\n ...JSON.parse(\r\n sessionStorage.getItem(NAMESPACE_DEFAULT + NAMESPACE_SEPARATOR_DEFAULT + value)\r\n ),\r\n };\r\n });\r\n\r\n return loadedState;\r\n};\r\n\r\nexport const save = ({ states }) => (store) => (next) => (action) => {\r\n const result = next(action);\r\n\r\n states.forEach((value) => {\r\n sessionStorage.setItem(\r\n NAMESPACE_DEFAULT + NAMESPACE_SEPARATOR_DEFAULT + value,\r\n JSON.stringify(store.getState()[value])\r\n );\r\n });\r\n\r\n return result;\r\n};\r\n","import { get } from 'lodash/fp';\r\n\r\nexport const SORT_DIRECTION_ASC = 'asc';\r\nexport const SORT_DIRECTION_DESC = 'desc';\r\n\r\nexport const sorterByDateCommon = (column) => (previous, current) => {\r\n const previousValue = get(column, previous);\r\n const currentValue = get(column, current);\r\n\r\n if (previousValue === undefined || currentValue === undefined) {\r\n return 0;\r\n }\r\n\r\n return new Date(previousValue) - new Date(currentValue);\r\n};\r\n\r\nexport const sorterByDate = (column) => (...props) => {\r\n if (props.length === 3) return sorterByDateCommon(column)(...props);\r\n\r\n const { direction } = props[1];\r\n\r\n return props[0].sort((previous, current) => {\r\n const previousValue = get(column, previous);\r\n const currentValue = get(column, current);\r\n\r\n if (previousValue === undefined || currentValue === undefined) {\r\n return 0;\r\n }\r\n\r\n if (direction === SORT_DIRECTION_ASC) {\r\n return new Date(previousValue) - new Date(currentValue);\r\n }\r\n\r\n if (direction === SORT_DIRECTION_DESC) {\r\n return new Date(currentValue) - new Date(previousValue);\r\n }\r\n\r\n return 0;\r\n });\r\n};\r\n\r\nexport const sorterStringCommon = (column) => (previous, current) => {\r\n let previousValue = get(column, previous);\r\n let currentValue = get(column, current);\r\n\r\n if (typeof previousValue === 'string') {\r\n previousValue = previousValue.toLowerCase();\r\n }\r\n\r\n if (typeof currentValue === 'string') {\r\n currentValue = currentValue.toLowerCase();\r\n }\r\n\r\n if (previousValue === undefined || currentValue === undefined) {\r\n return 0;\r\n }\r\n\r\n return previousValue.localeCompare(currentValue);\r\n};\r\n\r\nexport const sorterString = (column) => (...props) => {\r\n if (props.length === 3) return sorterStringCommon(column)(...props);\r\n\r\n const { direction } = props[1];\r\n\r\n return props[0].sort((previous, current) => {\r\n let previousValue = get(column, previous);\r\n let currentValue = get(column, current);\r\n\r\n if (typeof previousValue === 'string') {\r\n previousValue = previousValue.toLowerCase();\r\n }\r\n\r\n if (typeof currentValue === 'string') {\r\n currentValue = currentValue.toLowerCase();\r\n }\r\n\r\n if (previousValue === undefined || currentValue === undefined) {\r\n return 0;\r\n }\r\n\r\n if (direction === SORT_DIRECTION_ASC) {\r\n return previousValue.localeCompare(currentValue);\r\n }\r\n\r\n if (direction === SORT_DIRECTION_DESC) {\r\n return currentValue.localeCompare(previousValue);\r\n }\r\n\r\n return 0;\r\n });\r\n};\r\n\r\nexport const sorterNumberCommon = (column) => (previous, current) => {\r\n let previousValue = get(column, previous);\r\n let currentValue = get(column, current);\r\n\r\n if (typeof previousValue === 'string') {\r\n previousValue = Number(previousValue.replace(/[^\\d.-]/g, ''));\r\n }\r\n\r\n if (typeof currentValue === 'string') {\r\n currentValue = Number(currentValue.replace(/[^\\d.-]/g, ''));\r\n }\r\n\r\n return previousValue - currentValue;\r\n};\r\n\r\nexport const sorterNumber = (column) => (...props) => {\r\n if (props.length === 3) return sorterNumberCommon(column)(...props);\r\n\r\n const { direction } = props[1];\r\n\r\n return props[0].sort((previous, current) => {\r\n let previousValue = get(column, previous);\r\n let currentValue = get(column, current);\r\n\r\n if (typeof previousValue === 'string') {\r\n previousValue = Number(previousValue.replace(/[^\\d.-]/g, ''));\r\n }\r\n\r\n if (typeof currentValue === 'string') {\r\n currentValue = Number(currentValue.replace(/[^\\d.-]/g, ''));\r\n }\r\n\r\n if (previousValue === undefined || currentValue === undefined) {\r\n return 0;\r\n }\r\n\r\n if (direction === SORT_DIRECTION_ASC) {\r\n return previousValue - currentValue;\r\n }\r\n\r\n if (direction === SORT_DIRECTION_DESC) {\r\n return currentValue - previousValue;\r\n }\r\n\r\n return 0;\r\n });\r\n};\r\n","import { createSelector } from 'reselect';\r\nimport { get } from 'lodash/fp';\r\nimport { isSessionValidSelector } from '../session/sessionSelectors';\r\n\r\nconst roles = {\r\n PRIVATE: 1,\r\n CORPORATE: 2,\r\n MANAGER: 4,\r\n ADMIN: 8,\r\n};\r\n\r\nexport const authSelector = (state) => state.auth;\r\nexport const errorSelector = (state) => state.error;\r\n\r\nexport const isAuthenticatedSelector = createSelector(\r\n authSelector,\r\n isSessionValidSelector,\r\n (auth, isSessionValid) => auth.isAuthenticated && isSessionValid === true\r\n);\r\n\r\nexport const isLoginDoneSelector = (state) => authSelector(state).isAuthenticated === true;\r\n\r\nexport const isJWTBaseLoginSelector = (state) => authSelector(state).isJWTBaseLogin === true;\r\n\r\nexport const isFistStepDoneSelector = createSelector(authSelector, (auth) => auth.isFistStepDone);\r\nexport const userSelector = createSelector(authSelector, (auth) => get('user', auth));\r\nexport const roleIdSelector = createSelector(userSelector, (user) => get('roleId', user));\r\nexport const passcodeLengthSelector = createSelector(userSelector, (user) =>\r\n get('passcodeLength', user)\r\n);\r\n// export const rememberMeSelector = createSelector(userSelector, (user) => get('rememberMe', user));\r\nexport const factorSelector = createSelector(userSelector, (user) => get('factor', user));\r\nexport const providerSelector = createSelector(userSelector, (user) => get('provider', user));\r\nexport const memberIdSelector = createSelector(userSelector, (user) =>\r\n get('relationshipManagerId', user)\r\n);\r\nexport const contactIdSelector = createSelector(userSelector, (user) => get('contactId', user));\r\nexport const sessionIdSelector = createSelector(userSelector, (user) => get('sessionId', user));\r\nexport const isUserActiveSelector = createSelector(userSelector, (user) => get('isActive', user));\r\nexport const jwtSelector = createSelector(userSelector, (user) => get('jwt', user));\r\nexport const jwtAccessTokenSelector = createSelector(userSelector, (user) =>\r\n get('jwtAccessToken', user)\r\n);\r\nexport const contactTypeIdSelector = createSelector(userSelector, (user) =>\r\n get('contactTypeId', user)\r\n);\r\nexport const isTwoFactorEnabledSelector = createSelector(userSelector, (user) =>\r\n get('isTwoFactorEnabled', user)\r\n);\r\nexport const qrCodeSelector = createSelector(userSelector, (user) =>\r\n get('AsynchronousParameters.QrCodeUrl', user)\r\n);\r\nexport const hasPrivateRoleSelector = createSelector(\r\n contactTypeIdSelector,\r\n (contactTypeId) => contactTypeId & roles.PRIVATE\r\n);\r\nexport const hasCorporateRoleSelector = createSelector(\r\n contactTypeIdSelector,\r\n (contactTypeId) => contactTypeId & roles.CORPORATE\r\n);\r\nexport const hasManagerRoleSelector = createSelector(\r\n contactTypeIdSelector,\r\n (contactTypeId) => contactTypeId & roles.MANAGER\r\n);\r\nexport const hasAdminRoleSelector = createSelector(\r\n contactTypeIdSelector,\r\n (contactTypeId) => contactTypeId & roles.ADMIN\r\n);\r\nexport const usernameSelector = createSelector(userSelector, (user) => user.username);\r\nexport const passwordSelector = createSelector(userSelector, (user) => user.password);\r\nexport const contactFirstNameSelector = createSelector(userSelector, (user) =>\r\n get('contactFirstName', user)\r\n);\r\nexport const contactLasNameSelector = createSelector(userSelector, (user) =>\r\n get('contactLasName', user)\r\n);\r\nexport const isUserNameAndLastNameAvailableSelector = createSelector(\r\n contactFirstNameSelector,\r\n contactLasNameSelector,\r\n (contactFirstName, contactLasName) =>\r\n contactFirstName !== undefined && contactLasName !== undefined\r\n);\r\n\r\nexport const userNameAndLastNameSelector = createSelector(\r\n isUserNameAndLastNameAvailableSelector,\r\n contactFirstNameSelector,\r\n contactLasNameSelector,\r\n (isUserNameAndLastNameAvailable, contactFirstName, contactLasName) =>\r\n isUserNameAndLastNameAvailable === true\r\n ? `${contactFirstName} ${contactLasName}`\r\n : undefined\r\n);\r\n","export class ErrorModel {\r\n #type;\r\n\r\n #id;\r\n\r\n #message;\r\n\r\n #data;\r\n\r\n constructor({ type, message, data, id }) {\r\n this.#type = type;\r\n this.#message = message;\r\n this.#data = data;\r\n this.#id = id;\r\n }\r\n\r\n get type() {\r\n return this.#type;\r\n }\r\n\r\n get id() {\r\n return this.#id;\r\n }\r\n\r\n get message() {\r\n return this.#message;\r\n }\r\n\r\n get data() {\r\n return this.#data;\r\n }\r\n}\r\n\r\nexport const generateError = (data) => new ErrorModel(data);\r\n","import React, { useEffect, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { TextInput } from 'ui-library';\r\n\r\nimport './Passcode.css';\r\n\r\nexport const Passcode = ({ passcodeLength, onChange }) => {\r\n const passcodeInputs = [];\r\n const passcodeArr = useMemo(() => {\r\n const passcode = [];\r\n\r\n for (let i = 0; i < passcodeLength; i += 1) {\r\n passcode[i] = '';\r\n }\r\n\r\n return passcode;\r\n }, [passcodeLength]);\r\n const [passcode, setPasscode] = useState(passcodeArr);\r\n\r\n useEffect(() => {\r\n if (passcodeInputs[0]) {\r\n passcodeInputs[0].focus();\r\n }\r\n }, []);\r\n\r\n const changeTanHandler = (index) => (e) => {\r\n const clonedPasscode = [...passcode];\r\n const { value } = e.currentTarget;\r\n const valueLength = value.length;\r\n\r\n if (valueLength > 1) {\r\n const maxValue = Math.min(passcodeLength, index + valueLength);\r\n const focusIndex = Math.min(maxValue, passcodeLength - 1);\r\n\r\n for (let i = index; i < maxValue; i += 1) {\r\n clonedPasscode[i] = value[i - index];\r\n }\r\n\r\n passcodeInputs[focusIndex].focus();\r\n } else {\r\n [clonedPasscode[index]] = value;\r\n if (value !== undefined && value !== '' && index !== passcodeLength - 1) {\r\n if (passcodeInputs[index + 1]) {\r\n passcodeInputs[index + 1].focus();\r\n }\r\n }\r\n }\r\n\r\n onChange(clonedPasscode.join(''));\r\n setPasscode(clonedPasscode);\r\n };\r\n\r\n const keyupTanHandler = (index) => (e) => {\r\n e.target.select();\r\n const event = e || global.event;\r\n const { selectionStart, value } = event.currentTarget;\r\n const charCode = event.keyCode || event.which;\r\n\r\n if (charCode === 8 && value === '' && index !== 0) {\r\n if (passcodeInputs[index - 1]) passcodeInputs[index - 1].focus();\r\n }\r\n if (charCode === 37 && index !== 0 && (value === '' || selectionStart === 0)) {\r\n if (passcodeInputs[index - 1]) passcodeInputs[index - 1].focus();\r\n }\r\n if (\r\n charCode === 39 &&\r\n index !== passcodeLength - 1 &&\r\n (value === '' || selectionStart === 1)\r\n ) {\r\n if (passcodeInputs[index + 1]) passcodeInputs[index + 1].focus();\r\n }\r\n };\r\n\r\n const setRef = (index) => (ref) => {\r\n passcodeInputs[index] = ref || undefined;\r\n };\r\n\r\n return (\r\n
\r\n {passcode.map(\r\n (value, index) => (\r\n {\r\n e.target.select();\r\n }}\r\n onChange={changeTanHandler(index)}\r\n onKeyUp={keyupTanHandler(index)}\r\n />\r\n ),\r\n this\r\n )}\r\n
\r\n );\r\n};\r\n\r\nPasscode.propTypes = {\r\n passcodeLength: PropTypes.number,\r\n onChange: PropTypes.func,\r\n};\r\n\r\nPasscode.defaultProps = {\r\n passcodeLength: 6,\r\n onChange: () => {},\r\n};\r\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJ4SURBVFhH7dY3iBVBHMfxZw6VAbMWhkow21jYWJhQTAiihTYGEAsLGwttbGzEgBgqCxUVtDEjKig2IohZMQcEtRfMfr/LzjHsze6tNtfsDz7cLTNvd97M/Gdfq0mTJp2dLvnfuumLcRiJMRgM8wmv8AEv8RW1UmcA3TERyzEDo/EdX/ALphsGoSfe4BZO4SF+ojRVA7BtMjZhFj7iHO7Ab+n1D9jPQY6AszIdCzAMV7EHDuQPaqcPNsNvcw1L0A8hvTEVy7AUU9ALIfa1zQE42I3wnrUyEIfgem7BAMTxwWfwHvdz7+CUT0AcP+s97Hsgv66MHY7jMeaiK+L48Ae4iDkYCqfa/y/hLiYhjveYh2c4gv5Ixinch6dwsxXjtJ/GeYTdH2cIruAE4uUImQkHsRup9tY6OFULs6v2mQan2pkpi5vPPvZNZTFsX51dRXH3PsE2lFWGm+oenPKy2OaesG8q3nsHXGKf2bbGv2FNF9c8jmXkDcoGaEJbVclZsj4rnCFtWQOnZ1F21T5uwLeoWgKXzz6WZSqWrM9YmV0V4sbYi+dwwxRj+0lYAW64YqwI6/4oPBGL8TB7gZ1ItWexRCwVd6sbqjjdHsmWmg+yPZSh/3tg3cZ4xPEezoxf7DDiAy0Zz4L98CDaml/Hsc6dCdvdcJ4LVs8xFB/uZ7fDvrvQ4cNDPDbXw2P0JlbgX4/iVfCzfvO1SB7FHe1op3wD5sOXzw1chzeNX0Y9MBy+ql1r95BLcxYHYdklK6NqACGWjWe8u382rF9fx58RXrUOwNPRv69xGRfwCP/9Ok7FHyRjMSoXdvM3uA/kD5PaP0iaNGnSyWm1/gKtn4AyqFDspAAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMLSURBVFhH7dZZyIxRHMfx12vf9y2ylcieJURIUSQlhbJcuJElWSJb4cJWLpQlXOACkSWJJJQi2dco+05Kluwivt+nTh4zz7wzSuPC/OpT78w785zz/M//nGeKCinkH6Ut+qI4epXHlMJAXMcGlEHeUhYT8QRrUQ/RjP4klqwWWqIxmqM6PuERHuMenuIbQmpgDsZgNdbgA3KeQFX0w3B0gLN/hbcwP1ARDfAeN3EI++Gdr0QXOIm9+I4o2SZQHkMxCS1wFodxA3fxGg5uKsOKWB0n2x8f4Tp/xmScQ85pis0Ia9YN3k1IbTjQKAxCM4QbctAZsBrvcAG9kHO6w7s9Dbs23q3+7Vr6/4fw4rdxC4vREDNhTyxHT+yAn/V7WbeeX3Cb7IZViMc7nAKrsgydYCUs+wQ4icu4D5fNJTTVsAh+bzwyLr0XughnXNc3UmID2uWzUNo3YvG7Z2BPOLnUQVy+2XCn2FdpsYl24jjcYkmxxJa+TvTqV+wF7/wIDsLuL4fUWBG34DW09o14LI3r1jt6lR7vaBtsyBCrMA4PsAX1MQKXEB00CfEz9tZ6FMcbIhwcGdeHWN7w/ypYgKVw8Kl4gXDNsD1TE74fP6iiVMJWnEAT30jIQrjO7eCgVmwswi7x4htxAElLUAFW0ArZM2nxsHGAPUgqYRvY6Tain+uDeMXcsm630dGr32MTWjGbcIhvZEpXXME+eLKFONBgeAHLa8N2RNiG0+DEvEMbOh634RL4XSsWn3RiOuMkzsPZes67r72ADxMb9hTCQXQHVmYefPCEOFB7eP7bqCOR828A+8BOdZBjeI65sFdMSUexg7icblufGUfRA2l3nq0UrbALXvwL3D7udR8qnnY+EeMPIz9ngw6AJ6oPo03YjpdIS0kTcMar8BXz4TIMg+97SobHcZiAlXGP+5y/CneCd/4MGZM0AcvnQD5IPN08Pr1b4//iP0jcKWFN38CzPukHSc5xnzqgF1qBmshbLOs6OLhPtvAky1umw7Vzr+e8Vf5mGiF+8BTyP6So6Cc3DqewjXo3SAAAAABJRU5ErkJggg==\"","module.exports = __webpack_public_path__ + \"static/media/itunes_icon.7394dae8.svg\";","module.exports = __webpack_public_path__ + \"static/media/gplay_icon.106162ae.svg\";","import { get } from 'lodash/fp';\r\n\r\nexport const isTwoFactorEnabledSelector = (data) => get('IsTwoFactorEnabled', data);\r\nexport const enrollQRCodeSelector = (data) =>\r\n get('AsynchronousParameters.ActivationQrCodeUrl', data);\r\nexport const enrollmentSessionIdSelector = (data) => get('EnrollmentSessionId', data);\r\nexport const enrollStatusSelector = (data) => get('Status', data);\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"--primary-default\":\"#e4e8ee\",\"--primary-lighter\":\"#f0f3f6\",\"--primary-light\":\"#ffffff\",\"--primary-dark\":\"#7d8da5\",\"--primary-darker\":\"#586579\",\"--secondary-default\":\"#4a4a7a\",\"--secondary-lighter\":\"#7171a7\",\"--secondary-light\":\"#c8c8e8\",\"--secondary-dark\":\"#26264e\",\"--secondary-darker\":\"#0b0b1e\",\"--accent-default\":\"#3681b0\",\"--accent-lighter\":\"rgba(54, 129, 176, 0.75)\",\"--accent-light\":\"rgba(54, 129, 176, 0.5)\",\"--accent-dark\":\"#2e6d94\",\"--accent-darker\":\"#245472\",\"--positive-default\":\"#07cc9b\",\"--positive-lighter\":\"#83e5cd\",\"--positive-light\":\"#38d6af\",\"--positive-dark\":\"#19b38d\",\"--positive-darker\":\"#159475\",\"--negative-default\":\"#ff376b\",\"--negative-lighter\":\"#ff9bb5\",\"--negative-light\":\"#ff5f88\",\"--negative-dark\":\"#ce3960\",\"--negative-darker\":\"#bb3256\",\"--white\":\"#ffffff\",\"--white-rgb\":\"255,255,255\",\"--black\":\"#000\",\"--black-rgb\":\"0,0,0\",\"--bright\":\"var(--secondary-darker)\",\"--primary-default-rgb\":\"40,39,38\",\"--white-darker\":\"#f5f5f5\",\"--border-color\":\"#090912\",\"--background-base\":\"#10101f\",\"--background-content\":\"#191934\",\"--background-header\":\"var(--background-base)\",\"--background-footer\":\"var(--background-base)\",\"--outline-blur-size\":\"0\",\"--outline-width\":\"2px\",\"--outline-color\":\"var(--primary-color)\",\"--background-color-light\":\"rgb(250, 250, 250)\",\"--background-color-base\":\"rgb(245, 245, 245)\",\"--padding-base\":\"30px\",\"--component-background\":\"var(--white)\",\"--primary-color\":\"var(--accent-default)\",\"--info-color\":\"var(--accent-default)\",\"--success-color\":\"var(--accent-default)\",\"--processing-color\":\"var(--accent-default)\",\"--error-color\":\"var(--negative-default)\",\"--highlight-color\":\"var(--negative-default)\",\"--warning-color\":\"var(--primary-lighter)\",\"--normal-color\":\"#d9d9d9\",\"--primary-1\":\"#f0f5ff\",\"--primary-5\":\"#6b89ff\",\"--primary-7\":\"#2e44d9\",\"--item-active-bg\":\"var(--primary-1)\",\"--item-hover-bg\":\"var(--primary-1)\",\"--text-color\":\"var(--primary-default)\",\"--text-color-secondary\":\"rgba(var(--black-rgb), 45%)\",\"--text-color-inverse\":\"var(--primary-default)\",\"--text-color-dark\":\"rgba(var(--white-rgb), 0.85)\",\"--heading-color\":\"rgba(var(--black-rgb), 0.85)\",\"--icon-color-hover\":\"rgba(var(--black-rgb), 75%)\",\"--font-variant-base\":\"tabular-nums\",\"--font-feature-settings-base\":\"'tnum'\",\"--font-size-base\":\"14px\",\"--font-size-lg\":\"calc(var(--font-size-base) + 2px)\",\"--font-size-sm\":\"12px\",\"--line-height-base\":\"1.5\",\"--disabled-color\":\"rgba(0,0,0, 0.25)\",\"--disabled-bg\":\"var(--background-color-base)\",\"--disabled-color-dark\":\"rgba(var(--white-rgb), 0.35)\",\"--border-color-base\":\"var(--border-color)\",\"--border-color-split\":\"rgb(232, 232, 232)\",\"--border-color-inverse\":\"var(--background-content)\",\"--border-width-base\":\"1px\",\"--border-style-base\":\"solid\",\"--border-radius-base\":\"2px\",\"--border-radius-sm\":\"2px\",\"--accent-font-family\":\"'Century-gothic', Roboto, Helvetica, Arial, sans-serif\",\"--accent-font-weight\":\"normal\",\"--collapse-color\":\"var(--primary-default)\",\"--collapse-bg-color\":\"var(--background-base)\",\"--collapse-border-color\":\"var(--border-color)\",\"--collapse-header-color\":\"var(--primary-default)\",\"--collapse-arrow-color\":\"var(--accent-default)\",\"--collapse-item-border-color\":\"var(--secondary-lighter)\",\"--collapse-extra-counter-color\":\"var(--white)\",\"--collapse-extra-counter-bg-color\":\"var(--accent-default)\",\"--collapse-content-color\":\"var(--primary-default)\",\"--collapse-content-disabled-color\":\"var(--secondary-lighter)\",\"--collapse-content-bg-color\":\"var(--white)\",\"--collapse-borderless-bg-color\":\"var(--white)\",\"--breadcrumb-color-hover\":\"var(--primary-default)\",\"--breadcrumb-color-base\":\"var(--secondary-default)\",\"--breadcrumb-color\":\"var(--secondary-default)\",\"--breadcrumb-color-active\":\"var(--primary-default)\",\"--checkbox-color\":\"var(--primary-color)\",\"--checkbox-check-color\":\"var(--white)\",\"--checkbox-border-width\":\"var(--border-width-base)\",\"--input-color\":\"var(--primary-default)\",\"--input-error-color\":\"var(--negative-default)\",\"--input-error-hover-color\":\"var(--negative-light)\",\"--input-bg-color\":\"var(--background-content)\",\"--input-wrap-bg-color\":\"var(--background-content)\",\"--input-border-color\":\"var(--border-color-base)\",\"--input-group-border-color\":\"var(--primary-lighter)\",\"--input-focus-border-color\":\"var(--primary-color)\",\"--input-active-bg-color\":\"var(--background-content)\",\"--input-disabled-color\":\"var(--primary-default)\",\"--input-disabled-bg-color\":\"var(--disabled-bg)\",\"--input-disabled-border-color\":\"#e6d8d8\",\"--input-hover-color\":\"var(--primary-5)\",\"--input-hover-border-color\":\"var(--primary-color)\",\"--input-placeholder-color\":\"var(--primary-light)\",\"--input-number-handler-active-bg\":\"#f4f4f4\",\"--input-shadow-color\":\"var(--primary-light)\",\"--input-addon-bg\":\"var(--input-bg-color)\",\"--input-max-button-color\":\"var(--primary-default)\",\"--input-max-button-hover-color\":\"var(--primary-darker)\",\"--shadow-color\":\"none\",\"--shadow-color-inverse\":\"var(--shadow-color)\",\"--box-shadow-base\":\"var(--shadow-color)\",\"--shadow-1-up\":\"var(--shadow-color)\",\"--shadow-1-down\":\"var(--shadow-color)\",\"--shadow-1-left\":\"var(--shadow-color)\",\"--shadow-1-right\":\"var(--shadow-color)\",\"--shadow-2\":\"var(--shadow-color)\",\"--modal-body-padding\":\"24px\",\"--modal-header-bg\":\"var(--component-background)\",\"--modal-footer-bg\":\"tranparent\",\"--modal-mask-bg\":\"rgba(var(--primary-default-rgb), 0.50)\",\"--table-header-color\":\"var(--secondary-default)\",\"--table-header-hover-color\":\"var(--primary-default)\",\"--table-linked\":\"var(--primary-default)\",\"--table-linked-hover\":\"var(--primary-light)\",\"--animation-duration-slow\":\"0.3s\",\"--animation-duration-base\":\"0.2s\",\"--animation-duration-fast\":\"0.1s\",\"--screen-xs-max\":\"calc((var(--screen-sm-min) - 1px))\",\"--screen-sm-max\":\"calc((var(--screen-md-min) - 1px))\",\"--screen-md-max\":\"calc((var(--screen-lg-min) - 1px))\",\"--screen-lg-max\":\"calc((var(--screen-xl-min) - 1px))\",\"--screen-xl-max\":\"calc((var(--screen-xxl-min) - 1px))\",\"--btn-default-color\":\"var(--text-color)\",\"--btn-default-bg\":\"var(--background-content)\",\"--btn-default-border\":\"var(--border-color-base)\",\"--btn-primary-hover-bg\":\"var(--accent-darker)\",\"--btn-secondary-hover-bg\":\"var(--secondary-default)\",\"--btn-secondary-disabled-color\":\"var(--primary-dark)\",\"--radio-size\":\"16px\",\"--radio-dot-color\":\"var(--primary-default)\",\"--radio-dot-color-rgb\":\"rgb(40, 39, 38)\",\"--radio-duration\":\"0.3s\",\"--radio-focused-outline\":\"3px solid rgba(var(--radio-dot-color-rgb), 0.06)\",\"--radio-button-bg\":\"var(--btn-default-bg)\",\"--radio-button-checked-bg\":\"var(--btn-default-bg)\",\"--radio-button-color\":\"var(--btn-default-color)\",\"--radio-button-hover-color\":\"var(--primary-5)\",\"--radio-button-active-color\":\"var(--primary-7)\",\"--radion-bt-wr-dis-checked\":\"#e6e6e6\",\"--radio-button-box-shadow\":\"0 0 0 3px rgba(var(--radio-dot-color-rgb), 0.08)\",\"--ease-base-out\":\"cubic-bezier(0.7, 0.3, 0.1, 1)\",\"--ease-base-in\":\"cubic-bezier(0.9, 0, 0.3, 0.7)\",\"--ease-out\":\"cubic-bezier(0.215, 0.61, 0.355, 1)\",\"--ease-in\":\"cubic-bezier(0.55, 0.055, 0.675, 0.19)\",\"--ease-in-out\":\"cubic-bezier(0.645, 0.045, 0.355, 1)\",\"--ease-out-back\":\"cubic-bezier(0.12, 0.4, 0.29, 1.46)\",\"--ease-in-back\":\"cubic-bezier(0.71, -0.46, 0.88, 0.6)\",\"--ease-in-out-back\":\"cubic-bezier(0.71, -0.46, 0.29, 1.46)\",\"--ease-out-circ\":\"cubic-bezier(0.08, 0.82, 0.17, 1)\",\"--ease-in-circ\":\"cubic-bezier(0.6, 0.04, 0.98, 0.34)\",\"--ease-in-out-circ\":\"cubic-bezier(0.78, 0.14, 0.15, 0.86)\",\"--ease-out-quint\":\"cubic-bezier(0.23, 1, 0.32, 1)\",\"--ease-in-quint\":\"cubic-bezier(0.755, 0.05, 0.855, 0.06)\",\"--ease-in-out-quint\":\"cubic-bezier(0.86, 0, 0.07, 1)\",\"--padding-lg\":\"24px\",\"--padding-md\":\"16px\",\"--padding-sm\":\"12px\",\"--padding-xs\":\"8px\",\"--control-padding-horizontal\":\"var(--padding-sm)\",\"--control-padding-horizontal-sm\":\"var(--padding-xs)\",\"--content-box-border-radius\":\"5px\",\"--content-box-shadow\":\"none\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"--primary-default\":\"#25282e\",\"--primary-lighter\":\"#babece\",\"--primary-light\":\"#85899d\",\"--primary-dark\":\"#141519\",\"--primary-darker\":\"#050506\",\"--secondary-default\":\"#9dabbf\",\"--secondary-lighter\":\"#e4e8ee\",\"--secondary-light\":\"#c3ccd9\",\"--secondary-dark\":\"#808ea2\",\"--secondary-darker\":\"#5e6b7d\",\"--accent-default\":\"#3681b0\",\"--accent-lighter\":\"rgba(54, 129, 176, 0.5)\",\"--accent-light\":\"rgba(54, 129, 176, 0.75)\",\"--accent-dark\":\"#2e6d94\",\"--accent-darker\":\"#245472\",\"--positive-default\":\"#07cc9b\",\"--positive-lighter\":\"#83e5cd\",\"--positive-light\":\"#38d6af\",\"--positive-dark\":\"#19b38d\",\"--positive-darker\":\"#159475\",\"--negative-default\":\"#ff376b\",\"--negative-lighter\":\"#ff9bb5\",\"--negative-light\":\"#ff5f88\",\"--negative-dark\":\"#ce3960\",\"--negative-darker\":\"#bb3256\",\"--white\":\"#ffffff\",\"--white-rgb\":\"255, 255, 255\",\"--black\":\"#000\",\"--black-rgb\":\"0, 0, 0\",\"--bright\":\"var(--white)\",\"--primary-default-rgb\":\"40, 39, 38\",\"--white-darker\":\"#f5f5f5\",\"--border-color\":\"var(--primary-lighter)\",\"--background-base\":\"#F5F6FA\",\"--background-content\":\"var(--white)\",\"--background-header\":\"var(--accent-default)\",\"--background-footer\":\"#63666AFF\",\"--outline-blur-size\":\"0\",\"--outline-width\":\"2px\",\"--outline-color\":\"var(--primary-color)\",\"--background-color-light\":\"rgb(250, 250, 250)\",\"--background-color-base\":\"rgb(245, 245, 245)\",\"--padding-base\":\"30px\",\"--component-background\":\"var(--white)\",\"--primary-color\":\"var(--accent-default)\",\"--info-color\":\"var(--accent-default)\",\"--success-color\":\"var(--accent-default)\",\"--processing-color\":\"var(--accent-default)\",\"--error-color\":\"var(--negative-default)\",\"--highlight-color\":\"var(--negative-default)\",\"--warning-color\":\"var(--primary-lighter)\",\"--normal-color\":\"#d9d9d9\",\"--primary-1\":\"#f0f5ff\",\"--primary-5\":\"#6b89ff\",\"--primary-7\":\"#2e44d9\",\"--item-active-bg\":\"var(--primary-1)\",\"--item-hover-bg\":\"var(--primary-1)\",\"--text-color\":\"rgba(var(--black-rgb), 0.65)\",\"--text-color-secondary\":\"rgba(var(--black-rgb), 45%)\",\"--text-color-inverse\":\"var(--white)\",\"--text-color-dark\":\"rgba(var(--white-rgb), 0.85)\",\"--heading-color\":\"rgba(var(--black-rgb), 0.85)\",\"--icon-color-hover\":\"rgba(var(--black-rgb), 75%)\",\"--font-variant-base\":\"tabular-nums\",\"--font-feature-settings-base\":\"'tnum'\",\"--font-size-base\":\"14px\",\"--font-size-lg\":\"calc(var(--font-size-base) + 2px)\",\"--font-size-sm\":\"12px\",\"--line-height-base\":\"1.5\",\"--disabled-color\":\"rgba(0, 0, 0, 0.25)\",\"--disabled-bg\":\"var(--background-color-base)\",\"--disabled-color-dark\":\"rgba(var(--white-rgb), 0.35)\",\"--border-color-base\":\"var(--border-color)\",\"--border-color-split\":\"rgb(232, 232, 232)\",\"--border-color-inverse\":\"var(--white)\",\"--border-width-base\":\"1px\",\"--border-style-base\":\"solid\",\"--border-radius-base\":\"2px\",\"--border-radius-sm\":\"2px\",\"--accent-font-family\":\"'Century-gothic', Roboto, Helvetica, Arial, sans-serif\",\"--accent-font-weight\":\"normal\",\"--collapse-color\":\"var(--primary-default)\",\"--collapse-bg-color\":\"var(--background-base)\",\"--collapse-border-color\":\"var(--border-color)\",\"--collapse-header-color\":\"var(--primary-default)\",\"--collapse-arrow-color\":\"var(--accent-default)\",\"--collapse-item-border-color\":\"var(--secondary-lighter)\",\"--collapse-extra-counter-color\":\"var(--white)\",\"--collapse-extra-counter-bg-color\":\"var(--accent-default)\",\"--collapse-content-color\":\"var(--primary-default)\",\"--collapse-content-disabled-color\":\"var(--secondary-lighter)\",\"--collapse-content-bg-color\":\"var(--background-content)\",\"--collapse-borderless-bg-color\":\"var(--background-content)\",\"--breadcrumb-color-hover\":\"var(--primary-default)\",\"--breadcrumb-color-base\":\"var(--secondary-default)\",\"--breadcrumb-color\":\"var(--secondary-default)\",\"--breadcrumb-color-active\":\"var(--primary-default)\",\"--checkbox-color\":\"var(--primary-color)\",\"--checkbox-check-color\":\"var(--white)\",\"--checkbox-border-width\":\"var(--border-width-base)\",\"--input-color\":\"var(--primary-default)\",\"--input-error-color\":\"var(--negative-default)\",\"--input-error-hover-color\":\"var(--negative-dark)\",\"--input-bg-color\":\"var(--background-content)\",\"--input-wrap-bg-color\":\"var(--background-content)\",\"--input-border-color\":\"var(--border-color-base)\",\"--input-group-border-color\":\"var(--primary-lighter)\",\"--input-focus-border-color\":\"var(--primary-color)\",\"--input-active-bg-color\":\"var(--background-content)\",\"--input-disabled-color\":\"var(--primary-default)\",\"--input-disabled-bg-color\":\"var(--disabled-bg)\",\"--input-disabled-border-color\":\"#e6d8d8\",\"--input-hover-color\":\"var(--primary-5)\",\"--input-hover-border-color\":\"var(--primary-color)\",\"--input-placeholder-color\":\"var(--primary-light)\",\"--input-number-handler-active-bg\":\"#f4f4f4\",\"--input-shadow-color\":\"rgba(24, 144, 255, 0.2)\",\"--input-addon-bg\":\"var(--input-bg-color)\",\"--input-max-button-color\":\"var(--input-color)\",\"--input-max-button-hover-color\":\"var(--primary-darker)\",\"--shadow-color\":\"none\",\"--shadow-color-inverse\":\"var(--shadow-color)\",\"--box-shadow-base\":\"var(--shadow-color)\",\"--shadow-1-up\":\"var(--shadow-color)\",\"--shadow-1-down\":\"var(--shadow-color)\",\"--shadow-1-left\":\"var(--shadow-color)\",\"--shadow-1-right\":\"var(--shadow-color)\",\"--shadow-2\":\"var(--shadow-color)\",\"--modal-body-padding\":\"24px\",\"--modal-header-bg\":\"var(--component-background)\",\"--modal-footer-bg\":\"tranparent\",\"--modal-mask-bg\":\"rgba(var(--primary-default-rgb), 0.5)\",\"--table-header-color\":\"var(--primary-light)\",\"--table-header-hover-color\":\"var(--secondary-dark)\",\"--table-linked\":\"var(--primary-default)\",\"--table-linked-hover\":\"var(--primary-dark)\",\"--animation-duration-slow\":\"0.3s\",\"--animation-duration-base\":\"0.2s\",\"--animation-duration-fast\":\"0.1s\",\"--screen-xs-max\":\"calc((var(--screen-sm-min) - 1px))\",\"--screen-sm-max\":\"calc((var(--screen-md-min) - 1px))\",\"--screen-md-max\":\"calc((var(--screen-lg-min) - 1px))\",\"--screen-lg-max\":\"calc((var(--screen-xl-min) - 1px))\",\"--screen-xl-max\":\"calc((var(--screen-xxl-min) - 1px))\",\"--btn-default-color\":\"var(--text-color)\",\"--btn-default-bg\":\"var(--white)\",\"--btn-default-border\":\"var(--border-color-base)\",\"--btn-primary-hover-bg\":\"var(--accent-dark)\",\"--btn-secondary-hover-bg\":\"var(--white)\",\"--btn-secondary-disabled-color\":\"var(--primary-default)\",\"--radio-size\":\"16px\",\"--radio-dot-color\":\"var(--primary-default)\",\"--radio-dot-color-rgb\":\"rgb(40, 39, 38)\",\"--radio-duration\":\"0.3s\",\"--radio-focused-outline\":\"3px solid rgba(var(--radio-dot-color-rgb), 0.06)\",\"--radio-button-bg\":\"var(--btn-default-bg)\",\"--radio-button-checked-bg\":\"var(--btn-default-bg)\",\"--radio-button-color\":\"var(--btn-default-color)\",\"--radio-button-hover-color\":\"var(--primary-5)\",\"--radio-button-active-color\":\"var(--primary-7)\",\"--radion-bt-wr-dis-checked\":\"#e6e6e6\",\"--radio-button-box-shadow\":\"0 0 0 3px rgba(var(--radio-dot-color-rgb), 0.08)\",\"--ease-base-out\":\"cubic-bezier(0.7, 0.3, 0.1, 1)\",\"--ease-base-in\":\"cubic-bezier(0.9, 0, 0.3, 0.7)\",\"--ease-out\":\"cubic-bezier(0.215, 0.61, 0.355, 1)\",\"--ease-in\":\"cubic-bezier(0.55, 0.055, 0.675, 0.19)\",\"--ease-in-out\":\"cubic-bezier(0.645, 0.045, 0.355, 1)\",\"--ease-out-back\":\"cubic-bezier(0.12, 0.4, 0.29, 1.46)\",\"--ease-in-back\":\"cubic-bezier(0.71, -0.46, 0.88, 0.6)\",\"--ease-in-out-back\":\"cubic-bezier(0.71, -0.46, 0.29, 1.46)\",\"--ease-out-circ\":\"cubic-bezier(0.08, 0.82, 0.17, 1)\",\"--ease-in-circ\":\"cubic-bezier(0.6, 0.04, 0.98, 0.34)\",\"--ease-in-out-circ\":\"cubic-bezier(0.78, 0.14, 0.15, 0.86)\",\"--ease-out-quint\":\"cubic-bezier(0.23, 1, 0.32, 1)\",\"--ease-in-quint\":\"cubic-bezier(0.755, 0.05, 0.855, 0.06)\",\"--ease-in-out-quint\":\"cubic-bezier(0.86, 0, 0.07, 1)\",\"--padding-lg\":\"24px\",\"--padding-md\":\"16px\",\"--padding-sm\":\"12px\",\"--padding-xs\":\"8px\",\"--control-padding-horizontal\":\"var(--padding-sm)\",\"--control-padding-horizontal-sm\":\"var(--padding-xs)\",\"--content-box-border-radius\":\"5px\",\"--content-box-shadow\":\"0 3px 10px 0 rgba(66, 97, 255, 0.1)\",\"--footer-logo-width\":\"50px\",\"--light-blue\":\"#66aae2\",\"--lighter-blue\":\"rgb(235, 242, 247)\",\"--dark-grey\":\"#75726c\",\"--darker-gray\":\"#565450\",\"--light-grey\":\"#ececec\",\"--terms-bg-color\":\"#000000ef\",\"--body-bg\":\"var(--lighter-blue)\",\"--navigation-box-shadow\":\"0 5px 5px rgba(0, 0, 0, 0.25)\",\"--scroll-top-bg-color\":\"#0c181c\",\"--scroll-top-color\":\"#fff\",\"--chart0-color1\":\"rgb(255, 153, 0)\",\"--chart0-color2\":\"rgb(134, 166, 68)\",\"--chart0-color3\":\"rgb(102, 170, 226)\",\"--chart0-color4\":\"rgb(0, 114, 206)\",\"--chart0-color5\":\"rgb(99, 102, 106)\",\"--chart0-color6\":\"rgb(187, 175, 151)\",\"--chart0-color7\":\"rgb(255, 194, 102)\",\"--chart0-color8\":\"rgb(184, 207, 138)\",\"--chart1-color1\":\"var(--chart0-color1)\",\"--chart1-color2\":\"var(--chart0-color2)\",\"--chart1-color3\":\"rgb(163, 204, 238)\",\"--chart1-color4\":\"rgb(194, 221, 243)\",\"--chart1-color5\":\"rgb(224, 238, 249)\",\"--chart1-color6\":\"rgb(64, 149, 218)\",\"--chart1-color7\":\"rgb(125, 185, 231)\",\"--chart1-color8\":\"rgb(191, 220, 243)\",\"--chart1-color9\":\"rgb(138, 140, 143)\",\"--chart1-color10\":\"rgb(177, 178, 181)\",\"--chart1-color11\":\"rgb(216, 217, 218)\",\"--chart1-color12\":\"var(--chart0-color6)\",\"--chart1-color13\":\"var(--chart0-color7)\",\"--chart1-color14\":\"rgb(255, 235, 204)\",\"--chart1-color15\":\"rgb(231, 239, 216)\",\"--chart1-color16\":\"rgb(228, 223, 213)\",\"--chart1-color17\":\"rgb(217, 217, 217)\",\"--chart2-color1\":\"var(--chart0-color7)\",\"--chart2-color2\":\"var(--chart0-color8)\",\"--chart2-color3\":\"var(--chart0-color3)\",\"--chart2-color4\":\"var(--chart1-color3)\",\"--chart2-color5\":\"var(--chart0-color4)\",\"--chart2-color6\":\"var(--chart1-color4)\",\"--chart2-color7\":\"var(--chart1-color5)\",\"--chart2-color8\":\"var(--chart0-color5)\",\"--chart2-color9\":\"var(--chart0-color1)\",\"--chart2-color10\":\"var(--chart1-color6)\",\"--chart2-color11\":\"var(--chart1-color7)\",\"--chart2-color12\":\"var(--chart0-color2)\",\"--chart2-color13\":\"var(--chart1-color8)\",\"--chart2-color14\":\"var(--chart1-color9)\",\"--chart2-color15\":\"var(--chart1-color10)\",\"--chart2-color16\":\"var(--chart1-color11)\",\"--chart2-color17\":\"var(--chart0-color6)\",\"--chart2-color18\":\"var(--chart0-color7)\",\"--chart2-color19\":\"var(--chart1-color14)\",\"--chart2-color20\":\"var(--chart1-color15)\",\"--chart2-color21\":\"var(--chart1-color16)\",\"--chart2-color22\":\"var(--chart1-color17)\",\"--chart2-color23\":\"rgb(255, 255, 0)\",\"--chart2-color24\":\"var(--chart0-color6)\",\"--chart2-color25\":\"rgb(0, 176, 80)\",\"--chart2-color26\":\"rgb(112, 48, 160)\"};","import PropTypes from 'prop-types';\r\nimport React, { Component } from 'react';\r\nimport { Modal } from 'ui-library';\r\nimport { connect } from 'react-redux';\r\nimport { withTranslation } from 'react-i18next';\r\nimport { logout as logoutAction } from '../redux/auth/authActions';\r\n\r\nconst events = ['mousemove', 'click', 'scroll', 'keypress'];\r\n\r\nconst SESSION_TIMEOUT_WARNING_DIALOG = parseInt(\r\n global.SetupConfig.SESSION_TIMEOUT_WARNING_DIALOG,\r\n 10\r\n);\r\nconst SESSION_TIMEOUT_WARNING_DIALOG_COUNTDOWN = parseInt(\r\n global.SetupConfig.SESSION_TIMEOUT_WARNING_DIALOG_COUNTDOWN,\r\n 10\r\n);\r\n\r\nexport function withAutoLogout(WrappedComponent) {\r\n class AutoLogout extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.timer = 0;\r\n this.modal = null;\r\n this.showModal = this.showModal.bind(this);\r\n this.resetTimeout = this.resetTimeout.bind(this);\r\n this.continueSession = this.continueSession.bind(this);\r\n this.clearSessionTimeout = this.clearSessionTimeout.bind(this);\r\n this.state = {\r\n modalTime: 1000 * SESSION_TIMEOUT_WARNING_DIALOG,\r\n logoutTime:\r\n 1000 *\r\n (SESSION_TIMEOUT_WARNING_DIALOG + SESSION_TIMEOUT_WARNING_DIALOG_COUNTDOWN),\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n events.forEach((event) => {\r\n global.window.addEventListener(event, this.resetTimeout);\r\n });\r\n\r\n this.setSessionTimeout();\r\n }\r\n\r\n componentWillUnmount() {\r\n events.forEach((event) => {\r\n global.window.removeEventListener(event, this.resetTimeout);\r\n });\r\n this.clearSessionTimeout();\r\n if (this.modal) this.modal.destroy();\r\n }\r\n\r\n setSessionTimeout() {\r\n const { logout } = this.props;\r\n const { modalTime, logoutTime } = this.state;\r\n\r\n if (this.modalTimeout) {\r\n this.clearSessionTimeout();\r\n }\r\n this.modalTimeout = setTimeout(this.showModal, modalTime);\r\n this.logoutTimeout = setTimeout(logout, logoutTime);\r\n }\r\n\r\n clearSessionTimeout() {\r\n if (this.timer) clearInterval(this.timer);\r\n if (this.modalTimeout) clearTimeout(this.modalTimeout);\r\n if (this.logoutTimeout) clearTimeout(this.logoutTimeout);\r\n }\r\n\r\n resetTimeout() {\r\n this.clearSessionTimeout();\r\n this.setSessionTimeout();\r\n }\r\n\r\n renderModalContent = (t, seconds) => (\r\n <>\r\n {t('session.content')}\r\n
\r\n
\r\n {`${t('session.remainingTime')}: `}\r\n {`${seconds} ${t('session.seconds')}`}\r\n \r\n );\r\n\r\n continueSession() {\r\n events.forEach((event) => {\r\n global.window.addEventListener(event, this.resetTimeout);\r\n });\r\n this.resetTimeout();\r\n }\r\n\r\n showModal() {\r\n const { t } = this.props;\r\n let remainSeconds = SESSION_TIMEOUT_WARNING_DIALOG_COUNTDOWN;\r\n\r\n events.forEach((event) => {\r\n global.window.removeEventListener(event, this.resetTimeout);\r\n });\r\n\r\n this.modal = Modal.success({\r\n title: t('session.title'),\r\n onOk: this.continueSession,\r\n okText: t('session.button'),\r\n content: this.renderModalContent(t, remainSeconds),\r\n keyboard: false,\r\n className: 'auto-logout',\r\n });\r\n\r\n this.timer = setInterval(() => {\r\n remainSeconds -= 1;\r\n\r\n this.modal.update({\r\n content: this.renderModalContent(t, remainSeconds),\r\n });\r\n }, 1000);\r\n\r\n setTimeout(() => {\r\n clearInterval(this.timer);\r\n this.modal.destroy();\r\n }, remainSeconds * 1000);\r\n }\r\n\r\n render() {\r\n return ;\r\n }\r\n }\r\n\r\n AutoLogout.propTypes = {\r\n t: PropTypes.func.isRequired,\r\n logout: PropTypes.func.isRequired,\r\n };\r\n\r\n const mapDispatchToProps = (dispatch) => ({\r\n logout: () => dispatch(logoutAction(true)),\r\n });\r\n\r\n return connect(() => {}, mapDispatchToProps)(withTranslation()(AutoLogout));\r\n}\r\n","const getAvatarPath = (imgName) => {\r\n const transformedName = imgName.toLowerCase().replace(/[^a-z0-9]/g, '_');\r\n const memberPhoto = global.MEMBER_PHOTO?.[transformedName];\r\n\r\n return memberPhoto && `/static/img/MemberPictures/${memberPhoto}`;\r\n};\r\n\r\nexport default getAvatarPath;\r\n","import { useMemo, useCallback, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { changeLocale } from 'ui-library';\r\nimport { importLocale } from 'utils/datetime';\r\nimport { GA_ACTIONS, GA_CATEGORIES, sendGAEvent } from 'utils/analytics';\r\nimport { languagesAdapt } from '../adaptors/languagesAdapt';\r\n\r\nexport const useLanguageSwitcher = () => {\r\n const { i18n, t } = useTranslation();\r\n // NS-692 fix for browser firefox language from navigator.language\r\n const languageWithoutLocale = useMemo(() => i18n.language.split('-')[0], [i18n.language]);\r\n const languages = useMemo(() => languagesAdapt(global.availableLanguages, t), [\r\n global.availableLanguages,\r\n i18n.language,\r\n ]);\r\n\r\n const changeLanguage = useCallback(\r\n (lang) => {\r\n sendGAEvent(GA_ACTIONS.changeLanguage, GA_CATEGORIES.language, lang);\r\n i18n.changeLanguage(lang);\r\n importLocale(lang);\r\n changeLocale(lang);\r\n },\r\n [i18n.language]\r\n );\r\n\r\n useEffect(() => {\r\n // todo: move next operation inside of LanguageDetector on i18n initialization\r\n i18n.changeLanguage(languageWithoutLocale);\r\n importLocale(i18n.language);\r\n changeLocale(i18n.language);\r\n sendGAEvent(GA_ACTIONS.startLanguage, GA_CATEGORIES.language, i18n.language);\r\n }, []);\r\n\r\n useEffect(() => {\r\n try {\r\n if (\r\n !global.availableLanguages.map(({ value }) => value).includes(languageWithoutLocale)\r\n ) {\r\n if (i18n.options.fallbackLng && i18n.options.fallbackLng.length) {\r\n changeLanguage(i18n.options.fallbackLng[0]);\r\n }\r\n }\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.log(e);\r\n }\r\n }, [i18n.language]);\r\n\r\n return { languages, changeLanguage, language: languageWithoutLocale, t };\r\n};\r\n","export const languagesAdapt = (langSources = [], t) => {\r\n if (!Array.isArray(langSources)) {\r\n console.warn('langSources should be array');\r\n\r\n return [];\r\n }\r\n if (typeof t !== 'function') {\r\n console.warn('t should be function');\r\n\r\n return [];\r\n }\r\n\r\n return langSources.map((langSource) => {\r\n return {\r\n ...langSource,\r\n label: t(langSource.label),\r\n };\r\n });\r\n};\r\n","module.exports = __webpack_public_path__ + \"static/media/linkedin.30cfb32d.svg\";","import { setup } from 'additiv-services';\r\n// todo import/no-cycle\r\n// eslint-disable-next-line import/no-cycle\r\nimport {\r\n AUTH_COMPLETE,\r\n GET_USER_PROFILE_SUCCESS,\r\n // LOGIN_SUCCESS,\r\n LOGOUT_SUCCESS,\r\n PRE_AUTH_SUCCESS,\r\n PRE_AUTH_WITH_2FA_COMPLETE,\r\n RESET_LOGIN,\r\n LOGIN_WITH_URL_START,\r\n LOGIN_WITH_URL_SUCCESS,\r\n RESET2FA,\r\n SESSION_CHECKED,\r\n TERMS_ACCEPTED,\r\n} from './authActions';\r\n\r\nconst defaultState = {\r\n user: undefined,\r\n isAuthenticated: false,\r\n isFistStepDone: false,\r\n isJWTBaseLogin: false,\r\n};\r\n\r\nconst initState = defaultState;\r\n\r\nexport default function reducer(state = initState, action = {}) {\r\n let nextState = {};\r\n let jwt;\r\n\r\n switch (action.type) {\r\n case RESET2FA:\r\n return {\r\n ...state,\r\n isFistStepDone: false,\r\n };\r\n case RESET_LOGIN:\r\n return {\r\n ...state,\r\n isFistStepDone: false,\r\n user: {\r\n ...state.user,\r\n },\r\n };\r\n case SESSION_CHECKED:\r\n return {\r\n ...state,\r\n isAuthenticated: action.payload.isSessionValid,\r\n };\r\n case PRE_AUTH_SUCCESS:\r\n nextState = {\r\n ...state,\r\n user: {\r\n ...state.user,\r\n isDeviceEnrolled: true,\r\n isActive: action.payload.CampaignContact.IsActive,\r\n contactId: action.payload.CampaignContact.ContactId,\r\n passcodeLength: action.payload.Length,\r\n isTwoFactorEnabled: action.payload.CampaignContact.IsTwoFactorEnabled,\r\n statusFor2FA: action.payload.Status,\r\n username: action.payload.username,\r\n factor: action.payload.Factor,\r\n provider: action.payload.Provider,\r\n },\r\n };\r\n\r\n return nextState;\r\n case AUTH_COMPLETE:\r\n if (!action.payload.roleId) {\r\n jwt = btoa(`${action.payload.sessionId}:${action.payload.jwtAccessToken}`);\r\n } else {\r\n jwt = action.payload.jwtAccessToken;\r\n }\r\n\r\n nextState = {\r\n ...state,\r\n user: {\r\n ...state.user,\r\n sessionId: action.payload.sessionId,\r\n jwtAccessToken: action.payload.jwtAccessToken,\r\n contactId: action.payload.contactId,\r\n roleId: action.payload.roleId ? action.payload.roleId : undefined,\r\n jwt,\r\n },\r\n isFistStepDone: undefined,\r\n isAuthenticated: true,\r\n };\r\n\r\n setup({ jwt });\r\n\r\n return nextState;\r\n case PRE_AUTH_WITH_2FA_COMPLETE:\r\n nextState = {\r\n ...state,\r\n isFistStepDone: true,\r\n };\r\n\r\n return nextState;\r\n // case LOGIN_SUCCESS:\r\n // nextState = {\r\n // ...state,\r\n // user: {\r\n // ...state.user,\r\n // contactId: action.payload.CampaignContact.ContactId,\r\n // contactTypeId: action.payload.CampaignContact.Contact.ContactTypeId,\r\n // contactFirstName: action.payload.CampaignContact.Contact.FirstName,\r\n // contactLasName: action.payload.CampaignContact.Contact.LastName,\r\n // username: action.payload.username,\r\n // password: action.payload.password,\r\n // },\r\n // isFistStepDone: true,\r\n // };\r\n //\r\n // return nextState;\r\n case LOGIN_WITH_URL_START:\r\n nextState = {\r\n ...state,\r\n isFistStepDone: false,\r\n user: {\r\n ...state.user,\r\n contactId: action.payload.contactId,\r\n jwt: action.payload.jwt,\r\n jwtAccessToken: action.payload.jwt,\r\n roleId: action.payload.roleId,\r\n },\r\n isJWTBaseLogin: true,\r\n };\r\n\r\n setup({ jwt: action.payload.jwt });\r\n\r\n return nextState;\r\n case LOGIN_WITH_URL_SUCCESS:\r\n nextState = {\r\n ...state,\r\n isAuthenticated: true,\r\n };\r\n\r\n return nextState;\r\n case GET_USER_PROFILE_SUCCESS:\r\n nextState = {\r\n ...state,\r\n user: {\r\n ...state.user,\r\n contactTypeId: action.payload.ContactType.Id,\r\n relationshipManagerId: action.payload.members[0].Id,\r\n contactFirstName: action.payload.FirstName,\r\n contactLasName: action.payload.LastName,\r\n isTwoFactorEnabled: action.payload.IsTwoFactorEnabled,\r\n },\r\n };\r\n\r\n return nextState;\r\n case TERMS_ACCEPTED:\r\n return {\r\n ...state,\r\n user: {\r\n ...state.user,\r\n isTermsAccepted: true,\r\n },\r\n };\r\n case LOGOUT_SUCCESS:\r\n return {\r\n ...defaultState,\r\n user: {\r\n isTermsAccepted: state.user.isTermsAccepted,\r\n jwt: undefined,\r\n },\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n","import { get } from 'lodash/fp';\r\nimport {\r\n CLEAN_ENROLL,\r\n DEVICE_ENROLL_FAIL,\r\n DEVICE_ENROLL_SUCCESS,\r\n ENROLL_FAIL,\r\n ENROLL_START,\r\n ENROLL_SUCCESS,\r\n DEVICE_ENROLL_START,\r\n UNENROLL_START,\r\n UNENROLL_SUCCESS,\r\n UNENROLL_FAIL,\r\n} from './enrollActions';\r\nimport {\r\n GET_USER_PROFILE_FAIL,\r\n GET_USER_PROFILE_START,\r\n GET_USER_PROFILE_SUCCESS,\r\n} from '../auth/authActions';\r\n\r\nconst defaultState = {\r\n isLoading: 0,\r\n isEnrollDeviceSuccess: false,\r\n isEnrollSuccess: false,\r\n isUnenrollSuccess: false,\r\n isEnrollUnsuccess: false,\r\n isUnenrollUnsuccess: false,\r\n};\r\n\r\nconst initState = defaultState;\r\n\r\nexport default function reducer(state = initState, action = {}) {\r\n switch (action.type) {\r\n case CLEAN_ENROLL:\r\n return {\r\n ...initState,\r\n };\r\n case DEVICE_ENROLL_START:\r\n return {\r\n ...state,\r\n };\r\n case DEVICE_ENROLL_SUCCESS:\r\n return {\r\n ...state,\r\n qrCode: undefined,\r\n isEnrollDeviceSuccess: true,\r\n };\r\n case DEVICE_ENROLL_FAIL:\r\n return {\r\n ...state,\r\n error: action.payload,\r\n isEnrollDeviceSuccess: false,\r\n isEnrollUnsuccess: true,\r\n };\r\n case ENROLL_START:\r\n return {\r\n ...state,\r\n isLoading: state.isLoading + 1,\r\n isEnrollDeviceSuccess: false,\r\n isEnrollSuccess: false,\r\n isUnenrollSuccess: false,\r\n isEnrollUnsuccess: false,\r\n isUnenrollUnsuccess: false,\r\n error: undefined,\r\n };\r\n case ENROLL_SUCCESS:\r\n return {\r\n ...state,\r\n qrCode: get('AsynchronousParameters.ActivationQrCodeUrl', action.payload),\r\n isLoading: state.isLoading - 1,\r\n isEnrollSuccess: true,\r\n };\r\n case ENROLL_FAIL:\r\n return {\r\n ...state,\r\n error: action.payload,\r\n isEnrollSuccess: false,\r\n isLoading: state.isLoading - 1,\r\n isEnrollUnsuccess: true,\r\n };\r\n case UNENROLL_START:\r\n return {\r\n ...state,\r\n isLoading: state.isLoading + 1,\r\n isEnrollDeviceSuccess: false,\r\n isEnrollSuccess: false,\r\n isUnenrollSuccess: false,\r\n isEnrollUnsuccess: false,\r\n isUnenrollUnsuccess: false,\r\n error: undefined,\r\n };\r\n case UNENROLL_SUCCESS:\r\n return {\r\n ...state,\r\n isLoading: state.isLoading - 1,\r\n isUnenrollSuccess: true,\r\n };\r\n case UNENROLL_FAIL:\r\n return {\r\n ...state,\r\n error: action.payload,\r\n isUnenrollSuccess: false,\r\n isUnenrollUnsuccess: false,\r\n isLoading: state.isLoading - 1,\r\n };\r\n case GET_USER_PROFILE_START:\r\n return {\r\n ...state,\r\n isLoading: state.isLoading + 1,\r\n };\r\n case GET_USER_PROFILE_SUCCESS:\r\n return {\r\n ...state,\r\n isLoading: state.isLoading - 1,\r\n };\r\n case GET_USER_PROFILE_FAIL:\r\n return {\r\n ...state,\r\n isLoading: state.isLoading - 1,\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n","import DetectorSystemTheme from 'services/core/DetectorSystemTheme';\r\nimport { RESET_THEME, SET_THEME } from './themeActions';\r\n\r\nconst defaultState = {\r\n theme: DetectorSystemTheme.getSystemTheme(),\r\n};\r\n\r\nconst initState = defaultState;\r\n\r\nexport default function reducer(state = initState, action = {}) {\r\n switch (action.type) {\r\n case RESET_THEME:\r\n return {\r\n ...initState,\r\n };\r\n case SET_THEME:\r\n return {\r\n theme: action.payload,\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n","import {\r\n AUTH_COMPLETE,\r\n LOGOUT_SUCCESS,\r\n LOGIN_WITH_URL_SUCCESS,\r\n SESSION_CHECKED,\r\n} from '../auth/authActions';\r\n\r\nconst defaultState = {\r\n isCurrentSessionChecked: false,\r\n isSessionValid: false,\r\n};\r\n\r\nconst initState = defaultState;\r\n\r\nexport default function reducer(state = initState, action = {}) {\r\n switch (action.type) {\r\n case SESSION_CHECKED:\r\n return {\r\n ...state,\r\n isCurrentSessionChecked: true,\r\n isSessionValid: action.payload.isSessionValid,\r\n };\r\n case AUTH_COMPLETE:\r\n return {\r\n ...state,\r\n isCurrentSessionChecked: true,\r\n isSessionValid: true,\r\n };\r\n case LOGIN_WITH_URL_SUCCESS:\r\n return {\r\n ...state,\r\n isCurrentSessionChecked: true,\r\n isSessionValid: true,\r\n };\r\n case LOGOUT_SUCCESS:\r\n return {\r\n ...state,\r\n isCurrentSessionChecked: false,\r\n isSessionValid: false,\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n","/* eslint-disable import/no-cycle */\r\nimport { combineReducers } from 'redux';\r\nimport { reducer as formReducer } from 'redux-form';\r\nimport { connectRouter } from 'connected-react-router';\r\nimport loginReducer from './redux/auth/authReducers';\r\nimport enrollReducer from './redux/enroll/enrollReducers';\r\nimport themeReducer from './redux/theme/themeReducers';\r\nimport sessionReducer from './redux/session/sessionReducers';\r\nimport history from './services/core/history';\r\n\r\nexport default combineReducers({\r\n router: connectRouter(history),\r\n auth: loginReducer,\r\n enroll: enrollReducer,\r\n form: formReducer,\r\n theme: themeReducer,\r\n session: sessionReducer,\r\n});\r\n"],"sourceRoot":""}