Browse Source

Merge branch 'main' into task/remove-deprecated-attributes-from-holdings-of-public-portfolio-endpoint-response

pull/6923/head
Thomas Kaul 3 days ago
committed by GitHub
parent
commit
39cf95ff27
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 60
      apps/client/src/app/components/home-market/home-market.component.ts
  3. 10
      apps/client/src/app/components/home-market/home-market.html
  4. 51
      package-lock.json
  5. 2
      package.json

1
CHANGELOG.md

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Removed the deprecated attributes (`assetClass`, `countries`, `currency`, `dataSource`, `name`, `sectors`, `symbol` and `url`) from the holdings of the public portfolio endpoint response - Removed the deprecated attributes (`assetClass`, `countries`, `currency`, `dataSource`, `name`, `sectors`, `symbol` and `url`) from the holdings of the public portfolio endpoint response
- Upgraded `@keyv/redis` from version `4.4.0` to `5.1.6`
## 3.4.0 - 2026-05-21 ## 3.4.0 - 2026-05-21

60
apps/client/src/app/components/home-market/home-market.component.ts

@ -16,9 +16,12 @@ import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectorRef, ChangeDetectorRef,
Component, Component,
computed,
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
DestroyRef, DestroyRef,
OnInit inject,
OnInit,
signal
} from '@angular/core'; } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
@ -35,25 +38,27 @@ import { DeviceDetectorService } from 'ngx-device-detector';
templateUrl: './home-market.html' templateUrl: './home-market.html'
}) })
export class GfHomeMarketComponent implements OnInit { export class GfHomeMarketComponent implements OnInit {
public benchmarks: Benchmark[]; protected readonly benchmarks = signal<Benchmark[]>([]);
public deviceType: string; protected readonly deviceType = computed(
public fearAndGreedIndex: number; () => this.deviceDetectorService.deviceInfo().deviceType
public fearLabel = $localize`Fear`; );
public greedLabel = $localize`Greed`; protected readonly fearAndGreedIndex = signal<number | undefined>(undefined);
public hasPermissionToAccessFearAndGreedIndex: boolean; protected readonly fearLabel = $localize`Fear`;
public historicalDataItems: HistoricalDataItem[]; protected readonly greedLabel = $localize`Greed`;
public info: InfoItem; protected hasPermissionToAccessFearAndGreedIndex: boolean;
public readonly numberOfDays = 365; protected readonly historicalDataItems = signal<HistoricalDataItem[]>([]);
public user: User; protected readonly numberOfDays = 365;
protected user: User;
public constructor( private readonly info: InfoItem;
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService, private readonly changeDetectorRef = inject(ChangeDetectorRef);
private destroyRef: DestroyRef, private readonly dataService = inject(DataService);
private deviceDetectorService: DeviceDetectorService, private readonly destroyRef = inject(DestroyRef);
private userService: UserService private readonly deviceDetectorService = inject(DeviceDetectorService);
) { private readonly userService = inject(UserService);
this.deviceType = this.deviceDetectorService.getDeviceInfo().deviceType;
public constructor() {
this.info = this.dataService.fetchInfo(); this.info = this.dataService.fetchInfo();
this.userService.stateChanged this.userService.stateChanged
@ -73,7 +78,10 @@ export class GfHomeMarketComponent implements OnInit {
permissions.enableFearAndGreedIndex permissions.enableFearAndGreedIndex
); );
if (this.hasPermissionToAccessFearAndGreedIndex) { if (
this.hasPermissionToAccessFearAndGreedIndex &&
this.info.fearAndGreedDataSource
) {
this.dataService this.dataService
.fetchSymbolItem({ .fetchSymbolItem({
dataSource: this.info.fearAndGreedDataSource, dataSource: this.info.fearAndGreedDataSource,
@ -82,16 +90,14 @@ export class GfHomeMarketComponent implements OnInit {
}) })
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ historicalData, marketPrice }) => { .subscribe(({ historicalData, marketPrice }) => {
this.fearAndGreedIndex = marketPrice; this.fearAndGreedIndex.set(marketPrice);
this.historicalDataItems = [ this.historicalDataItems.set([
...historicalData, ...historicalData,
{ {
date: resetHours(new Date()).toISOString(), date: resetHours(new Date()).toISOString(),
value: marketPrice value: marketPrice
} }
]; ]);
this.changeDetectorRef.markForCheck();
}); });
} }
@ -99,9 +105,7 @@ export class GfHomeMarketComponent implements OnInit {
.fetchBenchmarks() .fetchBenchmarks()
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ benchmarks }) => { .subscribe(({ benchmarks }) => {
this.benchmarks = benchmarks; this.benchmarks.set(benchmarks);
this.changeDetectorRef.markForCheck();
}); });
} }
} }

10
apps/client/src/app/components/home-market/home-market.html

