Browse Source

Merge branch 'main' into feature/assistant-preselect-first-item

pull/5656/head
Aditya Garud 4 weeks ago
committed by GitHub
parent
commit
4683b87b7b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      CHANGELOG.md
  2. 1
      apps/api/src/app/portfolio/portfolio.controller.ts
  3. 10
      apps/api/src/app/portfolio/portfolio.service.ts
  4. 2
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
  5. 2
      apps/client/src/app/app-routing.module.ts
  6. 4
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  7. 8
      apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html
  8. 1
      apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts
  9. 2
      apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts
  10. 133
      apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
  11. 5
      apps/client/src/app/directives/file-drop/file-drop.directive.ts
  12. 9
      apps/client/src/app/directives/file-drop/file-drop.module.ts
  13. 22
      apps/client/src/app/pages/open/open-page-routing.module.ts
  14. 20
      apps/client/src/app/pages/open/open-page.component.ts
  15. 20
      apps/client/src/app/pages/open/open-page.module.ts
  16. 15
      apps/client/src/app/pages/open/open-page.routes.ts
  17. 10
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  18. 27
      apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
  19. 4
      apps/client/src/app/pages/portfolio/fire/fire-page.html
  20. 9
      apps/client/src/app/pipes/symbol/symbol.module.ts
  21. 5
      apps/client/src/app/pipes/symbol/symbol.pipe.ts
  22. 3
      libs/common/src/lib/interfaces/fire-wealth.interface.ts
  23. 2
      libs/common/src/lib/interfaces/index.ts
  24. 3
      libs/common/src/lib/interfaces/portfolio-summary.interface.ts
  25. 4
      libs/ui/src/lib/activities-filter/activities-filter.component.ts
  26. 4
      libs/ui/src/lib/activities-table/activities-table.component.ts
  27. 4
      libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
  28. 4
      libs/ui/src/lib/assistant/assistant.component.ts
  29. 4
      libs/ui/src/lib/holdings-table/holdings-table.component.ts
  30. 4
      libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts
  31. 4
      libs/ui/src/lib/top-holdings/top-holdings.component.ts

2
CHANGELOG.md

@ -5,7 +5,7 @@ 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.206.0 - 2025-01-27
### Added

1
apps/api/src/app/portfolio/portfolio.controller.ts

