diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e96e0d34..d80613a85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added the dividend timeline grouped by month + ### Changed - Improved the value redaction interceptor (including `comment`) diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 7ce976185..a0f676ff6 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -12,6 +12,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration.ser import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service'; import { PortfolioDetails, + PortfolioDividends, PortfolioInvestments, PortfolioPerformanceResponse, PortfolioPublicDetails, @@ -185,6 +186,55 @@ export class PortfolioController { }; } + @Get('dividends') + @UseGuards(AuthGuard('jwt')) + public async getDividends( + @Headers('impersonation-id') impersonationId: string, + @Query('range') dateRange: DateRange = 'max', + @Query('groupBy') groupBy?: GroupBy + ): Promise { + let dividends: InvestmentItem[]; + + if (groupBy === 'month') { + dividends = await this.portfolioService.getDividends({ + dateRange, + groupBy, + impersonationId + }); + } else { + dividends = await this.portfolioService.getDividends({ + dateRange, + impersonationId + }); + } + + if ( + impersonationId || + this.userService.isRestrictedView(this.request.user) + ) { + const maxDividend = dividends.reduce( + (investment, item) => Math.max(investment, item.investment), + 1 + ); + + dividends = dividends.map((item) => ({ + date: item.date, + investment: item.investment / maxDividend + })); + } + + if ( + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + this.request.user.subscription.type === 'Basic' + ) { + dividends = dividends.map((item) => { + return nullifyValuesInObject(item, ['investment']); + }); + } + + return { dividends }; + } + @Get('investments') @UseGuards(AuthGuard('jwt')) public async getInvestments( @@ -197,8 +247,8 @@ export class PortfolioController { if (groupBy === 'month') { investments = await this.portfolioService.getInvestments({ dateRange, - impersonationId, - groupBy: 'month' + groupBy, + impersonationId }); } else { investments = await this.portfolioService.getInvestments({ diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 125002b36..0db7d5813 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -67,6 +67,8 @@ import { format, isAfter, isBefore, + isSameMonth, + isSameYear, max, parseISO, set, @@ -206,6 +208,44 @@ export class PortfolioService { }; } + public async getDividends({ + dateRange, + impersonationId, + groupBy + }: { + dateRange: DateRange; + impersonationId: string; + groupBy?: GroupBy; + }): Promise { + const userId = await this.getUserId(impersonationId, this.request.user.id); + + const activities = await this.orderService.getOrders({ + userId, + types: ['DIVIDEND'], + userCurrency: this.request.user.Settings.settings.baseCurrency + }); + + let dividends = activities.map((dividend) => { + return { + date: format(dividend.date, DATE_FORMAT), + investment: dividend.valueInBaseCurrency + }; + }); + + if (groupBy === 'month') { + dividends = this.getDividendsByMonth(dividends); + } + + const startDate = this.getStartDate( + dateRange, + parseDate(dividends[0]?.date) + ); + + return dividends.filter(({ date }) => { + return !isBefore(parseDate(date), startDate); + }); + } + public async getInvestments({ dateRange, impersonationId, @@ -1204,6 +1244,49 @@ export class PortfolioService { ); } + private getDividendsByMonth(aDividends: InvestmentItem[]): InvestmentItem[] { + if (aDividends.length === 0) { + return []; + } + + const dividends = []; + let currentDate: Date; + let investmentByMonth = new Big(0); + + for (const [index, dividend] of aDividends.entries()) { + if ( + isSameMonth(parseDate(dividend.date), currentDate) && + isSameYear(parseDate(dividend.date), currentDate) + ) { + // Same month: Add up divididends + + investmentByMonth = investmentByMonth.plus(dividend.investment); + } else { + // New month: Store previous month and reset + + if (currentDate) { + dividends.push({ + date: format(set(currentDate, { date: 1 }), DATE_FORMAT), + investment: investmentByMonth + }); + } + + currentDate = parseDate(dividend.date); + investmentByMonth = new Big(dividend.investment); + } + + if (index === aDividends.length - 1) { + // Store current month (latest order) + dividends.push({ + date: format(set(currentDate, { date: 1 }), DATE_FORMAT), + investment: investmentByMonth + }); + } + } + + return dividends; + } + private getFees({ date = new Date(0), orders, diff --git a/apps/client/src/app/components/accounts-table/accounts-table.component.html b/apps/client/src/app/components/accounts-table/accounts-table.component.html index 7c12c735e..377989431 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.component.html +++ b/apps/client/src/app/components/accounts-table/accounts-table.component.html @@ -18,14 +18,8 @@ - - Name + + Name this.isInFuture( @@ -194,6 +195,9 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { this.chart.options.plugins.tooltip = ( this.getTooltipPluginConfiguration() ); + this.chart.options.scales.x.min = this.daysInMarket + ? subDays(new Date(), this.daysInMarket).toISOString() + : undefined; this.chart.update(); } else { this.chart = new Chart(this.chartCanvas.nativeElement, { @@ -264,6 +268,10 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy { color: `rgba(${getTextColor(this.colorScheme)}, 0.8)`, display: false }, + min: this.daysInMarket + ? subDays(new Date(), this.daysInMarket).toISOString() + : undefined, + suggestedMax: new Date().toISOString(), type: 'time', time: { tooltipFormat: getDateFormatString(this.locale), diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index c7442e1f3..1cfc598d3 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -30,9 +30,12 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { public dateRangeOptions = ToggleComponent.DEFAULT_DATE_RANGE_OPTIONS; public daysInMarket: number; public deviceType: string; + public dividendsByMonth: InvestmentItem[]; + public dividendTimelineDataLabel = $localize`Dividend`; public firstOrderDate: Date; public hasImpersonationId: boolean; public investments: InvestmentItem[]; + public investmentTimelineDataLabel = $localize`Deposit`; public investmentsByMonth: InvestmentItem[]; public isLoadingBenchmarkComparator: boolean; public isLoadingInvestmentChart: boolean; @@ -42,6 +45,7 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { ]; public performanceDataItems: HistoricalDataItem[]; public performanceDataItemsInPercentage: HistoricalDataItem[]; + public portfolioEvolutionDataLabel = $localize`Deposit`; public top3: Position[]; public user: User; @@ -165,6 +169,18 @@ export class AnalysisPageComponent implements OnDestroy, OnInit { this.changeDetectorRef.markForCheck(); }); + this.dataService + .fetchDividends({ + groupBy: 'month', + range: this.user?.settings?.dateRange + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ dividends }) => { + this.dividendsByMonth = dividends; + + this.changeDetectorRef.markForCheck(); + }); + this.dataService .fetchInvestments({ groupBy: 'month', diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index 6fff81da3..053ba835a 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -121,6 +121,7 @@ -
+
+ +
+
+
+
+ Dividend Timeline + +
+ +
+
+ +
+
+
diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index fc98da0fa..1b831ac90 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -27,6 +27,7 @@ import { InfoItem, OAuthResponse, PortfolioDetails, + PortfolioDividends, PortfolioInvestments, PortfolioPerformanceResponse, PortfolioPublicDetails, @@ -35,7 +36,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; -import { AccountWithValue, DateRange } from '@ghostfolio/common/types'; +import { AccountWithValue, DateRange, GroupBy } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; import { DataSource, Order as OrderModel } from '@prisma/client'; import { format, parseISO } from 'date-fns'; @@ -100,6 +101,18 @@ export class DataService { }); } + public fetchDividends({ + groupBy = 'month', + range + }: { + groupBy?: GroupBy; + range: DateRange; + }) { + return this.http.get('/api/v1/portfolio/dividends', { + params: { groupBy, range } + }); + } + public fetchExchangeRateForDate({ date, symbol @@ -178,10 +191,10 @@ export class DataService { } public fetchInvestments({ - groupBy, + groupBy = 'month', range }: { - groupBy?: 'month'; + groupBy?: GroupBy; range: DateRange; }) { return this.http.get( diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index b2c014534..66f0d6e76 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -90,7 +90,7 @@ apps/client/src/app/components/accounts-table/accounts-table.component.html - 81 + 93 apps/client/src/app/components/admin-users/admin-users.html @@ -110,7 +110,7 @@ Name apps/client/src/app/components/accounts-table/accounts-table.component.html - 21 + 22 apps/client/src/app/components/positions-table/positions-table.component.html @@ -130,7 +130,7 @@ Gesamt apps/client/src/app/components/accounts-table/accounts-table.component.html - 36 + 38 libs/ui/src/lib/activities-table/activities-table.component.html @@ -142,11 +142,11 @@ Wert apps/client/src/app/components/accounts-table/accounts-table.component.html - 135 + 147 apps/client/src/app/components/accounts-table/accounts-table.component.html - 170 + 182 apps/client/src/app/components/positions-table/positions-table.component.html @@ -154,11 +154,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 225 + 230 libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 265 @@ -166,11 +166,11 @@ Bearbeiten apps/client/src/app/components/accounts-table/accounts-table.component.html - 212 + 224 libs/ui/src/lib/activities-table/activities-table.component.html - 369 + 399 @@ -178,19 +178,19 @@ Löschen apps/client/src/app/components/accounts-table/accounts-table.component.html - 220 + 232 apps/client/src/app/components/admin-market-data/admin-market-data.html - 152 + 168 apps/client/src/app/components/admin-users/admin-users.html - 87 + 88 libs/ui/src/lib/activities-table/activities-table.component.html - 385 + 415 @@ -198,7 +198,7 @@ Möchtest du dieses Konto wirklich löschen? apps/client/src/app/components/accounts-table/accounts-table.component.ts - 79 + 81 @@ -226,7 +226,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 88 + 93 @@ -362,7 +362,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 166 apps/client/src/app/pages/account/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -374,7 +374,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 201,205 + 218,222 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -390,7 +390,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 173 apps/client/src/app/pages/account/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -402,7 +402,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 208,213 + 225,230 @@ -434,7 +434,7 @@ Daten einholen apps/client/src/app/components/admin-market-data/admin-market-data.html - 139 + 155 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -502,7 +502,7 @@ Letzte Daten einholen apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 131 @@ -510,7 +510,7 @@ Alle Daten einholen apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 134 @@ -518,11 +518,11 @@ Profildaten einholen apps/client/src/app/components/admin-market-data/admin-market-data.html - 121 + 137 apps/client/src/app/components/admin-market-data/admin-market-data.html - 145 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1106,7 +1106,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 184,186 + 201,203 @@ -1138,7 +1138,7 @@ apps/client/src/app/components/positions-table/positions-table.component.html - 91 + 92 @@ -1146,7 +1146,7 @@ Alle anzeigen apps/client/src/app/components/positions-table/positions-table.component.html - 137 + 138 @@ -1338,7 +1338,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 296 @@ -1514,7 +1514,7 @@ Währung apps/client/src/app/components/accounts-table/accounts-table.component.html - 46 + 48 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1526,7 +1526,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 113 + 118 @@ -1534,7 +1534,7 @@ Cash-Bestand apps/client/src/app/components/accounts-table/accounts-table.component.html - 100 + 112 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1550,7 +1550,7 @@ apps/client/src/app/components/accounts-table/accounts-table.component.html - 58 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1870,7 +1870,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 134 + 139 @@ -1882,7 +1882,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 163 + 168 @@ -1892,17 +1892,25 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 131,132 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 148,149 + libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 197 Note Kommentar + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 153 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 140,143 + 157,160 @@ -1922,7 +1930,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 154,156 + 171,173 @@ -2082,7 +2090,7 @@ Geplant libs/ui/src/lib/activities-table/activities-table.component.html - 99 + 104 @@ -2090,7 +2098,7 @@ Aktivitäten importieren libs/ui/src/lib/activities-table/activities-table.component.html - 323 + 362 @@ -2098,7 +2106,7 @@ Aktivitäten exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 333 + 372 @@ -2106,7 +2114,7 @@ Geplante Aktivitäten als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 343 + 382 @@ -2114,7 +2122,7 @@ Kopieren libs/ui/src/lib/activities-table/activities-table.component.html - 373 + 403 @@ -2122,7 +2130,7 @@ Geplante Aktivität als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 381 + 411 @@ -2130,7 +2138,7 @@ Möchtest du diese Aktivität wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 147 + 149 @@ -2310,7 +2318,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 169,171 + 186,188 @@ -2414,7 +2422,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 @@ -2482,7 +2490,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 130 @@ -2502,7 +2510,7 @@ Filtern nach Konto, Währung, Symbol oder Typ... libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 321 @@ -2925,6 +2933,14 @@ 142 + + Dividend Timeline + Zeitstrahl der Dividenden + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 178 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index a7ffb72aa..937b6a728 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -83,7 +83,7 @@ apps/client/src/app/components/accounts-table/accounts-table.component.html - 81 + 93 apps/client/src/app/components/admin-users/admin-users.html @@ -102,7 +102,7 @@ Name apps/client/src/app/components/accounts-table/accounts-table.component.html - 21 + 22 apps/client/src/app/components/positions-table/positions-table.component.html @@ -121,7 +121,7 @@ Total apps/client/src/app/components/accounts-table/accounts-table.component.html - 36 + 38 libs/ui/src/lib/activities-table/activities-table.component.html @@ -132,11 +132,11 @@ Value apps/client/src/app/components/accounts-table/accounts-table.component.html - 135 + 147 apps/client/src/app/components/accounts-table/accounts-table.component.html - 170 + 182 apps/client/src/app/components/positions-table/positions-table.component.html @@ -144,48 +144,48 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 225 + 230 libs/ui/src/lib/activities-table/activities-table.component.html - 260 + 265 Edit apps/client/src/app/components/accounts-table/accounts-table.component.html - 212 + 224 libs/ui/src/lib/activities-table/activities-table.component.html - 369 + 399 Delete apps/client/src/app/components/accounts-table/accounts-table.component.html - 220 + 232 apps/client/src/app/components/admin-market-data/admin-market-data.html - 152 + 168 apps/client/src/app/components/admin-users/admin-users.html - 87 + 88 libs/ui/src/lib/activities-table/activities-table.component.html - 385 + 415 Do you really want to delete this account? apps/client/src/app/components/accounts-table/accounts-table.component.ts - 79 + 81 @@ -211,7 +211,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 88 + 93 @@ -333,7 +333,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 154 + 166 apps/client/src/app/pages/account/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -345,7 +345,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 201,205 + 218,222 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -360,7 +360,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 173 apps/client/src/app/pages/account/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -372,7 +372,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 208,213 + 225,230 @@ -400,7 +400,7 @@ Gather Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 139 + 155 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -460,25 +460,25 @@ Gather Recent Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 115 + 131 Gather All Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 118 + 134 Gather Profile Data apps/client/src/app/components/admin-market-data/admin-market-data.html - 121 + 137 apps/client/src/app/components/admin-market-data/admin-market-data.html - 145 + 161 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1002,7 +1002,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 184,186 + 201,203 @@ -1031,14 +1031,14 @@ apps/client/src/app/components/positions-table/positions-table.component.html - 91 + 92 Show all apps/client/src/app/components/positions-table/positions-table.component.html - 137 + 138 @@ -1208,7 +1208,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 286 + 296 @@ -1362,7 +1362,7 @@ Currency apps/client/src/app/components/accounts-table/accounts-table.component.html - 46 + 48 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1374,14 +1374,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 113 + 118 Cash Balance apps/client/src/app/components/accounts-table/accounts-table.component.html - 100 + 112 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1396,7 +1396,7 @@ apps/client/src/app/components/accounts-table/accounts-table.component.html - 58 + 65 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1679,7 +1679,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 134 + 139 @@ -1690,7 +1690,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 163 + 168 @@ -1699,16 +1699,24 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 131,132 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 148,149 + libs/ui/src/lib/activities-table/activities-table.component.html - 192 + 197 Note + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 153 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 140,143 + 157,160 @@ -1727,7 +1735,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 154,156 + 171,173 @@ -1868,49 +1876,49 @@ Draft libs/ui/src/lib/activities-table/activities-table.component.html - 99 + 104 Import Activities libs/ui/src/lib/activities-table/activities-table.component.html - 323 + 362 Export Activities libs/ui/src/lib/activities-table/activities-table.component.html - 333 + 372 Export Drafts as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 343 + 382 Clone libs/ui/src/lib/activities-table/activities-table.component.html - 373 + 403 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 381 + 411 Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 147 + 149 @@ -2049,7 +2057,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 169,171 + 186,188 @@ -2189,7 +2197,7 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 41 + 42 @@ -2235,14 +2243,14 @@ Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 128 + 130 Filter by account, currency, symbol or type... libs/ui/src/lib/activities-table/activities-table.component.ts - 319 + 321 @@ -2615,6 +2623,13 @@ 22 + + Dividend Timeline + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 178 + + diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index ef93845c5..416721a40 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -19,6 +19,7 @@ import { InfoItem } from './info-item.interface'; import { LineChartItem } from './line-chart-item.interface'; import { PortfolioChart } from './portfolio-chart.interface'; import { PortfolioDetails } from './portfolio-details.interface'; +import { PortfolioDividends } from './portfolio-dividends.interface'; import { PortfolioInvestments } from './portfolio-investments.interface'; import { PortfolioItem } from './portfolio-item.interface'; import { PortfolioOverview } from './portfolio-overview.interface'; @@ -62,6 +63,7 @@ export { OAuthResponse, PortfolioChart, PortfolioDetails, + PortfolioDividends, PortfolioInvestments, PortfolioItem, PortfolioOverview, diff --git a/libs/common/src/lib/interfaces/portfolio-dividends.interface.ts b/libs/common/src/lib/interfaces/portfolio-dividends.interface.ts new file mode 100644 index 000000000..585c46bb7 --- /dev/null +++ b/libs/common/src/lib/interfaces/portfolio-dividends.interface.ts @@ -0,0 +1,5 @@ +import { InvestmentItem } from './investment-item.interface'; + +export interface PortfolioDividends { + dividends: InvestmentItem[]; +}