@ -10,7 +10,7 @@
class="mb-3" class="mb-3"
label="Fear & Greed Index" label="Fear & Greed Index"
[colorScheme]="user?.settings?.colorScheme" [colorScheme]="user?.settings?.colorScheme"
[historicalDataItems]="historicalDataItems" [historicalDataItems]="historicalDataItems()"
[isAnimated]="true" [isAnimated]="true"
[locale]="user?.settings?.locale || undefined" [locale]="user?.settings?.locale || undefined"
[showXAxis]="true" [showXAxis]="true"
@ -22,7 +22,7 @@
/> />
<gf-fear-and-greed-index <gf-fear-and-greed-index
class="d-flex justify-content-center" class="d-flex justify-content-center"
[fearAndGreedIndex]="fearAndGreedIndex" [fearAndGreedIndex]="fearAndGreedIndex()"
/> />
</div> </div>
</div> </div>
@ -31,13 +31,13 @@
<div class="mb-3 row"> <div class="mb-3 row">
<div class="col-xs-12 col-md-10 offset-md-1"> <div class="col-xs-12 col-md-10 offset-md-1">
<gf-benchmark <gf-benchmark
[benchmarks]="benchmarks" [benchmarks]="benchmarks()"
[deviceType]="deviceType" [deviceType]="deviceType()"
[locale]="user?.settings?.locale || undefined" [locale]="user?.settings?.locale || undefined"
[showSymbol]="false" [showSymbol]="false"
[user]="user" [user]="user"
/> />
@if (benchmarks?.length > 0) { @if (benchmarks()?.length > 0) {
<div <div
class="gf-text-wrap-balance line-height-1 mt-3 text-center text-muted" class="gf-text-wrap-balance line-height-1 mt-3 text-center text-muted"
> >

51
package-lock.json

@ -28,7 +28,7 @@
"@date-fns/utc": "2.1.1", "@date-fns/utc": "2.1.1",
"@internationalized/number": "3.6.6", "@internationalized/number": "3.6.6",
"@ionic/angular": "8.8.5", "@ionic/angular": "8.8.5",
"@keyv/redis": "4.4.0", "@keyv/redis": "5.1.6",
"@nestjs/bull": "11.0.4", "@nestjs/bull": "11.0.4",
"@nestjs/cache-manager": "3.1.0", "@nestjs/cache-manager": "3.1.0",
"@nestjs/common": "11.1.19", "@nestjs/common": "11.1.19",
@ -7144,19 +7144,20 @@
} }
}, },
"node_modules/@keyv/redis": { "node_modules/@keyv/redis": {
"version": "4.4.0", "version": "5.1.6",
"resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-4.4.0.tgz", "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-5.1.6.tgz",
"integrity": "sha512-n/KEj3S7crVkoykggqsMUtcjNGvjagGPlJYgO/r6m9hhGZfhp1txJElHxcdJ1ANi/LJoBuOSILj15g6HD2ucqQ==", "integrity": "sha512-eKvW6pspvVaU5dxigaIDZr635/Uw6urTXL3gNbY9WTR8d3QigZQT+r8gxYSEOsw4+1cCBsC4s7T2ptR0WC9LfQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@redis/client": "^1.6.0", "@redis/client": "^5.10.0",
"cluster-key-slot": "^1.1.2" "cluster-key-slot": "^1.1.2",
"hookified": "^1.13.0"
}, },
"engines": { "engines": {
"node": ">= 18" "node": ">= 18"
}, },
"peerDependencies": { "peerDependencies": {
"keyv": "^5.3.3" "keyv": "^5.6.0"
} }
}, },
"node_modules/@keyv/serialize": { "node_modules/@keyv/serialize": {
@ -11664,17 +11665,27 @@
} }
}, },
"node_modules/@redis/client": { "node_modules/@redis/client": {
"version": "1.6.1", "version": "5.12.1",
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.12.1.tgz",
"integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", "integrity": "sha512-7aPGWeqA3uFm43o19umzdl16CEjK/JQGtSXVPevplTaOU3VJA/rseBC1QvYUz9lLDIMBimc4SW/zrW4S89BaCA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cluster-key-slot": "1.1.2", "cluster-key-slot": "1.1.2"
"generic-pool": "3.9.0",
"yallist": "4.0.0"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">= 18.19.0"
},
"peerDependencies": {
"@node-rs/xxhash": "^1.1.0",
"@opentelemetry/api": ">=1 <2"
},
"peerDependenciesMeta": {
"@node-rs/xxhash": {
"optional": true
},
"@opentelemetry/api": {
"optional": true
}
} }
}, },
"node_modules/@rolldown/binding-android-arm64": { "node_modules/@rolldown/binding-android-arm64": {
@ -23191,15 +23202,6 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/generic-pool": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
"integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/gensync": { "node_modules/gensync": {
"version": "1.0.0-beta.2", "version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@ -23818,8 +23820,7 @@
"version": "1.15.1", "version": "1.15.1",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
"integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==",
"license": "MIT", "license": "MIT"
"peer": true
}, },
"node_modules/hosted-git-info": { "node_modules/hosted-git-info": {
"version": "9.0.2", "version": "9.0.2",

2
package.json

@ -72,7 +72,7 @@
"@date-fns/utc": "2.1.1", "@date-fns/utc": "2.1.1",
"@internationalized/number": "3.6.6", "@internationalized/number": "3.6.6",
"@ionic/angular": "8.8.5", "@ionic/angular": "8.8.5",
"@keyv/redis": "4.4.0", "@keyv/redis": "5.1.6",
"@nestjs/bull": "11.0.4", "@nestjs/bull": "11.0.4",
"@nestjs/cache-manager": "3.1.0", "@nestjs/cache-manager": "3.1.0",
"@nestjs/common": "11.1.19", "@nestjs/common": "11.1.19",

Loading…
Cancel
Save