@ -195,7 +195,6 @@ export class PortfolioController {
'excludedAccountsAndActivities',
'fees',
'filteredValueInBaseCurrency',
'fireWealth',
'grossPerformance',
'grossPerformanceWithCurrencyEffect',
'interest',

10
apps/api/src/app/portfolio/portfolio.service.ts

@ -2092,9 +2092,13 @@ export class PortfolioService {
filteredValueInPercentage: netWorth
? filteredValueInBaseCurrency.div(netWorth).toNumber()
: undefined,
fireWealth: new Big(currentValueInBaseCurrency)
.minus(emergencyFundHoldingsValueInBaseCurrency)
.toNumber(),
fireWealth: {
today: {
valueInBaseCurrency: new Big(currentValueInBaseCurrency)
.minus(emergencyFundHoldingsValueInBaseCurrency)
.toNumber()
}
},
grossPerformance: new Big(netPerformance).plus(fees).toNumber(),
grossPerformanceWithCurrencyEffect: new Big(
netPerformanceWithCurrencyEffect

2
apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts

@ -161,7 +161,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}
).then((res) => res.json());
if (etfInformation.website) {
if (etfInformation?.website) {
response.url = etfInformation.website;
}

2
apps/client/src/app/app-routing.module.ts

@ -94,7 +94,7 @@ const routes: Routes = [
{
path: publicRoutes.openStartup.path,
loadChildren: () =>
import('./pages/open/open-page.module').then((m) => m.OpenPageModule)
import('./pages/open/open-page.routes').then((m) => m.routes)
},
{
path: internalRoutes.portfolio.path,

4
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
@ -79,7 +79,7 @@ import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/in
CommonModule,
GfActivitiesFilterComponent,
GfPremiumIndicatorComponent,
GfSymbolModule,
GfSymbolPipe,
GfValueComponent,
IonIcon,
MatButtonModule,

8
apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html

@ -12,7 +12,13 @@
</mat-form-field>
</div>
<div class="d-flex justify-content-end" mat-dialog-actions>
<button i18n mat-button type="button" (click)="onCancel()">Cancel</button>
<button mat-button type="button" (click)="onCancel()">
@if (createWatchlistItemForm.dirty) {
<ng-container i18n>Cancel</ng-container>
} @else {
<ng-container i18n>Close</ng-container>
}
</button>
<button
color="primary"
mat-flat-button

1
apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts

@ -5,6 +5,7 @@ import {
export interface IRuleSettingsDialogParams {
categoryName: string;
locale: string;
rule: PortfolioReportRule;
settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
}

2
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts

@ -1,4 +1,5 @@
import { XRayRulesSettings } from '@ghostfolio/common/interfaces';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { Component, Inject } from '@angular/core';
@ -17,6 +18,7 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces';
imports: [
CommonModule,
FormsModule,
GfValueComponent,
MatButtonModule,
MatDialogModule,
MatSliderModule

133
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html

@ -5,28 +5,30 @@
data.rule.configuration.thresholdMin && data.rule.configuration.thresholdMax
) {
<div class="w-100">
<h6 class="mb-0">
<h6 class="d-flex mb-0">
<ng-container i18n>Threshold range</ng-container>:
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMin | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMin }}
}
-
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMax | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMax }}
}
<gf-value
class="ml-1"
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMin"
/>
<span class="mx-1">-</span>
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMax"
/>
</h6>
<div class="align-items-center d-flex w-100">
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.min | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.min }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.min"
/>
<mat-slider
class="flex-grow-1"
[max]="data.rule.configuration.threshold.max"
@ -36,13 +38,12 @@
<input matSliderStartThumb [(ngModel)]="data.settings.thresholdMin" />
<input matSliderEndThumb [(ngModel)]="data.settings.thresholdMax" />
</mat-slider>
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.max | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.max }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.max"
/>
</div>
</div>
} @else {
@ -50,22 +51,23 @@
class="w-100"
[ngClass]="{ 'd-none': !data.rule.configuration.thresholdMin }"
>
<h6 class="mb-0">
<h6 class="d-flex mb-0">
<ng-container i18n>Threshold Min</ng-container>:
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMin | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMin }}
}
<gf-value
class="ml-1"
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMin"
/>
</h6>
<div class="align-items-center d-flex w-100">
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.min | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.min }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.min"
/>
<mat-slider
class="flex-grow-1"
name="thresholdMin"
@ -75,35 +77,35 @@
>
<input matSliderThumb [(ngModel)]="data.settings.thresholdMin" />
</mat-slider>
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.max | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.max }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.max"
/>
</div>
</div>
<div
class="w-100"
[ngClass]="{ 'd-none': !data.rule.configuration.thresholdMax }"
>
<h6 class="mb-0">
<h6 class="d-flex mb-0">
<ng-container i18n>Threshold Max</ng-container>:
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMax | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMax }}
}
<gf-value
class="ml-1"
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMax"
/>
</h6>
<div class="align-items-center d-flex w-100">
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.min | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.min }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.min"
/>
<mat-slider
class="flex-grow-1"
name="thresholdMax"
@ -113,13 +115,12 @@
>
<input matSliderThumb [(ngModel)]="data.settings.thresholdMax" />
</mat-slider>
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.max | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.max }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.max"
/>
</div>
</div>
}

5
apps/client/src/app/directives/file-drop/file-drop.directive.ts

