diff --git a/CHANGELOG.md b/CHANGELOG.md index a0a2e2d69..929769ae1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated the browserslist database +## 2.75.1 - 2024-04-21 + +### Added + +- Added `accountId` and `date` as a unique constraint to the `AccountBalance` database schema + +### Changed + +- Improved the chart in the account detail dialog +- Improved the account balance management + +### Fixed + +- Fixed an issue with `totalValueInBaseCurrency` in the value redaction interceptor for the impersonation mode + +## 2.74.0 - 2024-04-20 + +### Added + +- Added the date range support to the portfolio holdings page +- Added support to create an account balance + +### Changed + +- Removed the date range support in the activities table on the portfolio activities page (experimental) +- Improved the language localization for German (`de`) +- Upgraded `angular` from version `17.3.3` to `17.3.5` +- Upgraded `Nx` from version `18.2.3` to `18.3.3` + +### Fixed + +- Fixed gaps in the portfolio performance charts by considering `BUY` and `SELL` activities + ## 2.73.0 - 2024-04-17 ### Added diff --git a/README.md b/README.md index 234e2c941..d63bb10d0 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,6 @@ [![Shield: Contributions Welcome](https://img.shields.io/badge/Contributions-Welcome-orange.svg)](#contributing) [![Shield: License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) -New: [Ghostfolio 2.0](https://ghostfol.io/en/blog/2023/09/ghostfolio-2) - **Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation. @@ -144,7 +142,7 @@ docker compose --env-file ./.env -f docker/docker-compose.build.yml up -d ### Home Server Systems (Community) -Ghostfolio is available for various home server systems, including [CasaOS](https://github.com/bigbeartechworld/big-bear-casaos), [Runtipi](https://www.runtipi.io/docs/apps-available), [TrueCharts](https://truecharts.org/charts/stable/ghostfolio), [Umbrel](https://apps.umbrel.com/app/ghostfolio), and [Unraid](https://unraid.net/community/apps?q=ghostfolio). +Ghostfolio is available for various home server systems, including [CasaOS](https://github.com/bigbeartechworld/big-bear-casaos), Home Assistant, [Runtipi](https://www.runtipi.io/docs/apps-available), [TrueCharts](https://truecharts.org/charts/stable/ghostfolio), [Umbrel](https://apps.umbrel.com/app/ghostfolio), and [Unraid](https://unraid.net/community/apps?q=ghostfolio). ## Development diff --git a/apps/api/src/app/account-balance/account-balance.controller.ts b/apps/api/src/app/account-balance/account-balance.controller.ts index 943d0aeb5..4a8412003 100644 --- a/apps/api/src/app/account-balance/account-balance.controller.ts +++ b/apps/api/src/app/account-balance/account-balance.controller.ts @@ -1,10 +1,14 @@ +import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { resetHours } from '@ghostfolio/common/helper'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { Controller, + Body, + Post, Delete, HttpException, Inject, @@ -14,17 +18,48 @@ import { import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { AccountBalance } from '@prisma/client'; +import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AccountBalanceService } from './account-balance.service'; +import { CreateAccountBalanceDto } from './create-account-balance.dto'; @Controller('account-balance') export class AccountBalanceController { public constructor( private readonly accountBalanceService: AccountBalanceService, + private readonly accountService: AccountService, @Inject(REQUEST) private readonly request: RequestWithUser ) {} + @HasPermission(permissions.createAccountBalance) + @Post() + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async createAccountBalance( + @Body() data: CreateAccountBalanceDto + ): Promise { + const account = await this.accountService.account({ + id_userId: { + id: data.accountId, + userId: this.request.user.id + } + }); + + if (!account) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + + return this.accountBalanceService.createOrUpdateAccountBalance({ + accountId: account.id, + balance: data.balance, + date: data.date, + userId: account.userId + }); + } + @HasPermission(permissions.deleteAccountBalance) @Delete(':id') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) diff --git a/apps/api/src/app/account-balance/account-balance.module.ts b/apps/api/src/app/account-balance/account-balance.module.ts index 1fba60fce..02323acc9 100644 --- a/apps/api/src/app/account-balance/account-balance.module.ts +++ b/apps/api/src/app/account-balance/account-balance.module.ts @@ -1,3 +1,4 @@ +import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; @@ -10,6 +11,6 @@ import { AccountBalanceService } from './account-balance.service'; controllers: [AccountBalanceController], exports: [AccountBalanceService], imports: [ExchangeRateDataModule, PrismaModule], - providers: [AccountBalanceService] + providers: [AccountBalanceService, AccountService] }) export class AccountBalanceModule {} diff --git a/apps/api/src/app/account-balance/account-balance.service.ts b/apps/api/src/app/account-balance/account-balance.service.ts index 8a9d7b83e..5a5ec5be0 100644 --- a/apps/api/src/app/account-balance/account-balance.service.ts +++ b/apps/api/src/app/account-balance/account-balance.service.ts @@ -1,10 +1,14 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { resetHours } from '@ghostfolio/common/helper'; import { AccountBalancesResponse, Filter } from '@ghostfolio/common/interfaces'; import { UserWithSettings } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { AccountBalance, Prisma } from '@prisma/client'; +import { parseISO } from 'date-fns'; + +import { CreateAccountBalanceDto } from './create-account-balance.dto'; @Injectable() export class AccountBalanceService { @@ -24,11 +28,36 @@ export class AccountBalanceService { }); } - public async createAccountBalance( - data: Prisma.AccountBalanceCreateInput - ): Promise { - return this.prismaService.accountBalance.create({ - data + public async createOrUpdateAccountBalance({ + accountId, + balance, + date, + userId + }: CreateAccountBalanceDto & { + userId: string; + }): Promise { + return this.prismaService.accountBalance.upsert({ + create: { + Account: { + connect: { + id_userId: { + userId, + id: accountId + } + } + }, + date: resetHours(parseISO(date)), + value: balance + }, + update: { + value: balance + }, + where: { + accountId_date: { + accountId, + date: resetHours(parseISO(date)) + } + } }); } diff --git a/apps/api/src/app/account-balance/create-account-balance.dto.ts b/apps/api/src/app/account-balance/create-account-balance.dto.ts new file mode 100644 index 000000000..28e939b82 --- /dev/null +++ b/apps/api/src/app/account-balance/create-account-balance.dto.ts @@ -0,0 +1,12 @@ +import { IsISO8601, IsNumber, IsUUID } from 'class-validator'; + +export class CreateAccountBalanceDto { + @IsUUID() + accountId: string; + + @IsNumber() + balance: number; + + @IsISO8601() + date: string; +} diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index 697041645..6be7e8ffb 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -1,11 +1,13 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Filter } from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; import { Account, Order, Platform, Prisma } from '@prisma/client'; import { Big } from 'big.js'; +import { format } from 'date-fns'; import { groupBy } from 'lodash'; import { CashDetails } from './interfaces/cash-details.interface'; @@ -85,15 +87,11 @@ export class AccountService { data }); - await this.prismaService.accountBalance.create({ - data: { - Account: { - connect: { - id_userId: { id: account.id, userId: aUserId } - } - }, - value: data.balance - } + await this.accountBalanceService.createOrUpdateAccountBalance({ + accountId: account.id, + balance: data.balance, + date: format(new Date(), DATE_FORMAT), + userId: aUserId }); return account; @@ -196,15 +194,11 @@ export class AccountService { ): Promise { const { data, where } = params; - await this.prismaService.accountBalance.create({ - data: { - Account: { - connect: { - id_userId: where.id_userId - } - }, - value: data.balance - } + await this.accountBalanceService.createOrUpdateAccountBalance({ + accountId: data.id, + balance: data.balance, + date: format(new Date(), DATE_FORMAT), + userId: aUserId }); return this.prismaService.account.update({ @@ -242,17 +236,11 @@ export class AccountService { ); if (amountInCurrencyOfAccount) { - await this.accountBalanceService.createAccountBalance({ - date, - Account: { - connect: { - id_userId: { - userId, - id: accountId - } - } - }, - value: new Big(balance).plus(amountInCurrencyOfAccount).toNumber() + await this.accountBalanceService.createOrUpdateAccountBalance({ + accountId, + userId, + balance: new Big(balance).plus(amountInCurrencyOfAccount).toNumber(), + date: date.toISOString() }); } } diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts index e64c23942..a75ce9b62 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts @@ -1,6 +1,7 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { HistoricalDataItem } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; @@ -22,11 +23,13 @@ export class PortfolioCalculatorFactory { ) {} public createCalculator({ + accountBalanceItems = [], activities, calculationType, currency, dateRange = 'max' }: { + accountBalanceItems?: HistoricalDataItem[]; activities: Activity[]; calculationType: PerformanceCalculationType; currency: string; @@ -35,6 +38,7 @@ export class PortfolioCalculatorFactory { switch (calculationType) { case PerformanceCalculationType.MWR: return new MWRPortfolioCalculator({ + accountBalanceItems, activities, currency, dateRange, @@ -43,6 +47,7 @@ export class PortfolioCalculatorFactory { }); case PerformanceCalculationType.TWR: return new TWRPortfolioCalculator({ + accountBalanceItems, activities, currency, currentRateService: this.currentRateService, diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 1d2eadfbf..54e474779 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -37,13 +37,15 @@ import { isBefore, isSameDay, max, + min, subDays } from 'date-fns'; -import { last, uniq, uniqBy } from 'lodash'; +import { first, last, uniq, uniqBy } from 'lodash'; export abstract class PortfolioCalculator { protected static readonly ENABLE_LOGGING = false; + protected accountBalanceItems: HistoricalDataItem[]; protected orders: PortfolioOrder[]; private currency: string; @@ -57,18 +59,21 @@ export abstract class PortfolioCalculator { private transactionPoints: TransactionPoint[]; public constructor({ + accountBalanceItems, activities, currency, currentRateService, dateRange, exchangeRateDataService }: { + accountBalanceItems: HistoricalDataItem[]; activities: Activity[]; currency: string; currentRateService: CurrentRateService; dateRange: DateRange; exchangeRateDataService: ExchangeRateDataService; }) { + this.accountBalanceItems = accountBalanceItems; this.currency = currency; this.currentRateService = currentRateService; this.exchangeRateDataService = exchangeRateDataService; @@ -383,10 +388,6 @@ export abstract class PortfolioCalculator { dateRange?: DateRange; withDataDecimation?: boolean; }): Promise { - if (this.getTransactionPoints().length === 0) { - return []; - } - const { endDate, startDate } = getInterval(dateRange, this.getStartDate()); const daysInMarket = differenceInDays(endDate, startDate) + 1; @@ -485,6 +486,7 @@ export abstract class PortfolioCalculator { investmentValueWithCurrencyEffect: Big; totalCurrentValue: Big; totalCurrentValueWithCurrencyEffect: Big; + totalAccountBalanceWithCurrencyEffect: Big; totalInvestmentValue: Big; totalInvestmentValueWithCurrencyEffect: Big; totalNetPerformanceValue: Big; @@ -544,9 +546,24 @@ export abstract class PortfolioCalculator { }; } + let lastDate = format(this.startDate, DATE_FORMAT); + for (const currentDate of dates) { const dateString = format(currentDate, DATE_FORMAT); + accumulatedValuesByDate[dateString] = { + investmentValueWithCurrencyEffect: new Big(0), + totalAccountBalanceWithCurrencyEffect: new Big(0), + totalCurrentValue: new Big(0), + totalCurrentValueWithCurrencyEffect: new Big(0), + totalInvestmentValue: new Big(0), + totalInvestmentValueWithCurrencyEffect: new Big(0), + totalNetPerformanceValue: new Big(0), + totalNetPerformanceValueWithCurrencyEffect: new Big(0), + totalTimeWeightedInvestmentValue: new Big(0), + totalTimeWeightedInvestmentValueWithCurrencyEffect: new Big(0) + }; + for (const symbol of Object.keys(valuesBySymbol)) { const symbolValues = valuesBySymbol[symbol]; @@ -584,49 +601,94 @@ export abstract class PortfolioCalculator { dateString ] ?? new Big(0); - accumulatedValuesByDate[dateString] = { - investmentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.investmentValueWithCurrencyEffect ?? new Big(0) - ).add(investmentValueWithCurrencyEffect), - totalCurrentValue: ( - accumulatedValuesByDate[dateString]?.totalCurrentValue ?? new Big(0) - ).add(currentValue), - totalCurrentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalCurrentValueWithCurrencyEffect ?? new Big(0) - ).add(currentValueWithCurrencyEffect), - totalInvestmentValue: ( - accumulatedValuesByDate[dateString]?.totalInvestmentValue ?? - new Big(0) - ).add(investmentValueAccumulated), - totalInvestmentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalInvestmentValueWithCurrencyEffect ?? new Big(0) - ).add(investmentValueAccumulatedWithCurrencyEffect), - totalNetPerformanceValue: ( - accumulatedValuesByDate[dateString]?.totalNetPerformanceValue ?? - new Big(0) - ).add(netPerformanceValue), - totalNetPerformanceValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalNetPerformanceValueWithCurrencyEffect ?? new Big(0) - ).add(netPerformanceValueWithCurrencyEffect), - totalTimeWeightedInvestmentValue: ( - accumulatedValuesByDate[dateString] - ?.totalTimeWeightedInvestmentValue ?? new Big(0) - ).add(timeWeightedInvestmentValue), - totalTimeWeightedInvestmentValueWithCurrencyEffect: ( - accumulatedValuesByDate[dateString] - ?.totalTimeWeightedInvestmentValueWithCurrencyEffect ?? new Big(0) - ).add(timeWeightedInvestmentValueWithCurrencyEffect) - }; + accumulatedValuesByDate[dateString].investmentValueWithCurrencyEffect = + accumulatedValuesByDate[ + dateString + ].investmentValueWithCurrencyEffect.add( + investmentValueWithCurrencyEffect + ); + + accumulatedValuesByDate[dateString].totalCurrentValue = + accumulatedValuesByDate[dateString].totalCurrentValue.add( + currentValue + ); + + accumulatedValuesByDate[ + dateString + ].totalCurrentValueWithCurrencyEffect = accumulatedValuesByDate[ + dateString + ].totalCurrentValueWithCurrencyEffect.add( + currentValueWithCurrencyEffect + ); + + accumulatedValuesByDate[dateString].totalInvestmentValue = + accumulatedValuesByDate[dateString].totalInvestmentValue.add( + investmentValueAccumulated + ); + + accumulatedValuesByDate[ + dateString + ].totalInvestmentValueWithCurrencyEffect = accumulatedValuesByDate[ + dateString + ].totalInvestmentValueWithCurrencyEffect.add( + investmentValueAccumulatedWithCurrencyEffect + ); + + accumulatedValuesByDate[dateString].totalNetPerformanceValue = + accumulatedValuesByDate[dateString].totalNetPerformanceValue.add( + netPerformanceValue + ); + + accumulatedValuesByDate[ + dateString + ].totalNetPerformanceValueWithCurrencyEffect = accumulatedValuesByDate[ + dateString + ].totalNetPerformanceValueWithCurrencyEffect.add( + netPerformanceValueWithCurrencyEffect + ); + + accumulatedValuesByDate[dateString].totalTimeWeightedInvestmentValue = + accumulatedValuesByDate[ + dateString + ].totalTimeWeightedInvestmentValue.add(timeWeightedInvestmentValue); + + accumulatedValuesByDate[ + dateString + ].totalTimeWeightedInvestmentValueWithCurrencyEffect = + accumulatedValuesByDate[ + dateString + ].totalTimeWeightedInvestmentValueWithCurrencyEffect.add( + timeWeightedInvestmentValueWithCurrencyEffect + ); + } + + if ( + this.accountBalanceItems.some(({ date }) => { + return date === dateString; + }) + ) { + accumulatedValuesByDate[ + dateString + ].totalAccountBalanceWithCurrencyEffect = new Big( + this.accountBalanceItems.find(({ date }) => { + return date === dateString; + }).value + ); + } else { + accumulatedValuesByDate[ + dateString + ].totalAccountBalanceWithCurrencyEffect = + accumulatedValuesByDate[lastDate] + ?.totalAccountBalanceWithCurrencyEffect ?? new Big(0); } + + lastDate = dateString; } return Object.entries(accumulatedValuesByDate).map(([date, values]) => { const { investmentValueWithCurrencyEffect, + totalAccountBalanceWithCurrencyEffect, totalCurrentValue, totalCurrentValueWithCurrencyEffect, totalInvestmentValue, @@ -661,6 +723,11 @@ export abstract class PortfolioCalculator { netPerformance: totalNetPerformanceValue.toNumber(), netPerformanceWithCurrencyEffect: totalNetPerformanceValueWithCurrencyEffect.toNumber(), + // TODO: Add valuables + netWorth: totalCurrentValueWithCurrencyEffect + .plus(totalAccountBalanceWithCurrencyEffect) + .toNumber(), + totalAccountBalance: totalAccountBalanceWithCurrencyEffect.toNumber(), totalInvestment: totalInvestmentValue.toNumber(), totalInvestmentValueWithCurrencyEffect: totalInvestmentValueWithCurrencyEffect.toNumber(), @@ -749,9 +816,30 @@ export abstract class PortfolioCalculator { } public getStartDate() { - return this.transactionPoints.length > 0 - ? parseDate(this.transactionPoints[0].date) - : new Date(); + let firstAccountBalanceDate: Date; + let firstActivityDate: Date; + + try { + const firstAccountBalanceDateString = first( + this.accountBalanceItems + )?.date; + firstAccountBalanceDate = firstAccountBalanceDateString + ? parseDate(firstAccountBalanceDateString) + : new Date(); + } catch (error) { + firstAccountBalanceDate = new Date(); + } + + try { + const firstActivityDateString = this.transactionPoints[0].date; + firstActivityDate = firstActivityDateString + ? parseDate(firstActivityDateString) + : new Date(); + } catch (error) { + firstActivityDate = new Date(); + } + + return min([firstAccountBalanceDate, firstActivityDate]); } protected abstract getSymbolMetrics({ diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts index 1d69abfbf..bd04d6045 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-no-orders.spec.ts @@ -90,7 +90,12 @@ describe('PortfolioCalculator', () => { expect(investments).toEqual([]); - expect(investmentsByMonth).toEqual([]); + expect(investmentsByMonth).toEqual([ + { + date: '2021-12-01', + investment: 0 + } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts index 6f0b03800..0dd16b045 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -113,6 +113,8 @@ describe('PortfolioCalculator', () => { netPerformanceInPercentage: 0, netPerformanceInPercentageWithCurrencyEffect: 0, netPerformanceWithCurrencyEffect: 0, + netWorth: 151.6, + totalAccountBalance: 0, totalInvestment: 151.6, totalInvestmentValueWithCurrencyEffect: 151.6, value: 151.6, @@ -126,6 +128,8 @@ describe('PortfolioCalculator', () => { netPerformanceInPercentage: 13.100263852242744, netPerformanceInPercentageWithCurrencyEffect: 13.100263852242744, netPerformanceWithCurrencyEffect: 19.86, + netWorth: 0, + totalAccountBalance: 0, totalInvestment: 0, totalInvestmentValueWithCurrencyEffect: 0, value: 0, diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index 7dcef89cb..9458fb1bd 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -188,6 +188,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { [date: string]: Big; } = {}; + let totalAccountBalanceInBaseCurrency = new Big(0); let totalDividend = new Big(0); let totalDividendInBaseCurrency = new Big(0); let totalInterest = new Big(0); @@ -237,6 +238,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { timeWeightedInvestmentValues: {}, timeWeightedInvestmentValuesWithCurrencyEffect: {}, timeWeightedInvestmentWithCurrencyEffect: new Big(0), + totalAccountBalanceInBaseCurrency: new Big(0), totalDividend: new Big(0), totalDividendInBaseCurrency: new Big(0), totalInterest: new Big(0), @@ -286,6 +288,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { timeWeightedInvestmentValues: {}, timeWeightedInvestmentValuesWithCurrencyEffect: {}, timeWeightedInvestmentWithCurrencyEffect: new Big(0), + totalAccountBalanceInBaseCurrency: new Big(0), totalDividend: new Big(0), totalDividendInBaseCurrency: new Big(0), totalInterest: new Big(0), @@ -334,8 +337,10 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { if (isChartMode) { const datesWithOrders = {}; - for (const order of orders) { - datesWithOrders[order.date] = true; + for (const { date, type } of orders) { + if (['BUY', 'SELL'].includes(type)) { + datesWithOrders[date] = true; + } } while (isBefore(day, end)) { @@ -396,11 +401,46 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { if (PortfolioCalculator.ENABLE_LOGGING) { console.log(); console.log(); - console.log(i + 1, order.type, order.itemType); + console.log( + i + 1, + order.date, + order.type, + order.itemType ? `(${order.itemType})` : '' + ); } const exchangeRateAtOrderDate = exchangeRates[order.date]; + if (order.type === 'DIVIDEND') { + const dividend = order.quantity.mul(order.unitPrice); + + totalDividend = totalDividend.plus(dividend); + totalDividendInBaseCurrency = totalDividendInBaseCurrency.plus( + dividend.mul(exchangeRateAtOrderDate ?? 1) + ); + } else if (order.type === 'INTEREST') { + const interest = order.quantity.mul(order.unitPrice); + + totalInterest = totalInterest.plus(interest); + totalInterestInBaseCurrency = totalInterestInBaseCurrency.plus( + interest.mul(exchangeRateAtOrderDate ?? 1) + ); + } else if (order.type === 'ITEM') { + const valuables = order.quantity.mul(order.unitPrice); + + totalValuables = totalValuables.plus(valuables); + totalValuablesInBaseCurrency = totalValuablesInBaseCurrency.plus( + valuables.mul(exchangeRateAtOrderDate ?? 1) + ); + } else if (order.type === 'LIABILITY') { + const liabilities = order.quantity.mul(order.unitPrice); + + totalLiabilities = totalLiabilities.plus(liabilities); + totalLiabilitiesInBaseCurrency = totalLiabilitiesInBaseCurrency.plus( + liabilities.mul(exchangeRateAtOrderDate ?? 1) + ); + } + if (order.itemType === 'start') { // Take the unit price of the order as the market price if there are no // orders of this symbol before the start date @@ -483,13 +523,6 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { } if (PortfolioCalculator.ENABLE_LOGGING) { - console.log('totalInvestment', totalInvestment.toNumber()); - - console.log( - 'totalInvestmentWithCurrencyEffect', - totalInvestmentWithCurrencyEffect.toNumber() - ); - console.log('order.quantity', order.quantity.toNumber()); console.log('transactionInvestment', transactionInvestment.toNumber()); @@ -536,36 +569,6 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { totalUnits = totalUnits.plus(order.quantity.mul(getFactor(order.type))); - if (order.type === 'DIVIDEND') { - const dividend = order.quantity.mul(order.unitPrice); - - totalDividend = totalDividend.plus(dividend); - totalDividendInBaseCurrency = totalDividendInBaseCurrency.plus( - dividend.mul(exchangeRateAtOrderDate ?? 1) - ); - } else if (order.type === 'INTEREST') { - const interest = order.quantity.mul(order.unitPrice); - - totalInterest = totalInterest.plus(interest); - totalInterestInBaseCurrency = totalInterestInBaseCurrency.plus( - interest.mul(exchangeRateAtOrderDate ?? 1) - ); - } else if (order.type === 'ITEM') { - const valuables = order.quantity.mul(order.unitPrice); - - totalValuables = totalValuables.plus(valuables); - totalValuablesInBaseCurrency = totalValuablesInBaseCurrency.plus( - valuables.mul(exchangeRateAtOrderDate ?? 1) - ); - } else if (order.type === 'LIABILITY') { - const liabilities = order.quantity.mul(order.unitPrice); - - totalLiabilities = totalLiabilities.plus(liabilities); - totalLiabilitiesInBaseCurrency = totalLiabilitiesInBaseCurrency.plus( - liabilities.mul(exchangeRateAtOrderDate ?? 1) - ); - } - const valueOfInvestment = totalUnits.mul(order.unitPriceInBaseCurrency); const valueOfInvestmentWithCurrencyEffect = totalUnits.mul( @@ -875,6 +878,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { netPerformanceValuesWithCurrencyEffect, timeWeightedInvestmentValues, timeWeightedInvestmentValuesWithCurrencyEffect, + totalAccountBalanceInBaseCurrency, totalDividend, totalDividendInBaseCurrency, totalInterest, diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 56c0a231c..81d0c3df9 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -290,6 +290,7 @@ export class PortfolioController { @Query('assetClasses') filterByAssetClasses?: string, @Query('holdingType') filterByHoldingType?: string, @Query('query') filterBySearchQuery?: string, + @Query('range') dateRange: DateRange = 'max', @Query('tags') filterByTags?: string ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ @@ -301,6 +302,7 @@ export class PortfolioController { }); const { holdings } = await this.portfolioService.getDetails({ + dateRange, filters, impersonationId, userId: this.request.user.id diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 4c65d2eb9..cf7a47f52 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -64,7 +64,6 @@ import { differenceInDays, format, isAfter, - isBefore, isSameMonth, isSameYear, parseISO, @@ -1056,11 +1055,16 @@ export class PortfolioService { ) => { const formattedDate = format(date, DATE_FORMAT); - // Store the item in the map, overwriting if the date already exists - map[formattedDate] = { - date: formattedDate, - value: valueInBaseCurrency - }; + if (map[formattedDate]) { + // If the value exists, add the current value to the existing one + map[formattedDate].value += valueInBaseCurrency; + } else { + // Otherwise, initialize the value for that date + map[formattedDate] = { + date: formattedDate, + value: valueInBaseCurrency + }; + } return map; }, @@ -1100,6 +1104,7 @@ export class PortfolioService { } const portfolioCalculator = this.calculatorFactory.createCalculator({ + accountBalanceItems, activities, dateRange, calculationType: PerformanceCalculationType.TWR, @@ -1131,6 +1136,8 @@ export class PortfolioService { let currentNetPerformanceWithCurrencyEffect = netPerformanceWithCurrencyEffect; + let currentNetWorth = 0; + const items = await portfolioCalculator.getChart({ dateRange }); @@ -1153,35 +1160,14 @@ export class PortfolioService { currentNetPerformanceWithCurrencyEffect = new Big( itemOfToday.netPerformanceWithCurrencyEffect ); - } - - accountBalanceItems = accountBalanceItems.filter(({ date }) => { - return !isBefore(parseDate(date), startDate); - }); - const accountBalanceItemOfToday = accountBalanceItems.find(({ date }) => { - return date === format(new Date(), DATE_FORMAT); - }); - - if (!accountBalanceItemOfToday) { - accountBalanceItems.push({ - date: format(new Date(), DATE_FORMAT), - value: last(accountBalanceItems)?.value ?? 0 - }); + currentNetWorth = itemOfToday.netWorth; } - const mergedHistoricalDataItems = this.mergeHistoricalDataItems( - accountBalanceItems, - items - ); - - const currentHistoricalDataItem = last(mergedHistoricalDataItems); - const currentNetWorth = currentHistoricalDataItem?.netWorth ?? 0; - return { errors, hasErrors, - chart: mergedHistoricalDataItems, + chart: items, firstOrderDate: parseDate(items[0]?.date), performance: { currentNetWorth, @@ -1909,44 +1895,4 @@ export class PortfolioService { return { accounts, platforms }; } - - private mergeHistoricalDataItems( - accountBalanceItems: HistoricalDataItem[], - performanceChartItems: HistoricalDataItem[] - ): HistoricalDataItem[] { - const historicalDataItemsMap: { [date: string]: HistoricalDataItem } = {}; - let latestAccountBalance = 0; - - for (const item of accountBalanceItems.concat(performanceChartItems)) { - const isAccountBalanceItem = accountBalanceItems.includes(item); - - const totalAccountBalance = isAccountBalanceItem - ? item.value - : latestAccountBalance; - - if (isAccountBalanceItem && performanceChartItems.length > 0) { - latestAccountBalance = item.value; - } else { - historicalDataItemsMap[item.date] = { - ...item, - totalAccountBalance, - netWorth: - (isAccountBalanceItem ? 0 : item.value) + totalAccountBalance - }; - } - } - - // Convert to an array and sort by date in ascending order - const historicalDataItems = Object.keys(historicalDataItemsMap).map( - (date) => { - return historicalDataItemsMap[date]; - } - ); - - historicalDataItems.sort((a, b) => { - return new Date(a.date).getTime() - new Date(b.date).getTime(); - }); - - return historicalDataItems; - } } diff --git a/apps/api/src/interceptors/redact-values-in-response.interceptor.ts b/apps/api/src/interceptors/redact-values-in-response.interceptor.ts index 78ae918d2..17d4e3c17 100644 --- a/apps/api/src/interceptors/redact-values-in-response.interceptor.ts +++ b/apps/api/src/interceptors/redact-values-in-response.interceptor.ts @@ -57,6 +57,7 @@ export class RedactValuesInResponseInterceptor 'quantity', 'symbolMapping', 'totalBalanceInBaseCurrency', + 'totalValueInBaseCurrency', 'unitPrice', 'value', 'valueInBaseCurrency' diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index a02ddb597..683002a10 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -449,13 +449,16 @@ export class ExchangeRateDataService { factors[format(date, DATE_FORMAT)] = factor; } } catch { - Logger.error( - `No exchange rate has been found for ${currencyFrom}${currencyTo} at ${format( - date, - DATE_FORMAT - )}. Please complement market data for ${DEFAULT_CURRENCY}${currencyFrom} and ${DEFAULT_CURRENCY}${currencyTo}.`, - 'ExchangeRateDataService' - ); + let errorMessage = `No exchange rate has been found for ${currencyFrom}${currencyTo} at ${format( + date, + DATE_FORMAT + )}. Please complement market data for ${DEFAULT_CURRENCY}${currencyFrom}`; + + if (DEFAULT_CURRENCY !== currencyTo) { + errorMessage = `${errorMessage} and ${DEFAULT_CURRENCY}${currencyTo}`; + } + + Logger.error(`${errorMessage}.`, 'ExchangeRateDataService'); } } } diff --git a/apps/client/src/app/app.module.ts b/apps/client/src/app/app.module.ts index f8b52faa9..fac59bf48 100644 --- a/apps/client/src/app/app.module.ts +++ b/apps/client/src/app/app.module.ts @@ -1,4 +1,4 @@ -import { GfLogoModule } from '@ghostfolio/ui/logo'; +import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { Platform } from '@angular/cdk/platform'; import { HttpClientModule } from '@angular/common/http'; @@ -43,7 +43,7 @@ export function NgxStripeFactory(): string { BrowserAnimationsModule, BrowserModule, GfHeaderModule, - GfLogoModule, + GfLogoComponent, GfSubscriptionInterstitialDialogModule, HttpClientModule, MarkdownModule.forRoot(), diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index 537adf1d1..aeec7d2a5 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -84,55 +84,10 @@ export class AccountDetailDialog implements OnDestroy, OnInit { } public ngOnInit() { - this.dataService - .fetchAccount(this.data.accountId) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe( - ({ - balance, - currency, - name, - Platform, - transactionCount, - value, - valueInBaseCurrency - }) => { - this.balance = balance; - this.currency = currency; - - if (isNumber(balance) && isNumber(value)) { - this.equity = new Big(value).minus(balance).toNumber(); - } else { - this.equity = null; - } - - this.name = name; - this.platformName = Platform?.name ?? '-'; - this.transactionCount = transactionCount; - this.valueInBaseCurrency = valueInBaseCurrency; - - this.changeDetectorRef.markForCheck(); - } - ); - - this.dataService - .fetchPortfolioHoldings({ - filters: [ - { - type: 'ACCOUNT', - id: this.data.accountId - } - ] - }) - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ holdings }) => { - this.holdings = holdings; - - this.changeDetectorRef.markForCheck(); - }); - + this.fetchAccount(); this.fetchAccountBalances(); this.fetchActivities(); + this.fetchPortfolioHoldings(); this.fetchPortfolioPerformance(); } @@ -140,15 +95,35 @@ export class AccountDetailDialog implements OnDestroy, OnInit { this.dialogRef.close(); } + public onAddAccountBalance({ + balance, + date + }: { + balance: number; + date: Date; + }) { + this.dataService + .postAccountBalance({ + balance, + date, + accountId: this.data.accountId + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + this.fetchAccount(); + this.fetchAccountBalances(); + this.fetchPortfolioPerformance(); + }); + } + public onDeleteAccountBalance(aId: string) { this.dataService .deleteAccountBalance(aId) .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe({ - next: () => { - this.fetchAccountBalances(); - this.fetchPortfolioPerformance(); - } + .subscribe(() => { + this.fetchAccount(); + this.fetchAccountBalances(); + this.fetchPortfolioPerformance(); }); } @@ -181,6 +156,39 @@ export class AccountDetailDialog implements OnDestroy, OnInit { this.fetchActivities(); } + private fetchAccount() { + this.dataService + .fetchAccount(this.data.accountId) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe( + ({ + balance, + currency, + name, + Platform, + transactionCount, + value, + valueInBaseCurrency + }) => { + this.balance = balance; + this.currency = currency; + + if (isNumber(balance) && isNumber(value)) { + this.equity = new Big(value).minus(balance).toNumber(); + } else { + this.equity = null; + } + + this.name = name; + this.platformName = Platform?.name ?? '-'; + this.transactionCount = transactionCount; + this.valueInBaseCurrency = valueInBaseCurrency; + + this.changeDetectorRef.markForCheck(); + } + ); + } + private fetchAccountBalances() { this.dataService .fetchAccountBalances(this.data.accountId) @@ -212,6 +220,24 @@ export class AccountDetailDialog implements OnDestroy, OnInit { }); } + private fetchPortfolioHoldings() { + this.dataService + .fetchPortfolioHoldings({ + filters: [ + { + type: 'ACCOUNT', + id: this.data.accountId + } + ] + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(({ holdings }) => { + this.holdings = holdings; + + this.changeDetectorRef.markForCheck(); + }); + } + private fetchPortfolioPerformance() { this.isLoadingChart = true; @@ -233,11 +259,7 @@ export class AccountDetailDialog implements OnDestroy, OnInit { ({ date, netWorth, netWorthInPercentage }) => { return { date, - value: - this.data.hasImpersonationId || - this.user.settings.isRestrictedView - ? netWorthInPercentage - : netWorth + value: isNumber(netWorth) ? netWorth : netWorthInPercentage }; } ); diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html index 041a779c4..e092cce68 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html @@ -115,6 +115,7 @@ diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts index faba1d6d2..e404aaad1 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.module.ts @@ -1,10 +1,10 @@ import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module'; import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module'; import { GfInvestmentChartModule } from '@ghostfolio/client/components/investment-chart/investment-chart.module'; -import { GfAccountBalancesModule } from '@ghostfolio/ui/account-balances/account-balances.module'; -import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; -import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfAccountBalancesComponent } from '@ghostfolio/ui/account-balances'; +import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; +import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -19,13 +19,13 @@ import { AccountDetailDialog } from './account-detail-dialog.component'; declarations: [AccountDetailDialog], imports: [ CommonModule, - GfAccountBalancesModule, - GfActivitiesTableModule, + GfAccountBalancesComponent, + GfActivitiesTableComponent, GfDialogFooterModule, GfDialogHeaderModule, - GfHoldingsTableModule, + GfHoldingsTableComponent, GfInvestmentChartModule, - GfValueModule, + GfValueComponent, MatButtonModule, MatDialogModule, MatTabsModule, diff --git a/apps/client/src/app/components/accounts-table/accounts-table.module.ts b/apps/client/src/app/components/accounts-table/accounts-table.module.ts index bae24fda3..879ca13ea 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.module.ts +++ b/apps/client/src/app/components/accounts-table/accounts-table.module.ts @@ -1,5 +1,5 @@ import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -18,7 +18,7 @@ import { AccountsTableComponent } from './accounts-table.component'; imports: [ CommonModule, GfAssetProfileIconComponent, - GfValueModule, + GfValueComponent, MatButtonModule, MatMenuModule, MatSortModule, diff --git a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.module.ts b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.module.ts index 9e742acba..9f4e1b3bc 100644 --- a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.module.ts +++ b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.module.ts @@ -1,4 +1,4 @@ -import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module'; +import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -9,7 +9,7 @@ import { GfMarketDataDetailDialogModule } from './market-data-detail-dialog/mark @NgModule({ declarations: [AdminMarketDataDetailComponent], exports: [AdminMarketDataDetailComponent], - imports: [CommonModule, GfLineChartModule, GfMarketDataDetailDialogModule], + imports: [CommonModule, GfLineChartComponent, GfMarketDataDetailDialogModule], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfAdminMarketDataDetailModule {} diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts index c4cdc3bdd..73bf47f7f 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.module.ts @@ -1,5 +1,5 @@ import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module'; +import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -20,7 +20,7 @@ import { GfCreateAssetProfileDialogModule } from './create-asset-profile-dialog/ declarations: [AdminMarketDataComponent], imports: [ CommonModule, - GfActivitiesFilterModule, + GfActivitiesFilterComponent, GfAssetProfileDialogModule, GfCreateAssetProfileDialogModule, GfSymbolModule, diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts index ffde6c0ae..a872f567f 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts @@ -1,9 +1,9 @@ import { GfAdminMarketDataDetailModule } from '@ghostfolio/client/components/admin-market-data-detail/admin-market-data-detail.module'; import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; -import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module'; -import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; +import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { TextFieldModule } from '@angular/cdk/text-field'; import { CommonModule } from '@angular/common'; @@ -26,9 +26,9 @@ import { AssetProfileDialog } from './asset-profile-dialog.component'; FormsModule, GfAdminMarketDataDetailModule, GfAssetProfileIconComponent, - GfCurrencySelectorModule, - GfPortfolioProportionChartModule, - GfValueModule, + GfCurrencySelectorComponent, + GfPortfolioProportionChartComponent, + GfValueComponent, MatButtonModule, MatCheckboxModule, MatDialogModule, diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts index 888abfa56..24cc90dbe 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete'; +import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -16,7 +16,7 @@ import { CreateAssetProfileDialog } from './create-asset-profile-dialog.componen imports: [ CommonModule, FormsModule, - GfSymbolAutocompleteModule, + GfSymbolAutocompleteComponent, MatDialogModule, MatButtonModule, MatFormFieldModule, diff --git a/apps/client/src/app/components/admin-overview/admin-overview.module.ts b/apps/client/src/app/components/admin-overview/admin-overview.module.ts index a5a0a35e7..da49eb858 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.module.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.module.ts @@ -1,5 +1,5 @@ import { CacheService } from '@ghostfolio/client/services/cache.service'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -19,7 +19,7 @@ import { AdminOverviewComponent } from './admin-overview.component'; imports: [ CommonModule, FormsModule, - GfValueModule, + GfValueComponent, MatButtonModule, MatCardModule, MatMenuModule, diff --git a/apps/client/src/app/components/admin-users/admin-users.module.ts b/apps/client/src/app/components/admin-users/admin-users.module.ts index 0e232a4ed..3f4e9f2f7 100644 --- a/apps/client/src/app/components/admin-users/admin-users.module.ts +++ b/apps/client/src/app/components/admin-users/admin-users.module.ts @@ -1,5 +1,5 @@ -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -14,8 +14,8 @@ import { AdminUsersComponent } from './admin-users.component'; exports: [], imports: [ CommonModule, - GfPremiumIndicatorModule, - GfValueModule, + GfPremiumIndicatorComponent, + GfValueComponent, MatButtonModule, MatMenuModule, MatTableModule diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts index 2e6cae5cf..1bd4b0792 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.module.ts @@ -1,4 +1,4 @@ -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -15,7 +15,7 @@ import { BenchmarkComparatorComponent } from './benchmark-comparator.component'; imports: [ CommonModule, FormsModule, - GfPremiumIndicatorModule, + GfPremiumIndicatorComponent, MatSelectModule, NgxSkeletonLoaderModule, ReactiveFormsModule, diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 1251853e7..dd1e3cc3c 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -12,7 +12,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { Filter, InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { DateRange } from '@ghostfolio/common/types'; -import { AssistantComponent } from '@ghostfolio/ui/assistant/assistant.component'; +import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.component'; import { ChangeDetectionStrategy, @@ -62,7 +62,7 @@ export class HeaderComponent implements OnChanges { @Output() signOut = new EventEmitter(); - @ViewChild('assistant') assistantElement: AssistantComponent; + @ViewChild('assistant') assistantElement: GfAssistantComponent; @ViewChild('assistantTrigger') assistentMenuTriggerElement: MatMenuTrigger; public hasPermissionForSocialLogin: boolean; diff --git a/apps/client/src/app/components/header/header.module.ts b/apps/client/src/app/components/header/header.module.ts index 8ec816625..797ff7b6e 100644 --- a/apps/client/src/app/components/header/header.module.ts +++ b/apps/client/src/app/components/header/header.module.ts @@ -1,7 +1,7 @@ import { LoginWithAccessTokenDialogModule } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.module'; -import { GfAssistantModule } from '@ghostfolio/ui/assistant'; -import { GfLogoModule } from '@ghostfolio/ui/logo'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfAssistantComponent } from '@ghostfolio/ui/assistant'; +import { GfLogoComponent } from '@ghostfolio/ui/logo'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -17,9 +17,9 @@ import { HeaderComponent } from './header.component'; exports: [HeaderComponent], imports: [ CommonModule, - GfAssistantModule, - GfLogoModule, - GfPremiumIndicatorModule, + GfAssistantComponent, + GfLogoComponent, + GfPremiumIndicatorComponent, LoginWithAccessTokenDialogModule, MatButtonModule, MatMenuModule, diff --git a/apps/client/src/app/components/home-market/home-market.module.ts b/apps/client/src/app/components/home-market/home-market.module.ts index b8d2f8c79..bc35b4bef 100644 --- a/apps/client/src/app/components/home-market/home-market.module.ts +++ b/apps/client/src/app/components/home-market/home-market.module.ts @@ -1,6 +1,6 @@ import { GfFearAndGreedIndexModule } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.module'; -import { GfBenchmarkModule } from '@ghostfolio/ui/benchmark/benchmark.module'; -import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module'; +import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; +import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -13,9 +13,9 @@ import { HomeMarketComponent } from './home-market.component'; exports: [HomeMarketComponent], imports: [ CommonModule, - GfBenchmarkModule, + GfBenchmarkComponent, GfFearAndGreedIndexModule, - GfLineChartModule, + GfLineChartComponent, NgxSkeletonLoaderModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] diff --git a/apps/client/src/app/components/home-overview/home-overview.module.ts b/apps/client/src/app/components/home-overview/home-overview.module.ts index 4f5041627..44c96953d 100644 --- a/apps/client/src/app/components/home-overview/home-overview.module.ts +++ b/apps/client/src/app/components/home-overview/home-overview.module.ts @@ -1,6 +1,6 @@ import { GfPortfolioPerformanceModule } from '@ghostfolio/client/components/portfolio-performance/portfolio-performance.module'; -import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module'; -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; +import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; +import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -13,8 +13,8 @@ import { HomeOverviewComponent } from './home-overview.component'; declarations: [HomeOverviewComponent], imports: [ CommonModule, - GfLineChartModule, - GfNoTransactionsInfoModule, + GfLineChartComponent, + GfNoTransactionsInfoComponent, GfPortfolioPerformanceModule, MatButtonModule, RouterModule diff --git a/apps/client/src/app/components/portfolio-performance/portfolio-performance.module.ts b/apps/client/src/app/components/portfolio-performance/portfolio-performance.module.ts index b72f64b15..5c62cca87 100644 --- a/apps/client/src/app/components/portfolio-performance/portfolio-performance.module.ts +++ b/apps/client/src/app/components/portfolio-performance/portfolio-performance.module.ts @@ -1,4 +1,4 @@ -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -9,7 +9,7 @@ import { PortfolioPerformanceComponent } from './portfolio-performance.component @NgModule({ declarations: [PortfolioPerformanceComponent], exports: [PortfolioPerformanceComponent], - imports: [CommonModule, GfValueModule, NgxSkeletonLoaderModule], + imports: [CommonModule, GfValueComponent, NgxSkeletonLoaderModule], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfPortfolioPerformanceModule {} diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts b/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts index be9f6fef8..603d5271a 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.module.ts @@ -1,4 +1,4 @@ -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -8,7 +8,7 @@ import { PortfolioSummaryComponent } from './portfolio-summary.component'; @NgModule({ declarations: [PortfolioSummaryComponent], exports: [PortfolioSummaryComponent], - imports: [CommonModule, GfValueModule], + imports: [CommonModule, GfValueComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class GfPortfolioSummaryModule {} diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts index 675f8187b..751c645e5 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts @@ -1,11 +1,11 @@ import { GfAccountsTableModule } from '@ghostfolio/client/components/accounts-table/accounts-table.module'; import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module'; import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module'; -import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; -import { GfDataProviderCreditsModule } from '@ghostfolio/ui/data-provider-credits/data-provider-credits.module'; -import { GfLineChartModule } from '@ghostfolio/ui/line-chart/line-chart.module'; -import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; +import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits'; +import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; +import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -22,13 +22,13 @@ import { PositionDetailDialog } from './position-detail-dialog.component'; imports: [ CommonModule, GfAccountsTableModule, - GfActivitiesTableModule, - GfDataProviderCreditsModule, + GfActivitiesTableComponent, + GfDataProviderCreditsComponent, GfDialogFooterModule, GfDialogHeaderModule, - GfLineChartModule, - GfPortfolioProportionChartModule, - GfValueModule, + GfLineChartComponent, + GfPortfolioProportionChartComponent, + GfValueComponent, MatButtonModule, MatChipsModule, MatDialogModule, diff --git a/apps/client/src/app/components/position/position.module.ts b/apps/client/src/app/components/position/position.module.ts index 0b225cd04..6483e274a 100644 --- a/apps/client/src/app/components/position/position.module.ts +++ b/apps/client/src/app/components/position/position.module.ts @@ -1,6 +1,6 @@ import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfTrendIndicatorModule } from '@ghostfolio/ui/trend-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfTrendIndicatorComponent } from '@ghostfolio/ui/trend-indicator'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -18,8 +18,8 @@ import { PositionComponent } from './position.component'; CommonModule, GfPositionDetailDialogModule, GfSymbolModule, - GfTrendIndicatorModule, - GfValueModule, + GfTrendIndicatorComponent, + GfValueComponent, MatDialogModule, NgxSkeletonLoaderModule, RouterModule diff --git a/apps/client/src/app/components/positions/positions.module.ts b/apps/client/src/app/components/positions/positions.module.ts index e9d1cb838..34bd38b2d 100644 --- a/apps/client/src/app/components/positions/positions.module.ts +++ b/apps/client/src/app/components/positions/positions.module.ts @@ -1,4 +1,4 @@ -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; +import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -12,7 +12,7 @@ import { PositionsComponent } from './positions.component'; exports: [PositionsComponent], imports: [ CommonModule, - GfNoTransactionsInfoModule, + GfNoTransactionsInfoComponent, GfPositionModule, MatButtonModule ], diff --git a/apps/client/src/app/components/rules/rules.module.ts b/apps/client/src/app/components/rules/rules.module.ts index 48cd02388..3b82c6ab1 100644 --- a/apps/client/src/app/components/rules/rules.module.ts +++ b/apps/client/src/app/components/rules/rules.module.ts @@ -1,5 +1,5 @@ import { GfRuleModule } from '@ghostfolio/client/components/rule/rule.module'; -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; +import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -14,7 +14,7 @@ import { RulesComponent } from './rules.component'; exports: [RulesComponent], imports: [ CommonModule, - GfNoTransactionsInfoModule, + GfNoTransactionsInfoComponent, GfPositionModule, GfRuleModule, MatButtonModule, diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts index b67d2783c..36bc931b0 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -12,7 +12,7 @@ import { SubscriptionInterstitialDialog } from './subscription-interstitial-dial declarations: [SubscriptionInterstitialDialog], imports: [ CommonModule, - GfPremiumIndicatorModule, + GfPremiumIndicatorComponent, MatButtonModule, MatDialogModule, RouterModule diff --git a/apps/client/src/app/components/user-account-access/user-account-access.module.ts b/apps/client/src/app/components/user-account-access/user-account-access.module.ts index c8d1cc578..93270ee3c 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.module.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.module.ts @@ -1,5 +1,5 @@ import { GfPortfolioAccessTableModule } from '@ghostfolio/client/components/access-table/access-table.module'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -17,7 +17,7 @@ import { UserAccountAccessComponent } from './user-account-access.component'; CommonModule, GfCreateOrUpdateAccessDialogModule, GfPortfolioAccessTableModule, - GfPremiumIndicatorModule, + GfPremiumIndicatorComponent, MatButtonModule, MatDialogModule, RouterModule diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.module.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.module.ts index b5f91a521..90646c09e 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.module.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.module.ts @@ -1,6 +1,6 @@ -import { GfMembershipCardModule } from '@ghostfolio/ui/membership-card'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -15,9 +15,9 @@ import { UserAccountMembershipComponent } from './user-account-membership.compon exports: [UserAccountMembershipComponent], imports: [ CommonModule, - GfMembershipCardModule, - GfPremiumIndicatorModule, - GfValueModule, + GfMembershipCardComponent, + GfPremiumIndicatorComponent, + GfValueComponent, MatButtonModule, MatCardModule, RouterModule diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts index 50d092a1e..89626a96c 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.module.ts @@ -1,4 +1,4 @@ -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -18,7 +18,7 @@ import { UserAccountSettingsComponent } from './user-account-settings.component' imports: [ CommonModule, FormsModule, - GfValueModule, + GfValueComponent, MatButtonModule, MatCardModule, MatFormFieldModule, diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 15a0d2e9f..5314c10f1 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -63,9 +63,11 @@ export class HttpResponseInterceptor implements HttpInterceptor { undefined, { duration: 6000 } ); - } else if (!error.url.endsWith('auth/anonymous')) { + } else if (!error.url.includes('/auth')) { this.snackBarRef = this.snackBar.open( - $localize`This feature requires a subscription.`, + this.hasPermissionForSubscription + ? $localize`This feature requires a subscription.` + : $localize`This action is not allowed.`, this.hasPermissionForSubscription ? $localize`Upgrade Plan` : undefined, diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 93d88cd64..e1b53acd3 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -233,6 +233,8 @@ export class AccountsPageComponent implements OnDestroy, OnInit { .afterClosed() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => { + this.fetchAccounts(); + this.router.navigate(['.'], { relativeTo: this.route }); }); } diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts index e2ea5d091..249715d61 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts @@ -1,5 +1,5 @@ import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; -import { GfCurrencySelectorModule } from '@ghostfolio/ui/currency-selector/currency-selector.module'; +import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -19,7 +19,7 @@ import { CreateOrUpdateAccountDialog } from './create-or-update-account-dialog.c CommonModule, FormsModule, GfAssetProfileIconComponent, - GfCurrencySelectorModule, + GfCurrencySelectorComponent, MatAutocompleteModule, MatButtonModule, MatCheckboxModule, diff --git a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts index ab117d0a3..5820104d9 100644 --- a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts @@ -1,4 +1,4 @@ -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -6,7 +6,7 @@ import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, - imports: [GfPremiumIndicatorModule, MatButtonModule, RouterModule], + imports: [GfPremiumIndicatorComponent, MatButtonModule, RouterModule], selector: 'gf-black-friday-2022-page', standalone: true, templateUrl: './black-friday-2022-page.html' diff --git a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts index 9f23f30ff..f0c88cfd4 100644 --- a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts @@ -1,4 +1,4 @@ -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -6,7 +6,7 @@ import { RouterModule } from '@angular/router'; @Component({ host: { class: 'page' }, - imports: [GfPremiumIndicatorModule, MatButtonModule, RouterModule], + imports: [GfPremiumIndicatorComponent, MatButtonModule, RouterModule], selector: 'gf-black-week-2023-page', standalone: true, templateUrl: './black-week-2023-page.html' diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html index 0272f535e..7df2cdbe9 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -30,7 +30,8 @@ systems, including CasaOS, Runtipi, + >, Home Assistant, + Runtipi, TrueCharts, Umbrel, and diff --git a/apps/client/src/app/pages/features/features-page.module.ts b/apps/client/src/app/pages/features/features-page.module.ts index ede263d94..fb5b00c14 100644 --- a/apps/client/src/app/pages/features/features-page.module.ts +++ b/apps/client/src/app/pages/features/features-page.module.ts @@ -1,4 +1,4 @@ -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -13,7 +13,7 @@ import { FeaturesPageComponent } from './features-page.component'; imports: [ CommonModule, FeaturesPageRoutingModule, - GfPremiumIndicatorModule, + GfPremiumIndicatorComponent, MatButtonModule, MatCardModule ], diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html index 579b35702..331defae4 100644 --- a/apps/client/src/app/pages/landing/landing-page.html +++ b/apps/client/src/app/pages/landing/landing-page.html @@ -2,12 +2,6 @@
-

