diff --git a/.config/prisma.ts b/.config/prisma.ts new file mode 100644 index 000000000..64691136c --- /dev/null +++ b/.config/prisma.ts @@ -0,0 +1,14 @@ +import { defineConfig } from '@prisma/config'; +import { config } from 'dotenv'; +import { expand } from 'dotenv-expand'; +import { join } from 'node:path'; + +expand(config({ quiet: true })); + +export default defineConfig({ + migrations: { + path: join(__dirname, '..', 'prisma', 'migrations'), + seed: `node ${join(__dirname, '..', 'prisma', 'seed.mts')}` + }, + schema: join(__dirname, '..', 'prisma', 'schema.prisma') +}); diff --git a/CHANGELOG.md b/CHANGELOG.md index 7690d90ed..1d5674673 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,29 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 2.211.0 - 2025-10-25 + +### Added + +- Extended the export functionality by the user account’s performance calculation type +- Added the _SelfhostedHub_ logo to the logo carousel on the landing page +- Added a user detail dialog to the users section of the admin control panel + +### Changed + +- Localized the number formatting in the static portfolio analysis rule: _Liquidity_ (Buying Power) +- Moved the _Prisma Configuration File_ from `prisma.config.ts` to `.config/prisma.ts` +- Improved the language localization for German (`de`) +- Upgraded `prisma` from version `6.17.1` to `6.18.0` +- Upgraded `tablemark` from version `3.1.0` to `4.1.0` + +### Fixed + +- Fixed the style in the footer row of the accounts table +- Fixed the rendering of names and symbols for custom assets in the import activities dialog +- Fixed an issue with the market price in base currency during the portfolio snapshot calculation + +## 2.210.1 - 2025-10-22 ### Added @@ -16,10 +38,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extracted the portfolio filter form of the assistant to a reusable component - Formatted the holdings table in the _Copy AI prompt to clipboard for analysis_ action on the analysis page (experimental) - Formatted the holdings table in the _Copy portfolio data to clipboard for AI prompt_ action on the analysis page (experimental) +- Reverted the explicit configuration of the _Redis_ address family in the job queue module - Improved the language localization for German (`de`) +- Upgraded `ioredis` from version `5.6.1` to `5.8.2` ### Fixed +- Fixed the enter key press to submit the form of the login with access token dialog - Fixed an issue in the database seeding process caused by unresolved environment variables in `DATABASE_URL` ## 2.209.0 - 2025-10-18 @@ -64,7 +89,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed the deprecated endpoint `GET api/v1/portfolio/position/:dataSource/:symbol` - Removed the deprecated endpoint `PUT api/v1/portfolio/position/:dataSource/:symbol/tags` - Improved the language localization for German (`de`) -- Upgraded `prisma` from version `6.16.1` to `6.16.3` +- Upgraded `prisma` from version `6.16.1` to `6.17.1` ### Fixed diff --git a/Dockerfile b/Dockerfile index be1bb53ea..5beaf6e03 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,11 +13,11 @@ RUN apt-get update && apt-get install -y --no-install-suggests \ # Only add basic files without the application itself to avoid rebuilding # layers when files (package.json etc.) have not changed +COPY ./.config .config/ COPY ./CHANGELOG.md CHANGELOG.md COPY ./LICENSE LICENSE COPY ./package.json package.json COPY ./package-lock.json package-lock.json -COPY ./prisma.config.ts prisma.config.ts COPY ./prisma/schema.prisma prisma/ RUN npm install @@ -44,7 +44,7 @@ WORKDIR /ghostfolio/dist/apps/api COPY ./package-lock.json /ghostfolio/dist/apps/api/ RUN npm install -COPY prisma.config.ts /ghostfolio/dist/apps/api/ +COPY .config /ghostfolio/dist/apps/api/.config/ COPY prisma /ghostfolio/dist/apps/api/prisma/ # Overwrite the generated package.json with the original one to ensure having diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 86ceede28..5ec148558 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -71,7 +71,6 @@ import { UserModule } from './user/user.module'; BullModule.forRoot({ redis: { db: parseInt(process.env.REDIS_DB ?? '0', 10), - family: 0, host: process.env.REDIS_HOST, password: process.env.REDIS_PASSWORD, port: parseInt(process.env.REDIS_PORT ?? '6379', 10) diff --git a/apps/api/src/app/endpoints/ai/ai.service.ts b/apps/api/src/app/endpoints/ai/ai.service.ts index d1e1b413f..4cc4fde65 100644 --- a/apps/api/src/app/endpoints/ai/ai.service.ts +++ b/apps/api/src/app/endpoints/ai/ai.service.ts @@ -10,7 +10,7 @@ import type { AiPromptMode } from '@ghostfolio/common/types'; import { Injectable } from '@nestjs/common'; import { createOpenRouter } from '@openrouter/ai-sdk-provider'; import { generateText } from 'ai'; -import tablemark, { ColumnDescriptor } from 'tablemark'; +import type { ColumnDescriptor } from 'tablemark'; @Injectable() export class AiService { @@ -92,6 +92,13 @@ export class AiService { } ); + // Dynamic import to load ESM module from CommonJS context + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const dynamicImport = new Function('s', 'return import(s)') as ( + s: string + ) => Promise; + const { tablemark } = await dynamicImport('tablemark'); + const holdingsTableString = tablemark(holdingsTableRows, { columns: holdingsTableColumns }); diff --git a/apps/api/src/app/export/export.controller.ts b/apps/api/src/app/export/export.controller.ts index 0b4a2c6e0..5446f8789 100644 --- a/apps/api/src/app/export/export.controller.ts +++ b/apps/api/src/app/export/export.controller.ts @@ -48,8 +48,8 @@ export class ExportController { return this.exportService.export({ activityIds, filters, - userCurrency: this.request.user.settings.settings.baseCurrency, - userId: this.request.user.id + userId: this.request.user.id, + userSettings: this.request.user.settings.settings }); } } diff --git a/apps/api/src/app/export/export.service.ts b/apps/api/src/app/export/export.service.ts index 2001fd3e2..d07b199be 100644 --- a/apps/api/src/app/export/export.service.ts +++ b/apps/api/src/app/export/export.service.ts @@ -3,7 +3,11 @@ import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { environment } from '@ghostfolio/api/environments/environment'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; -import { ExportResponse, Filter } from '@ghostfolio/common/interfaces'; +import { + ExportResponse, + Filter, + UserSettings +} from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; import { Platform, Prisma } from '@prisma/client'; @@ -21,13 +25,13 @@ export class ExportService { public async export({ activityIds, filters, - userCurrency, - userId + userId, + userSettings }: { activityIds?: string[]; filters?: Filter[]; - userCurrency: string; userId: string; + userSettings: UserSettings; }): Promise { const { ACCOUNT: filtersByAccount } = groupBy(filters, ({ type }) => { return type; @@ -36,11 +40,11 @@ export class ExportService { let { activities } = await this.orderService.getOrders({ filters, - userCurrency, userId, includeDrafts: true, sortColumn: 'date', sortDirection: 'asc', + userCurrency: userSettings?.baseCurrency, withExcludedAccountsAndActivities: true }); @@ -244,7 +248,10 @@ export class ExportService { } ), user: { - settings: { currency: userCurrency } + settings: { + currency: userSettings?.baseCurrency, + performanceCalculationType: userSettings?.performanceCalculationType + } } }; } diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 2725747aa..2ec28365e 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -539,6 +539,7 @@ export class ImportService { connectOrCreate: { create: { dataSource, + name, symbol, currency: assetProfile.currency, userId: dataSource === 'MANUAL' ? user.id : undefined @@ -746,10 +747,19 @@ export class ImportService { if (['FEE', 'INTEREST', 'LIABILITY'].includes(type)) { // Skip asset profile validation for FEE, INTEREST, and LIABILITY // as these activity types don't require asset profiles + const assetProfileInImport = assetProfilesWithMarketDataDto?.find( + (profile) => { + return ( + profile.dataSource === dataSource && profile.symbol === symbol + ); + } + ); + assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })] = { currency, dataSource, - symbol + symbol, + name: assetProfileInImport?.name }; continue; diff --git a/apps/api/src/app/order/create-order.dto.ts b/apps/api/src/app/order/create-order.dto.ts index ba7a1d868..fb4ac32dd 100644 --- a/apps/api/src/app/order/create-order.dto.ts +++ b/apps/api/src/app/order/create-order.dto.ts @@ -44,7 +44,8 @@ export class CreateOrderDto { customCurrency?: string; @IsEnum(DataSource) - dataSource: DataSource; + @IsOptional() // Optional for type FEE, INTEREST, and LIABILITY (default data source is resolved in the backend) + dataSource?: DataSource; @IsISO8601() @Validate(IsAfter1970Constraint) diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts index 01a5a60f0..8c88cc2cf 100644 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ b/apps/api/src/app/order/interfaces/activities.interface.ts @@ -3,11 +3,6 @@ import { AccountWithPlatform } from '@ghostfolio/common/types'; import { Order, Tag } from '@prisma/client'; -export interface Activities { - activities: Activity[]; - count: number; -} - export interface Activity extends Order { account?: AccountWithPlatform; error?: ActivityError; diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 86228cf2e..d6c231059 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -11,7 +11,10 @@ import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; -import { ActivityResponse } from '@ghostfolio/common/interfaces'; +import { + ActivitiesResponse, + ActivityResponse +} from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { DateRange, RequestWithUser } from '@ghostfolio/common/types'; @@ -37,7 +40,6 @@ import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { CreateOrderDto } from './create-order.dto'; -import { Activities } from './interfaces/activities.interface'; import { OrderService } from './order.service'; import { UpdateOrderDto } from './update-order.dto'; @@ -114,7 +116,7 @@ export class OrderController { @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string, @Query('take') take?: number - ): Promise { + ): Promise { let endDate: Date; let startDate: Date; diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 11579bbf1..e4c642977 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -14,6 +14,7 @@ import { } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { + ActivitiesResponse, AssetProfileIdentifier, EnhancedSymbolProfile, Filter @@ -37,8 +38,6 @@ import { endOfToday, isAfter } from 'date-fns'; import { groupBy, uniqBy } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { Activities } from './interfaces/activities.interface'; - @Injectable() export class OrderService { public constructor( @@ -129,7 +128,7 @@ export class OrderService { const assetSubClass = data.assetSubClass; const dataSource: DataSource = 'MANUAL'; - let name: string; + let name = data.SymbolProfile.connectOrCreate.create.name; let symbol: string; if ( @@ -142,7 +141,7 @@ export class OrderService { symbol = data.SymbolProfile.connectOrCreate.create.symbol; } else { // Create custom asset profile - name = data.SymbolProfile.connectOrCreate.create.symbol; + name = name ?? data.SymbolProfile.connectOrCreate.create.symbol; symbol = uuidv4(); } @@ -345,7 +344,7 @@ export class OrderService { userCurrency: string; userId: string; withExcludedAccountsAndActivities?: boolean; - }): Promise { + }): Promise { let orderBy: Prisma.Enumerable = [ { date: 'asc' } ]; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 3218d01f4..10e5c15cb 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -336,7 +336,7 @@ export abstract class PortfolioCalculator { ).mul( exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[ endDateString - ] + ] ?? 1 ); const { diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts index 9ffa1b409..aa174f319 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index ab8000702..69b6c3dfc 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts index cc65fa8a2..a3cb8716e 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index 7d9544666..ae083a7db 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts index ca9e5b0d5..cef8938c2 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index de3f5d3cd..36e6fa900 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -21,7 +21,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -32,7 +31,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -42,7 +40,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -53,7 +50,6 @@ jest.mock( '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention ExchangeRateDataService: jest.fn().mockImplementation(() => { return ExchangeRateDataServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts index 3e67389dd..5a4dfdc07 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts index f08083554..2ee367530 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts index aaf2c4302..002be9154 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts index f7d0e9e6d..bf0b15020 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts @@ -21,7 +21,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -32,7 +31,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -42,7 +40,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) @@ -53,7 +50,6 @@ jest.mock( '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention ExchangeRateDataService: jest.fn().mockImplementation(() => { return ExchangeRateDataServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts index 2cb3899e9..32822014c 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts index bb976564a..08015da5b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts @@ -28,7 +28,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -38,7 +37,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts index 36b6e8be9..e5b128085 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts index f64328d39..fdd9e4718 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts @@ -15,7 +15,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -26,7 +25,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -36,7 +34,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index 4678dbd5e..cf330d136 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts index c4ccab7ad..681169062 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -23,7 +23,6 @@ import { join } from 'node:path'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -34,7 +33,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -44,7 +42,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts index 5e9949dd2..fc1d477a6 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts @@ -20,7 +20,6 @@ import { Big } from 'big.js'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention CurrentRateService: jest.fn().mockImplementation(() => { return CurrentRateServiceMock; }) @@ -31,7 +30,6 @@ jest.mock( '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention PortfolioSnapshotService: jest.fn().mockImplementation(() => { return PortfolioSnapshotServiceMock; }) @@ -41,7 +39,6 @@ jest.mock( jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { return { - // eslint-disable-next-line @typescript-eslint/naming-convention RedisCacheService: jest.fn().mockImplementation(() => { return RedisCacheServiceMock; }) diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 244a6b806..e1c705fdd 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -5,7 +5,10 @@ import { DEFAULT_LANGUAGE_CODE, PROPERTY_COUPONS } from '@ghostfolio/common/config'; -import { Coupon } from '@ghostfolio/common/interfaces'; +import { + Coupon, + CreateStripeCheckoutSessionResponse +} from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { @@ -111,11 +114,11 @@ export class SubscriptionController { @Post('stripe/checkout-session') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async createCheckoutSession( + public createStripeCheckoutSession( @Body() { couponId, priceId }: { couponId?: string; priceId: string } - ) { + ): Promise { try { - return this.subscriptionService.createCheckoutSession({ + return this.subscriptionService.createStripeCheckoutSession({ couponId, priceId, user: this.request.user diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 9574d17e9..37ab1c0f6 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -6,7 +6,10 @@ import { PROPERTY_STRIPE_CONFIG } from '@ghostfolio/common/config'; import { parseDate } from '@ghostfolio/common/helper'; -import { SubscriptionOffer } from '@ghostfolio/common/interfaces'; +import { + CreateStripeCheckoutSessionResponse, + SubscriptionOffer +} from '@ghostfolio/common/interfaces'; import { SubscriptionOfferKey, UserWithSettings @@ -38,7 +41,7 @@ export class SubscriptionService { } } - public async createCheckoutSession({ + public async createStripeCheckoutSession({ couponId, priceId, user @@ -46,7 +49,7 @@ export class SubscriptionService { couponId?: string; priceId: string; user: UserWithSettings; - }) { + }): Promise { const subscriptionOffers: { [offer in SubscriptionOfferKey]: SubscriptionOffer; } = @@ -58,33 +61,34 @@ export class SubscriptionService { } ); - const checkoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = { - cancel_url: `${this.configurationService.get('ROOT_URL')}/${ - user.settings.settings.language - }/account`, - client_reference_id: user.id, - line_items: [ - { - price: priceId, - quantity: 1 - } - ], - locale: - (user.settings?.settings - ?.language as Stripe.Checkout.SessionCreateParams.Locale) ?? - DEFAULT_LANGUAGE_CODE, - metadata: subscriptionOffer - ? { subscriptionOffer: JSON.stringify(subscriptionOffer) } - : {}, - mode: 'payment', - payment_method_types: ['card'], - success_url: `${this.configurationService.get( - 'ROOT_URL' - )}/api/v1/subscription/stripe/callback?checkoutSessionId={CHECKOUT_SESSION_ID}` - }; + const stripeCheckoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = + { + cancel_url: `${this.configurationService.get('ROOT_URL')}/${ + user.settings.settings.language + }/account`, + client_reference_id: user.id, + line_items: [ + { + price: priceId, + quantity: 1 + } + ], + locale: + (user.settings?.settings + ?.language as Stripe.Checkout.SessionCreateParams.Locale) ?? + DEFAULT_LANGUAGE_CODE, + metadata: subscriptionOffer + ? { subscriptionOffer: JSON.stringify(subscriptionOffer) } + : {}, + mode: 'payment', + payment_method_types: ['card'], + success_url: `${this.configurationService.get( + 'ROOT_URL' + )}/api/v1/subscription/stripe/callback?checkoutSessionId={CHECKOUT_SESSION_ID}` + }; if (couponId) { - checkoutSessionCreateParams.discounts = [ + stripeCheckoutSessionCreateParams.discounts = [ { coupon: couponId } @@ -92,7 +96,7 @@ export class SubscriptionService { } const session = await this.stripe.checkout.sessions.create( - checkoutSessionCreateParams + stripeCheckoutSessionCreateParams ); return { diff --git a/apps/api/src/dependencies.ts b/apps/api/src/dependencies.ts new file mode 100644 index 000000000..acb7af382 --- /dev/null +++ b/apps/api/src/dependencies.ts @@ -0,0 +1,3 @@ +// Dependencies required by .config/prisma.ts in Docker container +import 'dotenv'; +import 'dotenv-expand'; diff --git a/apps/api/src/models/rules/liquidity/buying-power.ts b/apps/api/src/models/rules/liquidity/buying-power.ts index 70393278d..2cd4d6fee 100644 --- a/apps/api/src/models/rules/liquidity/buying-power.ts +++ b/apps/api/src/models/rules/liquidity/buying-power.ts @@ -40,7 +40,9 @@ export class BuyingPower extends Rule { languageCode: this.getLanguageCode(), placeholders: { baseCurrency: ruleSettings.baseCurrency, - thresholdMin: ruleSettings.thresholdMin + thresholdMin: ruleSettings.thresholdMin.toLocaleString( + ruleSettings.locale + ) } }), value: false @@ -53,7 +55,9 @@ export class BuyingPower extends Rule { languageCode: this.getLanguageCode(), placeholders: { baseCurrency: ruleSettings.baseCurrency, - thresholdMin: ruleSettings.thresholdMin + thresholdMin: ruleSettings.thresholdMin.toLocaleString( + ruleSettings.locale + ) } }), value: true diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index 84b82d111..fce97877b 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -19,6 +19,7 @@ import { ViewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; +import { MatDialog } from '@angular/material/dialog'; import { MatMenuModule } from '@angular/material/menu'; import { MatPaginator, @@ -26,6 +27,7 @@ import { PageEvent } from '@angular/material/paginator'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { ActivatedRoute, Router } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; import { differenceInSeconds, @@ -37,8 +39,10 @@ import { contractOutline, ellipsisHorizontal, keyOutline, + personOutline, trashOutline } from 'ionicons/icons'; +import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -49,6 +53,8 @@ import { AdminService } from '../../services/admin.service'; import { DataService } from '../../services/data.service'; import { ImpersonationStorageService } from '../../services/impersonation-storage.service'; import { UserService } from '../../services/user/user.service'; +import { UserDetailDialogParams } from '../user-detail-dialog/interfaces/interfaces'; +import { GfUserDetailDialogComponent } from '../user-detail-dialog/user-detail-dialog.component'; @Component({ imports: [ @@ -71,6 +77,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { public dataSource = new MatTableDataSource(); public defaultDateFormat: string; + public deviceType: string; public displayedColumns: string[] = []; public getEmojiFlag = getEmojiFlag; public hasPermissionForSubscription: boolean; @@ -87,11 +94,16 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { private adminService: AdminService, private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, + private deviceService: DeviceDetectorService, + private dialog: MatDialog, private impersonationStorageService: ImpersonationStorageService, private notificationService: NotificationService, + private route: ActivatedRoute, + private router: Router, private tokenStorageService: TokenStorageService, private userService: UserService ) { + this.deviceType = this.deviceService.getDeviceInfo().deviceType; this.info = this.dataService.fetchInfo(); this.hasPermissionForSubscription = hasPermission( @@ -121,6 +133,14 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { ]; } + this.route.queryParams + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((params) => { + if (params['userDetailDialog'] && params['userId']) { + this.openUserDetailDialog(params['userId']); + } + }); + this.userService.stateChanged .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((state) => { @@ -138,7 +158,13 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { } }); - addIcons({ contractOutline, ellipsisHorizontal, keyOutline, trashOutline }); + addIcons({ + contractOutline, + ellipsisHorizontal, + keyOutline, + personOutline, + trashOutline + }); } public ngOnInit() { @@ -161,6 +187,12 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { return ''; } + public onChangePage(page: PageEvent) { + this.fetchUsers({ + pageIndex: page.pageIndex + }); + } + public onDeleteUser(aId: string) { this.notificationService.confirm({ confirmFn: () => { @@ -212,9 +244,9 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { window.location.reload(); } - public onChangePage(page: PageEvent) { - this.fetchUsers({ - pageIndex: page.pageIndex + public onOpenUserDetailDialog(userId: string) { + this.router.navigate([], { + queryParams: { userId, userDetailDialog: true } }); } @@ -245,4 +277,34 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { this.changeDetectorRef.markForCheck(); }); } + + private openUserDetailDialog(userId: string) { + const userData = this.dataSource.data.find(({ id }) => { + return id === userId; + }); + + if (!userData) { + this.router.navigate(['.'], { relativeTo: this.route }); + return; + } + + const dialogRef = this.dialog.open(GfUserDetailDialogComponent, { + autoFocus: false, + data: { + userData, + deviceType: this.deviceType, + locale: this.user?.settings?.locale + } as UserDetailDialogParams, + height: this.deviceType === 'mobile' ? '98vh' : '60vh', + width: this.deviceType === 'mobile' ? '100vw' : '50rem' + }); + + dialogRef + .afterClosed() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + this.fetchUsers(); + this.router.navigate(['.'], { relativeTo: this.route }); + }); + } } diff --git a/apps/client/src/app/components/admin-users/admin-users.html b/apps/client/src/app/components/admin-users/admin-users.html index 4e58abf08..e802e3272 100644 --- a/apps/client/src/app/components/admin-users/admin-users.html +++ b/apps/client/src/app/components/admin-users/admin-users.html @@ -216,6 +216,15 @@ + @if (hasPermissionToImpersonateAllUsers) { + + @if (data.hasPermissionToUseSocialLogin) { +
or
+
+ + Sign in with Google +
+ } - @if (data.hasPermissionToUseSocialLogin) { -
or
-
- - Sign in with Google -
- } +
{ this.notificationService.alert({ @@ -117,7 +120,7 @@ export class GfUserAccountMembershipComponent implements OnDestroy { throw error; }), - switchMap(({ sessionId }: { sessionId: string }) => { + switchMap(({ sessionId }) => { return this.stripeService.redirectToCheckout({ sessionId }); }) ) diff --git a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts new file mode 100644 index 000000000..81cf84d12 --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts @@ -0,0 +1,7 @@ +import { AdminUsers } from '@ghostfolio/common/interfaces'; + +export interface UserDetailDialogParams { + deviceType: string; + locale: string; + userData: AdminUsers['users'][0]; +} diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss new file mode 100644 index 000000000..b63df0134 --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss @@ -0,0 +1,7 @@ +:host { + display: block; + + .mat-mdc-dialog-content { + max-height: unset; + } +} diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts new file mode 100644 index 000000000..bd336c4f8 --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts @@ -0,0 +1,52 @@ +import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; +import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; +import { GfValueComponent } from '@ghostfolio/ui/value'; + +import { CommonModule } from '@angular/common'; +import { + ChangeDetectionStrategy, + Component, + CUSTOM_ELEMENTS_SCHEMA, + Inject, + OnDestroy +} from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatDialogModule } from '@angular/material/dialog'; +import { Subject } from 'rxjs'; + +import { UserDetailDialogParams } from './interfaces/interfaces'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'd-flex flex-column h-100' }, + imports: [ + CommonModule, + GfDialogFooterComponent, + GfDialogHeaderComponent, + GfValueComponent, + MatButtonModule, + MatDialogModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + selector: 'gf-user-detail-dialog', + styleUrls: ['./user-detail-dialog.component.scss'], + templateUrl: './user-detail-dialog.html' +}) +export class GfUserDetailDialogComponent implements OnDestroy { + private unsubscribeSubject = new Subject(); + + public constructor( + @Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams, + public dialogRef: MatDialogRef + ) {} + + public onClose() { + this.dialogRef.close(); + } + + public ngOnDestroy() { + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } +} diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html new file mode 100644 index 000000000..d90a6abf6 --- /dev/null +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -0,0 +1,32 @@ + + +
+
+
+
+ User ID +
+
+ Registration Date +
+
+
+
+ + diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 8bc3e3a67..82560246f 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -134,9 +134,12 @@ export class GfPricingPageComponent implements OnDestroy, OnInit { public onCheckout() { this.dataService - .createCheckoutSession({ couponId: this.couponId, priceId: this.priceId }) + .createStripeCheckoutSession({ + couponId: this.couponId, + priceId: this.priceId + }) .pipe( - switchMap(({ sessionId }: { sessionId: string }) => { + switchMap(({ sessionId }) => { return this.stripeService.redirectToCheckout({ sessionId }); }), catchError((error) => { diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 549675f7f..6f0b17ed1 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -9,7 +9,6 @@ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto' import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Activities } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface'; import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; @@ -24,6 +23,7 @@ import { AccessTokenResponse, AccountBalancesResponse, AccountsResponse, + ActivitiesResponse, ActivityResponse, AiPromptResponse, ApiKeyResponse, @@ -31,6 +31,7 @@ import { AssetResponse, BenchmarkMarketDataDetailsResponse, BenchmarkResponse, + CreateStripeCheckoutSessionResponse, DataProviderHealthResponse, ExportResponse, Filter, @@ -168,17 +169,20 @@ export class DataService { return params; } - public createCheckoutSession({ + public createStripeCheckoutSession({ couponId, priceId }: { couponId?: string; priceId: string; }) { - return this.http.post('/api/v1/subscription/stripe/checkout-session', { - couponId, - priceId - }); + return this.http.post( + '/api/v1/subscription/stripe/checkout-session', + { + couponId, + priceId + } + ); } public fetchAccount(aAccountId: string) { @@ -211,7 +215,7 @@ export class DataService { sortColumn?: string; sortDirection?: SortDirection; take?: number; - }): Observable { + }): Observable { let params = this.buildFiltersAsQueryParams({ filters }); if (range) { diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index 323f07a5b..0f2715e47 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -76,12 +76,8 @@ export class ImportActivitiesService { updateAccountBalance: false }); - if ( - dataSource === DataSource.MANUAL && - !['FEE', 'INTEREST', 'LIABILITY'].includes(type) - ) { + if (dataSource === DataSource.MANUAL) { // Create synthetic asset profile for MANUAL data source - // (except for FEE, INTEREST, and LIABILITY which don't require asset profiles) assetProfiles.push({ currency, symbol, diff --git a/apps/client/src/assets/images/logo-selfhostedhub.svg b/apps/client/src/assets/images/logo-selfhostedhub.svg new file mode 100644 index 000000000..72fccdc07 --- /dev/null +++ b/apps/client/src/assets/images/logo-selfhostedhub.svg @@ -0,0 +1,2 @@ + + diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 3cc3c65ff..c68b369d4 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -42,7 +42,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -523,7 +523,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -559,11 +559,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -603,7 +603,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -639,7 +639,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -671,7 +671,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -831,7 +831,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1467,7 +1467,7 @@ Està segur que vol eliminar aquest usuari? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -1503,7 +1503,7 @@ Actuar com un altre Usuari apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1511,7 +1511,7 @@ Eliminar Usuari apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1691,7 +1691,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1979,7 +1979,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -2015,7 +2015,7 @@ Inicieu la sessió amb la identitat d’Internet apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -2023,7 +2023,7 @@ Inicieu la sessió amb Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -2031,7 +2031,7 @@ Manteniu la sessió iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -2307,7 +2307,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -2319,7 +2319,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -2331,7 +2331,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -2343,7 +2343,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -2355,7 +2355,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2409,6 +2409,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Granted Access @@ -2423,7 +2427,7 @@ Introduïu el vostre codi de cupó. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -2431,7 +2435,7 @@ No s’ha pogut bescanviar el codi de cupó apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2439,7 +2443,7 @@ El codi del cupó s’ha bescanviat apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2447,7 +2451,7 @@ Torna a carregar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2727,7 +2731,7 @@ D’acord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -4012,7 +4016,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -4028,7 +4032,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -4044,7 +4048,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -4103,8 +4107,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -5265,7 +5269,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -5277,7 +5281,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -5301,7 +5305,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -5309,7 +5313,7 @@ Exporta l’esborrany com a ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -5333,7 +5337,7 @@ Setmana fins avui libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5345,7 +5349,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5353,7 +5357,7 @@ Mes fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5365,7 +5369,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5373,7 +5377,7 @@ Any fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5393,7 +5397,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5405,7 +5409,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5421,7 +5425,7 @@ Interval de dates libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5429,7 +5433,7 @@ Restableix els filtres libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5437,7 +5441,7 @@ Aplicar filtres libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -5609,14 +5613,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -5651,14 +5655,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class @@ -5867,14 +5871,14 @@ Tag Etiqueta - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -5884,6 +5888,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Anys @@ -5913,7 +5925,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -7071,7 +7083,7 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7079,7 +7091,7 @@ Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7087,7 +7099,7 @@ Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7095,7 +7107,7 @@ Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7439,7 +7451,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7451,7 +7463,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7459,7 +7471,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7467,7 +7479,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 29ec1d9b7..2db1d100f 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -62,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -198,11 +198,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -242,7 +242,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -278,7 +278,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -434,7 +434,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -638,7 +638,7 @@ Möchtest du diesen Benutzer wirklich löschen? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -714,7 +714,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -798,7 +798,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -834,7 +834,7 @@ Einloggen mit Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -842,7 +842,7 @@ Einloggen mit Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -850,7 +850,7 @@ Eingeloggt bleiben apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1022,7 +1022,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1034,7 +1034,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1046,7 +1046,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1058,7 +1058,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1070,7 +1070,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1078,7 +1078,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1146,7 +1146,7 @@ Bitte gebe deinen Gutscheincode ein. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1154,7 +1154,7 @@ Gutscheincode konnte nicht eingelöst werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1162,7 +1162,7 @@ Gutscheincode wurde eingelöst apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1170,7 +1170,7 @@ Neu laden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1280,6 +1280,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Granted Access @@ -1382,7 +1386,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -1914,7 +1918,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1930,7 +1934,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -2202,7 +2206,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -2214,7 +2218,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -2226,7 +2230,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -2234,7 +2238,7 @@ Kopieren libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -2242,7 +2246,7 @@ Geplante Aktivität als ICS exportieren libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -2686,14 +2690,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2720,14 +2724,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2760,14 +2764,14 @@ Tag Tag - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -3177,8 +3181,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3210,7 +3214,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3726,7 +3730,7 @@ Benutzer verwenden apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3734,7 +3738,7 @@ Benutzer löschen apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3981,6 +3985,14 @@ 32 + + View Details + Details anzeigen + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Verbindlichkeiten @@ -5324,7 +5336,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5660,7 +5672,7 @@ Zeitraum libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5812,7 +5824,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5824,7 +5836,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5832,7 +5844,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5844,7 +5856,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5852,7 +5864,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5880,7 +5892,7 @@ Filter zurücksetzen libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5900,7 +5912,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5912,7 +5924,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5920,7 +5932,7 @@ Filter anwenden libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7095,7 +7107,7 @@ API-Schlüssel konnte nicht erstellt werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7103,7 +7115,7 @@ Setze diesen API-Schlüssel in deiner selbst gehosteten Umgebung: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7111,7 +7123,7 @@ API-Schlüssel für den Ghostfolio Premium Datenanbieter apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7119,7 +7131,7 @@ Möchtest du wirklich einen neuen API-Schlüssel erstellen? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7463,7 +7475,7 @@ Sicherheits-Token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7475,7 +7487,7 @@ Möchtest du für diesen Benutzer wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7483,7 +7495,7 @@ Konto, Position oder Seite finden... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7491,7 +7503,7 @@ Sicherheits-Token generieren apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registrierungsdatum + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Folge Ghostfolio auf LinkedIn diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 7d8cbd117..29746f597 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -63,7 +63,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -199,11 +199,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -243,7 +243,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -279,7 +279,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -435,7 +435,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -623,7 +623,7 @@ ¿Estás seguro de eliminar este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -699,7 +699,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -783,7 +783,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -819,7 +819,7 @@ Iniciar sesión con Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -827,7 +827,7 @@ Iniciar sesión con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -835,7 +835,7 @@ Seguir conectado apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1007,7 +1007,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1019,7 +1019,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1031,7 +1031,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1043,7 +1043,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1055,7 +1055,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1063,7 +1063,7 @@ De acuerdo apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1131,7 +1131,7 @@ Por favor, ingresa tu código de cupón: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1139,7 +1139,7 @@ No se puede canjear este código de cupón apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1147,7 +1147,7 @@ El codigo de cupón ha sido canjeado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1155,7 +1155,7 @@ Refrescar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1265,6 +1265,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Granted Access @@ -1367,7 +1371,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -1899,7 +1903,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1915,7 +1919,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -2187,7 +2191,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -2199,7 +2203,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -2211,7 +2215,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -2219,7 +2223,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -2227,7 +2231,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -2671,14 +2675,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2705,14 +2709,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2745,14 +2749,14 @@ Tag Etiqueta - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -3162,8 +3166,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3195,7 +3199,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3703,7 +3707,7 @@ Suplantar usuario apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3711,7 +3715,7 @@ Eliminar usuario apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3958,6 +3962,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Pasivos @@ -5301,7 +5313,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5637,7 +5649,7 @@ Rango de fechas libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5789,7 +5801,7 @@ Semana hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5801,7 +5813,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5809,7 +5821,7 @@ Mes hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5821,7 +5833,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5829,7 +5841,7 @@ El año hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5857,7 +5869,7 @@ Reiniciar filtros libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5877,7 +5889,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5889,7 +5901,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5897,7 +5909,7 @@ Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7072,7 +7084,7 @@ No se pudo generar una clave API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7080,7 +7092,7 @@ Configure esta clave API en su entorno autohospedado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7088,7 +7100,7 @@ Clave API del proveedor de datos premium de Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7096,7 +7108,7 @@ ¿Realmente desea generar una nueva clave API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7440,7 +7452,7 @@ Token de seguridad apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7452,7 +7464,7 @@ ¿Realmente deseas generar un nuevo token de seguridad para este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7460,7 +7472,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7468,7 +7480,7 @@ Generar token de seguridad apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8532,6 +8544,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Siga a Ghostfolio en LinkedIn diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 62f4847eb..9b40a3031 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -54,7 +54,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -202,7 +202,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -254,11 +254,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -298,7 +298,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -334,7 +334,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -490,7 +490,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -830,7 +830,7 @@ Voulez-vous vraiment supprimer cet·te utilisateur·rice ? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -946,7 +946,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -1078,7 +1078,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -1114,7 +1114,7 @@ Se connecter avec Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -1122,7 +1122,7 @@ Se connecter avec Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -1130,7 +1130,7 @@ Rester connecté apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1242,7 +1242,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1266,7 +1266,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1278,7 +1278,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1290,7 +1290,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1302,7 +1302,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1314,7 +1314,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1358,7 +1358,7 @@ D’accord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1438,7 +1438,7 @@ Veuillez entrer votre code promotionnel. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1446,7 +1446,7 @@ Le code promotionnel n’a pas pu être appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1454,7 +1454,7 @@ Le code promotionnel a été appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1462,7 +1462,7 @@ Rafraîchir apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1612,6 +1612,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Granted Access @@ -2074,7 +2078,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -2662,7 +2666,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -2674,7 +2678,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -2686,7 +2690,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -2694,7 +2698,7 @@ Dupliquer libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -2702,7 +2706,7 @@ Exporter Brouillon sous ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -2818,14 +2822,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2852,14 +2856,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class @@ -2948,14 +2952,14 @@ Tag Étiquette - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -3161,8 +3165,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3194,7 +3198,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3702,7 +3706,7 @@ Voir en tant que ... apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3710,7 +3714,7 @@ Supprimer l’Utilisateur apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3957,6 +3961,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Dettes @@ -5300,7 +5312,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5636,7 +5648,7 @@ Intervalle de Date libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5788,7 +5800,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5800,7 +5812,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5808,7 +5820,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5820,7 +5832,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5828,7 +5840,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5856,7 +5868,7 @@ Réinitialiser les Filtres libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5876,7 +5888,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5888,7 +5900,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5896,7 +5908,7 @@ Appliquer les Filtres libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7071,7 +7083,7 @@ Impossible de générer une clé API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7079,7 +7091,7 @@ Définissez cette clé API dans votre environnement auto-hébergé : apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7087,7 +7099,7 @@ Clé API du fournisseur de données Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7095,7 +7107,7 @@ Voulez-vous vraiment générer une nouvelle clé API ? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7439,7 +7451,7 @@ Jeton de sécurité apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7451,7 +7463,7 @@ Voulez-vous vraiment générer un nouveau jeton de sécurité pour cet utilisateur ? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7459,7 +7471,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7467,7 +7479,7 @@ Générer un jeton de sécurité apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index d5c08f0de..f720742c8 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -63,7 +63,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -199,11 +199,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -243,7 +243,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -279,7 +279,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -435,7 +435,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -623,7 +623,7 @@ Vuoi davvero eliminare questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -699,7 +699,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -783,7 +783,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -819,7 +819,7 @@ Accedi con Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -827,7 +827,7 @@ Accedi con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -835,7 +835,7 @@ Rimani connesso apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1007,7 +1007,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1019,7 +1019,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1031,7 +1031,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1043,7 +1043,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1055,7 +1055,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1063,7 +1063,7 @@ Bene apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1131,7 +1131,7 @@ Inserisci il tuo codice del buono: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1139,7 +1139,7 @@ Impossibile riscattare il codice del buono apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1147,7 +1147,7 @@ Il codice del buono è stato riscattato apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1155,7 +1155,7 @@ Ricarica apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1265,6 +1265,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Granted Access @@ -1367,7 +1371,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -1899,7 +1903,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1915,7 +1919,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -2187,7 +2191,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -2199,7 +2203,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -2211,7 +2215,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -2219,7 +2223,7 @@ Clona libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -2227,7 +2231,7 @@ Esporta la bozza come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -2671,14 +2675,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2705,14 +2709,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2745,14 +2749,14 @@ Tag Etichetta - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -3162,8 +3166,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3195,7 +3199,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3703,7 +3707,7 @@ Imita l’utente apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3711,7 +3715,7 @@ Elimina l’utente apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3958,6 +3962,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Passività @@ -5301,7 +5313,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5637,7 +5649,7 @@ Intervallo di date libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5789,7 +5801,7 @@ Da inizio settimana libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5801,7 +5813,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5809,7 +5821,7 @@ Da inizio mese libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5821,7 +5833,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5829,7 +5841,7 @@ Da inizio anno libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5857,7 +5869,7 @@ Reset Filtri libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5877,7 +5889,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5889,7 +5901,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5897,7 +5909,7 @@ Applica i Filtri libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7072,7 +7084,7 @@ Non è stato possibile generare un API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7080,7 +7092,7 @@ Imposta questa API key nel tuo ambiente self-hosted: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7088,7 +7100,7 @@ API Key for Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7096,7 +7108,7 @@ Vuoi davvero generare una nuova API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7440,7 +7452,7 @@ Token di sicurezza apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7452,7 +7464,7 @@ Vuoi davvero generare un nuovo token di sicurezza per questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7460,7 +7472,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7468,7 +7480,7 @@ Genera Token di Sicurezza apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8532,6 +8544,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 4dd7fb278..869b932aa 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -62,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -198,11 +198,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -242,7 +242,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -278,7 +278,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -434,7 +434,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -622,7 +622,7 @@ Wilt je deze gebruiker echt verwijderen? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -698,7 +698,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -782,7 +782,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -818,7 +818,7 @@ Aanmelden met Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -826,7 +826,7 @@ Aanmelden met Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -834,7 +834,7 @@ Aangemeld blijven apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1006,7 +1006,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1018,7 +1018,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1030,7 +1030,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1042,7 +1042,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1054,7 +1054,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1062,7 +1062,7 @@ Oké apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1130,7 +1130,7 @@ Voer je couponcode in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1138,7 +1138,7 @@ Kon je kortingscode niet inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1146,7 +1146,7 @@ Je couponcode is ingewisseld apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1154,7 +1154,7 @@ Herladen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1264,6 +1264,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Granted Access @@ -1366,7 +1370,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -1898,7 +1902,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1914,7 +1918,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -2186,7 +2190,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -2198,7 +2202,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -2210,7 +2214,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -2218,7 +2222,7 @@ Kloon libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -2226,7 +2230,7 @@ Concept exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -2670,14 +2674,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2704,14 +2708,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Symbol @@ -2744,14 +2748,14 @@ Tag Label - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -3161,8 +3165,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3194,7 +3198,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3702,7 +3706,7 @@ Gebruiker immiteren apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3710,7 +3714,7 @@ Gebruiker verwijderen apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3957,6 +3961,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Verplichtingen @@ -5300,7 +5312,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5636,7 +5648,7 @@ Datumbereik libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5788,7 +5800,7 @@ Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5800,7 +5812,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5808,7 +5820,7 @@ Maand tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5820,7 +5832,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5828,7 +5840,7 @@ Jaar tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5856,7 +5868,7 @@ Filters Herstellen libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5876,7 +5888,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5888,7 +5900,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5896,7 +5908,7 @@ Filters Toepassen libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7071,7 +7083,7 @@ Er kon geen API-sleutel worden gegenereerd apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7079,7 +7091,7 @@ Stel deze API-sleutel in uw zelf-gehoste omgeving in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7087,7 +7099,7 @@ Ghostfolio Premium Gegevensleverancier API-sleutel apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7095,7 +7107,7 @@ Wilt u echt een nieuwe API-sleutel genereren? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7439,7 +7451,7 @@ Beveiligingstoken apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7451,7 +7463,7 @@ Wilt u echt een nieuw beveiligingstoken voor deze gebruiker aanmaken? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7459,7 +7471,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7467,7 +7479,7 @@ Beveiligingstoken Aanmaken apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Volg Ghostfolio op LinkedIn diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 1f02ab72d..87c485b25 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -263,7 +263,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -439,7 +439,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -475,11 +475,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -519,7 +519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -555,7 +555,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -711,7 +711,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1287,7 +1287,7 @@ Czy na pewno chcesz usunąć tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -1323,7 +1323,7 @@ Wciel się w Użytkownika apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1331,7 +1331,7 @@ Usuń Użytkownika apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1435,7 +1435,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -1667,7 +1667,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -1703,7 +1703,7 @@ Zaloguj się przy użyciu Tożsamości Internetowej (Internet Identity) apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -1711,7 +1711,7 @@ Zaloguj się przez Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -1719,7 +1719,7 @@ Pozostań zalogowany apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1863,7 +1863,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2055,7 +2055,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -2067,7 +2067,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -2079,7 +2079,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -2091,7 +2091,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -2103,7 +2103,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2135,7 +2135,7 @@ Wpisz kod kuponu: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -2143,7 +2143,7 @@ Nie udało się zrealizować kodu kuponu apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2151,7 +2151,7 @@ Kupon został zrealizowany apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2159,7 +2159,7 @@ Odśwież apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2353,6 +2353,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Export Data @@ -2403,7 +2407,7 @@ Okej apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -3639,7 +3643,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -3655,7 +3659,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -3671,7 +3675,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3730,8 +3734,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -4800,7 +4804,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -4812,7 +4816,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -4828,7 +4832,7 @@ Sklonuj libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4836,7 +4840,7 @@ Eksportuj Wersję Roboczą jako ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -5000,14 +5004,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -5042,14 +5046,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class @@ -5250,14 +5254,14 @@ Tag Tag - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -5267,6 +5271,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Lata @@ -5296,7 +5308,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5636,7 +5648,7 @@ Zakres Dat libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5788,7 +5800,7 @@ Dotychczasowy tydzień libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5800,7 +5812,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5808,7 +5820,7 @@ Od początku miesiąca libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5820,7 +5832,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5828,7 +5840,7 @@ Od początku roku libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5856,7 +5868,7 @@ Resetuj Filtry libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5876,7 +5888,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5888,7 +5900,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5896,7 +5908,7 @@ Zastosuj Filtry libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7071,7 +7083,7 @@ Nie udało się wygenerować klucza API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7079,7 +7091,7 @@ Ustaw ten klucz API w samodzielnie hostowanym środowisku: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7087,7 +7099,7 @@ Klucz API dostawcy danych Premium Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7095,7 +7107,7 @@ Czy na pewno chcesz wygenerować nowy klucz API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7439,7 +7451,7 @@ Token bezpieczeństwa apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7451,7 +7463,7 @@ Czy napewno chcesz wygenerować nowy token bezpieczeństwa dla tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7459,7 +7471,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7467,7 +7479,7 @@ Generowanie Tokena Zabezpieczającego apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 969facd9b..8d93b9ecb 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -54,7 +54,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -202,7 +202,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -254,11 +254,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -298,7 +298,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -334,7 +334,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -490,7 +490,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -702,7 +702,7 @@ Deseja realmente excluir este utilizador? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -818,7 +818,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -958,7 +958,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -994,7 +994,7 @@ Iniciar sessão com Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -1002,7 +1002,7 @@ Iniciar sessão com Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -1010,7 +1010,7 @@ Manter sessão iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1122,7 +1122,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1254,7 +1254,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1266,7 +1266,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1278,7 +1278,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1290,7 +1290,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1302,7 +1302,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1346,7 +1346,7 @@ OK apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -1426,7 +1426,7 @@ Por favor, insira o seu código de cupão: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -1434,7 +1434,7 @@ Não foi possível resgatar o código de cupão apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -1442,7 +1442,7 @@ Código de cupão foi resgatado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -1450,7 +1450,7 @@ Atualizar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -1608,6 +1608,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Granted Access @@ -2050,7 +2054,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -2562,7 +2566,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -2574,7 +2578,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -2586,7 +2590,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -2594,7 +2598,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -2602,7 +2606,7 @@ Exportar Rascunho como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -2690,14 +2694,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -2724,14 +2728,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Emergency Fund @@ -2792,14 +2796,14 @@ Tag Marcador - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Cash @@ -3161,8 +3165,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -3194,7 +3198,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3702,7 +3706,7 @@ Personificar Utilizador apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -3710,7 +3714,7 @@ Apagar Utilizador apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -3957,6 +3961,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Liabilities Responsabilidades @@ -5300,7 +5312,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5636,7 +5648,7 @@ Período libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5788,7 +5800,7 @@ Semana até agora libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5800,7 +5812,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5808,7 +5820,7 @@ Do mês até a data libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5820,7 +5832,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5828,7 +5840,7 @@ No acumulado do ano libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5856,7 +5868,7 @@ Redefinir filtros libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5876,7 +5888,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5888,7 +5900,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5896,7 +5908,7 @@ Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7071,7 +7083,7 @@ Não foi possível gerar uma chave de API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7079,7 +7091,7 @@ Defina esta chave de API no seu ambiente auto-hospedado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7087,7 +7099,7 @@ Chave de API do Provedor de Dados do Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7095,7 +7107,7 @@ Você realmente deseja gerar uma nova chave de API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7439,7 +7451,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7451,7 +7463,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7459,7 +7471,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7467,7 +7479,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Siga o Ghostfolio no LinkedIn diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 5ed44fbd1..fd87792f9 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -235,7 +235,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -399,7 +399,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -435,11 +435,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -479,7 +479,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -515,7 +515,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -671,7 +671,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1151,7 +1151,7 @@ Bu kullanıcıyı silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -1187,7 +1187,7 @@ Kullanıcıyı Taklit Et apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1195,7 +1195,7 @@ Kullanıcıyı Sil apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1291,7 +1291,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -1523,7 +1523,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -1559,7 +1559,7 @@ İnternet Kimliği (Internet Identity) ile Oturum Aç apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -1567,7 +1567,7 @@ Google ile Oturum Aç apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -1575,7 +1575,7 @@ Oturumu açık tut apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1707,7 +1707,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1911,7 +1911,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1923,7 +1923,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1935,7 +1935,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1947,7 +1947,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1959,7 +1959,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2003,7 +2003,7 @@ Tamam apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -3119,7 +3119,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -3135,7 +3135,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -3151,7 +3151,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3210,8 +3210,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -4264,7 +4264,7 @@ Lütfen kupon kodunuzu girin: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -4272,7 +4272,7 @@ Kupon kodu kullanılamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -4280,7 +4280,7 @@ Kupon kodu kullanıldı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -4288,7 +4288,7 @@ Yeniden Yükle apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -4470,6 +4470,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Export Data @@ -4520,7 +4524,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -4532,7 +4536,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -4548,7 +4552,7 @@ Klonla libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4556,7 +4560,7 @@ Taslakları ICS Olarak Dışa Aktar libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -4696,14 +4700,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -4738,14 +4742,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class @@ -4946,14 +4950,14 @@ Tag Etiket - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -4963,6 +4967,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Yıl @@ -5308,7 +5320,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5636,7 +5648,7 @@ Tarih Aralığı libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5788,7 +5800,7 @@ Hafta içi libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5800,7 +5812,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5808,7 +5820,7 @@ Ay içi libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5820,7 +5832,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5828,7 +5840,7 @@ Yıl içi libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5856,7 +5868,7 @@ Filtreleri Sıfırla libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5876,7 +5888,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5888,7 +5900,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5896,7 +5908,7 @@ Filtreleri Uygula libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7071,7 +7083,7 @@ API anahtarı oluşturulamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7079,7 +7091,7 @@ Bu API anahtarını kendi barındırılan ortamınıza ayarlayın: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7087,7 +7099,7 @@ Ghostfolio Premium Veri Sağlayıcı API Anahtarı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7095,7 +7107,7 @@ Yeni bir API anahtarı oluşturmak istediğinize emin misiniz? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7439,7 +7451,7 @@ Güvenlik belirteci apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7451,7 +7463,7 @@ Bu kullanıcı için yeni bir güvenlik belirteci oluşturmak istediğinize emin misiniz? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7459,7 +7471,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7467,7 +7479,7 @@ Güvenlik belirteci oluştur apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Ghostfolio’yu LinkedIn’de takip edin diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index ee2008b95..61c9be112 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -42,7 +42,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -547,7 +547,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -583,11 +583,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -627,7 +627,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -663,7 +663,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -695,7 +695,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -1503,7 +1503,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -1583,7 +1583,7 @@ Ви дійсно хочете видалити цього користувача? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -1623,7 +1623,7 @@ Видавати себе за користувача apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1631,7 +1631,7 @@ Видалити користувача apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1827,7 +1827,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2111,7 +2111,7 @@ Увійти з Інтернет-Ідентичністю apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -2119,7 +2119,7 @@ Увійти з Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -2127,7 +2127,7 @@ Залишатися в системі apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -2523,7 +2523,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -2535,7 +2535,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -2547,7 +2547,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -2559,7 +2559,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -2571,7 +2571,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2625,6 +2625,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Me @@ -2667,7 +2671,7 @@ Не вдалося згенерувати ключ API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -2675,7 +2679,7 @@ ОК apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -2691,7 +2695,7 @@ Встановіть цей ключ API у вашому self-hosted середовищі: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -2699,7 +2703,7 @@ Ключ API Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -2707,7 +2711,7 @@ Ви дійсно хочете згенерувати новий ключ API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -2715,7 +2719,7 @@ Не вдалося обміняти код купона apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2723,7 +2727,7 @@ Код купона був обміняний apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2731,7 +2735,7 @@ Перезавантажити apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2739,7 +2743,7 @@ Будь ласка, введіть ваш код купона. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -4308,7 +4312,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -4324,7 +4328,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -4340,7 +4344,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -4356,7 +4360,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -4415,8 +4419,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -5995,7 +5999,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -6007,7 +6011,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -6031,7 +6035,7 @@ Клонувати libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -6039,7 +6043,7 @@ Експортувати чернетку як ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -6063,7 +6067,7 @@ Тиждень до дати libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -6075,7 +6079,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -6083,7 +6087,7 @@ Місяць до дати libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -6095,7 +6099,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -6103,7 +6107,7 @@ Рік до дати libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -6123,7 +6127,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -6135,7 +6139,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -6151,7 +6155,7 @@ Діапазон дат libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -6159,7 +6163,7 @@ Скинути фільтри libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -6167,7 +6171,7 @@ Застосувати фільтри libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -6355,14 +6359,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -6397,14 +6401,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class @@ -6713,14 +6717,14 @@ Tag Тег - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -6730,6 +6734,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years Роки @@ -6767,7 +6779,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -7439,7 +7451,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7451,7 +7463,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7459,7 +7471,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7467,7 +7479,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8531,6 +8543,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn Follow Ghostfolio on LinkedIn diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 241482624..b9b3fb451 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -247,7 +247,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -420,7 +420,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -455,11 +455,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -498,7 +498,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -533,7 +533,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -674,7 +674,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1214,7 +1214,7 @@ Do you really want to delete this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -1246,14 +1246,14 @@ Impersonate User apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 Delete User apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1348,7 +1348,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -1559,7 +1559,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -1594,21 +1594,21 @@ Sign in with Internet Identity apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 Sign in with Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 Stay signed in apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1736,7 +1736,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -1915,7 +1915,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -1926,7 +1926,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -1937,7 +1937,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -1948,7 +1948,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -1959,7 +1959,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -1987,28 +1987,28 @@ Please enter your coupon code. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 Could not redeem coupon code apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 Coupon code has been redeemed apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 Reload apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2181,6 +2181,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Export Data @@ -2226,7 +2230,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -3354,7 +3358,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -3369,7 +3373,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -3384,7 +3388,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3436,8 +3440,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -4420,7 +4424,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -4431,7 +4435,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -4445,14 +4449,14 @@ Clone libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -4613,14 +4617,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -4653,14 +4657,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class @@ -4842,14 +4846,14 @@ Tag - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -4858,6 +4862,13 @@ 32 + + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years @@ -4884,7 +4895,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5134,7 +5145,7 @@ Date Range libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5284,21 +5295,21 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5309,7 +5320,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5320,7 +5331,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5345,7 +5356,7 @@ Reset Filters libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5364,7 +5375,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5375,14 +5386,14 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 Apply Filters libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -6451,28 +6462,28 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -6767,21 +6778,21 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -6792,7 +6803,7 @@ Generate Security Token apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -7712,6 +7723,13 @@ 128 + + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Join the Ghostfolio Slack community diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 95735836b..90e239595 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -264,7 +264,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 158 + 161 @@ -448,7 +448,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 278 + 281 @@ -484,11 +484,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 259 + 262 libs/ui/src/lib/activities-table/activities-table.component.html - 295 + 298 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -528,7 +528,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 440 + 443 @@ -564,7 +564,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 467 + 470 libs/ui/src/lib/benchmark/benchmark.component.html @@ -720,7 +720,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 167 + 170 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1296,7 +1296,7 @@ 您真的要删除该用户吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 175 + 207 @@ -1332,7 +1332,7 @@ 模拟用户 apps/client/src/app/components/admin-users/admin-users.html - 223 + 232 @@ -1340,7 +1340,7 @@ 删除用户 apps/client/src/app/components/admin-users/admin-users.html - 244 + 253 @@ -1444,7 +1444,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 68 + 71 libs/common/src/lib/routes/routes.ts @@ -1676,7 +1676,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 27 + 28 apps/client/src/app/pages/landing/landing-page.html @@ -1712,7 +1712,7 @@ 使用互联网身份登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 37 + 38 @@ -1720,7 +1720,7 @@ 使用 Google 登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 47 + 48 @@ -1728,7 +1728,7 @@ 保持登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 56 + 59 @@ -1872,7 +1872,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 188 + 191 libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -2064,7 +2064,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 383 + 364 @@ -2076,7 +2076,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -2088,7 +2088,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -2100,7 +2100,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -2112,7 +2112,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 436 + 417 @@ -2144,7 +2144,7 @@ 请输入您的优惠券代码。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 215 + 218 @@ -2152,7 +2152,7 @@ 无法兑换优惠券代码 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 179 + 182 @@ -2160,7 +2160,7 @@ 优惠券代码已被兑换 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 192 + 195 @@ -2168,7 +2168,7 @@ 重新加载 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 193 + 196 @@ -2362,6 +2362,10 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html 252 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 12 + Export Data @@ -2412,7 +2416,7 @@ 好的 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 154 + 157 apps/client/src/app/core/http-response.interceptor.ts @@ -3648,7 +3652,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 212 + 215 @@ -3664,7 +3668,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 377 + 380 @@ -3680,7 +3684,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 389 + 392 @@ -3739,8 +3743,8 @@ 32 - libs/ui/src/lib/assistant/assistant.html - 207 + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 @@ -4829,7 +4833,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 402 + 405 @@ -4841,7 +4845,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 415 + 418 @@ -4857,7 +4861,7 @@ 克隆 libs/ui/src/lib/activities-table/activities-table.component.html - 446 + 449 @@ -4865,7 +4869,7 @@ 将汇票导出为 ICS libs/ui/src/lib/activities-table/activities-table.component.html - 456 + 459 @@ -5045,14 +5049,14 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 310 + 313 - libs/ui/src/lib/assistant/assistant.html - 185 + libs/ui/src/lib/i18n.ts + 4 - libs/ui/src/lib/i18n.ts + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html 4 @@ -5087,14 +5091,14 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 290 - - libs/ui/src/lib/assistant/assistant.html - 246 - libs/ui/src/lib/i18n.ts 6 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + Asset Sub Class @@ -5295,14 +5299,14 @@ Tag 标签 - - libs/ui/src/lib/assistant/assistant.html - 235 - libs/ui/src/lib/i18n.ts 31 + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + Year @@ -5312,6 +5316,14 @@ 32 + + View Details + View Details + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + Years @@ -5341,7 +5353,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 236 + 239 libs/ui/src/lib/i18n.ts @@ -5621,7 +5633,7 @@ 日期范围 libs/ui/src/lib/assistant/assistant.html - 171 + 170 @@ -5789,7 +5801,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 395 + 376 @@ -5797,7 +5809,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5805,7 +5817,7 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5817,7 +5829,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 391 + 372 @@ -5829,7 +5841,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 368 @@ -5857,7 +5869,7 @@ 重置过滤器 libs/ui/src/lib/assistant/assistant.html - 266 + 205 @@ -5877,7 +5889,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 405 + 386 @@ -5889,7 +5901,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 430 + 411 @@ -5897,7 +5909,7 @@ 应用过滤器 libs/ui/src/lib/assistant/assistant.html - 276 + 219 @@ -7072,7 +7084,7 @@ 无法生成 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 141 + 144 @@ -7080,7 +7092,7 @@ 在您的自托管环境中设置此 API 密钥: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 156 + 159 @@ -7088,7 +7100,7 @@ Ghostfolio Premium 数据提供者 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 162 @@ -7096,7 +7108,7 @@ 您确定要生成新的 API 密钥吗? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 164 + 167 @@ -7440,7 +7452,7 @@ 安全令牌 apps/client/src/app/components/admin-users/admin-users.component.ts - 196 + 228 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7452,7 +7464,7 @@ 您确定要为此用户生成新的安全令牌吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 201 + 233 @@ -7460,7 +7472,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 162 + 152 @@ -7468,7 +7480,7 @@ 生成安全令牌 apps/client/src/app/components/admin-users/admin-users.html - 233 + 242 @@ -8532,6 +8544,14 @@ 128 + + Registration Date + Registration Date + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 22 + + Follow Ghostfolio on LinkedIn 在 LinkedIn 上关注 Ghostfolio diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index f387809bd..0f7a0a5a6 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -37,12 +37,14 @@ import type { Product } from './product'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; import type { AccountsResponse } from './responses/accounts-response.interface'; +import type { ActivitiesResponse } from './responses/activities-response.interface'; import type { ActivityResponse } from './responses/activity-response.interface'; import type { AiPromptResponse } from './responses/ai-prompt-response.interface'; import type { ApiKeyResponse } from './responses/api-key-response.interface'; import type { AssetResponse } from './responses/asset-response.interface'; import type { BenchmarkMarketDataDetailsResponse } from './responses/benchmark-market-data-details-response.interface'; import type { BenchmarkResponse } from './responses/benchmark-response.interface'; +import type { CreateStripeCheckoutSessionResponse } from './responses/create-stripe-checkout-session-response.interface'; import type { DataEnhancerHealthResponse } from './responses/data-enhancer-health-response.interface'; import type { DataProviderGhostfolioAssetProfileResponse } from './responses/data-provider-ghostfolio-asset-profile-response.interface'; import type { DataProviderGhostfolioStatusResponse } from './responses/data-provider-ghostfolio-status-response.interface'; @@ -85,6 +87,7 @@ export { AccountBalance, AccountBalancesResponse, AccountsResponse, + ActivitiesResponse, ActivityResponse, AdminData, AdminJobs, @@ -102,6 +105,7 @@ export { BenchmarkProperty, BenchmarkResponse, Coupon, + CreateStripeCheckoutSessionResponse, DataEnhancerHealthResponse, DataProviderGhostfolioAssetProfileResponse, DataProviderGhostfolioStatusResponse, diff --git a/libs/common/src/lib/interfaces/responses/activities-response.interface.ts b/libs/common/src/lib/interfaces/responses/activities-response.interface.ts new file mode 100644 index 000000000..e6abe4618 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/activities-response.interface.ts @@ -0,0 +1,6 @@ +import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; + +export interface ActivitiesResponse { + activities: Activity[]; + count: number; +} diff --git a/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts new file mode 100644 index 000000000..18c9e4400 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts @@ -0,0 +1,3 @@ +export interface CreateStripeCheckoutSessionResponse { + sessionId: string; +} diff --git a/libs/common/src/lib/interfaces/responses/export-response.interface.ts b/libs/common/src/lib/interfaces/responses/export-response.interface.ts index a5416e886..8b1697ca4 100644 --- a/libs/common/src/lib/interfaces/responses/export-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/export-response.interface.ts @@ -9,6 +9,7 @@ import { import { AccountBalance } from '../account-balance.interface'; import { MarketData } from '../market-data.interface'; +import { UserSettings } from '../user-settings.interface'; export interface ExportResponse { accounts: (Omit & { @@ -36,5 +37,10 @@ export interface ExportResponse { }; platforms: Platform[]; tags: Omit[]; - user: { settings: { currency: string } }; + user: { + settings: { + currency: UserSettings['baseCurrency']; + performanceCalculationType: UserSettings['performanceCalculationType']; + }; + }; } diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.html b/libs/ui/src/lib/accounts-table/accounts-table.component.html index 609c76ee1..e9e0337c9 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -320,11 +320,7 @@ - + diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html index 8079a6258..843832e1a 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -143,7 +143,10 @@ }
- @if (!isUUID(element.SymbolProfile?.symbol)) { + @if ( + element.SymbolProfile?.dataSource !== 'MANUAL' && + !isUUID(element.SymbolProfile?.symbol) + ) {
{{ element.SymbolProfile?.symbol | gfSymbol diff --git a/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss b/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss index 18c3a26cb..89a837195 100644 --- a/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss +++ b/libs/ui/src/lib/logo-carousel/logo-carousel.component.scss @@ -139,6 +139,15 @@ max-height: 1.25rem; } + &.logo-selfhostedhub { + background-image: url('/assets/images/logo-selfhostedhub.svg'); + background-position: center; + background-repeat: no-repeat; + background-size: contain; + filter: grayscale(1); + opacity: 0.5; + } + &.logo-sourceforge { mask-image: url('/assets/images/logo-sourceforge.svg'); } diff --git a/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts b/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts index d7d3fa6af..ea6344694 100644 --- a/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts +++ b/libs/ui/src/lib/logo-carousel/logo-carousel.component.ts @@ -82,6 +82,12 @@ export class GfLogoCarouselComponent { title: 'selfh.st — Self-hosted content and software', url: 'https://selfh.st' }, + { + className: 'logo-selfhostedhub', + name: 'SelfhostedHub', + title: 'SelfhostedHub — Discover best self-hosted software', + url: 'https://selfhostedhub.com' + }, { className: 'logo-sourceforge', isMask: true, diff --git a/package-lock.json b/package-lock.json index 16a8381b4..62913d174 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.209.0", + "version": "2.211.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.209.0", + "version": "2.211.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -43,7 +43,7 @@ "@nestjs/schedule": "6.0.0", "@nestjs/serve-static": "5.0.3", "@openrouter/ai-sdk-provider": "0.7.2", - "@prisma/client": "6.17.1", + "@prisma/client": "6.18.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "7.9.0", @@ -92,7 +92,7 @@ "rxjs": "7.8.1", "stripe": "18.5.0", "svgmap": "2.12.2", - "tablemark": "3.1.0", + "tablemark": "4.1.0", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", "yahoo-finance2": "3.10.0", @@ -151,7 +151,7 @@ "nx": "21.5.1", "prettier": "3.6.2", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.17.1", + "prisma": "6.18.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", @@ -6115,9 +6115,9 @@ } }, "node_modules/@ioredis/commands": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.0.tgz", - "integrity": "sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", + "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", "license": "MIT" }, "node_modules/@isaacs/balanced-match": { @@ -11983,9 +11983,9 @@ "license": "MIT" }, "node_modules/@prisma/client": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.17.1.tgz", - "integrity": "sha512-zL58jbLzYamjnNnmNA51IOZdbk5ci03KviXCuB0Tydc9btH2kDWsi1pQm2VecviRTM7jGia0OPPkgpGnT3nKvw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.18.0.tgz", + "integrity": "sha512-jnL2I9gDnPnw4A+4h5SuNn8Gc+1mL1Z79U/3I9eE2gbxJG1oSA+62ByPW4xkeDgwE0fqMzzpAZ7IHxYnLZ4iQA==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -12005,66 +12005,66 @@ } }, "node_modules/@prisma/config": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.17.1.tgz", - "integrity": "sha512-fs8wY6DsvOCzuiyWVckrVs1LOcbY4LZNz8ki4uUIQ28jCCzojTGqdLhN2Jl5lDnC1yI8/gNIKpsWDM8pLhOdwA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.18.0.tgz", + "integrity": "sha512-rgFzspCpwsE+q3OF/xkp0fI2SJ3PfNe9LLMmuSVbAZ4nN66WfBiKqJKo/hLz3ysxiPQZf8h1SMf2ilqPMeWATQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { "c12": "3.1.0", "deepmerge-ts": "7.1.5", - "effect": "3.16.12", + "effect": "3.18.4", "empathic": "2.0.0" } }, "node_modules/@prisma/debug": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.17.1.tgz", - "integrity": "sha512-Vf7Tt5Wh9XcndpbmeotuqOMLWPTjEKCsgojxXP2oxE1/xYe7PtnP76hsouG9vis6fctX+TxgmwxTuYi/+xc7dQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", + "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.17.1.tgz", - "integrity": "sha512-D95Ik3GYZkqZ8lSR4EyFOJ/tR33FcYRP8kK61o+WMsyD10UfJwd7+YielflHfKwiGodcqKqoraWw8ElAgMDbPw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.18.0.tgz", + "integrity": "sha512-i5RzjGF/ex6AFgqEe2o1IW8iIxJGYVQJVRau13kHPYEL1Ck8Zvwuzamqed/1iIljs5C7L+Opiz5TzSsUebkriA==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.17.1", - "@prisma/engines-version": "6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac", - "@prisma/fetch-engine": "6.17.1", - "@prisma/get-platform": "6.17.1" + "@prisma/debug": "6.18.0", + "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "@prisma/fetch-engine": "6.18.0", + "@prisma/get-platform": "6.18.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac.tgz", - "integrity": "sha512-17140E3huOuD9lMdJ9+SF/juOf3WR3sTJMVyyenzqUPbuH+89nPhSWcrY+Mf7tmSs6HvaO+7S+HkELinn6bhdg==", + "version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f.tgz", + "integrity": "sha512-T7Af4QsJQnSgWN1zBbX+Cha5t4qjHRxoeoWpK4JugJzG/ipmmDMY5S+O0N1ET6sCBNVkf6lz+Y+ZNO9+wFU8pQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.17.1.tgz", - "integrity": "sha512-AYZiHOs184qkDMiTeshyJCtyL4yERkjfTkJiSJdYuSfc24m94lTNL5+GFinZ6vVz+ktX4NJzHKn1zIFzGTWrWg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.18.0.tgz", + "integrity": "sha512-TdaBvTtBwP3IoqVYoGIYpD4mWlk0pJpjTJjir/xLeNWlwog7Sl3bD2J0jJ8+5+q/6RBg+acb9drsv5W6lqae7A==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.17.1", - "@prisma/engines-version": "6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac", - "@prisma/get-platform": "6.17.1" + "@prisma/debug": "6.18.0", + "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", + "@prisma/get-platform": "6.18.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.17.1.tgz", - "integrity": "sha512-AKEn6fsfz0r482S5KRDFlIGEaq9wLNcgalD1adL+fPcFFblIKs1sD81kY/utrHdqKuVC6E1XSRpegDK3ZLL4Qg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.18.0.tgz", + "integrity": "sha512-uXNJCJGhxTCXo2B25Ta91Rk1/Nmlqg9p7G9GKh8TPhxvAyXCvMNQoogj4JLEUy+3ku8g59cpyQIKFhqY2xO2bg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.17.1" + "@prisma/debug": "6.18.0" } }, "node_modules/@redis/client": { @@ -17595,6 +17595,12 @@ "node": ">=8" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "license": "MIT" + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -21166,9 +21172,9 @@ "license": "MIT" }, "node_modules/effect": { - "version": "3.16.12", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.16.12.tgz", - "integrity": "sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==", + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -23695,15 +23701,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -25108,12 +25105,12 @@ } }, "node_modules/ioredis": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", - "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", + "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", "license": "MIT", "dependencies": { - "@ioredis/commands": "^1.1.1", + "@ioredis/commands": "1.4.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", @@ -32021,6 +32018,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -32924,6 +32922,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, "license": "MIT", "dependencies": { "lower-case": "^2.0.2", @@ -35802,15 +35801,15 @@ } }, "node_modules/prisma": { - "version": "6.17.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.17.1.tgz", - "integrity": "sha512-ac6h0sM1Tg3zu8NInY+qhP/S9KhENVaw9n1BrGKQVFu05JT5yT5Qqqmb8tMRIE3ZXvVj4xcRA5yfrsy4X7Yy5g==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.18.0.tgz", + "integrity": "sha512-bXWy3vTk8mnRmT+SLyZBQoC2vtV9Z8u7OHvEu+aULYxwiop/CPiFZ+F56KsNRNf35jw+8wcu8pmLsjxpBxAO9g==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.17.1", - "@prisma/engines": "6.17.1" + "@prisma/config": "6.18.0", + "@prisma/engines": "6.18.0" }, "bin": { "prisma": "build/index.js" @@ -37691,17 +37690,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -38351,19 +38339,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/split-text-to-chunks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split-text-to-chunks/-/split-text-to-chunks-1.0.0.tgz", - "integrity": "sha512-HLtEwXK/T4l7QZSJ/kOSsZC0o5e2Xg3GzKKFxm0ZexJXw0Bo4CaEl39l7MCSRHk9EOOL5jT8JIDjmhTtcoe6lQ==", - "license": "MIT", - "dependencies": { - "get-stdin": "^5.0.1", - "minimist": "^1.2.0" - }, - "bin": { - "wordwrap": "cli.js" - } - }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -39133,16 +39108,114 @@ } }, "node_modules/tablemark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-3.1.0.tgz", - "integrity": "sha512-IwO6f0SEzp1Z+zqz/7ANUmeEac4gaNlknWyj/S9aSg11wZmWYnLeyI/xXvEOU88BYUIf8y30y0wxB58xIKrVlQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tablemark/-/tablemark-4.1.0.tgz", + "integrity": "sha512-B3LDjbDo+ac+D5RwkBOPZZ6ua8716KdT+6NO3DKOCHJq0ezE6vV2r92rjrC1ci2H+ocuysl5ytf1T0QqV65yoA==", "license": "MIT", "dependencies": { - "sentence-case": "^3.0.4", - "split-text-to-chunks": "^1.0.0" + "ansi-regex": "^6.2.2", + "change-case": "^5.4.4", + "string-width": "^8.1.0", + "wordwrapjs": "^5.1.0", + "wrap-ansi": "^9.0.2" }, "engines": { - "node": ">=14.16" + "node": ">=20" + } + }, + "node_modules/tablemark/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/tablemark/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tablemark/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/tablemark/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tapable": { @@ -40624,15 +40697,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -42036,6 +42100,15 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrapjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", diff --git a/package.json b/package.json index 403ce7f7b..512f61b6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.209.0", + "version": "2.211.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -89,7 +89,7 @@ "@nestjs/schedule": "6.0.0", "@nestjs/serve-static": "5.0.3", "@openrouter/ai-sdk-provider": "0.7.2", - "@prisma/client": "6.17.1", + "@prisma/client": "6.18.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "7.9.0", @@ -138,7 +138,7 @@ "rxjs": "7.8.1", "stripe": "18.5.0", "svgmap": "2.12.2", - "tablemark": "3.1.0", + "tablemark": "4.1.0", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", "yahoo-finance2": "3.10.0", @@ -197,7 +197,7 @@ "nx": "21.5.1", "prettier": "3.6.2", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.17.1", + "prisma": "6.18.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", diff --git a/prisma.config.ts b/prisma.config.ts deleted file mode 100644 index 60597cbf1..000000000 --- a/prisma.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { config } from 'dotenv'; -import { expand } from 'dotenv-expand'; -import { join } from 'node:path'; -import { defineConfig } from 'prisma/config'; - -expand(config({ quiet: true })); - -export default defineConfig({ - migrations: { - path: join('prisma', 'migrations'), - seed: `node ${join('prisma', 'seed.mts')}` - }, - schema: join('prisma', 'schema.prisma') -});