@ -1,10 +1,9 @@
import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
@Directive({
selector: '[gfFileDrop]',
standalone: false
selector: '[gfFileDrop]'
})
export class FileDropDirective {
export class GfFileDropDirective {
@Output() filesDropped = new EventEmitter<FileList>();
@HostListener('dragenter', ['$event']) onDragEnter(event: DragEvent) {

9
apps/client/src/app/directives/file-drop/file-drop.module.ts

@ -1,9 +0,0 @@
import { NgModule } from '@angular/core';
import { FileDropDirective } from './file-drop.directive';
@NgModule({
declarations: [FileDropDirective],
exports: [FileDropDirective]
})
export class GfFileDropModule {}

22
apps/client/src/app/pages/open/open-page-routing.module.ts

@ -1,22 +0,0 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { OpenPageComponent } from './open-page.component';
const routes: Routes = [
{
canActivate: [AuthGuard],
component: OpenPageComponent,
path: '',
title: publicRoutes.openStartup.title
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class OpenPageRoutingModule {}

20
apps/client/src/app/pages/open/open-page.component.ts

@ -1,18 +1,28 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { Statistics, User } from '@ghostfolio/common/interfaces';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
OnDestroy,
OnInit
} from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page' },
imports: [CommonModule, GfValueComponent, MatCardModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-open-page',
styleUrls: ['./open-page.scss'],
templateUrl: './open-page.html',
standalone: false
templateUrl: './open-page.html'
})
export class OpenPageComponent implements OnDestroy, OnInit {
export class GfOpenPageComponent implements OnDestroy, OnInit {
public statistics: Statistics;
public user: User;

20
apps/client/src/app/pages/open/open-page.module.ts

@ -1,20 +0,0 @@
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { OpenPageRoutingModule } from './open-page-routing.module';
import { OpenPageComponent } from './open-page.component';
@NgModule({
declarations: [OpenPageComponent],
imports: [
CommonModule,
GfValueComponent,
MatCardModule,
OpenPageRoutingModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class OpenPageModule {}

15
apps/client/src/app/pages/open/open-page.routes.ts

@ -0,0 +1,15 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
import { GfOpenPageComponent } from './open-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
component: GfOpenPageComponent,
path: '',
title: publicRoutes.openStartup.title
}
];

10
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -4,8 +4,8 @@ import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { GfFileDropModule } from '@ghostfolio/client/directives/file-drop/file-drop.module';
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service';
import { PortfolioPosition } from '@ghostfolio/common/interfaces';
@ -15,6 +15,7 @@ import {
StepperOrientation,
StepperSelectionEvent
} from '@angular/cdk/stepper';
import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
@ -59,11 +60,12 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'd-flex flex-column h-100' },
imports: [
CommonModule,
GfActivitiesTableComponent,
GfDialogFooterComponent,
GfDialogHeaderComponent,
GfFileDropModule,
GfSymbolModule,
GfFileDropDirective,
GfSymbolPipe,
IonIcon,
MatButtonModule,
MatDialogModule,

27
apps/client/src/app/pages/portfolio/fire/fire-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces';
import { FireWealth, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfFireCalculatorComponent } from '@ghostfolio/ui/fire-calculator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
@ -29,7 +29,7 @@ import { takeUntil } from 'rxjs/operators';
})
export class GfFirePageComponent implements OnDestroy, OnInit {
public deviceType: string;
public fireWealth: Big;
public fireWealth: FireWealth;
public hasImpersonationId: boolean;
public hasPermissionToUpdateUserSettings: boolean;
public isLoading = false;
@ -55,17 +55,24 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
.fetchPortfolioDetails()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ summary }) => {
this.fireWealth = summary.fireWealth
? new Big(summary.fireWealth)
: new Big(0);
this.fireWealth = {
today: {
valueInBaseCurrency: summary.fireWealth
? summary.fireWealth.today.valueInBaseCurrency
: 0
}
};
if (this.user.subscription?.type === 'Basic') {
this.fireWealth = new Big(10000);
this.fireWealth = {
today: {
valueInBaseCurrency: 10000
}
};
}
this.withdrawalRatePerYear = this.fireWealth.mul(
this.user.settings.safeWithdrawalRate
);
this.withdrawalRatePerYear = Big(
this.fireWealth.today.valueInBaseCurrency
).mul(this.user.settings.safeWithdrawalRate);
this.withdrawalRatePerMonth = this.withdrawalRatePerYear.div(12);

4
apps/client/src/app/pages/portfolio/fire/fire-page.html

@ -14,7 +14,7 @@
[colorScheme]="user?.settings?.colorScheme"
[currency]="user?.settings?.baseCurrency"
[deviceType]="deviceType"
[fireWealth]="fireWealth?.toNumber()"
[fireWealth]="fireWealth?.today.valueInBaseCurrency"
[hasPermissionToUpdateUserSettings]="
!hasImpersonationId && hasPermissionToUpdateUserSettings
"
@ -100,7 +100,7 @@
[isCurrency]="true"
[locale]="user?.settings?.locale"
[unit]="user?.settings?.baseCurrency"
[value]="fireWealth?.toNumber()"
[value]="fireWealth?.today.valueInBaseCurrency"
/>
</span>
<ng-container>&nbsp;</ng-container>

9
apps/client/src/app/pipes/symbol/symbol.module.ts

@ -1,9 +0,0 @@
import { NgModule } from '@angular/core';
import { SymbolPipe } from './symbol.pipe';
@NgModule({
declarations: [SymbolPipe],
exports: [SymbolPipe]
})
export class GfSymbolModule {}

5
apps/client/src/app/pipes/symbol/symbol.pipe.ts

@ -3,10 +3,9 @@ import { prettifySymbol } from '@ghostfolio/common/helper';
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'gfSymbol',
standalone: false
name: 'gfSymbol'
})
export class SymbolPipe implements PipeTransform {
export class GfSymbolPipe implements PipeTransform {
public transform(aSymbol: string) {
return prettifySymbol(aSymbol);
}

3
libs/common/src/lib/interfaces/fire-wealth.interface.ts

@ -0,0 +1,3 @@
export interface FireWealth {
today: { valueInBaseCurrency: number };
}

2
libs/common/src/lib/interfaces/index.ts

@ -19,6 +19,7 @@ import type { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'
import type { Export } from './export.interface';
import type { FilterGroup } from './filter-group.interface';
import type { Filter } from './filter.interface';
import type { FireWealth } from './fire-wealth.interface';
import type { HistoricalDataItem } from './historical-data-item.interface';
import type { HoldingWithParents } from './holding-with-parents.interface';
import type { Holding } from './holding.interface';
@ -104,6 +105,7 @@ export {
Export,
Filter,
FilterGroup,
FireWealth,
HistoricalDataItem,
HistoricalResponse,
Holding,

3
libs/common/src/lib/interfaces/portfolio-summary.interface.ts

@ -1,3 +1,4 @@
import { FireWealth } from './fire-wealth.interface';
import { PortfolioPerformance } from './portfolio-performance.interface';
export interface PortfolioSummary extends PortfolioPerformance {
@ -16,7 +17,7 @@ export interface PortfolioSummary extends PortfolioPerformance {
fees: number;
filteredValueInBaseCurrency?: number;
filteredValueInPercentage?: number;
fireWealth: number;
fireWealth: FireWealth;
grossPerformance: number;
grossPerformanceWithCurrencyEffect: number;
interest: number;

4
libs/ui/src/lib/activities-filter/activities-filter.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { Filter, FilterGroup } from '@ghostfolio/common/interfaces';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
@ -39,7 +39,7 @@ import { translate } from '../i18n';
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
CommonModule,
GfSymbolModule,
GfSymbolPipe,
IonIcon,
MatAutocompleteModule,
MatButtonModule,

4
libs/ui/src/lib/activities-table/activities-table.component.ts

@ -1,7 +1,7 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import {
DEFAULT_PAGE_SIZE,
TAG_ID_EXCLUDE_FROM_ANALYSIS
@ -73,7 +73,7 @@ import { GfValueComponent } from '../value/value.component';
GfActivityTypeComponent,
GfEntityLogoComponent,
GfNoTransactionsInfoComponent,
GfSymbolModule,
GfSymbolPipe,
GfValueComponent,
IonIcon,
MatButtonModule,

4
libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { FocusableOption } from '@angular/cdk/a11y';
@ -24,7 +24,7 @@ import {
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [GfSymbolModule, RouterModule],
imports: [GfSymbolPipe, RouterModule],
selector: 'gf-assistant-list-item',
styleUrls: ['./assistant-list-item.scss'],
templateUrl: './assistant-list-item.html'

4
libs/ui/src/lib/assistant/assistant.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
@ -76,7 +76,7 @@ import {
FormsModule,
GfAssistantListItemComponent,
GfEntityLogoComponent,
GfSymbolModule,
GfSymbolPipe,
IonIcon,
MatButtonModule,
MatFormFieldModule,

4
libs/ui/src/lib/holdings-table/holdings-table.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { getLocale } from '@ghostfolio/common/helper';
import {
AssetProfileIdentifier,
@ -34,7 +34,7 @@ import { GfValueComponent } from '../value/value.component';
imports: [
CommonModule,
GfEntityLogoComponent,
GfSymbolModule,
GfSymbolPipe,
GfValueComponent,
MatButtonModule,
MatDialogModule,

4
libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { DataService } from '@ghostfolio/client/services/data.service';
import { LookupItem } from '@ghostfolio/common/interfaces';
@ -57,7 +57,7 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field';
imports: [
FormsModule,
GfPremiumIndicatorComponent,
GfSymbolModule,
GfSymbolPipe,
MatAutocompleteModule,
MatFormFieldModule,
MatInputModule,

4
libs/ui/src/lib/top-holdings/top-holdings.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { getLocale } from '@ghostfolio/common/helper';
import {
AssetProfileIdentifier,
@ -46,7 +46,7 @@ import { GfValueComponent } from '../value/value.component';
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
CommonModule,
GfSymbolModule,
GfSymbolPipe,
GfValueComponent,
MatButtonModule,
MatPaginatorModule,

Loading…
Cancel
Save