Manage your wealth like a boss

diff --git a/apps/client/src/app/pages/landing/landing-page.module.ts b/apps/client/src/app/pages/landing/landing-page.module.ts index ef1d3d0ac..ca39e6023 100644 --- a/apps/client/src/app/pages/landing/landing-page.module.ts +++ b/apps/client/src/app/pages/landing/landing-page.module.ts @@ -1,7 +1,7 @@ import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; -import { GfCarouselModule } from '@ghostfolio/ui/carousel'; -import { GfLogoModule } from '@ghostfolio/ui/logo'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfCarouselComponent } from '@ghostfolio/ui/carousel'; +import { GfLogoComponent } from '@ghostfolio/ui/logo'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -16,9 +16,9 @@ import { LandingPageComponent } from './landing-page.component'; declarations: [LandingPageComponent], imports: [ CommonModule, - GfCarouselModule, - GfLogoModule, - GfValueModule, + GfCarouselComponent, + GfLogoComponent, + GfValueComponent, GfWorldMapChartModule, LandingPageRoutingModule, MatButtonModule, diff --git a/apps/client/src/app/pages/open/open-page.module.ts b/apps/client/src/app/pages/open/open-page.module.ts index ba8a94831..ab48f2d4a 100644 --- a/apps/client/src/app/pages/open/open-page.module.ts +++ b/apps/client/src/app/pages/open/open-page.module.ts @@ -1,4 +1,4 @@ -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -9,7 +9,12 @@ import { OpenPageComponent } from './open-page.component'; @NgModule({ declarations: [OpenPageComponent], - imports: [CommonModule, GfValueModule, MatCardModule, OpenPageRoutingModule], + imports: [ + CommonModule, + GfValueComponent, + MatCardModule, + OpenPageRoutingModule + ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class OpenPageModule {} diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index 3e45ec037..190fc673e 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -124,9 +124,6 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { this.dataService .fetchActivities({ filters: this.userService.getFilters(), - range: this.user?.settings?.isExperimentalFeatures - ? this.user?.settings?.dateRange - : undefined, skip: this.pageIndex * this.pageSize, sortColumn: this.sortColumn, sortDirection: this.sortDirection, diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts index c7c14b623..c964022be 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.module.ts @@ -1,5 +1,5 @@ import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; -import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; +import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -17,7 +17,7 @@ import { GfImportActivitiesDialogModule } from './import-activities-dialog/impor imports: [ ActivitiesPageRoutingModule, CommonModule, - GfActivitiesTableModule, + GfActivitiesTableComponent, GfCreateOrUpdateActivityDialogModule, GfImportActivitiesDialogModule, MatButtonModule, diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts index 0d258f1ca..a4d28d0e0 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts @@ -1,6 +1,6 @@ import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; -import { GfSymbolAutocompleteModule } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.module'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -23,8 +23,8 @@ import { CreateOrUpdateActivityDialog } from './create-or-update-activity-dialog CommonModule, FormsModule, GfAssetProfileIconComponent, - GfSymbolAutocompleteModule, - GfValueModule, + GfSymbolAutocompleteComponent, + GfValueComponent, MatAutocompleteModule, MatButtonModule, MatCheckboxModule, diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts index 95573b1d6..664054a54 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts @@ -2,7 +2,7 @@ import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-foote import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module'; import { GfFileDropModule } from '@ghostfolio/client/directives/file-drop/file-drop.module'; import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module'; +import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -22,7 +22,7 @@ import { ImportActivitiesDialog } from './import-activities-dialog.component'; imports: [ CommonModule, FormsModule, - GfActivitiesTableModule, + GfActivitiesTableComponent, GfDialogFooterModule, GfDialogHeaderModule, GfFileDropModule, diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts index b0a027cb5..0f500ab35 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts @@ -1,7 +1,7 @@ import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; -import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -17,10 +17,10 @@ import { AllocationsPageComponent } from './allocations-page.component'; imports: [ AllocationsPageRoutingModule, CommonModule, - GfPortfolioProportionChartModule, - GfPremiumIndicatorModule, + GfPortfolioProportionChartComponent, + GfPremiumIndicatorComponent, GfWorldMapChartModule, - GfValueModule, + GfValueComponent, MatCardModule, MatDialogModule, MatProgressBarModule diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts index 52e45c330..b33905456 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.module.ts @@ -1,9 +1,9 @@ import { GfBenchmarkComparatorModule } from '@ghostfolio/client/components/benchmark-comparator/benchmark-comparator.module'; import { GfInvestmentChartModule } from '@ghostfolio/client/components/investment-chart/investment-chart.module'; import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module'; -import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -18,12 +18,12 @@ import { AnalysisPageComponent } from './analysis-page.component'; imports: [ AnalysisPageRoutingModule, CommonModule, - GfActivitiesFilterModule, + GfActivitiesFilterComponent, GfBenchmarkComparatorModule, GfInvestmentChartModule, - GfPremiumIndicatorModule, + GfPremiumIndicatorComponent, GfToggleModule, - GfValueModule, + GfValueComponent, MatCardModule, NgxSkeletonLoaderModule ], diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.module.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.module.ts index 90b6f204f..60e3127d9 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.module.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.module.ts @@ -1,7 +1,7 @@ import { GfRulesModule } from '@ghostfolio/client/components/rules/rules.module'; -import { GfFireCalculatorModule } from '@ghostfolio/ui/fire-calculator'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfFireCalculatorComponent } from '@ghostfolio/ui/fire-calculator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -15,10 +15,10 @@ import { FirePageComponent } from './fire-page.component'; imports: [ CommonModule, FirePageRoutingModule, - GfFireCalculatorModule, - GfPremiumIndicatorModule, + GfFireCalculatorComponent, + GfPremiumIndicatorComponent, GfRulesModule, - GfValueModule, + GfValueComponent, NgxSkeletonLoaderModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] diff --git a/apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts b/apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts index 8834593e1..107e8f307 100644 --- a/apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts +++ b/apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts @@ -123,7 +123,8 @@ export class HoldingsPageComponent implements OnDestroy, OnInit { } return this.dataService.fetchPortfolioHoldings({ - filters + filters, + range: this.user?.settings?.dateRange }); } diff --git a/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts b/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts index eae26d2b3..a5040f373 100644 --- a/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts +++ b/apps/client/src/app/pages/portfolio/holdings/holdings-page.module.ts @@ -1,5 +1,5 @@ import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module'; -import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module'; +import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -12,7 +12,7 @@ import { HoldingsPageComponent } from './holdings-page.component'; declarations: [HoldingsPageComponent], imports: [ CommonModule, - GfHoldingsTableModule, + GfHoldingsTableComponent, GfToggleModule, HoldingsPageRoutingModule, MatButtonModule diff --git a/apps/client/src/app/pages/pricing/pricing-page.module.ts b/apps/client/src/app/pages/pricing/pricing-page.module.ts index 19bc99ce2..cb3766f13 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.module.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.module.ts @@ -1,4 +1,4 @@ -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; +import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -14,7 +14,7 @@ import { PricingPageComponent } from './pricing-page.component'; declarations: [PricingPageComponent], imports: [ CommonModule, - GfPremiumIndicatorModule, + GfPremiumIndicatorComponent, MatButtonModule, MatCardModule, MatTooltipModule, diff --git a/apps/client/src/app/pages/public/public-page.module.ts b/apps/client/src/app/pages/public/public-page.module.ts index 2a595f7fe..68c43b45f 100644 --- a/apps/client/src/app/pages/public/public-page.module.ts +++ b/apps/client/src/app/pages/public/public-page.module.ts @@ -1,7 +1,7 @@ import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; -import { GfHoldingsTableModule } from '@ghostfolio/ui/holdings-table/holdings-table.module'; -import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; -import { GfValueModule } from '@ghostfolio/ui/value'; +import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table'; +import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -15,9 +15,9 @@ import { PublicPageComponent } from './public-page.component'; declarations: [PublicPageComponent], imports: [ CommonModule, - GfHoldingsTableModule, - GfPortfolioProportionChartModule, - GfValueModule, + GfHoldingsTableComponent, + GfPortfolioProportionChartComponent, + GfValueComponent, GfWorldMapChartModule, MatButtonModule, MatCardModule, diff --git a/apps/client/src/app/pages/register/register-page.module.ts b/apps/client/src/app/pages/register/register-page.module.ts index f0bcfd1a8..b6e917e6d 100644 --- a/apps/client/src/app/pages/register/register-page.module.ts +++ b/apps/client/src/app/pages/register/register-page.module.ts @@ -1,4 +1,4 @@ -import { GfLogoModule } from '@ghostfolio/ui/logo'; +import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; @@ -13,7 +13,7 @@ import { ShowAccessTokenDialogModule } from './show-access-token-dialog/show-acc declarations: [RegisterPageComponent], imports: [ CommonModule, - GfLogoModule, + GfLogoComponent, MatButtonModule, RegisterPageRoutingModule, RouterModule, diff --git a/apps/client/src/app/pages/webauthn/webauthn-page.module.ts b/apps/client/src/app/pages/webauthn/webauthn-page.module.ts index 0ef7d12ce..93f9fe870 100644 --- a/apps/client/src/app/pages/webauthn/webauthn-page.module.ts +++ b/apps/client/src/app/pages/webauthn/webauthn-page.module.ts @@ -1,5 +1,5 @@ import { WebauthnPageComponent } from '@ghostfolio/client/pages/webauthn/webauthn-page.component'; -import { GfLogoModule } from '@ghostfolio/ui/logo'; +import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -12,7 +12,7 @@ import { WebauthnPageRoutingModule } from './webauthn-page-routing.module'; declarations: [WebauthnPageComponent], imports: [ CommonModule, - GfLogoModule, + GfLogoComponent, MatButtonModule, MatProgressSpinnerModule, WebauthnPageRoutingModule diff --git a/apps/client/src/app/pages/webauthn/webauthn-page.scss b/apps/client/src/app/pages/webauthn/webauthn-page.scss index 5d4e87f30..e138a380b 100644 --- a/apps/client/src/app/pages/webauthn/webauthn-page.scss +++ b/apps/client/src/app/pages/webauthn/webauthn-page.scss @@ -1,3 +1,9 @@ :host { display: block; + + button { + @media (max-width: 575.98px) { + width: 100%; + } + } } diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 8a3f7d293..16d104834 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -42,7 +42,11 @@ import { translate } from '@ghostfolio/ui/i18n'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { SortDirection } from '@angular/material/sort'; -import { DataSource, Order as OrderModel } from '@prisma/client'; +import { + AccountBalance, + DataSource, + Order as OrderModel +} from '@prisma/client'; import { format, parseISO } from 'date-fns'; import { cloneDeep, groupBy, isNumber } from 'lodash'; import { Observable } from 'rxjs'; @@ -464,13 +468,21 @@ export class DataService { } public fetchPortfolioHoldings({ - filters + filters, + range }: { filters?: Filter[]; - } = {}) { + range?: DateRange; + }) { + let params = this.buildFiltersAsQueryParams({ filters }); + + if (range) { + params = params.append('range', range); + } + return this.http .get('/api/v1/portfolio/holdings', { - params: this.buildFiltersAsQueryParams({ filters }) + params }) .pipe( map((response) => { @@ -603,6 +615,22 @@ export class DataService { return this.http.post(`/api/v1/account`, aAccount); } + public postAccountBalance({ + accountId, + balance, + date + }: { + accountId: string; + balance: number; + date: Date; + }) { + return this.http.post(`/api/v1/account-balance`, { + accountId, + balance, + date + }); + } + public postBenchmark(benchmark: UniqueAsset) { return this.http.post(`/api/v1/benchmark`, benchmark); } diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 033f5c58d..ef828af83 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -218,7 +218,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -294,7 +294,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -314,7 +314,7 @@ Jobs löschen apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -362,7 +362,7 @@ Versuche apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -370,7 +370,7 @@ Erstellt apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -378,7 +378,7 @@ Abgeschlossen apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -386,7 +386,7 @@ Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -410,7 +410,7 @@ Daten anzeigen apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -418,7 +418,7 @@ Stacktrace anzeigen apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -426,7 +426,7 @@ Job löschen apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -450,7 +450,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -728,6 +728,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -1596,7 +1600,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -1608,7 +1612,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -1620,7 +1624,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -1632,7 +1636,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -1644,7 +1648,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -1656,7 +1660,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -1668,7 +1672,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -1676,7 +1680,7 @@ Okay apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2748,7 +2752,7 @@ Möchtest du diese Aktivität wirklich löschen? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -2824,7 +2828,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2836,7 +2840,7 @@ Ups! Es ist etwas schief gelaufen. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2984,7 +2988,7 @@ Einlage libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -2992,7 +2996,7 @@ Verzinsung libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -3004,7 +3008,7 @@ Ersparnisse libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -3324,7 +3328,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -3332,11 +3336,11 @@ Keine Daten verfügbar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -4108,7 +4112,7 @@ Möchtest du wirklich alle Aktivitäten löschen? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -11152,7 +11156,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -11188,7 +11192,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -13436,7 +13440,7 @@ Finde Position... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14636,7 +14640,7 @@ Möchtest du diesen Cash-Bestand wirklich löschen? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14804,7 +14808,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14812,7 +14816,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14820,7 +14824,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14828,7 +14832,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14836,7 +14840,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14880,7 +14884,7 @@ Jahr libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14888,7 +14892,7 @@ Jahre libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14972,7 +14976,7 @@ Ups! Es sieht so aus, als würdest du zu viele Anfragen senden. Bitte geh es ein bisschen langsamer an. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15020,7 +15024,23 @@ Job ausführen apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priorität + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + Diese Aktion ist nicht zulässig. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index c770a2dc2..4e480b139 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -219,7 +219,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -295,7 +295,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -315,7 +315,7 @@ Elimina los trabajos apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -363,7 +363,7 @@ Intentos apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -371,7 +371,7 @@ Creado apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -379,7 +379,7 @@ Finalizado apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -387,7 +387,7 @@ Estado apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -411,7 +411,7 @@ Visualiza los datos apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -419,7 +419,7 @@ Visualiza Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -427,7 +427,7 @@ Elimina el trabajo apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -451,7 +451,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -729,6 +729,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -1594,7 +1598,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -1606,7 +1610,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -1618,7 +1622,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -1630,7 +1634,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -1642,7 +1646,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -1654,7 +1658,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -1666,7 +1670,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -1674,7 +1678,7 @@ De acuerdo apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2746,7 +2750,7 @@ ¿Estás seguro de eliminar esta operación? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -2818,7 +2822,7 @@ Vaya! Algo no funcionó bien. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2834,7 +2838,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2974,7 +2978,7 @@ Ahorros libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -2982,7 +2986,7 @@ Interés libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -2994,7 +2998,7 @@ Depósito libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -3322,7 +3326,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -3330,11 +3334,11 @@ Sin datos disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -4106,7 +4110,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -11150,7 +11154,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -11186,7 +11190,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -13434,7 +13438,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14634,7 +14638,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14802,7 +14806,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14810,7 +14814,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14818,7 +14822,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14826,7 +14830,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14834,7 +14838,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14878,7 +14882,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14886,7 +14890,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14970,7 +14974,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15018,7 +15022,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 3a241feda..fbc210fce 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -274,7 +274,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -350,7 +350,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -410,7 +410,7 @@ Tentatives apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -418,7 +418,7 @@ Créé apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -426,7 +426,7 @@ Terminé apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -434,7 +434,7 @@ Statut apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -442,7 +442,7 @@ Supprimer Tâches apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -466,7 +466,7 @@ Voir Données apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -474,7 +474,7 @@ Voir la Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -482,7 +482,7 @@ Supprimer Tâche apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -506,7 +506,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -988,6 +988,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -1578,7 +1582,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -1590,7 +1594,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -1925,7 +1929,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -1937,7 +1941,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -1949,7 +1953,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -1961,7 +1965,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -1973,7 +1977,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -1993,7 +1997,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2005,7 +2009,7 @@ Oups! Quelque chose s'est mal passé. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2017,7 +2021,7 @@ D'accord apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2925,7 +2929,7 @@ Dépôt libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -3265,7 +3269,7 @@ Voulez-vous vraiment supprimer cette activité ? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -3313,7 +3317,7 @@ Intérêt libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -3325,7 +3329,7 @@ Épargne libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -3385,7 +3389,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -3561,11 +3565,11 @@ Pas de données disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -4105,7 +4109,7 @@ Voulez-vous vraiment supprimer toutes vos activités ? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -11149,7 +11153,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -11185,7 +11189,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -13433,7 +13437,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14633,7 +14637,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14801,7 +14805,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14809,7 +14813,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14817,7 +14821,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14825,7 +14829,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14833,7 +14837,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14877,7 +14881,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14885,7 +14889,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14969,7 +14973,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15017,7 +15021,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 99f669151..7075781c5 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -219,7 +219,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -295,7 +295,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -315,7 +315,7 @@ Elimina i lavori apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -363,7 +363,7 @@ Tentativi apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -371,7 +371,7 @@ Creato apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -379,7 +379,7 @@ Finito apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -387,7 +387,7 @@ Stato apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -411,7 +411,7 @@ Visualizza i dati apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -419,7 +419,7 @@ Visualizza Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -427,7 +427,7 @@ Elimina il lavoro apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -451,7 +451,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -729,6 +729,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -1594,7 +1598,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -1606,7 +1610,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -1618,7 +1622,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -1630,7 +1634,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -1642,7 +1646,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -1654,7 +1658,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -1666,7 +1670,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -1674,7 +1678,7 @@ Bene apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2746,7 +2750,7 @@ Vuoi davvero eliminare questa attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -2818,7 +2822,7 @@ Ops! Qualcosa è andato storto. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2834,7 +2838,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2974,7 +2978,7 @@ Risparmio libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -2982,7 +2986,7 @@ Interesse libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -2994,7 +2998,7 @@ Deposito libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -3322,7 +3326,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -3330,11 +3334,11 @@ Nessun dato disponibile libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -4106,7 +4110,7 @@ Vuoi davvero eliminare tutte le tue attività? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -11150,7 +11154,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -11186,7 +11190,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -13434,7 +13438,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14634,7 +14638,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14802,7 +14806,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14810,7 +14814,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14818,7 +14822,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14826,7 +14830,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14834,7 +14838,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14878,7 +14882,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14886,7 +14890,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14970,7 +14974,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15018,7 +15022,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 9116a411a..b4b13691a 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -218,7 +218,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -294,7 +294,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -314,7 +314,7 @@ Taken verwijderen apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -362,7 +362,7 @@ Pogingen apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -370,7 +370,7 @@ Aangemaakt apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -378,7 +378,7 @@ Voltooid apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -386,7 +386,7 @@ Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -410,7 +410,7 @@ Bekijk gegevens apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -418,7 +418,7 @@ Bekijk Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -426,7 +426,7 @@ Taak verwijderen apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -450,7 +450,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -728,6 +728,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -1593,7 +1597,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -1605,7 +1609,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -1617,7 +1621,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -1629,7 +1633,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -1641,7 +1645,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -1653,7 +1657,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -1665,7 +1669,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -1673,7 +1677,7 @@ Oké apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2745,7 +2749,7 @@ Wil je deze activiteit echt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -2817,7 +2821,7 @@ Oeps! Er ging iets mis. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2833,7 +2837,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -2973,7 +2977,7 @@ Besparingen libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -2981,7 +2985,7 @@ Rente libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -2993,7 +2997,7 @@ Storting libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -3321,7 +3325,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -3329,11 +3333,11 @@ Geen gegevens beschikbaar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -4105,7 +4109,7 @@ Wil je echt al je activiteiten verwijderen? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -11149,7 +11153,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -11185,7 +11189,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -13433,7 +13437,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14633,7 +14637,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14801,7 +14805,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14809,7 +14813,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14817,7 +14821,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14825,7 +14829,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14833,7 +14837,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14877,7 +14881,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14885,7 +14889,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14969,7 +14973,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15017,7 +15021,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index c02f78aee..1d7e40388 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -654,7 +654,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -690,7 +690,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -1790,7 +1790,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1866,7 +1866,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1942,7 +1942,7 @@ Attempts apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -1950,7 +1950,7 @@ Created apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -1958,7 +1958,7 @@ Finished apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -1966,7 +1966,7 @@ Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -1974,7 +1974,7 @@ Delete Jobs apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -1982,7 +1982,7 @@ View Data apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -1990,7 +1990,7 @@ View Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -1998,7 +1998,7 @@ Delete Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -2022,7 +2022,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2616,6 +2616,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -3138,7 +3142,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -3150,7 +3154,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -3688,7 +3692,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -3700,7 +3704,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -3712,7 +3716,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -3724,7 +3728,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -3736,7 +3740,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -4016,7 +4020,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4028,7 +4032,7 @@ Oops! Something went wrong. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4040,7 +4044,7 @@ Okay apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4952,7 +4956,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -5396,7 +5400,7 @@ Deposit libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -13220,7 +13224,7 @@ Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -13228,7 +13232,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -13328,7 +13332,7 @@ Interest libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -13340,7 +13344,7 @@ Savings libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -13496,7 +13500,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -13792,11 +13796,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -14636,7 +14640,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14804,7 +14808,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14812,7 +14816,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14820,7 +14824,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14828,7 +14832,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14836,7 +14840,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14880,7 +14884,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14888,7 +14892,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14972,7 +14976,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15020,7 +15024,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 6ebacade4..d7156d354 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -274,7 +274,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -350,7 +350,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -410,7 +410,7 @@ Tentativas apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -418,7 +418,7 @@ Criado apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -426,7 +426,7 @@ Terminado apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -434,7 +434,7 @@ Estado apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -442,7 +442,7 @@ Eliminar Tarefas apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -466,7 +466,7 @@ Visualizar dados apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -474,7 +474,7 @@ Ver Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -482,7 +482,7 @@ Apagar Tarefa apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -506,7 +506,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -856,6 +856,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -1446,7 +1450,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -1458,7 +1462,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -1474,7 +1478,7 @@ Depósito libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -1901,7 +1905,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -1913,7 +1917,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -1925,7 +1929,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -1937,7 +1941,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -1949,7 +1953,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -1969,7 +1973,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -1981,7 +1985,7 @@ Oops! Ocorreu um erro. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -1993,7 +1997,7 @@ OK apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -3137,7 +3141,7 @@ Deseja realmente eliminar esta atividade? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -3185,7 +3189,7 @@ Juros libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -3197,7 +3201,7 @@ Poupanças libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -3233,7 +3237,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -3409,11 +3413,11 @@ Sem dados disponíveis libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -4105,7 +4109,7 @@ Deseja mesmo eliminar todas as suas atividades? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -11149,7 +11153,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -11185,7 +11189,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -13433,7 +13437,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14633,7 +14637,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14801,7 +14805,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14809,7 +14813,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14817,7 +14821,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14825,7 +14829,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14833,7 +14837,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14877,7 +14881,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14885,7 +14889,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14969,7 +14973,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15017,7 +15021,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 39f5817ce..51dd75275 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -654,7 +654,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -690,7 +690,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -1754,7 +1754,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1830,7 +1830,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1890,7 +1890,7 @@ Deneme apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -1898,7 +1898,7 @@ Oluşturuldu apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -1906,7 +1906,7 @@ Tamamlandı apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -1914,7 +1914,7 @@ Durum apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -1922,7 +1922,7 @@ İşleri Sil apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -1946,7 +1946,7 @@ Veri Gör apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -1954,7 +1954,7 @@ Hata İzini Görüntüle apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -1962,7 +1962,7 @@ İşleri Sil apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -1986,7 +1986,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2528,6 +2528,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -2990,7 +2994,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -3002,7 +3006,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -3529,7 +3533,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -3541,7 +3545,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -3553,7 +3557,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -3565,7 +3569,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -3577,7 +3581,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -3597,7 +3601,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -3609,7 +3613,7 @@ Hay Allah! Bir şeyler yanlış gitti. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -3621,7 +3625,7 @@ Tamam apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4453,7 +4457,7 @@ Tüm işlemlerinizi silmeyi gerçekten istiyor musunuz? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -4873,7 +4877,7 @@ Para Yatırma libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -12669,7 +12673,7 @@ TBu işlemi silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -12741,7 +12745,7 @@ Faiz libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -12753,7 +12757,7 @@ Tasarruflar libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -12909,7 +12913,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -13157,11 +13161,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -13433,7 +13437,7 @@ Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14633,7 +14637,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14801,7 +14805,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14809,7 +14813,7 @@ WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14817,7 +14821,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14825,7 +14829,7 @@ MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14833,7 +14837,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14877,7 +14881,7 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14885,7 +14889,7 @@ years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14969,7 +14973,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15017,7 +15021,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 53ff1578b..b39de189e 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -649,7 +649,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -685,7 +685,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -1759,7 +1759,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1833,7 +1833,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1903,56 +1903,56 @@ Attempts apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 Created apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 Finished apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 Delete Jobs apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 View Data apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 View Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 Delete Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -1974,7 +1974,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2523,6 +2523,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -2992,7 +2996,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -3003,7 +3007,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -3488,7 +3492,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -3499,7 +3503,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -3510,7 +3514,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -3521,7 +3525,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -3532,7 +3536,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -3779,7 +3783,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -3790,7 +3794,7 @@ Oops! Something went wrong. apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -3801,7 +3805,7 @@ Okay apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4615,7 +4619,7 @@ Do you really want to delete all your activities? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -5011,7 +5015,7 @@ Deposit libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -13459,7 +13463,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -13538,14 +13542,14 @@ Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 Find holding... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -13647,7 +13651,7 @@ Interest libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -13658,7 +13662,7 @@ Savings libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -13795,7 +13799,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -14054,11 +14058,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -14200,35 +14204,35 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 MTD libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 WTD libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14267,14 +14271,14 @@ year libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 years libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14349,7 +14353,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -14391,7 +14395,21 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 + + + + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index fa47da7e0..8b44e31b6 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -655,7 +655,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 81 + 83 apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -691,7 +691,7 @@ libs/ui/src/lib/membership-card/membership-card.component.ts - 13 + 25 @@ -1799,7 +1799,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 20 + 34 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1875,7 +1875,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 51 + 80 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1951,7 +1951,7 @@ 尝试 apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 82 @@ -1959,7 +1959,7 @@ 创建 apps/client/src/app/components/admin-jobs/admin-jobs.html - 72 + 91 @@ -1967,7 +1967,7 @@ 完成的 apps/client/src/app/components/admin-jobs/admin-jobs.html - 81 + 100 @@ -1975,7 +1975,7 @@ 状况 apps/client/src/app/components/admin-jobs/admin-jobs.html - 90 + 109 @@ -1983,7 +1983,7 @@ 删除作业 apps/client/src/app/components/admin-jobs/admin-jobs.html - 126 + 158 @@ -1991,7 +1991,7 @@ 查看数据 apps/client/src/app/components/admin-jobs/admin-jobs.html - 141 + 173 @@ -1999,7 +1999,7 @@ 查看堆栈跟踪 apps/client/src/app/components/admin-jobs/admin-jobs.html - 148 + 180 @@ -2007,7 +2007,7 @@ 删除作业 apps/client/src/app/components/admin-jobs/admin-jobs.html - 154 + 186 @@ -2031,7 +2031,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 11 + 12 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2633,6 +2633,10 @@ apps/client/src/app/components/admin-overview/admin-overview.html 231 + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + Housekeeping @@ -3155,7 +3159,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 68 + 69 @@ -3167,7 +3171,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 70 + 72 @@ -3705,7 +3709,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 188 + 215 @@ -3717,7 +3721,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -3729,7 +3733,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -3741,7 +3745,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -3753,7 +3757,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 209 + 236 @@ -4033,7 +4037,7 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 91 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4045,7 +4049,7 @@ 哎呀!出了些问题。 apps/client/src/app/core/http-response.interceptor.ts - 87 + 89 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4057,7 +4061,7 @@ 好的 apps/client/src/app/core/http-response.interceptor.ts - 90 + 92 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -4969,7 +4973,7 @@ 您真的要删除所有活动吗? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts - 171 + 168 @@ -5413,7 +5417,7 @@ 订金 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 332 + 357 @@ -13965,7 +13969,7 @@ 您确实要删除该帐户余额吗? libs/ui/src/lib/account-balances/account-balances.component.ts - 58 + 104 @@ -14053,7 +14057,7 @@ 您确实要删除此活动吗? libs/ui/src/lib/activities-table/activities-table.component.ts - 175 + 215 @@ -14061,7 +14065,7 @@ 查找持有... libs/ui/src/lib/assistant/assistant.component.ts - 111 + 138 @@ -14177,7 +14181,7 @@ 利息 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 342 + 367 libs/ui/src/lib/i18n.ts @@ -14189,7 +14193,7 @@ 储蓄 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts - 352 + 377 @@ -14345,7 +14349,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 385 + 389 @@ -14641,11 +14645,11 @@ 无可用数据 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 387 + 391 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 404 @@ -14805,7 +14809,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 198 + 225 @@ -14813,7 +14817,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14821,7 +14825,7 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14829,7 +14833,7 @@ 最大输运量 libs/ui/src/lib/assistant/assistant.component.ts - 194 + 221 @@ -14837,7 +14841,7 @@ 世界贸易组织 libs/ui/src/lib/assistant/assistant.component.ts - 190 + 217 @@ -14881,7 +14885,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 202 + 229 @@ -14889,7 +14893,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 206 + 233 @@ -14973,7 +14977,7 @@ 哎呀!看来您提出了太多要求。请慢一点。 apps/client/src/app/core/http-response.interceptor.ts - 105 + 107 @@ -15021,7 +15025,23 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 151 + 183 + + + + Priority + Priority + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 63 + + + + This action is not allowed. + This action is not allowed. + + apps/client/src/app/core/http-response.interceptor.ts + 70 diff --git a/git-hooks/pre-commit b/git-hooks/pre-commit old mode 100644 new mode 100755 diff --git a/libs/common/src/lib/interfaces/symbol-metrics.interface.ts b/libs/common/src/lib/interfaces/symbol-metrics.interface.ts index 57eed9212..6b78f273a 100644 --- a/libs/common/src/lib/interfaces/symbol-metrics.interface.ts +++ b/libs/common/src/lib/interfaces/symbol-metrics.interface.ts @@ -40,6 +40,7 @@ export interface SymbolMetrics { [date: string]: Big; }; timeWeightedInvestmentWithCurrencyEffect: Big; + totalAccountBalanceInBaseCurrency: Big; totalDividend: Big; totalDividendInBaseCurrency: Big; totalInterest: Big; diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts index 09bbfa1bd..890cb8b63 100644 --- a/libs/common/src/lib/permissions.ts +++ b/libs/common/src/lib/permissions.ts @@ -7,6 +7,7 @@ export const permissions = { accessAssistant: 'accessAssistant', createAccess: 'createAccess', createAccount: 'createAccount', + createAccountBalance: 'createAccountBalance', createOrder: 'createOrder', createPlatform: 'createPlatform', createTag: 'createTag', @@ -47,6 +48,7 @@ export function getPermissions(aRole: Role): string[] { permissions.accessAssistant, permissions.createAccess, permissions.createAccount, + permissions.createAccountBalance, permissions.deleteAccountBalance, permissions.createOrder, permissions.createPlatform, @@ -75,6 +77,7 @@ export function getPermissions(aRole: Role): string[] { permissions.accessAssistant, permissions.createAccess, permissions.createAccount, + permissions.createAccountBalance, permissions.createOrder, permissions.deleteAccess, permissions.deleteAccount, diff --git a/libs/ui/src/lib/account-balances/account-balances.component.html b/libs/ui/src/lib/account-balances/account-balances.component.html index 0d1a79f41..0cfa4a5da 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.html +++ b/libs/ui/src/lib/account-balances/account-balances.component.html @@ -1,60 +1,106 @@ - - - - - + +
- Date - - -
+ + + + + - - - - + + + + + - - - + + - + + - - -
+ Date + + + + + + + + + + + - Value - -
- -
-
+ Value + +
+ +
+
+
+ + +
+ {{ accountCurrency }} +
+
+
+
- @if (showActions) { + + + @if (showActions) { + + } + + + + - } - - - -
+ + + + + diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts index 65f2547b9..c4fd379c8 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.ts +++ b/libs/ui/src/lib/account-balances/account-balances.component.ts @@ -1,7 +1,9 @@ import { getLocale } from '@ghostfolio/common/helper'; import { AccountBalancesResponse } from '@ghostfolio/common/interfaces'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, EventEmitter, @@ -12,37 +14,81 @@ import { Output, ViewChild } from '@angular/core'; -import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; +import { + FormGroup, + FormControl, + Validators, + ReactiveFormsModule +} from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { DateAdapter } from '@angular/material/core'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { get } from 'lodash'; import { Subject } from 'rxjs'; +import { GfValueComponent } from '../value'; + @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + GfValueComponent, + MatButtonModule, + MatDatepickerModule, + MatFormFieldModule, + MatInputModule, + MatMenuModule, + MatSortModule, + MatTableModule, + ReactiveFormsModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-account-balances', + standalone: true, styleUrls: ['./account-balances.component.scss'], templateUrl: './account-balances.component.html' }) -export class AccountBalancesComponent implements OnChanges, OnDestroy, OnInit { +export class GfAccountBalancesComponent + implements OnChanges, OnDestroy, OnInit +{ @Input() accountBalances: AccountBalancesResponse['balances']; + @Input() accountCurrency: string; @Input() accountId: string; @Input() locale = getLocale(); @Input() showActions = true; + @Output() accountBalanceCreated = new EventEmitter<{ + balance: number; + date: Date; + }>(); @Output() accountBalanceDeleted = new EventEmitter(); @ViewChild(MatSort) sort: MatSort; + public accountBalanceForm = new FormGroup({ + balance: new FormControl(0, Validators.required), + date: new FormControl(new Date(), Validators.required) + }); + public dataSource: MatTableDataSource< AccountBalancesResponse['balances'][0] > = new MatTableDataSource(); + public displayedColumns: string[] = ['date', 'value', 'actions']; + public Validators = Validators; private unsubscribeSubject = new Subject(); - public constructor() {} + public constructor(private dateAdapter: DateAdapter) {} - public ngOnInit() {} + public ngOnInit() { + this.dateAdapter.setLocale(this.locale); + } public ngOnChanges() { if (this.accountBalances) { @@ -63,6 +109,10 @@ export class AccountBalancesComponent implements OnChanges, OnDestroy, OnInit { } } + public onSubmitAccountBalance() { + this.accountBalanceCreated.emit(this.accountBalanceForm.getRawValue()); + } + public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); diff --git a/libs/ui/src/lib/account-balances/account-balances.module.ts b/libs/ui/src/lib/account-balances/account-balances.module.ts deleted file mode 100644 index a789dcc39..000000000 --- a/libs/ui/src/lib/account-balances/account-balances.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { GfValueModule } from '@ghostfolio/ui/value'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; - -import { AccountBalancesComponent } from './account-balances.component'; - -@NgModule({ - declarations: [AccountBalancesComponent], - exports: [AccountBalancesComponent], - imports: [ - CommonModule, - GfValueModule, - MatButtonModule, - MatMenuModule, - MatSortModule, - MatTableModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfAccountBalancesModule {} diff --git a/libs/ui/src/lib/account-balances/index.ts b/libs/ui/src/lib/account-balances/index.ts new file mode 100644 index 000000000..b32ba9a0f --- /dev/null +++ b/libs/ui/src/lib/account-balances/index.ts @@ -0,0 +1 @@ +export * from './account-balances.component'; diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.ts b/libs/ui/src/lib/activities-filter/activities-filter.component.ts index db4cc2d31..6244fa5fc 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.ts +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.ts @@ -1,8 +1,11 @@ +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { Filter, FilterGroup } from '@ghostfolio/common/interfaces'; import { translate } from '@ghostfolio/ui/i18n'; import { COMMA, ENTER } from '@angular/cdk/keycodes'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, ElementRef, @@ -14,23 +17,39 @@ import { SimpleChanges, ViewChild } from '@angular/core'; -import { FormControl } from '@angular/forms'; +import { FormControl, ReactiveFormsModule } from '@angular/forms'; import { MatAutocomplete, + MatAutocompleteModule, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { MatButtonModule } from '@angular/material/button'; +import { MatChipInputEvent, MatChipsModule } from '@angular/material/chips'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { groupBy } from 'lodash'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + GfSymbolModule, + MatAutocompleteModule, + MatButtonModule, + MatChipsModule, + MatInputModule, + MatProgressSpinnerModule, + ReactiveFormsModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-activities-filter', + standalone: true, styleUrls: ['./activities-filter.component.scss'], templateUrl: './activities-filter.component.html' }) -export class ActivitiesFilterComponent implements OnChanges, OnDestroy { +export class GfActivitiesFilterComponent implements OnChanges, OnDestroy { @Input() allFilters: Filter[]; @Input() isLoading: boolean; @Input() placeholder: string; diff --git a/libs/ui/src/lib/activities-filter/activities-filter.module.ts b/libs/ui/src/lib/activities-filter/activities-filter.module.ts deleted file mode 100644 index 56f082e7b..000000000 --- a/libs/ui/src/lib/activities-filter/activities-filter.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -import { ActivitiesFilterComponent } from './activities-filter.component'; - -@NgModule({ - declarations: [ActivitiesFilterComponent], - exports: [ActivitiesFilterComponent], - imports: [ - CommonModule, - GfSymbolModule, - MatAutocompleteModule, - MatButtonModule, - MatChipsModule, - MatInputModule, - MatProgressSpinnerModule, - ReactiveFormsModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfActivitiesFilterModule {} diff --git a/libs/ui/src/lib/activities-filter/index.ts b/libs/ui/src/lib/activities-filter/index.ts new file mode 100644 index 000000000..ef776e130 --- /dev/null +++ b/libs/ui/src/lib/activities-filter/index.ts @@ -0,0 +1 @@ +export * from './activities-filter.component'; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts index af42f86e4..edc0cc64f 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -1,12 +1,19 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { getDateFormatString, getLocale } from '@ghostfolio/common/helper'; import { UniqueAsset } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; +import { GfActivityTypeComponent } from '@ghostfolio/ui/activity-type'; +import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; +import { GfValueComponent } from '@ghostfolio/ui/value'; import { SelectionModel } from '@angular/cdk/collections'; +import { CommonModule } from '@angular/common'; import { AfterViewInit, + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, EventEmitter, @@ -17,21 +24,54 @@ import { Output, ViewChild } from '@angular/core'; -import { MatPaginator, PageEvent } from '@angular/material/paginator'; -import { MatSort, Sort, SortDirection } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; -import { Router } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatMenuModule } from '@angular/material/menu'; +import { + MatPaginator, + MatPaginatorModule, + PageEvent +} from '@angular/material/paginator'; +import { + MatSort, + MatSortModule, + Sort, + SortDirection +} from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { Router, RouterModule } from '@angular/router'; import { isUUID } from 'class-validator'; import { endOfToday, isAfter } from 'date-fns'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, Subscription, takeUntil } from 'rxjs'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + GfActivityTypeComponent, + GfAssetProfileIconComponent, + GfNoTransactionsInfoComponent, + GfSymbolModule, + GfValueComponent, + MatButtonModule, + MatCheckboxModule, + MatMenuModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + MatTooltipModule, + NgxSkeletonLoaderModule, + RouterModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-activities-table', + standalone: true, styleUrls: ['./activities-table.component.scss'], templateUrl: './activities-table.component.html' }) -export class ActivitiesTableComponent +export class GfActivitiesTableComponent implements AfterViewInit, OnChanges, OnDestroy, OnInit { @Input() baseCurrency: string; diff --git a/libs/ui/src/lib/activities-table/activities-table.module.ts b/libs/ui/src/lib/activities-table/activities-table.module.ts deleted file mode 100644 index 1d80c9fb0..000000000 --- a/libs/ui/src/lib/activities-table/activities-table.module.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfActivityTypeModule } from '@ghostfolio/ui/activity-type'; -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; -import { GfValueModule } from '@ghostfolio/ui/value'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { RouterModule } from '@angular/router'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { ActivitiesTableComponent } from './activities-table.component'; - -@NgModule({ - declarations: [ActivitiesTableComponent], - exports: [ActivitiesTableComponent], - imports: [ - CommonModule, - GfActivityTypeModule, - GfAssetProfileIconComponent, - GfNoTransactionsInfoModule, - GfSymbolModule, - GfValueModule, - MatButtonModule, - MatCheckboxModule, - MatMenuModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - MatTooltipModule, - NgxSkeletonLoaderModule, - RouterModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfActivitiesTableModule {} diff --git a/libs/ui/src/lib/activities-table/index.ts b/libs/ui/src/lib/activities-table/index.ts new file mode 100644 index 000000000..82eee49b1 --- /dev/null +++ b/libs/ui/src/lib/activities-table/index.ts @@ -0,0 +1 @@ +export * from './activities-table.component'; diff --git a/libs/ui/src/lib/activity-type/activity-type.component.ts b/libs/ui/src/lib/activity-type/activity-type.component.ts index bf7621882..1554794b3 100644 --- a/libs/ui/src/lib/activity-type/activity-type.component.ts +++ b/libs/ui/src/lib/activity-type/activity-type.component.ts @@ -1,6 +1,8 @@ import { translate } from '@ghostfolio/ui/i18n'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, Input, @@ -10,11 +12,14 @@ import { Type as ActivityType } from '@prisma/client'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-activity-type', + standalone: true, styleUrls: ['./activity-type.component.scss'], templateUrl: './activity-type.component.html' }) -export class ActivityTypeComponent implements OnChanges { +export class GfActivityTypeComponent implements OnChanges { @Input() activityType: ActivityType; public activityTypeLabel: string; diff --git a/libs/ui/src/lib/activity-type/activity-type.module.ts b/libs/ui/src/lib/activity-type/activity-type.module.ts deleted file mode 100644 index e4cc71815..000000000 --- a/libs/ui/src/lib/activity-type/activity-type.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; - -import { ActivityTypeComponent } from './activity-type.component'; - -@NgModule({ - declarations: [ActivityTypeComponent], - exports: [ActivityTypeComponent], - imports: [CommonModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfActivityTypeModule {} diff --git a/libs/ui/src/lib/activity-type/index.ts b/libs/ui/src/lib/activity-type/index.ts index a1e626fef..9fcf60eeb 100644 --- a/libs/ui/src/lib/activity-type/index.ts +++ b/libs/ui/src/lib/activity-type/index.ts @@ -1 +1 @@ -export * from './activity-type.module'; +export * from './activity-type.component'; diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts index bb67b16c5..b909145c7 100644 --- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts +++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts @@ -1,6 +1,8 @@ +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { ISearchResultItem } from '@ghostfolio/ui/assistant/interfaces/interfaces'; import { FocusableOption } from '@angular/cdk/a11y'; +import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -13,15 +15,19 @@ import { Output, ViewChild } from '@angular/core'; -import { Params } from '@angular/router'; +import { Params, RouterModule } from '@angular/router'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule, GfSymbolModule, RouterModule], selector: 'gf-assistant-list-item', - templateUrl: './assistant-list-item.html', - styleUrls: ['./assistant-list-item.scss'] + standalone: true, + styleUrls: ['./assistant-list-item.scss'], + templateUrl: './assistant-list-item.html' }) -export class AssistantListItemComponent implements FocusableOption, OnChanges { +export class GfAssistantListItemComponent + implements FocusableOption, OnChanges +{ @HostBinding('attr.tabindex') tabindex = -1; @HostBinding('class.has-focus') get getHasFocus() { return this.hasFocus; diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.module.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.module.ts deleted file mode 100644 index fb512ee5e..000000000 --- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; - -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { AssistantListItemComponent } from './assistant-list-item.component'; - -@NgModule({ - declarations: [AssistantListItemComponent], - exports: [AssistantListItemComponent], - imports: [CommonModule, GfSymbolModule, RouterModule] -}) -export class GfAssistantListItemModule {} diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index 310bede05..f932fd5c2 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -1,3 +1,4 @@ +import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { Filter, User } from '@ghostfolio/common/interfaces'; @@ -5,7 +6,9 @@ import { DateRange } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; import { FocusKeyManager } from '@angular/cdk/a11y'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, @@ -21,10 +24,20 @@ import { ViewChild, ViewChildren } from '@angular/core'; -import { FormBuilder, FormControl } from '@angular/forms'; +import { + FormBuilder, + FormControl, + FormsModule, + ReactiveFormsModule +} from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatMenuTrigger } from '@angular/material/menu'; +import { MatSelectModule } from '@angular/material/select'; +import { RouterModule } from '@angular/router'; import { Account, AssetClass } from '@prisma/client'; import { eachYearOfInterval, format } from 'date-fns'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { EMPTY, Observable, Subject, lastValueFrom } from 'rxjs'; import { catchError, @@ -35,7 +48,7 @@ import { takeUntil } from 'rxjs/operators'; -import { AssistantListItemComponent } from './assistant-list-item/assistant-list-item.component'; +import { GfAssistantListItemComponent } from './assistant-list-item/assistant-list-item.component'; import { IDateRangeOption, ISearchResultItem, @@ -44,11 +57,25 @@ import { @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + FormsModule, + GfAssetProfileIconComponent, + GfAssistantListItemComponent, + MatButtonModule, + MatFormFieldModule, + MatSelectModule, + NgxSkeletonLoaderModule, + ReactiveFormsModule, + RouterModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-assistant', + standalone: true, styleUrls: ['./assistant.scss'], templateUrl: './assistant.html' }) -export class AssistantComponent implements OnChanges, OnDestroy, OnInit { +export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { @HostListener('document:keydown', ['$event']) onKeydown( event: KeyboardEvent ) { @@ -92,8 +119,8 @@ export class AssistantComponent implements OnChanges, OnDestroy, OnInit { @ViewChild('menuTrigger') menuTriggerElement: MatMenuTrigger; @ViewChild('search', { static: true }) searchElement: ElementRef; - @ViewChildren(AssistantListItemComponent) - assistantListItems: QueryList; + @ViewChildren(GfAssistantListItemComponent) + assistantListItems: QueryList; public static readonly SEARCH_RESULTS_DEFAULT_LIMIT = 5; @@ -117,7 +144,7 @@ export class AssistantComponent implements OnChanges, OnDestroy, OnInit { public tags: Filter[] = []; private filterTypes: Filter['type'][] = ['ACCOUNT', 'ASSET_CLASS', 'TAG']; - private keyManager: FocusKeyManager; + private keyManager: FocusKeyManager; private unsubscribeSubject = new Subject(); public constructor( @@ -334,7 +361,7 @@ export class AssistantComponent implements OnChanges, OnDestroy, OnInit { ); assetProfiles = assetProfiles.slice( 0, - AssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT + GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT ); } catch {} } @@ -343,7 +370,7 @@ export class AssistantComponent implements OnChanges, OnDestroy, OnInit { holdings = await lastValueFrom(this.searchHoldings(aSearchTerm)); holdings = holdings.slice( 0, - AssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT + GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT ); } catch {} @@ -364,7 +391,7 @@ export class AssistantComponent implements OnChanges, OnDestroy, OnInit { type: 'SEARCH_QUERY' } ], - take: AssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT + take: GfAssistantComponent.SEARCH_RESULTS_DEFAULT_LIMIT }) .pipe( catchError(() => { diff --git a/libs/ui/src/lib/assistant/assistant.module.ts b/libs/ui/src/lib/assistant/assistant.module.ts deleted file mode 100644 index 031f57f46..000000000 --- a/libs/ui/src/lib/assistant/assistant.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { RouterModule } from '@angular/router'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { GfAssistantListItemModule } from './assistant-list-item/assistant-list-item.module'; -import { AssistantComponent } from './assistant.component'; - -@NgModule({ - declarations: [AssistantComponent], - exports: [AssistantComponent], - imports: [ - CommonModule, - FormsModule, - GfAssetProfileIconComponent, - GfAssistantListItemModule, - MatButtonModule, - MatFormFieldModule, - MatSelectModule, - NgxSkeletonLoaderModule, - ReactiveFormsModule, - RouterModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfAssistantModule {} diff --git a/libs/ui/src/lib/assistant/index.ts b/libs/ui/src/lib/assistant/index.ts index f58d1b2f3..aded19f26 100644 --- a/libs/ui/src/lib/assistant/index.ts +++ b/libs/ui/src/lib/assistant/index.ts @@ -1 +1 @@ -export * from './assistant.module'; +export * from './assistant.component'; diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index 032c131bf..07e70c2fd 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -2,20 +2,36 @@ import { getLocale, resolveMarketCondition } from '@ghostfolio/common/helper'; import { Benchmark, User } from '@ghostfolio/common/interfaces'; import { translate } from '@ghostfolio/ui/i18n'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; +import { MatTableModule } from '@angular/material/table'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; + +import { GfTrendIndicatorComponent } from '../trend-indicator'; +import { GfValueComponent } from '../value'; @Component({ - selector: 'gf-benchmark', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './benchmark.component.html', - styleUrls: ['./benchmark.component.scss'] + imports: [ + CommonModule, + GfTrendIndicatorComponent, + GfValueComponent, + MatTableModule, + NgxSkeletonLoaderModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-benchmark', + standalone: true, + styleUrls: ['./benchmark.component.scss'], + templateUrl: './benchmark.component.html' }) -export class BenchmarkComponent implements OnChanges { +export class GfBenchmarkComponent implements OnChanges { @Input() benchmarks: Benchmark[]; @Input() locale = getLocale(); @Input() user: User; diff --git a/libs/ui/src/lib/benchmark/benchmark.module.ts b/libs/ui/src/lib/benchmark/benchmark.module.ts deleted file mode 100644 index 5b3e00209..000000000 --- a/libs/ui/src/lib/benchmark/benchmark.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatTableModule } from '@angular/material/table'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { GfTrendIndicatorModule } from '../trend-indicator'; -import { GfValueModule } from '../value'; -import { BenchmarkComponent } from './benchmark.component'; - -@NgModule({ - declarations: [BenchmarkComponent], - exports: [BenchmarkComponent], - imports: [ - CommonModule, - GfTrendIndicatorModule, - GfValueModule, - MatTableModule, - NgxSkeletonLoaderModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfBenchmarkModule {} diff --git a/libs/ui/src/lib/benchmark/index.ts b/libs/ui/src/lib/benchmark/index.ts index b8cd0c1a8..87fdc713c 100644 --- a/libs/ui/src/lib/benchmark/index.ts +++ b/libs/ui/src/lib/benchmark/index.ts @@ -1 +1 @@ -export * from './benchmark.module'; +export * from './benchmark.component'; diff --git a/libs/ui/src/lib/carousel/carousel.component.ts b/libs/ui/src/lib/carousel/carousel.component.ts index a0eb0f8a1..33f68b249 100644 --- a/libs/ui/src/lib/carousel/carousel.component.ts +++ b/libs/ui/src/lib/carousel/carousel.component.ts @@ -1,7 +1,9 @@ import { FocusKeyManager } from '@angular/cdk/a11y'; import { LEFT_ARROW, RIGHT_ARROW, TAB } from '@angular/cdk/keycodes'; +import { CommonModule } from '@angular/common'; import { AfterContentInit, + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, ContentChildren, @@ -13,17 +15,21 @@ import { QueryList, ViewChild } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations'; import { CarouselItem } from './carousel-item.directive'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule, MatButtonModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-carousel', + standalone: true, styleUrls: ['./carousel.component.scss'], templateUrl: './carousel.component.html' }) -export class CarouselComponent implements AfterContentInit { +export class GfCarouselComponent implements AfterContentInit { @ContentChildren(CarouselItem) public items!: QueryList; @HostBinding('class.animations-disabled') diff --git a/libs/ui/src/lib/carousel/carousel.module.ts b/libs/ui/src/lib/carousel/carousel.module.ts deleted file mode 100644 index 4e43f23b0..000000000 --- a/libs/ui/src/lib/carousel/carousel.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; - -import { CarouselItem } from './carousel-item.directive'; -import { CarouselComponent } from './carousel.component'; - -@NgModule({ - declarations: [CarouselComponent, CarouselItem], - exports: [CarouselComponent, CarouselItem], - imports: [CommonModule, MatButtonModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfCarouselModule {} diff --git a/libs/ui/src/lib/carousel/index.ts b/libs/ui/src/lib/carousel/index.ts index 2e039a80b..3cd42148e 100644 --- a/libs/ui/src/lib/carousel/index.ts +++ b/libs/ui/src/lib/carousel/index.ts @@ -1 +1 @@ -export * from './carousel.module'; +export * from './carousel.component'; diff --git a/libs/ui/src/lib/currency-selector/currency-selector.component.ts b/libs/ui/src/lib/currency-selector/currency-selector.component.ts index 8c9415689..a0ed3c88a 100644 --- a/libs/ui/src/lib/currency-selector/currency-selector.component.ts +++ b/libs/ui/src/lib/currency-selector/currency-selector.component.ts @@ -2,7 +2,9 @@ import { Currency } from '@ghostfolio/common/interfaces'; import { AbstractMatFormField } from '@ghostfolio/ui/shared/abstract-mat-form-field'; import { FocusMonitor } from '@angular/cdk/a11y'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, @@ -12,13 +14,23 @@ import { OnInit, ViewChild } from '@angular/core'; -import { FormControl, FormGroupDirective, NgControl } from '@angular/forms'; +import { + FormControl, + FormGroupDirective, + FormsModule, + NgControl, + ReactiveFormsModule +} from '@angular/forms'; import { MatAutocomplete, + MatAutocompleteModule, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatFormFieldControl } from '@angular/material/form-field'; -import { MatInput } from '@angular/material/input'; +import { + MatFormFieldControl, + MatFormFieldModule +} from '@angular/material/form-field'; +import { MatInput, MatInputModule } from '@angular/material/input'; import { Subject } from 'rxjs'; import { map, startWith, takeUntil } from 'rxjs/operators'; @@ -28,17 +40,27 @@ import { map, startWith, takeUntil } from 'rxjs/operators'; '[attr.aria-describedBy]': 'describedBy', '[id]': 'id' }, + imports: [ + CommonModule, + FormsModule, + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + ReactiveFormsModule + ], providers: [ { provide: MatFormFieldControl, - useExisting: CurrencySelectorComponent + useExisting: GfCurrencySelectorComponent } ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-currency-selector', + standalone: true, styleUrls: ['./currency-selector.component.scss'], templateUrl: 'currency-selector.component.html' }) -export class CurrencySelectorComponent +export class GfCurrencySelectorComponent extends AbstractMatFormField implements OnInit, OnDestroy { diff --git a/libs/ui/src/lib/currency-selector/currency-selector.module.ts b/libs/ui/src/lib/currency-selector/currency-selector.module.ts deleted file mode 100644 index ac4d12096..000000000 --- a/libs/ui/src/lib/currency-selector/currency-selector.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; - -import { CurrencySelectorComponent } from './currency-selector.component'; - -@NgModule({ - declarations: [CurrencySelectorComponent], - exports: [CurrencySelectorComponent], - imports: [ - CommonModule, - FormsModule, - MatAutocompleteModule, - MatFormFieldModule, - MatInputModule, - ReactiveFormsModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfCurrencySelectorModule {} diff --git a/libs/ui/src/lib/currency-selector/index.ts b/libs/ui/src/lib/currency-selector/index.ts new file mode 100644 index 000000000..2faa42b80 --- /dev/null +++ b/libs/ui/src/lib/currency-selector/index.ts @@ -0,0 +1 @@ +export * from './currency-selector.component'; diff --git a/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.ts b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.ts index afdcb969a..bfab714f9 100644 --- a/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.ts +++ b/libs/ui/src/lib/data-provider-credits/data-provider-credits.component.ts @@ -1,14 +1,23 @@ import { DataProviderInfo } from '@ghostfolio/common/interfaces'; -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { + CUSTOM_ELEMENTS_SCHEMA, + ChangeDetectionStrategy, + Component, + Input +} from '@angular/core'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-data-provider-credits', + standalone: true, styleUrls: ['./data-provider-credits.component.scss'], templateUrl: './data-provider-credits.component.html' }) -export class DataProviderCreditsComponent { +export class GfDataProviderCreditsComponent { @Input() dataProviderInfos: DataProviderInfo[]; public constructor() {} diff --git a/libs/ui/src/lib/data-provider-credits/data-provider-credits.module.ts b/libs/ui/src/lib/data-provider-credits/data-provider-credits.module.ts deleted file mode 100644 index e5dd9d3b9..000000000 --- a/libs/ui/src/lib/data-provider-credits/data-provider-credits.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; - -import { DataProviderCreditsComponent } from './data-provider-credits.component'; - -@NgModule({ - declarations: [DataProviderCreditsComponent], - exports: [DataProviderCreditsComponent], - imports: [CommonModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfDataProviderCreditsModule {} diff --git a/libs/ui/src/lib/data-provider-credits/index.ts b/libs/ui/src/lib/data-provider-credits/index.ts index 5d3759577..44db13ea5 100644 --- a/libs/ui/src/lib/data-provider-credits/index.ts +++ b/libs/ui/src/lib/data-provider-credits/index.ts @@ -1 +1 @@ -export * from './data-provider-credits.module'; +export * from './data-provider-credits.component'; diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts index 60c47a309..4f6c8dc08 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -6,6 +6,7 @@ import { primaryColorRgb } from '@ghostfolio/common/config'; import { getLocale } from '@ghostfolio/common/helper'; import { ColorScheme } from '@ghostfolio/common/types'; +import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -17,8 +18,19 @@ import { Output, ViewChild } from '@angular/core'; -import { FormBuilder, FormControl } from '@angular/forms'; -import { MatDatepicker } from '@angular/material/datepicker'; +import { + FormBuilder, + FormControl, + FormsModule, + ReactiveFormsModule +} from '@angular/forms'; +import { MatButtonModule } from '@angular/material/button'; +import { + MatDatepicker, + MatDatepickerModule +} from '@angular/material/datepicker'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BarController, BarElement, @@ -39,17 +51,30 @@ import { sub } from 'date-fns'; import { isNumber } from 'lodash'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, debounceTime, takeUntil } from 'rxjs'; import { FireCalculatorService } from './fire-calculator.service'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + FormsModule, + MatButtonModule, + MatDatepickerModule, + MatFormFieldModule, + MatInputModule, + NgxSkeletonLoaderModule, + ReactiveFormsModule + ], + providers: [FireCalculatorService], selector: 'gf-fire-calculator', + standalone: true, styleUrls: ['./fire-calculator.component.scss'], templateUrl: './fire-calculator.component.html' }) -export class FireCalculatorComponent implements OnChanges, OnDestroy { +export class GfFireCalculatorComponent implements OnChanges, OnDestroy { @Input() annualInterestRate = 5; @Input() colorScheme: ColorScheme; @Input() currency: string; diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.module.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.module.ts deleted file mode 100644 index 02b59dc27..000000000 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDatepickerModule } from '@angular/material/datepicker'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { FireCalculatorComponent } from './fire-calculator.component'; -import { FireCalculatorService } from './fire-calculator.service'; - -@NgModule({ - declarations: [FireCalculatorComponent], - exports: [FireCalculatorComponent], - imports: [ - CommonModule, - FormsModule, - MatButtonModule, - MatDatepickerModule, - MatFormFieldModule, - MatInputModule, - NgxSkeletonLoaderModule, - ReactiveFormsModule - ], - providers: [FireCalculatorService] -}) -export class GfFireCalculatorModule {} diff --git a/libs/ui/src/lib/fire-calculator/index.ts b/libs/ui/src/lib/fire-calculator/index.ts index aea6c656a..1636174fc 100644 --- a/libs/ui/src/lib/fire-calculator/index.ts +++ b/libs/ui/src/lib/fire-calculator/index.ts @@ -1 +1 @@ -export * from './fire-calculator.module'; +export * from './fire-calculator.component'; diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts index 38403d519..9d568abf7 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts @@ -1,7 +1,14 @@ +import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfPositionDetailDialogModule } from '@ghostfolio/client/components/position/position-detail-dialog/position-detail-dialog.module'; +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { getLocale } from '@ghostfolio/common/helper'; import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; +import { GfValueComponent } from '@ghostfolio/ui/value'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, Input, @@ -10,20 +17,40 @@ import { OnInit, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; -import { Router } from '@angular/router'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { Router, RouterModule } from '@angular/router'; import { AssetClass } from '@prisma/client'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, Subscription } from 'rxjs'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + CommonModule, + GfAssetProfileIconComponent, + GfNoTransactionsInfoComponent, + GfPositionDetailDialogModule, + GfSymbolModule, + GfValueComponent, + MatButtonModule, + MatDialogModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + NgxSkeletonLoaderModule, + RouterModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-holdings-table', + standalone: true, styleUrls: ['./holdings-table.component.scss'], templateUrl: './holdings-table.component.html' }) -export class HoldingsTableComponent implements OnChanges, OnDestroy, OnInit { +export class GfHoldingsTableComponent implements OnChanges, OnDestroy, OnInit { @Input() baseCurrency: string; @Input() deviceType: string; @Input() hasPermissionToCreateActivity: boolean; diff --git a/libs/ui/src/lib/holdings-table/holdings-table.module.ts b/libs/ui/src/lib/holdings-table/holdings-table.module.ts deleted file mode 100644 index a944bc1c1..000000000 --- a/libs/ui/src/lib/holdings-table/holdings-table.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; -import { GfPositionDetailDialogModule } from '@ghostfolio/client/components/position/position-detail-dialog/position-detail-dialog.module'; -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfNoTransactionsInfoModule } from '@ghostfolio/ui/no-transactions-info'; -import { GfValueModule } from '@ghostfolio/ui/value'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; -import { RouterModule } from '@angular/router'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { HoldingsTableComponent } from './holdings-table.component'; - -@NgModule({ - declarations: [HoldingsTableComponent], - exports: [HoldingsTableComponent], - imports: [ - CommonModule, - GfAssetProfileIconComponent, - GfNoTransactionsInfoModule, - GfPositionDetailDialogModule, - GfSymbolModule, - GfValueModule, - MatButtonModule, - MatDialogModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - NgxSkeletonLoaderModule, - RouterModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfHoldingsTableModule {} diff --git a/libs/ui/src/lib/holdings-table/index.ts b/libs/ui/src/lib/holdings-table/index.ts new file mode 100644 index 000000000..f2dd696ce --- /dev/null +++ b/libs/ui/src/lib/holdings-table/index.ts @@ -0,0 +1 @@ +export * from './holdings-table.component'; diff --git a/libs/ui/src/lib/line-chart/index.ts b/libs/ui/src/lib/line-chart/index.ts new file mode 100644 index 000000000..fca368497 --- /dev/null +++ b/libs/ui/src/lib/line-chart/index.ts @@ -0,0 +1 @@ +export * from './line-chart.component'; diff --git a/libs/ui/src/lib/line-chart/line-chart.component.ts b/libs/ui/src/lib/line-chart/line-chart.component.ts index bad5e2f3f..4098e1d5b 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.ts +++ b/libs/ui/src/lib/line-chart/line-chart.component.ts @@ -13,6 +13,7 @@ import { import { LineChartItem } from '@ghostfolio/common/interfaces'; import { ColorScheme } from '@ghostfolio/common/types'; +import { CommonModule } from '@angular/common'; import { AfterViewInit, ChangeDetectionStrategy, @@ -34,14 +35,19 @@ import { Tooltip } from 'chart.js'; import 'chartjs-adapter-date-fns'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ - selector: 'gf-line-chart', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './line-chart.component.html', - styleUrls: ['./line-chart.component.scss'] + imports: [CommonModule, NgxSkeletonLoaderModule], + selector: 'gf-line-chart', + standalone: true, + styleUrls: ['./line-chart.component.scss'], + templateUrl: './line-chart.component.html' }) -export class LineChartComponent implements AfterViewInit, OnChanges, OnDestroy { +export class GfLineChartComponent + implements AfterViewInit, OnChanges, OnDestroy +{ @Input() benchmarkDataItems: LineChartItem[] = []; @Input() benchmarkLabel = ''; @Input() colorScheme: ColorScheme; diff --git a/libs/ui/src/lib/line-chart/line-chart.module.ts b/libs/ui/src/lib/line-chart/line-chart.module.ts deleted file mode 100644 index 0483fc996..000000000 --- a/libs/ui/src/lib/line-chart/line-chart.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { LineChartComponent } from './line-chart.component'; - -@NgModule({ - declarations: [LineChartComponent], - exports: [LineChartComponent], - imports: [CommonModule, NgxSkeletonLoaderModule] -}) -export class GfLineChartModule {} diff --git a/libs/ui/src/lib/logo/index.ts b/libs/ui/src/lib/logo/index.ts index a02a37ec8..9a94f8985 100644 --- a/libs/ui/src/lib/logo/index.ts +++ b/libs/ui/src/lib/logo/index.ts @@ -1 +1 @@ -export * from './logo.module'; +export * from './logo.component'; diff --git a/libs/ui/src/lib/logo/logo.component.ts b/libs/ui/src/lib/logo/logo.component.ts index ecb3885dc..d9edd546e 100644 --- a/libs/ui/src/lib/logo/logo.component.ts +++ b/libs/ui/src/lib/logo/logo.component.ts @@ -1,4 +1,6 @@ +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, HostBinding, @@ -6,12 +8,15 @@ import { } from '@angular/core'; @Component({ - selector: 'gf-logo', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './logo.component.html', - styleUrls: ['./logo.component.scss'] + imports: [CommonModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-logo', + standalone: true, + styleUrls: ['./logo.component.scss'], + templateUrl: './logo.component.html' }) -export class LogoComponent { +export class GfLogoComponent { @HostBinding('class') @Input() size: 'large' | 'medium' = 'medium'; @Input() label: string; @Input() showLabel = true; diff --git a/libs/ui/src/lib/logo/logo.module.ts b/libs/ui/src/lib/logo/logo.module.ts deleted file mode 100644 index ced9bae30..000000000 --- a/libs/ui/src/lib/logo/logo.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; - -import { LogoComponent } from './logo.component'; - -@NgModule({ - declarations: [LogoComponent], - exports: [LogoComponent], - imports: [CommonModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfLogoModule {} diff --git a/libs/ui/src/lib/membership-card/index.ts b/libs/ui/src/lib/membership-card/index.ts index eccd8c4fd..1a0b5cac1 100644 --- a/libs/ui/src/lib/membership-card/index.ts +++ b/libs/ui/src/lib/membership-card/index.ts @@ -1 +1 @@ -export * from './membership-card.module'; +export * from './membership-card.component'; diff --git a/libs/ui/src/lib/membership-card/membership-card.component.ts b/libs/ui/src/lib/membership-card/membership-card.component.ts index 0ae760aba..f82dee3f1 100644 --- a/libs/ui/src/lib/membership-card/membership-card.component.ts +++ b/libs/ui/src/lib/membership-card/membership-card.component.ts @@ -1,12 +1,24 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { + CUSTOM_ELEMENTS_SCHEMA, + ChangeDetectionStrategy, + Component, + Input +} from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { GfLogoComponent } from '../logo'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, + imports: [CommonModule, GfLogoComponent, RouterModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-membership-card', + standalone: true, styleUrls: ['./membership-card.component.scss'], templateUrl: './membership-card.component.html' }) -export class MembershipCardComponent { +export class GfMembershipCardComponent { @Input() public expiresAt: string; @Input() public name: string; diff --git a/libs/ui/src/lib/membership-card/membership-card.module.ts b/libs/ui/src/lib/membership-card/membership-card.module.ts deleted file mode 100644 index 564308e29..000000000 --- a/libs/ui/src/lib/membership-card/membership-card.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { GfLogoModule } from '@ghostfolio/ui/logo'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { MembershipCardComponent } from './membership-card.component'; - -@NgModule({ - declarations: [MembershipCardComponent], - exports: [MembershipCardComponent], - imports: [CommonModule, GfLogoModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfMembershipCardModule {} diff --git a/libs/ui/src/lib/no-transactions-info/index.ts b/libs/ui/src/lib/no-transactions-info/index.ts index 8a907c9ec..956d0304d 100644 --- a/libs/ui/src/lib/no-transactions-info/index.ts +++ b/libs/ui/src/lib/no-transactions-info/index.ts @@ -1 +1 @@ -export * from './no-transactions-info.module'; +export * from './no-transactions-info.component'; diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts index 8910943b0..0c30041b6 100644 --- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts +++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts @@ -1,17 +1,26 @@ +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, HostBinding, Input } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { RouterModule } from '@angular/router'; + +import { GfLogoComponent } from '../logo'; @Component({ - selector: 'gf-no-transactions-info-indicator', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './no-transactions-info.component.html', - styleUrls: ['./no-transactions-info.component.scss'] + imports: [CommonModule, GfLogoComponent, MatButtonModule, RouterModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-no-transactions-info-indicator', + standalone: true, + styleUrls: ['./no-transactions-info.component.scss'], + templateUrl: './no-transactions-info.component.html' }) -export class NoTransactionsInfoComponent { +export class GfNoTransactionsInfoComponent { @HostBinding('class.has-border') @Input() hasBorder = true; public constructor() {} diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.module.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.module.ts deleted file mode 100644 index 03363abc8..000000000 --- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { GfLogoModule } from '@ghostfolio/ui/logo'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { RouterModule } from '@angular/router'; - -import { NoTransactionsInfoComponent } from './no-transactions-info.component'; - -@NgModule({ - declarations: [NoTransactionsInfoComponent], - exports: [NoTransactionsInfoComponent], - imports: [CommonModule, GfLogoModule, MatButtonModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfNoTransactionsInfoModule {} diff --git a/libs/ui/src/lib/portfolio-proportion-chart/index.ts b/libs/ui/src/lib/portfolio-proportion-chart/index.ts new file mode 100644 index 000000000..edf1fa198 --- /dev/null +++ b/libs/ui/src/lib/portfolio-proportion-chart/index.ts @@ -0,0 +1 @@ +export * from './portfolio-proportion-chart.component'; diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 620cb2066..f243f888a 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -5,6 +5,7 @@ import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; import { ColorScheme } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; +import { CommonModule } from '@angular/common'; import { AfterViewInit, ChangeDetectionStrategy, @@ -26,14 +27,17 @@ import { DoughnutController } from 'chart.js'; import { Chart } from 'chart.js'; import ChartDataLabels from 'chartjs-plugin-datalabels'; import * as Color from 'color'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ - selector: 'gf-portfolio-proportion-chart', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './portfolio-proportion-chart.component.html', - styleUrls: ['./portfolio-proportion-chart.component.scss'] + imports: [CommonModule, NgxSkeletonLoaderModule], + selector: 'gf-portfolio-proportion-chart', + standalone: true, + styleUrls: ['./portfolio-proportion-chart.component.scss'], + templateUrl: './portfolio-proportion-chart.component.html' }) -export class PortfolioProportionChartComponent +export class GfPortfolioProportionChartComponent implements AfterViewInit, OnChanges, OnDestroy { @Input() baseCurrency: string; diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.module.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.module.ts deleted file mode 100644 index 587c19072..000000000 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { PortfolioProportionChartComponent } from './portfolio-proportion-chart.component'; - -@NgModule({ - declarations: [PortfolioProportionChartComponent], - exports: [PortfolioProportionChartComponent], - imports: [CommonModule, NgxSkeletonLoaderModule] -}) -export class GfPortfolioProportionChartModule {} diff --git a/libs/ui/src/lib/premium-indicator/index.ts b/libs/ui/src/lib/premium-indicator/index.ts index 593823bbd..a61db2559 100644 --- a/libs/ui/src/lib/premium-indicator/index.ts +++ b/libs/ui/src/lib/premium-indicator/index.ts @@ -1 +1 @@ -export * from './premium-indicator.module'; +export * from './premium-indicator.component'; diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts index 3711a28dd..ff2b158b5 100644 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts +++ b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts @@ -1,12 +1,22 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { + CUSTOM_ELEMENTS_SCHEMA, + ChangeDetectionStrategy, + Component, + Input +} from '@angular/core'; +import { RouterModule } from '@angular/router'; @Component({ - selector: 'gf-premium-indicator', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './premium-indicator.component.html', - styleUrls: ['./premium-indicator.component.scss'] + imports: [CommonModule, RouterModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-premium-indicator', + standalone: true, + styleUrls: ['./premium-indicator.component.scss'], + templateUrl: './premium-indicator.component.html' }) -export class PremiumIndicatorComponent { +export class GfPremiumIndicatorComponent { @Input() enableLink = true; public constructor() {} diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.module.ts b/libs/ui/src/lib/premium-indicator/premium-indicator.module.ts deleted file mode 100644 index f79dc2f60..000000000 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { PremiumIndicatorComponent } from './premium-indicator.component'; - -@NgModule({ - declarations: [PremiumIndicatorComponent], - exports: [PremiumIndicatorComponent], - imports: [CommonModule, RouterModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfPremiumIndicatorModule {} diff --git a/libs/ui/src/lib/symbol-autocomplete/index.ts b/libs/ui/src/lib/symbol-autocomplete/index.ts index 7271d1ca9..2964effa0 100644 --- a/libs/ui/src/lib/symbol-autocomplete/index.ts +++ b/libs/ui/src/lib/symbol-autocomplete/index.ts @@ -1 +1 @@ -export * from './symbol-autocomplete.module'; +export * from './symbol-autocomplete.component'; diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index d25a15a28..7da62d9df 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -1,10 +1,13 @@ import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { DataService } from '@ghostfolio/client/services/data.service'; import { translate } from '@ghostfolio/ui/i18n'; import { AbstractMatFormField } from '@ghostfolio/ui/shared/abstract-mat-form-field'; import { FocusMonitor } from '@angular/cdk/a11y'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, @@ -14,13 +17,23 @@ import { OnInit, ViewChild } from '@angular/core'; -import { FormControl, NgControl } from '@angular/forms'; +import { + FormControl, + FormsModule, + NgControl, + ReactiveFormsModule +} from '@angular/forms'; import { MatAutocomplete, + MatAutocompleteModule, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; -import { MatFormFieldControl } from '@angular/material/form-field'; -import { MatInput } from '@angular/material/input'; +import { + MatFormFieldControl, + MatFormFieldModule +} from '@angular/material/form-field'; +import { MatInput, MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { isString } from 'lodash'; import { Subject, tap } from 'rxjs'; import { @@ -31,23 +44,38 @@ import { takeUntil } from 'rxjs/operators'; +import { GfPremiumIndicatorComponent } from '../premium-indicator'; + @Component({ changeDetection: ChangeDetectionStrategy.OnPush, host: { '[attr.aria-describedBy]': 'describedBy', '[id]': 'id' }, - selector: 'gf-symbol-autocomplete', - styleUrls: ['./symbol-autocomplete.component.scss'], - templateUrl: 'symbol-autocomplete.component.html', + imports: [ + CommonModule, + FormsModule, + GfPremiumIndicatorComponent, + GfSymbolModule, + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + MatProgressSpinnerModule, + ReactiveFormsModule + ], providers: [ { provide: MatFormFieldControl, - useExisting: SymbolAutocompleteComponent + useExisting: GfSymbolAutocompleteComponent } - ] + ], + selector: 'gf-symbol-autocomplete', + schemas: [CUSTOM_ELEMENTS_SCHEMA], + standalone: true, + styleUrls: ['./symbol-autocomplete.component.scss'], + templateUrl: 'symbol-autocomplete.component.html' }) -export class SymbolAutocompleteComponent +export class GfSymbolAutocompleteComponent extends AbstractMatFormField implements OnInit, OnDestroy { diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts deleted file mode 100644 index cdb6cc97a..000000000 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; -import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator'; -import { SymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.component'; - -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -@NgModule({ - declarations: [SymbolAutocompleteComponent], - exports: [SymbolAutocompleteComponent], - imports: [ - CommonModule, - FormsModule, - GfPremiumIndicatorModule, - GfSymbolModule, - MatAutocompleteModule, - MatFormFieldModule, - MatInputModule, - MatProgressSpinnerModule, - ReactiveFormsModule - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfSymbolAutocompleteModule {} diff --git a/libs/ui/src/lib/trend-indicator/index.ts b/libs/ui/src/lib/trend-indicator/index.ts index 5d9fc1d42..3e5ebf36e 100644 --- a/libs/ui/src/lib/trend-indicator/index.ts +++ b/libs/ui/src/lib/trend-indicator/index.ts @@ -1 +1 @@ -export * from './trend-indicator.module'; +export * from './trend-indicator.component'; diff --git a/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts b/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts index fafe6e0f3..d03ee8cf4 100644 --- a/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts +++ b/libs/ui/src/lib/trend-indicator/trend-indicator.component.ts @@ -1,14 +1,24 @@ import { DateRange, MarketState } from '@ghostfolio/common/types'; -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { + CUSTOM_ELEMENTS_SCHEMA, + ChangeDetectionStrategy, + Component, + Input +} from '@angular/core'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ - selector: 'gf-trend-indicator', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './trend-indicator.component.html', - styleUrls: ['./trend-indicator.component.scss'] + imports: [CommonModule, NgxSkeletonLoaderModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-trend-indicator', + standalone: true, + styleUrls: ['./trend-indicator.component.scss'], + templateUrl: './trend-indicator.component.html' }) -export class TrendIndicatorComponent { +export class GfTrendIndicatorComponent { @Input() isLoading = false; @Input() marketState: MarketState = 'open'; @Input() range: DateRange = 'max'; diff --git a/libs/ui/src/lib/trend-indicator/trend-indicator.module.ts b/libs/ui/src/lib/trend-indicator/trend-indicator.module.ts deleted file mode 100644 index dc84a3baa..000000000 --- a/libs/ui/src/lib/trend-indicator/trend-indicator.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { TrendIndicatorComponent } from './trend-indicator.component'; - -@NgModule({ - declarations: [TrendIndicatorComponent], - exports: [TrendIndicatorComponent], - imports: [CommonModule, NgxSkeletonLoaderModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfTrendIndicatorModule {} diff --git a/libs/ui/src/lib/value/index.ts b/libs/ui/src/lib/value/index.ts index 1e8ac4def..9dc866865 100644 --- a/libs/ui/src/lib/value/index.ts +++ b/libs/ui/src/lib/value/index.ts @@ -1 +1 @@ -export * from './value.module'; +export * from './value.component'; diff --git a/libs/ui/src/lib/value/value.component.ts b/libs/ui/src/lib/value/value.component.ts index 13675403f..28cb3c90a 100644 --- a/libs/ui/src/lib/value/value.component.ts +++ b/libs/ui/src/lib/value/value.component.ts @@ -1,20 +1,26 @@ import { getLocale } from '@ghostfolio/common/helper'; +import { CommonModule } from '@angular/common'; import { + CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; import { isNumber } from 'lodash'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ - selector: 'gf-value', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './value.component.html', - styleUrls: ['./value.component.scss'] + imports: [CommonModule, NgxSkeletonLoaderModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-value', + standalone: true, + styleUrls: ['./value.component.scss'], + templateUrl: './value.component.html' }) -export class ValueComponent implements OnChanges { +export class GfValueComponent implements OnChanges { @Input() colorizeSign = false; @Input() icon = ''; @Input() isAbsolute = false; diff --git a/libs/ui/src/lib/value/value.module.ts b/libs/ui/src/lib/value/value.module.ts deleted file mode 100644 index 1cb91050e..000000000 --- a/libs/ui/src/lib/value/value.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; - -import { ValueComponent } from './value.component'; - -@NgModule({ - declarations: [ValueComponent], - exports: [ValueComponent], - imports: [CommonModule, NgxSkeletonLoaderModule], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class GfValueModule {} diff --git a/package.json b/package.json index 3abee2dc8..da5c207ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.73.0", + "version": "2.75.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -54,17 +54,17 @@ "workspace-generator": "nx workspace-generator" }, "dependencies": { - "@angular/animations": "17.3.3", - "@angular/cdk": "17.3.3", - "@angular/common": "17.3.3", - "@angular/compiler": "17.3.3", - "@angular/core": "17.3.3", - "@angular/forms": "17.3.3", - "@angular/material": "17.3.3", - "@angular/platform-browser": "17.3.3", - "@angular/platform-browser-dynamic": "17.3.3", - "@angular/router": "17.3.3", - "@angular/service-worker": "17.3.3", + "@angular/animations": "17.3.5", + "@angular/cdk": "17.3.5", + "@angular/common": "17.3.5", + "@angular/compiler": "17.3.5", + "@angular/core": "17.3.5", + "@angular/forms": "17.3.5", + "@angular/material": "17.3.5", + "@angular/platform-browser": "17.3.5", + "@angular/platform-browser-dynamic": "17.3.5", + "@angular/router": "17.3.5", + "@angular/service-worker": "17.3.5", "@codewithdan/observable-store": "2.2.15", "@dfinity/agent": "0.15.7", "@dfinity/auth-client": "0.15.7", @@ -136,29 +136,29 @@ "zone.js": "0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "17.3.3", - "@angular-devkit/core": "17.3.3", - "@angular-devkit/schematics": "17.3.3", + "@angular-devkit/build-angular": "17.3.5", + "@angular-devkit/core": "17.3.5", + "@angular-devkit/schematics": "17.3.5", "@angular-eslint/eslint-plugin": "17.3.0", "@angular-eslint/eslint-plugin-template": "17.3.0", "@angular-eslint/template-parser": "17.3.0", - "@angular/cli": "17.3.3", - "@angular/compiler-cli": "17.3.3", - "@angular/language-service": "17.3.3", - "@angular/localize": "17.3.3", - "@angular/pwa": "17.3.3", + "@angular/cli": "17.3.5", + "@angular/compiler-cli": "17.3.5", + "@angular/language-service": "17.3.5", + "@angular/localize": "17.3.5", + "@angular/pwa": "17.3.5", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.1.3", - "@nx/angular": "18.2.3", - "@nx/cypress": "18.2.3", - "@nx/eslint-plugin": "18.2.3", - "@nx/jest": "18.2.3", - "@nx/js": "18.2.3", - "@nx/nest": "18.2.3", - "@nx/node": "18.2.3", - "@nx/storybook": "18.2.3", - "@nx/web": "18.2.3", - "@nx/workspace": "18.2.3", + "@nx/angular": "18.3.3", + "@nx/cypress": "18.3.3", + "@nx/eslint-plugin": "18.3.3", + "@nx/jest": "18.3.3", + "@nx/js": "18.3.3", + "@nx/nest": "18.3.3", + "@nx/node": "18.3.3", + "@nx/storybook": "18.3.3", + "@nx/web": "18.3.3", + "@nx/workspace": "18.3.3", "@schematics/angular": "17.3.3", "@simplewebauthn/types": "9.0.1", "@storybook/addon-essentials": "7.6.5", @@ -187,7 +187,7 @@ "jest": "29.4.3", "jest-environment-jsdom": "29.4.3", "jest-preset-angular": "14.0.3", - "nx": "18.2.3", + "nx": "18.3.3", "prettier": "3.2.5", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", diff --git a/prisma/migrations/20240421080039_added_account_id_and_date_to_account_balance_as_unique_constraint/migration.sql b/prisma/migrations/20240421080039_added_account_id_and_date_to_account_balance_as_unique_constraint/migration.sql new file mode 100644 index 000000000..96521bbfa --- /dev/null +++ b/prisma/migrations/20240421080039_added_account_id_and_date_to_account_balance_as_unique_constraint/migration.sql @@ -0,0 +1,29 @@ +-- Only keep the newest AccountBalance entry for each account / day +WITH entries_to_keep AS ( + SELECT + id, + "accountId", + date, + ROW_NUMBER() OVER (PARTITION BY "accountId", DATE(date) ORDER BY date DESC) AS row_num + FROM + "AccountBalance" +), +entries_to_delete AS ( + SELECT + id + FROM + entries_to_keep + WHERE + row_num > 1 +) +DELETE FROM + "AccountBalance" +WHERE + id IN (SELECT id FROM entries_to_delete); + +-- Reset time part of the date +UPDATE "AccountBalance" +SET date = DATE_TRUNC('day', date); + +-- CreateIndex +CREATE UNIQUE INDEX "AccountBalance_accountId_date_key" ON "AccountBalance"("accountId", "date"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f9a17d114..af7ad1845 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -59,6 +59,7 @@ model AccountBalance { value Float Account Account @relation(fields: [accountId, userId], onDelete: Cascade, references: [id, userId]) + @@unique([accountId, date]) @@index([accountId]) @@index([date]) } diff --git a/yarn.lock b/yarn.lock index 070f55244..c7297d6cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,12 +28,12 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1703.3": - version "0.1703.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1703.3.tgz#d60cdc2d2ad3b204d8b353124a8defa92c40db69" - integrity sha512-BKbdigCjmspqxOxSIQuWgPZzpyuKqZoTBDh0jDeLcAmvPsuxCgIWbsExI4OQ0CyusnQ+XT0IT39q8B9rvF56cg== +"@angular-devkit/architect@0.1703.5": + version "0.1703.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1703.5.tgz#2e6e534c99fd99d53034237d64de6317f24af52a" + integrity sha512-j3+9QeXIafuRMtk7N5Cmm/IiMSS/TOaybzfCv/LK+DP3hjEd8f8Az7hPmevUuOArvWNzUvoUeu30GmR3wABydA== dependencies: - "@angular-devkit/core" "17.3.3" + "@angular-devkit/core" "17.3.5" rxjs "7.8.1" "@angular-devkit/architect@^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0": @@ -44,15 +44,15 @@ "@angular-devkit/core" "17.0.0" rxjs "7.8.1" -"@angular-devkit/build-angular@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.3.3.tgz#94b610596300a8acba22f5c30dcb03220cbd96da" - integrity sha512-E/6Z1MIMhEB1I2sN+Pw4/zinwAFj4vLDh6dEuj856WWEPndgPiUB6fGX4EbCTsyIUzboXI5ysdNyt2Eq56bllA== +"@angular-devkit/build-angular@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.3.5.tgz#a1b1fdfe906a0132191c0fee56c2a1dc0a1d5f8f" + integrity sha512-Ju2MkMidJglJq/iWgM9CNbhK7A/2n0LNYPZx+ucb+aOFWvurCQrU4Mt/es6xCsxOEs5OPhjqdva8mxE5FHwzTQ== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1703.3" - "@angular-devkit/build-webpack" "0.1703.3" - "@angular-devkit/core" "17.3.3" + "@angular-devkit/architect" "0.1703.5" + "@angular-devkit/build-webpack" "0.1703.5" + "@angular-devkit/core" "17.3.5" "@babel/core" "7.24.0" "@babel/generator" "7.23.6" "@babel/helper-annotate-as-pure" "7.22.5" @@ -63,7 +63,7 @@ "@babel/preset-env" "7.24.0" "@babel/runtime" "7.24.0" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "17.3.3" + "@ngtools/webpack" "17.3.5" "@vitejs/plugin-basic-ssl" "1.1.0" ansi-colors "4.1.3" autoprefixer "10.4.18" @@ -104,8 +104,8 @@ terser "5.29.1" tree-kill "1.2.2" tslib "2.6.2" - undici "6.7.1" - vite "5.1.5" + undici "6.11.1" + vite "5.1.7" watchpack "2.4.0" webpack "5.90.3" webpack-dev-middleware "6.1.2" @@ -115,12 +115,12 @@ optionalDependencies: esbuild "0.20.1" -"@angular-devkit/build-webpack@0.1703.3": - version "0.1703.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1703.3.tgz#b7fcc2fa2c0c6ba4cc1dcdd8d108c8f536d03a60" - integrity sha512-d0JjE8MaGVNphlJfeP1OZKhNT4wCXkEZKdSdwE0+W+vDHNUuZiUBB1czO48sb7T4xBrdjRWlV/9CzMNJ7n3ydA== +"@angular-devkit/build-webpack@0.1703.5": + version "0.1703.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1703.5.tgz#3f8912aacb5b0d986e1f86756a40e4d21b3d7855" + integrity sha512-KcoKlWhDP6+2q3laQ6elXLt2QrVxWJFdCPUC9dIm0Tnc997Tal/UVhlDKaZgITYDgDvRFqG+tzNm2uFd8l7h+A== dependencies: - "@angular-devkit/architect" "0.1703.3" + "@angular-devkit/architect" "0.1703.5" rxjs "7.8.1" "@angular-devkit/core@16.0.1": @@ -169,6 +169,18 @@ rxjs "7.8.1" source-map "0.7.4" +"@angular-devkit/core@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.3.5.tgz#5af01de95b4945587aea1feaa1011f87485ffee5" + integrity sha512-iqGv45HVI+yRROoTqQTY0QChYlRCZkFUfIjdfJLegjc6xq9sLtxDr03CWM45BKGG5lSxDOy+qu/pdRvtL3V2eg== + dependencies: + ajv "8.12.0" + ajv-formats "2.1.1" + jsonc-parser "3.2.1" + picomatch "4.0.1" + rxjs "7.8.1" + source-map "0.7.4" + "@angular-devkit/schematics@16.0.1": version "16.0.1" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-16.0.1.tgz#d49387e9e41c9cce98b155da51b0e193333dd178" @@ -213,6 +225,17 @@ ora "5.4.1" rxjs "7.8.1" +"@angular-devkit/schematics@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.3.5.tgz#5ea31a3e5d7dc5eb11f786b796d0536f0a9b05bd" + integrity sha512-oh/mvpMKxGfk5v9QIB7LfGsDC/iVpmsIAvbb4+1ddCx86EJXdz3xWnVDbUehOd6n7HJXnQrNirWjWvWquM2GhQ== + dependencies: + "@angular-devkit/core" "17.3.5" + jsonc-parser "3.2.1" + magic-string "0.30.8" + ora "5.4.1" + rxjs "7.8.1" + "@angular-eslint/bundled-angular-compiler@17.3.0": version "17.3.0" resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz#08b8b1bebbb677a1f208b56516fc9177a289d212" @@ -254,31 +277,31 @@ "@angular-eslint/bundled-angular-compiler" "17.3.0" "@typescript-eslint/utils" "7.2.0" -"@angular/animations@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.3.3.tgz#b6487fbaa970cfd1f998d72a61e74c7e3deb14be" - integrity sha512-poLW3FHe5wkxmTIsQ3em2vq4obgQHyZJz6biF+4hCqQSNMbMBS0e5ZycAiJLkUD/WLc88lQZ20muRO7qjVuMLA== +"@angular/animations@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.3.5.tgz#68f1f209137b3e7148143b66ab3a2b444ac9b546" + integrity sha512-hbfCnBxwhYQMKB+9tDcmfvckUtB8LdY1gPST6TZ7CzrWCSPddsnXxqxBZSBjBI6zXvE4FOV3kUzaUXM/Bq5sRw== dependencies: tslib "^2.3.0" -"@angular/cdk@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.3.3.tgz#a266eb76a91ee2ce8f1e2df4bdc9a40b8dab29eb" - integrity sha512-hfS9pwaNE6CTZqP3FBh9tZPbuf//bDqZ5IpMzscfDFrwX8ycxBiI3znH/rFSf9l1rL0OQGoqWWNVfJCT+RrukA== +"@angular/cdk@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.3.5.tgz#a610ec34fe7adb4ebd30798664a421ce204c653d" + integrity sha512-6y8+yIPWG0wTdPwHIPxKrEFCX1JxxBh4aXcmQnrNTDIvtoEPGaea9SU9XKaU8ahiZMlcpUXqKLG0BVbEhA1Oow== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.3.3.tgz#66880fb12b0d4e536222ec7a256431795fe344c9" - integrity sha512-veIGK2sRm0SfiLHeftx0W0xC3N8uxoqxXiSG57V6W2wIFN/fKm3aRq3sa8phz7vxUzoKGqyZh6hsT7ybkjgkGA== +"@angular/cli@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.3.5.tgz#f668db09d283d669e42f166b7c9cfc0a8298b0a3" + integrity sha512-6MHJzPKy4uB9qlJO1eKs4rtDlRuCe0lOiz1f3kHFZ/GQQm5xA1xsmZJMN4ASsnu4yU3oZs6vJ/vt8i2/jvdPbA== dependencies: - "@angular-devkit/architect" "0.1703.3" - "@angular-devkit/core" "17.3.3" - "@angular-devkit/schematics" "17.3.3" - "@schematics/angular" "17.3.3" + "@angular-devkit/architect" "0.1703.5" + "@angular-devkit/core" "17.3.5" + "@angular-devkit/schematics" "17.3.5" + "@schematics/angular" "17.3.5" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "4.1.2" @@ -294,17 +317,17 @@ symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.3.3.tgz#6bbd0c033446010ada04511b6955d048259cf9d7" - integrity sha512-GwlKetNpfWKiG2j4S6bYTi6PA2iT4+eln7o8owo44xZWdQnWQjfxnH39vQuCyhi6OOQL1dozmae+fVXgQsV6jQ== +"@angular/common@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.3.5.tgz#901f5d85b78f5e28f36156064961d58732e73a7b" + integrity sha512-Ox91WxSnOSrQ6I21cHi69EfT2Pxtd5Knb5AsdwpxqE57V2E7EnWMhb+LP+holCtFUhK529EGXCk788M+Elyw6g== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.3.3.tgz#e2505b95b0d56118ea0950eae18bb0fa2c2e7515" - integrity sha512-vM0lqwuXQZ912HbLnIuvUblvIz2WEUsU7a5Z2ieNey6famH4zxPH12vCbVwXgicB6GLHorhOfcWC5443wD2mJw== +"@angular/compiler-cli@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.3.5.tgz#d24cb2039d130b03a898ec3bedf7cbabb573ba03" + integrity sha512-R53JNbbVDHWSGdL0e2vGQ5iJCrILOWZ1oemKjekOFB93fUBlEyi+nZmm4uTO7RU8PgjB0UpxI6ok5ZE3Amkt6A== dependencies: "@babel/core" "7.23.9" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -315,10 +338,10 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.3.3.tgz#ac6aefbb01f031b5834477aff46aa267719f7156" - integrity sha512-ZNMRfagMxMjk1KW5H3ssCg5QL0J6ZW1JAZ1mrTXixqS7gbdwl60bTGE+EfuEwbjvovEYaj4l9cga47eMaxZTbQ== +"@angular/compiler@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.3.5.tgz#308ac763c2a95fb6cea764d1ec3e8bd5f2384b89" + integrity sha512-lTubBFNlpH9zK46+yeVI7VJQNUELLAB8W1ucndYLCA9Rr9Jop+rYIXijmr42AGokOYr7yLc8HRiSQ5e+X2pUQg== dependencies: tslib "^2.3.0" @@ -327,10 +350,10 @@ resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== -"@angular/core@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.3.3.tgz#e0fd86eccd0106a5b8602c56eb4449cbb4538219" - integrity sha512-O/jr3aFJMCxF6Jmymjx4jIigRHJfqM/ALIi60y2LVznBVFkk9xyMTsAjgWQIEHX+2muEIzgfKuXzpL0y30y+wA== +"@angular/core@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.3.5.tgz#5445e5dad4dc713b032dde10dc048169afe998db" + integrity sha512-y6P27lcrKy3yMx/rtMuGsAnDyVEsS3BdyArTXcD0TOImVGHhVIaB0L95DUCam3ajTe2f2x39eozJZDh7QSpJaw== dependencies: tslib "^2.3.0" @@ -339,32 +362,32 @@ resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== -"@angular/forms@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.3.3.tgz#ff00da4f7ab1f6fefda7b3c323ddb07c2a4b23ac" - integrity sha512-wqn+eAggbOZY91hr7oDjv5qdflszVOC9SZMcWJUoZTGn+8eoV6v6728GDFuDDwYkKQ9G9eQbX4IZmYoVw3TVjQ== +"@angular/forms@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.3.5.tgz#68a1511c1c2b147d704f2579563840c3f94cb714" + integrity sha512-Rf/8XWHdFYZQaOVTJ0QVwxQm9fDqQqIJc0yfPcH/DYL5pT7R0U2z98I5McZawzUBJUo1Zt1gijzDlzNUGf6jiA== dependencies: tslib "^2.3.0" -"@angular/language-service@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.3.3.tgz#99b26aabc10b210e1cedf4b8cca1cac64ccf4183" - integrity sha512-OtdWNY0Syg4UvA8j2IhQJeq/UjWHYbRiyUcZjGKPRzuqIPjUhsmMyuW3zpi7Pwx2CpBzZXcik1Ra2WZ0gbwigg== +"@angular/language-service@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-17.3.5.tgz#64d31f5948f24bc2217047be1899b34c177c8cc6" + integrity sha512-s3W5o+pRPU3jNWeeyO4XEdc28+s4MPhew+k0meQfZ11VMdmShzwFu5nPgOMmLB3fBhQqlSBrHUh1P9SB7Hu3FQ== -"@angular/localize@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.3.3.tgz#3f9c3c66eb02648edc9c8d348124d7170bab1946" - integrity sha512-gahGKy0VBZ+KP6MUULGQMoi5SN3REwslaPvtomizzz9fdmqHfR8PPd1vOJSNm2IEVlvm1hv1dDRjPcR4DJwvaQ== +"@angular/localize@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.3.5.tgz#2af9f4f5db3c0b99d55534ef14058c6831a2fb4d" + integrity sha512-/5iKRvnleA2vsf8zqNZaXeOBjFFq3FLrbot+ygfmk3uYqz949X0nXrXBKk9kpakw/WC6kgzK+tmiEHKQY6cLiQ== dependencies: "@babel/core" "7.23.9" "@types/babel__core" "7.20.5" fast-glob "3.3.2" yargs "^17.2.1" -"@angular/material@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.3.3.tgz#33f7ca38d3c0ff909bde4e8ae490ea2da49ecd3f" - integrity sha512-cb3PYY+Lf3FvXxXIRmOBcTn5QS9Ghr5Eq0aiJiiYV6YVohr0YGWsndMCZ/5a2j8fxpboDo9THeTnOuuAOJv7AA== +"@angular/material@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.3.5.tgz#66e5479ba342277b0549cc301f0578ef51c40c3c" + integrity sha512-1+QqBQ8HVOwxOkx/v2n53JA9ALOee55yVDbnAv7TkseNN4JEDxOcE5TO5HGmdV2A4tcsXQ00MIdy04jiB4sCng== dependencies: "@material/animation" "15.0.0-canary.7f224ddd4.0" "@material/auto-init" "15.0.0-canary.7f224ddd4.0" @@ -415,40 +438,40 @@ "@material/typography" "15.0.0-canary.7f224ddd4.0" tslib "^2.3.0" -"@angular/platform-browser-dynamic@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.3.tgz#0e747cecb51ebaec53c11ebfef289972b793484d" - integrity sha512-jSgSNHRTXCIat20I+4tLm/e8qOvrIE3Zv7S/DtYZEiAth84uoznvo1kXnN+KREse2vP/WoNgSDKQ2JLzkwYXSQ== +"@angular/platform-browser-dynamic@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.5.tgz#39cedb2144e093a7b6127a694565c6b1afb8b872" + integrity sha512-KuS4j3Gh1h/CEj+bIOc/IcZIdiCB/DNbtUvz1eNp1o23aM8QutqelI3A4WBnQuR4yq8Z/8M3FH9F1OVwwhn2QQ== dependencies: tslib "^2.3.0" -"@angular/platform-browser@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.3.3.tgz#b00a68526e2f39e9797ad4696f9dd8b42451f268" - integrity sha512-XFWjquD+Pr9VszRzrDlT6uaf57TsY9XhL9iHCNok6Op5DpVQpIAuw1vFt2t5ZoQ0gv+lY8mVWnxgqe3CgTdYxw== +"@angular/platform-browser@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.3.5.tgz#f1b3832163a7bfccb8e7c3cafa0246226f03a6aa" + integrity sha512-ITlu/GTD64Sr0FMaFCJiHoTJrEZw8qRFXjPjv3BKhAp5dQKcwnCm02o1NOaj5d8oIItIh5fbI2zP0CSU2qNZkQ== dependencies: tslib "^2.3.0" -"@angular/pwa@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/pwa/-/pwa-17.3.3.tgz#28851976b5763b2e6608dafc6fdd86af1416d42a" - integrity sha512-my2EHZ+ld9L+r2BUfL1Mq9ozUvE+1BY3bav5o4ZkwwtQOZ3XTqYIK2v3Z5O/Mot3XAIAeUR9rksoHGtCZcagMg== +"@angular/pwa@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/pwa/-/pwa-17.3.5.tgz#c0f9fb156a4dcd8961de191638728f18bd431854" + integrity sha512-qa1w36x/oRErS9eMTUkmVolA7G/d6lEshAs4RprGxh/2cZ5WkrOxdzb2u1KAEZr0X/C6118laFvr6KRyPCsxpw== dependencies: - "@angular-devkit/schematics" "17.3.3" - "@schematics/angular" "17.3.3" + "@angular-devkit/schematics" "17.3.5" + "@schematics/angular" "17.3.5" parse5-html-rewriting-stream "7.0.0" -"@angular/router@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.3.3.tgz#29859efaeaf9e70ff098011679d1407b68de5997" - integrity sha512-kj42+TtwvET7MFqxB3pkKyob0VNmspASlv8Y29vSpzzaOHn8J1fDf6H+8opoIC+Gmvo5NqXUDwq7nxI5aQ0mUQ== +"@angular/router@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.3.5.tgz#6498d91560296424a2e2bc8a09cd0d9d81058a85" + integrity sha512-KsIIs3t9IpxsdMSrJDZzO5WgIWkVE6Ep5WWiSyPIgEfA+ndGpJLmyv0d/r1yKKlYUJxz7Hde55o4thgT2n2x/A== dependencies: tslib "^2.3.0" -"@angular/service-worker@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.3.3.tgz#cd8c83793771e93e0a98192428d956d92e9cb487" - integrity sha512-ZS7MPNPdvIoNKuPfK2pukKiyn+OXVMUALBjSH6k2ayiKxhMiNBCybA4KkQf6DZ9NIlKiGoBc46wf7FZybWAYbQ== +"@angular/service-worker@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.3.5.tgz#7e297ef8a654b517cbb93cb6ac702df815068e21" + integrity sha512-YJBSxlrLDUINHjy1GTrbfmUJOUf2ArLN2y/nM4OOsIev7w0d6PIqruKX7wnT6tl6jJZwFRcEGulo/bSd68P63A== dependencies: tslib "^2.3.0" @@ -4858,10 +4881,10 @@ dependencies: tslib "2.6.1" -"@ngtools/webpack@17.3.3": - version "17.3.3" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.3.3.tgz#da62af790e2d7280fe8b03f5dbff343580ffc0f0" - integrity sha512-053KMbg1Tb+Mmg4Htsv8yTpI7ABghguoxhwosQXKB0CjO6M0oexuvdaxbRDQ1vd5xYNOW9LcOfxOMPIwyU4BBA== +"@ngtools/webpack@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.3.5.tgz#5f1a8d6e59e8fb37b8f1a4fe69116d9f46f2102f" + integrity sha512-0heI0yHUckdGI8uywu/wkp24KR/tdYMKYJOaYIU+9JydyN1zJRpbR7x0thddl7+k/zu2ZGbfFdv1779Ecw/xdA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -4947,98 +4970,98 @@ read-package-json-fast "^3.0.0" which "^4.0.0" -"@nrwl/angular@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-18.2.3.tgz#eb65c229726c50f00d78e679d5696b0494548a24" - integrity sha512-F0RtvSIH/Qs0ju7VcdfBpDeBZvwio2g4KdNpRog9ZBlgJjEmRWu7aA733A2xng96IkJkIrO0DiJaFbNdm8Yelw== +"@nrwl/angular@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/angular/-/angular-18.3.3.tgz#63d7b65e4d96637d7361d018ec56d061595cb0d4" + integrity sha512-pQsxy58DZBVna3qeJH+osdiRBpx+FCAnCz5kogO6EmRsM17zP4zGpgijVHorAI4EjCNhl2vWa3X/bZ8yQIFBpg== dependencies: - "@nx/angular" "18.2.3" + "@nx/angular" "18.3.3" tslib "^2.3.0" -"@nrwl/cypress@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-18.2.3.tgz#934f7615f347ece85025a925de2e132a9a924164" - integrity sha512-P44e3hmhXWK6jALoHK8bAVUvIqGP8SCX/GM/e6jVAZIjvAC+L69WTkAXVLgZkiD8WpZegSho47AtaL1D256a/g== +"@nrwl/cypress@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-18.3.3.tgz#3b85e45169c3aff23ea46e19835956a355111b22" + integrity sha512-CsoPFX+iLwvc/+Im/zZsk3FP8c8epBMmI8GNvZFnDZe8J9bdBmtlxp8/Yh3LdUw8ycmPGPvW7eggv31yNZmT+Q== dependencies: - "@nx/cypress" "18.2.3" + "@nx/cypress" "18.3.3" -"@nrwl/devkit@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.2.3.tgz#4de5589b99c6e5a15da334630079d027a59fdd4c" - integrity sha512-BJQdPmXFze7g4zsHhwSTssAcm/hvl0rXbIzZYQxncsVU4d+Fx0GS3JYBZ+9EcfnCeAEb10jGvn7Rfk+0okMmOw== +"@nrwl/devkit@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-18.3.3.tgz#9ec5575afe6d14b17acd5e8da4e98a0de27704c6" + integrity sha512-3zZLE1vfwsNie7qjVUt9lqaM1slU0RTr/dW+Yt/2lxe8Peu6f8bnCM1Pf3kSlzoxQroctfocRtVHFXJsAuAt4g== dependencies: - "@nx/devkit" "18.2.3" + "@nx/devkit" "18.3.3" -"@nrwl/eslint-plugin-nx@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-18.2.3.tgz#f66513f8a2bbb63f3555129f8d8236a0936d7573" - integrity sha512-hwIqxp2A0G250tFzEDmVbhwhtldoB7858848AME99Nt9Ij27ThzYaLIG+TYicmb+Rq2FqG9G/6wS89eg1aAg2Q== +"@nrwl/eslint-plugin-nx@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-18.3.3.tgz#b41316daa9ac7f55379cb4510767f7a865c920a6" + integrity sha512-ARqwcA2n2NN+8ATrooZtPbaW5fb9WSjDFZaI8RdphMXFnPrEkZnMpbrjFpLTj+wc1R6hIgTcYbli6fv4Gfbo3Q== dependencies: - "@nx/eslint-plugin" "18.2.3" + "@nx/eslint-plugin" "18.3.3" -"@nrwl/jest@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-18.2.3.tgz#f603d310729b216788d00d70ad0c00193f8bc430" - integrity sha512-64Ebl6GYOQ8AWp/MpPx8qXwKla3x0wnVGjJK4gUGOJ9ShMQnzd4hgYLpVuB4Des7QSxXoict3YVOVocY0joNow== +"@nrwl/jest@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-18.3.3.tgz#6d75e59c47be007cbe4b78c23fd3e08fe954ed68" + integrity sha512-BPI0mIbmjTHFb0/qtMND59ECld7gorV+SEVLwf4BLl7SWumVB2gLAA2+yx71cvF1jO4R5Ndi2FrBwBC9E2Va5Q== dependencies: - "@nx/jest" "18.2.3" + "@nx/jest" "18.3.3" -"@nrwl/js@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-18.2.3.tgz#f7aa58ae957403215ca2507c6740245796a27d3e" - integrity sha512-fOpKQg7CvzOmcow9fbBc5l96Pbv8gTe9qba4jiw3Z+EH776qraNBL9pRpff653V+obVh//gkq84BUeoJgk8vzQ== +"@nrwl/js@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-18.3.3.tgz#e1a83fb43541cd06752aced6dd7ad932d0c1afa1" + integrity sha512-7Wtv5kpeMWUDBUFu5go49HM/S8vDrtMOvZf9xnUcnjsFDReWe8XIEkTWudZDbzID3X4T6WQAftzj2Ov6k566lQ== dependencies: - "@nx/js" "18.2.3" + "@nx/js" "18.3.3" -"@nrwl/nest@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-18.2.3.tgz#c4544725ab375f1189e719b50410d38c36bcec95" - integrity sha512-hQqh3kGZ6Ky7zHzyRDNnzZ57Egn7w96IEfABsT2nnpej0LPWebryPefGSAI4Afgy2q8jSUFj9Bgjf6j93Ogiqg== +"@nrwl/nest@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/nest/-/nest-18.3.3.tgz#28709e32ef4cef6db06a9e219de46ae9b9f40378" + integrity sha512-LIyCiS73O58n7NRWT/SnuA8xHWDu4ANLd9fvguyAzXk1TcPekFvTo6zpY+iu0lkxJ7RfvZHVDGC90bIFSyV9YA== dependencies: - "@nx/nest" "18.2.3" + "@nx/nest" "18.3.3" -"@nrwl/node@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-18.2.3.tgz#fff8c16005c41c8c7d3fe6b7ee4a1b4446e44461" - integrity sha512-cQWAAtG+AexiWsU+5DRfEvbHhU0vkcvhdD3yUG8HjcMjc7eHS82PPxWUk/EzEI/3+3fYcHhSw5F/WyqaVkYJaw== +"@nrwl/node@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-18.3.3.tgz#eb0850a8e7877332550d7e06e7c959d0842b25e2" + integrity sha512-87PXppPqI/jOl6swYVdQi8RBveOF7Oqmqw9m9eEbts6U2bazPipKTwBO4E9afkz3GMqaxe+d2H794JqH05Mr8w== dependencies: - "@nx/node" "18.2.3" + "@nx/node" "18.3.3" -"@nrwl/storybook@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-18.2.3.tgz#340b10b845dfa373c0513fba40213631e6d0bf51" - integrity sha512-+kZYFSKtZp4+qDav2Z9+xGtRoCiYFE7toKSWNO+7qBmuEm+noCppgxyJ4dv92gc2DR8FSWPrHKp5x+Km0dwJYQ== +"@nrwl/storybook@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/storybook/-/storybook-18.3.3.tgz#80c60ef3975150127a9b09e2d7b79900cd962af0" + integrity sha512-i8mZoJz9CTT7hmXJxgqlz8u4nm48S4XTZLH5nARXcArjoiojUQTQnRr8iDZlJsZxa3+kHTMCJVyQ5WQUC6+Uog== dependencies: - "@nx/storybook" "18.2.3" + "@nx/storybook" "18.3.3" -"@nrwl/tao@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.2.3.tgz#c29abf614c23b404d30340326fb52d33822815c0" - integrity sha512-vmteqzGcKPbexaAVPb/7VfXI5dXxzZwSm3rem3z20QlDOmNh1545VLO9YEfT5xzmZT2CC7F0etR4KcrJLtoT5g== +"@nrwl/tao@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-18.3.3.tgz#2d0c60d233f2cc07c85ba08126dd46f21dda1ef0" + integrity sha512-f/PUDLpSMEObiLQ5sIDySJM+5DxSCNunkxxbY1R9rmQ1cFcgrHaXIHQqbSj91mMa3mmtbKACk8u1LbI+oQV0Tg== dependencies: - nx "18.2.3" + nx "18.3.3" tslib "^2.3.0" -"@nrwl/web@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-18.2.3.tgz#15e43dd727ba06df111edf16c7f74f915600e41d" - integrity sha512-nlucIDaMUOAG5xOJTCzvKHhCAxergYUrfi2XgPYjg4mu+ApqJxI7HO6FVXZazdivEwNy++BLErjmOjMb52iaVw== +"@nrwl/web@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-18.3.3.tgz#3e31d086fef5aa1e68ac5af9d5c27592ef2fe39d" + integrity sha512-EuEht/tk9VHLKxjVMEh96wu8WNkRFRabpmLBc++pp2bEaoxz8Qm2xDO+sOU3Wp4zGNx/qQVxA1kKMZCjVjk75g== dependencies: - "@nx/web" "18.2.3" + "@nx/web" "18.3.3" -"@nrwl/webpack@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-18.2.3.tgz#d3443ed4478e87defb5be209a335d71b91ccce27" - integrity sha512-ygkYzE+ihhFBuMmOuOkGse0Aas0CSbJ8uLth8UumnapU1euBTP5blhp+y6HRCRT8SzfGzc0qJ+M8YLb6E/DvMQ== +"@nrwl/webpack@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-18.3.3.tgz#0c29dc1561c9b8e613313fd02f805be72515dfa6" + integrity sha512-E/8vr1qAFSan1FnewvLBRBHYIaPG9dxZeYKRcQvcDx+Jf2oPyJNYI+9kkoNxEZg9FeFJMShK2x8YBgwB+ivH5A== dependencies: - "@nx/webpack" "18.2.3" + "@nx/webpack" "18.3.3" -"@nrwl/workspace@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-18.2.3.tgz#811b3778b3222be835248eb366de0b9a98f3843e" - integrity sha512-5tVtui/iy+VZTk3x/eFj21Zm0ICPUre9CfB5jlJ2MwH8w+96+186Yt2XGJATkFfnVnjqnszOcjk5BLlra8fdLA== +"@nrwl/workspace@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-18.3.3.tgz#291ecda3c4fddcb534f0cc6b7c7796a21483ae49" + integrity sha512-9Giuec9l3PpS8mekD00W9kBIKmWRpQSkp+/RvYmc+7kKtVC+Uj/kc68exBOanVgq6zKzYrn+FqHWHGWnHxp+ww== dependencies: - "@nx/workspace" "18.2.3" + "@nx/workspace" "18.3.3" "@nuxtjs/opencollective@0.3.2": version "0.3.2" @@ -5049,18 +5072,18 @@ consola "^2.15.0" node-fetch "^2.6.1" -"@nx/angular@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-18.2.3.tgz#564c304c253a268c87d2cb751655691f471e98f7" - integrity sha512-oSp4cNlyCUd03SNoa+x5zjrnqBjxANInB0+vsGD5VlOewpfkVNWPb7TIRa+JyOFXWSWblF0LNEiLxWnxY+27gw== - dependencies: - "@nrwl/angular" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/eslint" "18.2.3" - "@nx/js" "18.2.3" - "@nx/web" "18.2.3" - "@nx/webpack" "18.2.3" - "@nx/workspace" "18.2.3" +"@nx/angular@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-18.3.3.tgz#3648480ddec56e2ca54caed7482eb941b60df3e4" + integrity sha512-KAWpIxd+cNAjSNaArHzJGavES6hBJApE6KVgg3lJwSThkjgTy6loEC4mw8VAQaSlHVx/OEQcbebC1LPkJadG9w== + dependencies: + "@nrwl/angular" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/eslint" "18.3.3" + "@nx/js" "18.3.3" + "@nx/web" "18.3.3" + "@nx/webpack" "18.3.3" + "@nx/workspace" "18.3.3" "@phenomnomnominal/tsquery" "~5.0.1" "@typescript-eslint/type-utils" "^7.3.0" chalk "^4.1.0" @@ -5074,26 +5097,26 @@ webpack "^5.80.0" webpack-merge "^5.8.0" -"@nx/cypress@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-18.2.3.tgz#fe32cbb21d592fbe0c62f1ee47abc5ffc232bd23" - integrity sha512-TY5LC4cXFAMq3hrIQDTKYwGgNVDWCTF6i22gaaMlTayowfSWcEug5FHfBGXzpvYR4Q5Snci988krI1yN/6Fbfw== +"@nx/cypress@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/cypress/-/cypress-18.3.3.tgz#d0af052f421312018b0d0ddc3476cd4a31ca748f" + integrity sha512-ou7Q6XXM9zIiWFVojZwnnFFJxx4iKACWvusfCOIwJ3zcel1vtamWHffRp2Z9WjdBDxy26Ax/DM+lZj4t6hQRmA== dependencies: - "@nrwl/cypress" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/eslint" "18.2.3" - "@nx/js" "18.2.3" + "@nrwl/cypress" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/eslint" "18.3.3" + "@nx/js" "18.3.3" "@phenomnomnominal/tsquery" "~5.0.1" detect-port "^1.5.1" semver "^7.5.3" tslib "^2.3.0" -"@nx/devkit@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.2.3.tgz#81788e9d018772414ddad0f1aba7ce007da570a3" - integrity sha512-dugw9Jm3Og28uwGee94P3KYkqiUV7J8RgibOQjQG4J2Vt3DPBNEGSgBD72qKkzpioEo+XSVUkn9h3GrdmnRU+Q== +"@nx/devkit@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-18.3.3.tgz#2ec37855020da74ad1e77b51711b057b3cb12fec" + integrity sha512-FtkZ6mA5//vEA5lcbT80m080ROVacHYV5F1peztTRA+IY2JZGJoqx425kn5ylDO8aCSAIAwcn2qIdhI8BnpG3Q== dependencies: - "@nrwl/devkit" "18.2.3" + "@nrwl/devkit" "18.3.3" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -5102,14 +5125,14 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/eslint-plugin@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-18.2.3.tgz#99e7e46d8bc32966bdb9c0be7783b7e7bc84a795" - integrity sha512-vOHkzHNpDLLd5RMrL/8/sAdqBqMcf2FrSJWug6W4cC0x8hzUpNwnfEn+i4ZCV/QxduQH4/UP96AbOm7rzwoAdg== +"@nx/eslint-plugin@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-18.3.3.tgz#0410261cf7f1a227eefbe2a979c9482ad9c19894" + integrity sha512-ww3r8VRlzJXOBRG+qCTd+VXHRKxiIrOH+cIokTtuzGrnCXWEMSPO5Ts6z/Jsbb0xAcfZ39WUnxuDZdKbp4aHqA== dependencies: - "@nrwl/eslint-plugin-nx" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/js" "18.2.3" + "@nrwl/eslint-plugin-nx" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/js" "18.3.3" "@typescript-eslint/type-utils" "^7.3.0" "@typescript-eslint/utils" "^7.3.0" chalk "^4.1.0" @@ -5118,28 +5141,28 @@ semver "^7.5.3" tslib "^2.3.0" -"@nx/eslint@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-18.2.3.tgz#714106ffb0e9a7dd35e3248640a073e811eb9c66" - integrity sha512-qr1A3on5tPR3Rxsrg1wlPLVB/L6iFDp+II1xBb/3PBAsddKvPCzPASsogAm0Q3RdqK2JkJrwo/rX3YxwrjZ5cQ== +"@nx/eslint@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-18.3.3.tgz#ce28b4240e0558333dee08c824d8f82d72a11159" + integrity sha512-cvJjyykTEtQN08b5wQFelD/cbye7Nl5zFVESs+mn9/ezCukjAgP9seOk39nchKykRBAm7zzA1xZOB9thNqw9aA== dependencies: - "@nx/devkit" "18.2.3" - "@nx/js" "18.2.3" - "@nx/linter" "18.2.3" + "@nx/devkit" "18.3.3" + "@nx/js" "18.3.3" + "@nx/linter" "18.3.3" eslint "^8.0.0" tslib "^2.3.0" typescript "~5.4.2" -"@nx/jest@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-18.2.3.tgz#f36a0671bb64e45961dad4a97c835873a5e297cf" - integrity sha512-AMI/RuTlNz5d0JiBdraCkZ1ABfEyuJkdCvVjo/RDu1NAw1Xv4hI4+5UG7sb/bJoX6n+lK1SS51z+Zb/ab8lQoQ== +"@nx/jest@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-18.3.3.tgz#4a25f77169d0e630cb9b5f49bd0cde1faf0aae31" + integrity sha512-AwkwYSJqu0vrDFMxKAc3lb0yHZFhsD8rX6rMMwe/fZMlAYml9FvGCp/ixWpcRWIo/1t3pxiF3Vejk9+oq/Avfw== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/js" "18.2.3" + "@nrwl/jest" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/js" "18.3.3" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" identity-obj-proxy "3.0.0" @@ -5151,10 +5174,10 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/js@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-18.2.3.tgz#fd9a1be56fd674f80563a20d90feffc6ab9b830a" - integrity sha512-hFSmgyaMVIlN/SyFwOwn/IveHsGxxJOv7qhewACg9NlKOa6+eEJYlEbOik9LjvcosDOh5icrngjsFgFJoC1sWA== +"@nx/js@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-18.3.3.tgz#977968160d6edc11f320bc0f654b52d36a9101ac" + integrity sha512-e8u56oG0mlTVz48EeH0C7txX0GeLYN0o4mK1LDAMIHQa4tKefNfwrdqHaZBiVqFOPopeFtqi8s0kqce5prwCaw== dependencies: "@babel/core" "^7.23.2" "@babel/plugin-proposal-decorators" "^7.22.7" @@ -5163,9 +5186,9 @@ "@babel/preset-env" "^7.23.2" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nrwl/js" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/workspace" "18.2.3" + "@nrwl/js" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/workspace" "18.3.3" "@phenomnomnominal/tsquery" "~5.0.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" @@ -5187,125 +5210,125 @@ tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-18.2.3.tgz#a2b9bd388955f7872c42b5dfcabb7f308344039b" - integrity sha512-buxqe0N/d5iVWA4zE/jX8xrkCJLyGG2h1bSTrz1oyPvM3SdcWr69JpL8j1wtBvnKo/brDzLbNWsnrUwO9cgSAQ== +"@nx/linter@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-18.3.3.tgz#ae861fb7d10c4f1dcdb4389f5b9f25aecab6fee0" + integrity sha512-5HmAN/8jZ2scrA0OiJSUdBPhIjwIHecK8AK7TxYX4fg1VJ3VcpknV8pWcETuNoBW8WlgF1RX2RW7Gog7vjf+Ww== dependencies: - "@nx/eslint" "18.2.3" + "@nx/eslint" "18.3.3" -"@nx/nest@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-18.2.3.tgz#24a01ba16207768e80ff42004fa6552b2605f609" - integrity sha512-kBIKF08iB8V4k9RaPsSzawaVIZo/czx+SEaQmS7+fSsVerLji5ZJoFKqSxnDz6ksW1lfkmRpymSdWWHRc/UDKA== +"@nx/nest@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-18.3.3.tgz#16fe7ba6d1f8634ffae58b8e6dda4132ef112c5e" + integrity sha512-e2uPVBsewdLkgf9ncAxN/UEln3ygc1lyy8LTfR5X0Gzx3CUPiayDfd9OxZaxnDFi7Jpu89dpckMO8NhAIBvheA== dependencies: "@nestjs/schematics" "^9.1.0" - "@nrwl/nest" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/eslint" "18.2.3" - "@nx/js" "18.2.3" - "@nx/node" "18.2.3" + "@nrwl/nest" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/eslint" "18.3.3" + "@nx/js" "18.3.3" + "@nx/node" "18.3.3" "@phenomnomnominal/tsquery" "~5.0.1" tslib "^2.3.0" -"@nx/node@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-18.2.3.tgz#5ba965f8163dadb802bd43c9706807efaea750be" - integrity sha512-ryI+xzFLBNlRqLNH5UkHO2ZYIs1u1dUbkf7HTyJ4AOrzH2kuBd7tKfFI/IcDzmhjMOfhDYPC0RV7osOSS5Vdiw== +"@nx/node@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-18.3.3.tgz#a000284eb88dc58cbb4dad9909c1e0a930560c61" + integrity sha512-OoeRuuvqrdEH8AsFKrJ91lnDVL9mlqvLzUy9D5PZCYspjCesc7Tmt7Xmbu3VEGzhQPilqZz4hVfXH6MLE7TvqA== dependencies: - "@nrwl/node" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/eslint" "18.2.3" - "@nx/jest" "18.2.3" - "@nx/js" "18.2.3" + "@nrwl/node" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/eslint" "18.3.3" + "@nx/jest" "18.3.3" + "@nx/js" "18.3.3" tslib "^2.3.0" -"@nx/nx-darwin-arm64@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.2.3.tgz#4b3f14437e6f5a7233594f63a8d36097e8872af1" - integrity sha512-TEks/vXHE87rNvVqhcIzQOM/+aZvNCf/70PhGG4RBEb+qV0C1kw7nygzdoLI4inFC76Qxhyya/K3J2OnU5ATiw== - -"@nx/nx-darwin-x64@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.2.3.tgz#bc546836bcce2293181a315666d4a0ea7b42642a" - integrity sha512-UsBbNbNXj+L2OzPyQYotyzmZF4h+ryaZ8quYDfdnlYwvFeqkdb2QJ3vJRd6in0kMWGrdk/ria/wZMCxR7U1ggg== - -"@nx/nx-freebsd-x64@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.2.3.tgz#afe920b26385fffb77cbad5435ff97607481c01c" - integrity sha512-f9BXGOeRPhrsNm99TCnOqZZeZUqN1BUOEzWa12eo3u+vQG6Qba3qKn7T92SeEzxOx/mUP/Csv3pFYoY6TE26jA== - -"@nx/nx-linux-arm-gnueabihf@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.2.3.tgz#d438dddcfb0fd255b8903214118c304eb89f33ef" - integrity sha512-ekqr5jZhD6PxGM5IbI/RtlERDJ+8HR04OIdfo6HkbwxwCHxZlzZq+ApEZYum4AbjP6cuc3Zd/us1uuDqfQbeHw== - -"@nx/nx-linux-arm64-gnu@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.2.3.tgz#a496666a70499d22589dfe0df3d46e738921250b" - integrity sha512-iAW2J8NBFU4zDn5nqRgUq4t7gYC8ALyALzznr97ZvMTQorWfmHYgPUAj/opNqUcr10fjxcmXT0Ux2SX3DgUDmw== - -"@nx/nx-linux-arm64-musl@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.2.3.tgz#90744f03377959bdc90cf5a8a2f00afb5b084b70" - integrity sha512-AJjGVHGGew0QVKUL30mjFjafowrSDYSQ1GgkJCLuWef5jl4rFvm9ruZswVja1KfZTFaImTCU01tZjPBr3zhmAA== - -"@nx/nx-linux-x64-gnu@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.2.3.tgz#0c0fac195dcf5eaf58a89bbd4764e06c5e338f14" - integrity sha512-nk5Xg8vmbBRoL0fOgZNBl1paC7hmjACLaSBmU7U2X+Y+QPGQzSw2b+Zn1MKVUWDmc4E6VnQfZ8n0L27+r9NgRw== - -"@nx/nx-linux-x64-musl@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.2.3.tgz#ba2e290ae3e7e0b43669546591e576c3f7ff2c50" - integrity sha512-bOlhul/eov58k9fX8lltopUDOIBEohZq2qc4ag91W2r4jdp6suAiqfXRxQwNZ2iHd8nAXuCDIHCbUuojs6OZnA== - -"@nx/nx-win32-arm64-msvc@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.2.3.tgz#5fc56f77ae98e273b1abb9eaf91492f1a40f2dc6" - integrity sha512-olXer0LnCvJrdV5ynd19fZHvvarRK/p1JnkoOUZDPVV+A3jGQQ8+paz+/5iLQBKA+5VcgWyqAaGFJnpyEFmnoQ== - -"@nx/nx-win32-x64-msvc@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.3.tgz#91083c549d4cdbaa0098cf1158edce98f1b440d6" - integrity sha512-BgzPjF/wqi7zIFcspcKzN37BX1wgGo0OTLncK2PN5nyzSQ+XeNbR5laDswxzOGdB4CRLPqak2+YMhYnoiXeRCg== - -"@nx/storybook@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-18.2.3.tgz#38a9d6a541113304abf5d918411bf8696ccdb51e" - integrity sha512-6XvgLD2L4+cbEwPneey+mxB7nGUi4l0K+R1AWjijGg14X2IzyCTgs5up56vIAKVuwuXxGWUTuXgSXwfKXINLIg== - dependencies: - "@nrwl/storybook" "18.2.3" - "@nx/cypress" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/eslint" "18.2.3" - "@nx/js" "18.2.3" +"@nx/nx-darwin-arm64@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.3.tgz#dcdbcfe2796bbe3f1dfd61bce81389b05a50e69b" + integrity sha512-NpA2/7o1uUuaocMYopX9muxKif9HlGfWaXo2UeiR918usF6xri4aUqweZbaXVc9iqCAEbVMWUsjaLYGKPXHAjw== + +"@nx/nx-darwin-x64@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.3.tgz#aa7bdd1a3ea0bb81682422b805914efccab3b179" + integrity sha512-aydPLbc7DeceJ6szRf6DLT4ERoPvwfWyFiGXdAlEZYWhjEuNZLeG8K6jA3yHeWltKfX/qJqhnyKbnubBNzBKlQ== + +"@nx/nx-freebsd-x64@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.3.tgz#331f5dbb56c90b08e99c1ce9ff51e0c5b956f030" + integrity sha512-sEYEWsK/fwC1l7wzls7RNOjhmrooH0lK0mpgj1vDXesLBSZ7k+pddAqaHFECN4QXBSbHZI2PWOEhbnIH+Errsg== + +"@nx/nx-linux-arm-gnueabihf@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.3.tgz#d66d4787f5cfc56b5a7aa9a0453174b96b4729a8" + integrity sha512-B9GGMkrrzwiAfvew22x85ITO9TiNxbgRbKJQWQaoopNpXrnSWpY8WTNxpDT24fwV1qdQfsPKcY3F4O0NOUgPRA== + +"@nx/nx-linux-arm64-gnu@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.3.tgz#2ab08df1d052a55d4a52ba910fe41c25701d5361" + integrity sha512-1EucHf5/0JeqZmhritqkpEdOcdo9Dl32gpFvhNfS6kCAYmaDlEl4zqedz3VIoj4C7+C0pV3mcRO9qB9H7GM5bQ== + +"@nx/nx-linux-arm64-musl@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.3.tgz#69376454bb9759c376d0a90aa876dfff6bbf4d15" + integrity sha512-HPgOgnYYLPVCBEaAkSEGPGzZqTDCiyCAF/qtvx5z0f1U/hZYb1ubgxw70ogY82Cafr7X4gQBz5k4/ZCnoCXlOQ== + +"@nx/nx-linux-x64-gnu@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.3.tgz#0b8ba8ec0c2371f0df462742460d52d63b1cc715" + integrity sha512-FgYTQ3VEE6EUOGtJT9riRK8IBwPGFjKS+N2mudQJn2bB/9IumUvVRYQUIX08gqGLlqZPO6uUUhUjwZY8SnjRLQ== + +"@nx/nx-linux-x64-musl@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.3.tgz#c96d6f8d2d94b99ac8da723077ebbc92f833beea" + integrity sha512-QnWjGViR1Wj9gJXa1RJ9mXyy2/JzQ7NF2C4ulTYSH5St1HoxhkfnLsV0+uNLFEV9PSZq+2BfxmQuT8Appefv1A== + +"@nx/nx-win32-arm64-msvc@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.3.tgz#0d2c7396e7a063849edbd6e3d34ea81445c389b5" + integrity sha512-Xn3LUaPsF8QkEYUVV3lc693NTCMWrfZBFXTy1cQpvLzQ+idsXQ/EGWoq93cIM3Nc2YWyblT2hHHelb8dHCZAlw== + +"@nx/nx-win32-x64-msvc@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.3.tgz#ea1a60ae1ffe805529d5cb95e7b28e6b8ae24621" + integrity sha512-t8HvOnQEiaaoTFOOIrql30NPhIwDFO7jg0Jtz3Tbneulh7ceswJp71yFHsRGGrYZ23Tgg+Sna6M9qLRGzlRGkg== + +"@nx/storybook@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/storybook/-/storybook-18.3.3.tgz#4fa01568e3189984d14bae217281f16e2cea5f4e" + integrity sha512-wqca3J20F9HakmPBzq9fwmcZ25LFNb9iWnSngXMgDXjRizbjZrXrCkpyiZe3qlYzhoCNN9oYlUsbas3dec/lwA== + dependencies: + "@nrwl/storybook" "18.3.3" + "@nx/cypress" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/eslint" "18.3.3" + "@nx/js" "18.3.3" "@phenomnomnominal/tsquery" "~5.0.1" semver "^7.5.3" tslib "^2.3.0" -"@nx/web@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-18.2.3.tgz#c1d1bf7a77d16fd9281453c1c9e68dea853f0fc0" - integrity sha512-nDiCHinZGfkGWuTL2HLk6tUcKILMYtrtd6c/cE8T+5TnTXNaMrOQFt1GvDa60HGh8xgRgpjzTsGfJFrf90GJcA== +"@nx/web@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-18.3.3.tgz#99e6952942b3e43bc52ba444f6933dd279f49a6a" + integrity sha512-/NfQirVd2Ncq2if+1n8DaxNQF0OLaFaDag7qm5pDWJnjXFNh8N7NGZQRry2k/bTSfSc8gN+KJjqSMLAUNNtKgQ== dependencies: - "@nrwl/web" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/js" "18.2.3" + "@nrwl/web" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/js" "18.3.3" chalk "^4.1.0" detect-port "^1.5.1" http-server "^14.1.0" tslib "^2.3.0" -"@nx/webpack@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-18.2.3.tgz#15b3c4be376f2313abdd64c3b67e04f11fbde1fc" - integrity sha512-0X7HXrF/VP9BrbbYD4Ewr4KnMT85eSaIBr/TvTrUM4v2BXqPgP4NVQhkd6jLlEkWuDlYtAgwFjcx4NGWRqnwbw== +"@nx/webpack@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-18.3.3.tgz#2b13c08c99821a413edd4ff7749936871ae6ae32" + integrity sha512-DPs8wfmYe/mEZCQ/TQgUqb/zgXY8hevR23d8bDkYjB3Akjk4OOF3QpQ2OXQ4c+Jf0ckGnQYOg6XAkE682UZqzg== dependencies: "@babel/core" "^7.23.2" - "@nrwl/webpack" "18.2.3" - "@nx/devkit" "18.2.3" - "@nx/js" "18.2.3" + "@nrwl/webpack" "18.3.3" + "@nx/devkit" "18.3.3" + "@nx/js" "18.3.3" ajv "^8.12.0" autoprefixer "^10.4.9" babel-loader "^9.1.2" @@ -5340,16 +5363,16 @@ webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@18.2.3": - version "18.2.3" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-18.2.3.tgz#797b2aef3613ddb30ea4dbef0bd1bde37b3c60e2" - integrity sha512-en3lSArMrHZ75SqMHnnZjXiMunc6QFDMcglNPQwIE8TuXnV8UWQ1e4hkzRo6hY/YOoY7HcFvMEJ5KyP8OWCmQg== +"@nx/workspace@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-18.3.3.tgz#bae369fe9d6c8aca425222ec53f797bcacd715e6" + integrity sha512-SUJJKzOUuNnclpHHde6f6nlF+pQwMjeF026jFpWDFaNzdsADhhRulkz0GLRXB9kKszvzz2JKde9WBWnKrFZ2IQ== dependencies: - "@nrwl/workspace" "18.2.3" - "@nx/devkit" "18.2.3" + "@nrwl/workspace" "18.3.3" + "@nx/devkit" "18.3.3" chalk "^4.1.0" enquirer "~2.3.6" - nx "18.2.3" + nx "18.3.3" tslib "^2.3.0" yargs-parser "21.1.1" @@ -5831,6 +5854,15 @@ "@angular-devkit/schematics" "17.3.3" jsonc-parser "3.2.1" +"@schematics/angular@17.3.5": + version "17.3.5" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.3.5.tgz#c58a6afef977e9280cc7a5e24e70b058f68fdc5e" + integrity sha512-SWCK16Eob0K86hpZ3NHmrTS6LSzTlhvnIdf3BXC6nzoiyDhcAS0oJ2Tjdq1opW/PaL1hB7MulcbIhxYln5du0w== + dependencies: + "@angular-devkit/core" "17.3.5" + "@angular-devkit/schematics" "17.3.5" + jsonc-parser "3.2.1" + "@schematics/angular@^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0": version "17.0.0" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0.tgz#63ddf8bfbb3b117fe7a355bd22b43d2c9ff7f0ee" @@ -15623,12 +15655,12 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@18.2.3: - version "18.2.3" - resolved "https://registry.yarnpkg.com/nx/-/nx-18.2.3.tgz#40d4c18a3b7143e10b3645b5bd47a65c5b9d5e6f" - integrity sha512-4XGvvIzXeeeSj1hObiBL7E7aXX6rbiB1F856AqUdGoysYfkhcxOFyeAv5XsXeukl9gYwh/LH84paXjEOkGaJlA== +nx@18.3.3: + version "18.3.3" + resolved "https://registry.yarnpkg.com/nx/-/nx-18.3.3.tgz#ab96811961b631efd4f0c83550e92f7b0a625e83" + integrity sha512-GqC5ANfTWV6SFbgquZwuRMI2Z2nO0c0Yx4JzM3x32aJOgXsmRml3WcV0a5648bIXSen34gylHYl2EHaxVWkzNQ== dependencies: - "@nrwl/tao" "18.2.3" + "@nrwl/tao" "18.3.3" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" @@ -15663,16 +15695,16 @@ nx@18.2.3: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "18.2.3" - "@nx/nx-darwin-x64" "18.2.3" - "@nx/nx-freebsd-x64" "18.2.3" - "@nx/nx-linux-arm-gnueabihf" "18.2.3" - "@nx/nx-linux-arm64-gnu" "18.2.3" - "@nx/nx-linux-arm64-musl" "18.2.3" - "@nx/nx-linux-x64-gnu" "18.2.3" - "@nx/nx-linux-x64-musl" "18.2.3" - "@nx/nx-win32-arm64-msvc" "18.2.3" - "@nx/nx-win32-x64-msvc" "18.2.3" + "@nx/nx-darwin-arm64" "18.3.3" + "@nx/nx-darwin-x64" "18.3.3" + "@nx/nx-freebsd-x64" "18.3.3" + "@nx/nx-linux-arm-gnueabihf" "18.3.3" + "@nx/nx-linux-arm64-gnu" "18.3.3" + "@nx/nx-linux-arm64-musl" "18.3.3" + "@nx/nx-linux-x64-gnu" "18.3.3" + "@nx/nx-linux-x64-musl" "18.3.3" + "@nx/nx-win32-arm64-msvc" "18.3.3" + "@nx/nx-win32-x64-msvc" "18.3.3" oauth@0.9.x: version "0.9.15" @@ -18875,10 +18907,10 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici@6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.7.1.tgz#3cb27222fd5d72c1b2058f4e18bf9b53dd933af8" - integrity sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ== +undici@6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.11.1.tgz#75ab573677885b421ca2e6f5f17ff1185b24c68d" + integrity sha512-KyhzaLJnV1qa3BSHdj4AZ2ndqI0QWPxYzaIOio0WzcEJB9gvuysprJSLtpvc2D9mhR9jPDUk7xlJlZbH2KR5iw== unfetch@^4.2.0: version "4.2.0" @@ -19152,10 +19184,10 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vite@5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.5.tgz#bdbc2b15e8000d9cc5172f059201178f9c9de5fb" - integrity sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q== +vite@5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.7.tgz#9f685a2c4c70707fef6d37341b0e809c366da619" + integrity sha512-sgnEEFTZYMui/sTlH1/XEnVNHMujOahPLGMxn1+5sIT45Xjng1Ec1K78jRP15dSmVgg5WBin9yO81j3o9OxofA== dependencies: esbuild "^0.19.3" postcss "^8.4.35"