From f5a50a95de72e8092f5c5e6d15fd479be78c6388 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 12 Jun 2023 15:16:43 +0200 Subject: [PATCH 1/5] Feature/upgrade prisma to version 4.15.0 (#2070) * Upgrade prisma to version 4.15.0 * Update changelog --- CHANGELOG.md | 6 ++++++ package.json | 4 ++-- yarn.lock | 36 ++++++++++++++++++------------------ 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad60933ec..3e6955d46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ 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 + +### Changed + +- Upgraded `prisma` from version `4.14.1` to `4.15.0` + ## 1.280.1 - 2023-06-10 ### Added diff --git a/package.json b/package.json index c328e2a1b..c49046bfc 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@nestjs/platform-express": "9.1.4", "@nestjs/schedule": "2.1.0", "@nestjs/serve-static": "3.0.0", - "@prisma/client": "4.14.1", + "@prisma/client": "4.15.0", "@simplewebauthn/browser": "5.2.1", "@simplewebauthn/server": "5.2.1", "@stripe/stripe-js": "1.47.0", @@ -119,7 +119,7 @@ "passport": "0.6.0", "passport-google-oauth20": "2.0.0", "passport-jwt": "4.0.0", - "prisma": "4.14.1", + "prisma": "4.15.0", "reflect-metadata": "0.1.13", "rxjs": "7.5.6", "stripe": "11.12.0", diff --git a/yarn.lock b/yarn.lock index 224e66b60..9ce071222 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3936,22 +3936,22 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@prisma/client@4.14.1": - version "4.14.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.14.1.tgz#61720f385f687f7e88de41fccade1ed62be57a54" - integrity sha512-TZIswkeX1ccsHG/eN2kICzg/csXll0osK3EHu1QKd8VJ3XLcXozbNELKkCNfsCUvKJAwPdDtFCzF+O+raIVldw== +"@prisma/client@4.15.0": + version "4.15.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.15.0.tgz#f52ec6ca6fbde37395a54b0a9e5da603a9de15f3" + integrity sha512-xnROvyABcGiwqRNdrObHVZkD9EjkJYHOmVdlKy1yGgI+XOzvMzJ4tRg3dz1pUlsyhKxXGCnjIQjWW+2ur+YXuw== dependencies: - "@prisma/engines-version" "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" + "@prisma/engines-version" "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944" -"@prisma/engines-version@4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c": - version "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz#0aeca447c4a5f23c83f68b8033e627b60bc01850" - integrity sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw== +"@prisma/engines-version@4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944": + version "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944.tgz#8d880becf996cffe08c78ad5afab6bc06090c990" + integrity sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg== -"@prisma/engines@4.14.1": - version "4.14.1" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.14.1.tgz#dac49f8d1f2d4f14a8ed7e6f96b24cd49bd6cd91" - integrity sha512-APqFddPVHYmWNKqc+5J5SqrLFfOghKOLZxobmguDUacxOwdEutLsbXPVhNnpFDmuQWQFbXmrTTPoRrrF6B1MWA== +"@prisma/engines@4.15.0": + version "4.15.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.15.0.tgz#d8687a9fda615fab88b75b466931280289de9e26" + integrity sha512-FTaOCGs0LL0OW68juZlGxFtYviZa4xdQj/rQEdat2txw0s3Vu/saAPKjNVXfIgUsGXmQ72HPgNr6935/P8FNAA== "@samverschueren/stream-to-observable@^0.3.0": version "0.3.1" @@ -15184,12 +15184,12 @@ pretty-hrtime@^1.0.3: resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== -prisma@4.14.1: - version "4.14.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.14.1.tgz#7a6bb4ce847a9d08deabb6acdf3116fff15e1316" - integrity sha512-z6hxzTMYqT9SIKlzD08dhzsLUpxjFKKsLpp5/kBDnSqiOjtUyyl/dC5tzxLcOa3jkEHQ8+RpB/fE3w8bgNP51g== +prisma@4.15.0: + version "4.15.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.15.0.tgz#4faa94f0d584828b68468953ff0bc88f37912c8c" + integrity sha512-iKZZpobPl48gTcSZVawLMQ3lEy6BnXwtoMj7hluoGFYu2kQ6F9LBuBrUyF95zRVnNo8/3KzLXJXJ5TEnLSJFiA== dependencies: - "@prisma/engines" "4.14.1" + "@prisma/engines" "4.15.0" prismjs@^1.28.0: version "1.29.0" From fce3b2084e110727ee21dde39039337a402f360e Mon Sep 17 00:00:00 2001 From: Arghya Ghosh Date: Wed, 14 Jun 2023 00:06:16 +0530 Subject: [PATCH 2/5] Feature/extract symbol search to component (#2003) (#2056) * Extract symbol search to component (#2003) * Update changelog --- CHANGELOG.md | 1 + ...ate-or-update-activity-dialog.component.ts | 75 ++------ .../create-or-update-activity-dialog.html | 28 +-- ...create-or-update-activity-dialog.module.ts | 6 +- .../abstract-mat-form-field.ts | 178 ++++++++++++++++++ libs/ui/src/lib/symbol-autocomplete/index.ts | 1 + .../symbol-autocomplete.component.html | 34 ++++ .../symbol-autocomplete.component.scss | 8 + .../symbol-autocomplete.component.ts | 169 +++++++++++++++++ .../symbol-autocomplete.module.ts | 26 +++ 10 files changed, 439 insertions(+), 87 deletions(-) create mode 100644 libs/ui/src/lib/symbol-autocomplete/abstract-mat-form-field.ts create mode 100644 libs/ui/src/lib/symbol-autocomplete/index.ts create mode 100644 libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html create mode 100644 libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.scss create mode 100644 libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts create mode 100644 libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e6955d46..e9f9f0fce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Extracted the symbol search to a dedicated component - Upgraded `prisma` from version `4.14.1` to `4.15.0` ## 1.280.1 - 2023-06-10 diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index d9fdb3fe4..6962d4d40 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -55,8 +55,6 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { public currencies: string[] = []; public currentMarketPrice = null; public defaultDateFormat: string; - public filteredLookupItems: LookupItem[] = []; - public filteredLookupItemsObservable: Observable = of([]); public filteredTagsObservable: Observable = of([]); public isLoading = false; public platforms: { id: string; name: string }[]; @@ -120,10 +118,12 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { name: [this.data.activity?.SymbolProfile?.name, Validators.required], quantity: [this.data.activity?.quantity, Validators.required], searchSymbol: [ - { - dataSource: this.data.activity?.SymbolProfile?.dataSource, - symbol: this.data.activity?.SymbolProfile?.symbol - }, + !!this.data.activity?.SymbolProfile + ? { + dataSource: this.data.activity?.SymbolProfile?.dataSource, + symbol: this.data.activity?.SymbolProfile?.symbol + } + : null, Validators.required ], tags: [ @@ -238,28 +238,19 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.changeDetectorRef.markForCheck(); }); - this.filteredLookupItemsObservable = this.activityForm.controls[ - 'searchSymbol' - ].valueChanges.pipe( - debounceTime(400), - distinctUntilChanged(), - switchMap((query: string) => { - if (isString(query) && query.length > 1) { - const filteredLookupItemsObservable = - this.dataService.fetchSymbols(query); - - filteredLookupItemsObservable - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((filteredLookupItems) => { - this.filteredLookupItems = filteredLookupItems; - }); + this.activityForm.controls['searchSymbol'].valueChanges.subscribe(() => { + if (this.activityForm.controls['searchSymbol'].invalid) { + this.data.activity.SymbolProfile = null; + } else { + this.activityForm.controls['dataSource'].setValue( + this.activityForm.controls['searchSymbol'].value.dataSource + ); - return filteredLookupItemsObservable; - } + this.updateSymbol(); + } - return []; - }) - ); + this.changeDetectorRef.markForCheck(); + }); this.filteredTagsObservable = this.activityForm.controls[ 'tags' @@ -393,25 +384,6 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.tagInput.nativeElement.value = ''; } - public onBlurSymbol() { - const currentLookupItem = this.filteredLookupItems.find((lookupItem) => { - return ( - lookupItem.symbol === - this.activityForm.controls['searchSymbol'].value.symbol - ); - }); - - if (currentLookupItem) { - this.updateSymbol(currentLookupItem.symbol); - } else { - this.activityForm.controls['searchSymbol'].setErrors({ incorrect: true }); - - this.data.activity.SymbolProfile = null; - } - - this.changeDetectorRef.markForCheck(); - } - public onCancel() { this.dialogRef.close(); } @@ -455,13 +427,6 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.dialogRef.close({ activity }); } - public onUpdateSymbol(event: MatAutocompleteSelectedEvent) { - this.activityForm.controls['dataSource'].setValue( - event.option.value.dataSource - ); - this.updateSymbol(event.option.value.symbol); - } - public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); @@ -477,12 +442,8 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { }); } - private updateSymbol(symbol: string) { + private updateSymbol() { this.isLoading = true; - - this.activityForm.controls['searchSymbol'].setErrors(null); - this.activityForm.controls['searchSymbol'].setValue({ symbol }); - this.changeDetectorRef.markForCheck(); this.dataService diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index 85511f012..a78b6ba86 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -48,34 +48,10 @@ > Name, symbol or ISIN - - - - {{ lookupItem.name }} -
- {{ lookupItem.symbol | gfSymbol }} · {{ lookupItem.currency - }} -
-
-
+ implements ControlValueAccessor, DoCheck, MatFormFieldControl, OnDestroy +{ + @HostBinding() + public id = `${this.controlType}-${AbstractMatFormField.nextId++}`; + + @HostBinding('attr.aria-describedBy') public describedBy = ''; + + public readonly autofilled: boolean; + public errorState: boolean; + public focused = false; + public readonly stateChanges = new Subject(); + public readonly userAriaDescribedBy: string; + + protected onChange?: (value: T) => void; + protected onTouched?: () => void; + + private static nextId: number = 0; + + protected constructor( + protected _elementRef: ElementRef, + protected _focusMonitor: FocusMonitor, + public readonly ngControl: NgControl + ) { + if (this.ngControl) { + this.ngControl.valueAccessor = this; + } + + _focusMonitor + .monitor(this._elementRef.nativeElement, true) + .subscribe((origin) => { + this.focused = !!origin; + this.stateChanges.next(); + }); + } + + private _controlType: string; + + public get controlType(): string { + return this._controlType; + } + + protected set controlType(value: string) { + this._controlType = value; + this.id = `${this._controlType}-${AbstractMatFormField.nextId++}`; + } + + private _value: T; + + public get value(): T { + return this._value; + } + + public set value(value: T) { + this._value = value; + + if (this.onChange) { + this.onChange(value); + } + } + + public get empty(): boolean { + return !this._value; + } + + public _placeholder: string = ''; + + public get placeholder() { + return this._placeholder; + } + + @Input() + public set placeholder(placeholder: string) { + this._placeholder = placeholder; + this.stateChanges.next(); + } + + public _required: boolean = false; + + public get required() { + return this._required; + } + + @Input() + public set required(required: any) { + this._required = coerceBooleanProperty(required); + this.stateChanges.next(); + } + + public _disabled: boolean = false; + + public get disabled() { + if (this.ngControl && this.ngControl.disabled !== null) { + return this.ngControl.disabled; + } + + return this._disabled; + } + + @Input() + public set disabled(disabled: any) { + this._disabled = coerceBooleanProperty(disabled); + + if (this.focused) { + this.focused = false; + this.stateChanges.next(); + } + } + + public abstract focus(): void; + + public get shouldLabelFloat(): boolean { + return this.focused || !this.empty; + } + + public ngDoCheck(): void { + if (this.ngControl) { + this.errorState = this.ngControl.invalid && this.ngControl.touched; + this.stateChanges.next(); + } + } + + public ngOnDestroy(): void { + this.stateChanges.complete(); + this._focusMonitor.stopMonitoring(this._elementRef.nativeElement); + } + + public registerOnChange(fn: (_: T) => void): void { + this.onChange = fn; + } + + public registerOnTouched(fn: () => void): void { + this.onTouched = fn; + } + + public setDescribedByIds(ids: string[]): void { + this.describedBy = ids.join(' '); + } + + public writeValue(value: T): void { + this.value = value; + } + + @HostListener('focusout') + public onBlur() { + this.focused = false; + + if (this.onTouched) { + this.onTouched(); + } + + this.stateChanges.next(); + } + + public onContainerClick(): void { + if (!this.focused) { + this.focus(); + } + } +} diff --git a/libs/ui/src/lib/symbol-autocomplete/index.ts b/libs/ui/src/lib/symbol-autocomplete/index.ts new file mode 100644 index 000000000..7271d1ca9 --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/index.ts @@ -0,0 +1 @@ +export * from './symbol-autocomplete.module'; diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html new file mode 100644 index 000000000..47cb8bcb4 --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html @@ -0,0 +1,34 @@ + + + + + + {{ lookupItem.name }} +
+ {{ lookupItem.symbol | gfSymbol }} · {{ lookupItem.currency }} +
+
+
+ diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.scss b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.scss new file mode 100644 index 000000000..71c06f26e --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.scss @@ -0,0 +1,8 @@ +:host { + display: block; + + .mat-mdc-progress-spinner { + right: 0; + top: calc(50% - 10px); + } +} diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts new file mode 100644 index 000000000..2b6bc45ca --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -0,0 +1,169 @@ +import { FocusMonitor } from '@angular/cdk/a11y'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + Input, + OnDestroy, + OnInit, + ViewChild +} from '@angular/core'; +import { FormControl, NgControl, Validators } from '@angular/forms'; +import { + MatAutocomplete, + MatAutocompleteSelectedEvent +} from '@angular/material/autocomplete'; +import { MatFormFieldControl } from '@angular/material/form-field'; +import { MatInput } from '@angular/material/input'; +import { LookupItem } from '@ghostfolio/api/app/symbol/interfaces/lookup-item.interface'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { isString } from 'lodash'; +import { Observable, Subject, of, tap } from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + filter, + switchMap +} from 'rxjs/operators'; + +import { AbstractMatFormField } from './abstract-mat-form-field'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '[attr.aria-describedBy]': 'describedBy', + '[id]': 'id' + }, + selector: 'gf-symbol-autocomplete', + styleUrls: ['./symbol-autocomplete.component.scss'], + templateUrl: 'symbol-autocomplete.component.html', + providers: [ + { + provide: MatFormFieldControl, + useExisting: SymbolAutocompleteComponent + } + ] +}) +export class SymbolAutocompleteComponent + extends AbstractMatFormField + implements OnInit, OnDestroy +{ + @Input() public isLoading = false; + + @ViewChild(MatInput, { static: false }) private input: MatInput; + + @ViewChild('symbolAutocomplete') public symbolAutocomplete: MatAutocomplete; + + public control = new FormControl(); + public filteredLookupItems: LookupItem[] = []; + public filteredLookupItemsObservable: Observable = of([]); + + private unsubscribeSubject = new Subject(); + + public constructor( + public readonly _elementRef: ElementRef, + public readonly _focusMonitor: FocusMonitor, + public readonly changeDetectorRef: ChangeDetectorRef, + public readonly dataService: DataService, + public readonly ngControl: NgControl + ) { + super(_elementRef, _focusMonitor, ngControl); + + this.controlType = 'symbol-autocomplete'; + } + + public ngOnInit() { + super.required = this.ngControl.control?.hasValidator(Validators.required); + + if (this.disabled) { + this.control.disable(); + } + + this.control.valueChanges + .pipe( + debounceTime(400), + distinctUntilChanged(), + filter((query) => { + return isString(query) && query.length > 1; + }), + tap(() => { + this.isLoading = true; + this.changeDetectorRef.markForCheck(); + }), + switchMap((query: string) => { + return this.dataService.fetchSymbols(query); + }) + ) + .subscribe((filteredLookupItems) => { + this.filteredLookupItems = filteredLookupItems; + this.isLoading = false; + + this.changeDetectorRef.markForCheck(); + }); + } + + public displayFn(aLookupItem: LookupItem) { + return aLookupItem?.symbol ?? ''; + } + + public get empty() { + return this.input?.empty; + } + + public focus() { + this.input.focus(); + } + + public isValueInOptions(value: string) { + return this.filteredLookupItems.some((item) => { + return item.symbol === value; + }); + } + + public ngDoCheck() { + if (this.ngControl) { + this.validateRequired(); + this.validateSelection(); + this.errorState = this.ngControl.invalid && this.ngControl.touched; + this.stateChanges.next(); + } + } + + public onUpdateSymbol(event: MatAutocompleteSelectedEvent) { + super.value = { + dataSource: event.option.value.dataSource, + symbol: event.option.value.symbol + } as LookupItem; + } + + public set value(value: LookupItem) { + this.control.setValue(value); + super.value = value; + } + + public ngOnDestroy() { + super.ngOnDestroy(); + + this.unsubscribeSubject.next(); + this.unsubscribeSubject.complete(); + } + + private validateRequired() { + const requiredCheck = super.required + ? !super.value?.dataSource || !super.value?.symbol + : false; + if (requiredCheck) { + this.ngControl.control.setErrors({ invalidData: true }); + } + } + + private validateSelection() { + const error = + !this.isValueInOptions(this.input?.value) || + this.input?.value !== super.value?.symbol; + if (error) { + this.ngControl.control.setErrors({ invalidData: true }); + } + } +} diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts new file mode 100644 index 000000000..d7b1ed2f8 --- /dev/null +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.module.ts @@ -0,0 +1,26 @@ +import { CommonModule } from '@angular/common'; +import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; +import { SymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete/symbol-autocomplete.component'; + +@NgModule({ + declarations: [SymbolAutocompleteComponent], + exports: [SymbolAutocompleteComponent], + imports: [ + CommonModule, + FormsModule, + GfSymbolModule, + MatAutocompleteModule, + MatFormFieldModule, + MatInputModule, + MatProgressSpinnerModule, + ReactiveFormsModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class GfSymbolAutocompleteModule {} From a9526430c2a6858ff397f747b8007808b0b16aa4 Mon Sep 17 00:00:00 2001 From: Francisco Silva Date: Tue, 13 Jun 2023 21:00:56 +0200 Subject: [PATCH 3/5] Improve column headers in holdings table for mobile (#2071) * Improve column headers in holdings table for mobile * Update changelog --- CHANGELOG.md | 1 + .../holdings-table/holdings-table.component.html | 14 ++++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9f9f0fce..f7444cd32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Extracted the symbol search to a dedicated component +- Improved the column headers in the holdings table for mobile - Upgraded `prisma` from version `4.14.1` to `4.15.0` ## 1.280.1 - 2023-06-10 diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.html b/libs/ui/src/lib/holdings-table/holdings-table.component.html index 9bda316c4..5be58e663 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.html +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.html @@ -92,7 +92,8 @@ mat-header-cell mat-sort-header > - Allocation + Allocation + %
@@ -108,17 +109,14 @@ - Performance + Performance + ± - +
Date: Wed, 14 Jun 2023 20:08:04 +0200 Subject: [PATCH 4/5] Feature/add liabilities to feature page (#2072) * Add section for liabilities * Update changelog --- CHANGELOG.md | 4 ++ .../src/app/pages/features/features-page.html | 59 ++++++++++++------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7444cd32..9edeeebb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Extended the feature overview page by liabilities + ### Changed - Extracted the symbol search to a dedicated component diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index 961bbe9cb..d898cfca0 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -1,7 +1,7 @@
-

Features

+

Features

Check out the numerous features of Ghostfolio to @@ -13,7 +13,7 @@

-

Stocks

+

Stocks

Keep track of your stock purchases and sales.

@@ -23,7 +23,7 @@
-

ETFs

+

ETFs

Are you into ETFs (Exchange Traded Funds)? Track your ETF investments. @@ -36,7 +36,7 @@

-

Bonds

+

Bonds

Manage your investment in bonds and other assets with fixed income. @@ -49,7 +49,7 @@

-

Cryptocurrencies

+

Cryptocurrencies

Keep track of your Bitcoin and Altcoin holdings.

@@ -61,7 +61,7 @@
-

Dividend

+

Dividend

Are you building a dividend portfolio? Track your dividend in Ghostfolio. @@ -74,7 +74,7 @@

-

Wealth Items

+

Wealth Items

Track all your treasuries, be it your luxury watch or rare trading cards. @@ -87,7 +87,7 @@

-

Emergency Fund

+

Emergency Fund

Define your emergency fund you are comfortable with for difficult times. @@ -100,7 +100,22 @@

-

Import and Export

+

Liabilities

+

+ Manage your financial liabilities, such as your student loan, + to stay ahead of your financial obligations. +

+
+ + +
+
+ + +
+

+ Import and Export +

Import and export your investment activities.

@@ -110,7 +125,7 @@
-

Multi-Accounts

+

Multi-Accounts

Keep an eye on all your accounts across multiple platforms (multi-banking). @@ -124,7 +139,7 @@

- Portfolio Calculations + Portfolio Calculations

- Portfolio Allocations + Portfolio Allocations
-

Dark Mode

+

Dark Mode

Ghostfolio automatically switches to a dark color theme based on your operating system's preferences. @@ -175,7 +190,7 @@

-

Zen Mode

+

Zen Mode

Keep calm and activate Zen Mode if the markets are going crazy. @@ -192,7 +207,7 @@

- Market Mood + Market Mood

@@ -210,7 +225,7 @@

- Static Analysis + Static Analysis
-

Multi-Language

+

Multi-Language

Use Ghostfolio in multiple languages: English, Dutch, French, German, Italian

-

Community

+

Community

Join the Ghostfolio

From 7444ff97fcca2265cbb26c480b2f32b038a084d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Pinho?= Date: Thu, 15 Jun 2023 07:34:47 +0100 Subject: [PATCH 5/5] Feature/translation pt (#2073) * Complete Portuguese translations for home screen and various other Portuguese translations --- apps/client/src/locales/messages.pt.xlf | 320 ++++++++++++------------ 1 file changed, 160 insertions(+), 160 deletions(-) diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 74d379bd7..5d7fb2dfe 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -3,7 +3,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. - The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. + O risco de perda em investimentos pode ser substancial. Não é aconselhável investir dinheiro que possa vir a precisar a curto prazo. apps/client/src/app/app.component.html 164,165 @@ -11,7 +11,7 @@ Alias - Alias + Alias apps/client/src/app/components/access-table/access-table.component.html 3 @@ -23,7 +23,7 @@ Grantee - Grantee + Beneficiário (a) apps/client/src/app/components/access-table/access-table.component.html 10 @@ -31,7 +31,7 @@ Type - Type + Tipo apps/client/src/app/components/access-table/access-table.component.html 17 @@ -59,7 +59,7 @@ Details - Details + Detalhes apps/client/src/app/components/access-table/access-table.component.html 27 @@ -67,7 +67,7 @@ Revoke - Revoke + Revogar apps/client/src/app/components/access-table/access-table.component.html 54 @@ -75,7 +75,7 @@ Do you really want to revoke this granted access? - Do you really want to revoke this granted access? + Pretende realmente revogar este acesso concedido? apps/client/src/app/components/access-table/access-table.component.ts 49 @@ -83,7 +83,7 @@ Account Type - Account Type + Tipo de conta apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 48 @@ -91,7 +91,7 @@ Platform - Platform + Plataforma apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 52 @@ -107,7 +107,7 @@ Activities - Activities + Atividades apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 58 @@ -135,7 +135,7 @@ Name - Name + Nome apps/client/src/app/components/accounts-table/accounts-table.component.html 22 @@ -167,7 +167,7 @@ Total - Total + Total apps/client/src/app/components/accounts-table/accounts-table.component.html 38 @@ -179,7 +179,7 @@ Currency - Currency + Moeda apps/client/src/app/components/accounts-table/accounts-table.component.html 48 @@ -203,7 +203,7 @@ Cash Balance - Cash Balance + Saldo disponível em dinheiro apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 32 @@ -219,7 +219,7 @@ Value - Value + Valor apps/client/src/app/components/accounts-table/accounts-table.component.html 147 @@ -251,7 +251,7 @@ Edit - Edit + Editar apps/client/src/app/components/accounts-table/accounts-table.component.html 224 @@ -267,7 +267,7 @@ Delete - Delete + Eliminar apps/client/src/app/components/accounts-table/accounts-table.component.html 232 @@ -287,7 +287,7 @@ Do you really want to delete this account? - Do you really want to delete this account? + Pretende realmente eliminar esta conta? apps/client/src/app/components/accounts-table/accounts-table.component.ts 81 @@ -295,7 +295,7 @@ Symbol - Symbol + Símbolo apps/client/src/app/components/admin-jobs/admin-jobs.html 21 @@ -311,7 +311,7 @@ Data Source - Data Source + Fonte de dados apps/client/src/app/components/admin-jobs/admin-jobs.html 22 @@ -327,7 +327,7 @@ Attempts - Attempts + Tentativas apps/client/src/app/components/admin-jobs/admin-jobs.html 23 @@ -335,7 +335,7 @@ Created - Created + Criado apps/client/src/app/components/admin-jobs/admin-jobs.html 24 @@ -343,7 +343,7 @@ Finished - Finished + Terminado apps/client/src/app/components/admin-jobs/admin-jobs.html 25 @@ -351,7 +351,7 @@ Status - Status + Estado apps/client/src/app/components/admin-jobs/admin-jobs.html 26 @@ -359,7 +359,7 @@ Delete Jobs - Delete Jobs + Eliminar Tarefas apps/client/src/app/components/admin-jobs/admin-jobs.html 38 @@ -367,7 +367,7 @@ Asset Profile - Asset Profile + Perfil de Ativos apps/client/src/app/components/admin-jobs/admin-jobs.html 55 @@ -375,7 +375,7 @@ Historical Market Data - Historical Market Data + Histórico de Dados de Mercado apps/client/src/app/components/admin-jobs/admin-jobs.html 60 @@ -383,7 +383,7 @@ View Data - View Data + Visualizar dados apps/client/src/app/components/admin-jobs/admin-jobs.html 115 @@ -399,7 +399,7 @@ Delete Job - Delete Job + Apagar Tarefa apps/client/src/app/components/admin-jobs/admin-jobs.html 125 @@ -407,7 +407,7 @@ Details for - Details for + Detalhes para apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 2 @@ -415,7 +415,7 @@ Date - Date + Data apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 6 @@ -431,7 +431,7 @@ Market Price - Market Price + Preço de Mercado apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 26 @@ -443,7 +443,7 @@ Cancel - Cancel + Cancelar apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 46 @@ -475,7 +475,7 @@ Save - Save + Guardar apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 48 @@ -503,7 +503,7 @@ Filter by... - Filter by... + Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 128 @@ -511,7 +511,7 @@ Asset Class - Asset Class + Classe do Ativo apps/client/src/app/components/admin-market-data/admin-market-data.html 42 @@ -531,7 +531,7 @@ Asset Sub Class - Asset Sub Class + Subclasse do ativo apps/client/src/app/components/admin-market-data/admin-market-data.html 51 @@ -551,7 +551,7 @@ First Activity - First Activity + Primeira Atividade apps/client/src/app/components/admin-market-data/admin-market-data.html 60 @@ -567,7 +567,7 @@ Activity Count - Activity Count + Contagem de Atividades apps/client/src/app/components/admin-overview/admin-overview.html 17 @@ -575,7 +575,7 @@ Historical Data - Historical Data + Dados Históricos apps/client/src/app/components/admin-market-data/admin-market-data.html 78 @@ -583,7 +583,7 @@ Countries Count - Countries Count + Contagem de Países apps/client/src/app/components/admin-market-data/admin-market-data.html 96 @@ -591,7 +591,7 @@ Sectors Count - Sectors Count + Contagem de Setores apps/client/src/app/components/admin-market-data/admin-market-data.html 87 @@ -599,7 +599,7 @@ Gather Recent Data - Gather Recent Data + Atualizar dados mais recentes apps/client/src/app/components/admin-market-data/admin-market-data.html 126 @@ -775,7 +775,7 @@ Registration - Registration + Registo apps/client/src/app/components/admin-users/admin-users.html 17 @@ -783,7 +783,7 @@ Accounts - Accounts + Contas apps/client/src/app/components/admin-platform/admin-platform.component.html 64 @@ -847,7 +847,7 @@ Portfolio - Portfolio + Portefólio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 109 @@ -875,7 +875,7 @@ Overview - Overview + Visão geral apps/client/src/app/components/header/header.component.html 21 @@ -887,7 +887,7 @@ Portfolio - Portfolio + Portefólio apps/client/src/app/components/header/header.component.html 32 @@ -899,7 +899,7 @@ Admin Control - Admin Control + Controlo Administrativo apps/client/src/app/components/header/header.component.html 55 @@ -975,7 +975,7 @@ My Ghostfolio - My Ghostfolio + O meu Ghostfolio apps/client/src/app/components/header/header.component.html 177 @@ -1411,7 +1411,7 @@ Minimum Price - Minimum Price + Preço Mínimo apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 93 @@ -1419,7 +1419,7 @@ Maximum Price - Maximum Price + Preço Máximo apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 105 @@ -1427,7 +1427,7 @@ Quantity - Quantity + Quantidade apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 115 @@ -1443,7 +1443,7 @@ First Buy Date - First Buy Date + Data da Primeira Compra apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 158 @@ -1451,7 +1451,7 @@ Transactions - Transactions + Transações apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 167 @@ -1459,7 +1459,7 @@ Sector - Sector + Setor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 117 @@ -1471,7 +1471,7 @@ Country - Country + País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 126 @@ -1487,7 +1487,7 @@ Sectors - Sectors + Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 132 @@ -1503,7 +1503,7 @@ Countries - Countries + Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 142 @@ -1547,7 +1547,7 @@ Show all - Show all + Mostrar tudo libs/ui/src/lib/holdings-table/holdings-table.component.html 171 @@ -1555,7 +1555,7 @@ Today - Today + Hoje apps/client/src/app/components/toggle/toggle.component.ts 21 @@ -1563,7 +1563,7 @@ YTD - YTD + AATD apps/client/src/app/components/toggle/toggle.component.ts 22 @@ -1571,7 +1571,7 @@ 1Y - 1Y + 1A apps/client/src/app/components/toggle/toggle.component.ts 23 @@ -1579,7 +1579,7 @@ 5Y - 5Y + 5A apps/client/src/app/components/toggle/toggle.component.ts 24 @@ -1587,7 +1587,7 @@ Max - Max + Máx apps/client/src/app/components/toggle/toggle.component.ts 25 @@ -1603,7 +1603,7 @@ Please try again later. - Please try again later. + Por favor tente novamente mais tarde. apps/client/src/app/core/http-response.interceptor.ts 61 @@ -1619,7 +1619,7 @@ Oops! Something went wrong. - Oops! Something went wrong. + Oops! Ocorreu um erro. apps/client/src/app/core/http-response.interceptor.ts 86 @@ -1631,7 +1631,7 @@ Okay - Okay + OK apps/client/src/app/core/http-response.interceptor.ts 89 @@ -1643,7 +1643,7 @@ About - About + Sobre apps/client/src/app/pages/about/about-page-routing.module.ts 35 @@ -1687,7 +1687,7 @@ Privacy Policy - Privacy Policy + Política de Privacidade apps/client/src/app/pages/about/about-page.component.ts 61 @@ -1699,7 +1699,7 @@ Privacy Policy - Privacy Policy + Política de Privacidade apps/client/src/app/app.component.html 97 @@ -1711,7 +1711,7 @@ My Ghostfolio - My Ghostfolio + O meu Ghostfolio apps/client/src/app/pages/account/account-page-routing.module.ts 12 @@ -1719,7 +1719,7 @@ Auto - Auto + Auto apps/client/src/app/pages/account/account-page.component.ts 42 @@ -1955,7 +1955,7 @@ Public - Public + Público apps/client/src/app/pages/account/create-or-update-access-dialog/create-or-update-access-dialog.html 19 @@ -1963,7 +1963,7 @@ Accounts - Accounts + Contas apps/client/src/app/pages/accounts/accounts-page-routing.module.ts 12 @@ -1971,7 +1971,7 @@ Update account - Update account + Atualizar conta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 2 @@ -1979,7 +1979,7 @@ Add account - Add account + Adicionar conta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 3 @@ -2003,7 +2003,7 @@ Account ID - Account ID + ID da Conta apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 63 @@ -2011,7 +2011,7 @@ Admin Control - Admin Control + Controlo Administrativo apps/client/src/app/pages/admin/admin-page-routing.module.ts 19 @@ -2019,7 +2019,7 @@ Blog - Blog + Blog apps/client/src/app/pages/blog/blog-page-routing.module.ts 12 @@ -2027,7 +2027,7 @@ Blog - Blog + Blog apps/client/src/app/app.component.html 78 @@ -2099,7 +2099,7 @@ Frequently Asked Questions (FAQ) - FAQ + FAQ apps/client/src/app/pages/faq/faq-page-routing.module.ts 12 @@ -2107,7 +2107,7 @@ Features - Features + Funcionalidades apps/client/src/app/pages/features/features-page-routing.module.ts 12 @@ -2115,7 +2115,7 @@ Overview - Overview + Visão geral apps/client/src/app/pages/admin/admin-page.component.ts 31 @@ -2135,7 +2135,7 @@ Markets - Markets + Mercados apps/client/src/app/pages/home/home-page-routing.module.ts 32 @@ -2151,7 +2151,7 @@ Activities - Activities + Atividades apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts 12 @@ -2163,7 +2163,7 @@ Update activity - Update activity + Atualizar atividade apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 7 @@ -2171,7 +2171,7 @@ Add activity - Add activity + Adicionar atividade apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 8 @@ -2191,7 +2191,7 @@ Item - Item + Item apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 16 @@ -2199,7 +2199,7 @@ Name, symbol or ISIN - Name, symbol or ISIN + Nome, símbolo or ISIN apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 49 @@ -2223,7 +2223,7 @@ Fee - Fee + Comissão apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 191 @@ -2251,7 +2251,7 @@ Importing data... - Importing data... + A importar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 108 @@ -2259,7 +2259,7 @@ Import has been completed - Import has been completed + A importação foi concluída apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 116 @@ -2267,7 +2267,7 @@ Choose File - Choose File + Escolher Ficheiro apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 70 @@ -2283,7 +2283,7 @@ Back - Back + Anterior apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 123 @@ -2487,7 +2487,7 @@ Portfolio Evolution - Portfolio Evolution + Evolução do Portefólio apps/client/src/app/pages/portfolio/analysis/analysis-page.html 136 @@ -2503,7 +2503,7 @@ FIRE - FIRE + FIRE apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts 12 @@ -2511,7 +2511,7 @@ FIRE - FIRE + FIRE apps/client/src/app/pages/portfolio/fire/fire-page.html 4 @@ -2519,7 +2519,7 @@ Calculator - Calculator + Calculadora apps/client/src/app/pages/portfolio/fire/fire-page.html 7 @@ -2527,7 +2527,7 @@ 4% Rule - 4% Rule + Regra dos 4% apps/client/src/app/pages/portfolio/fire/fire-page.html 34 @@ -2535,7 +2535,7 @@ Holdings - Holdings + Posições apps/client/src/app/pages/home/home-page-routing.module.ts 22 @@ -2559,7 +2559,7 @@ Holdings - Holdings + Posições apps/client/src/app/pages/portfolio/holdings/holdings-page.html 4 @@ -2571,7 +2571,7 @@ Pricing - Pricing + Preços apps/client/src/app/pages/pricing/pricing-page-routing.module.ts 12 @@ -2579,7 +2579,7 @@ Hello, has shared a Portfolio with you! - Hello, has shared a Portfolio with you! + Olá, partilhou um Portefólio consigo! apps/client/src/app/pages/public/public-page.html 4,7 @@ -2587,7 +2587,7 @@ Currencies - Currencies + Moedas apps/client/src/app/pages/public/public-page.html 30 @@ -2595,7 +2595,7 @@ Continents - Continents + Continentes apps/client/src/app/pages/public/public-page.html 60 @@ -2671,7 +2671,7 @@ Agree and continue - Agree and continue + Aceitar e continuar apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html 44 @@ -2679,7 +2679,7 @@ Resources - Resources + Recursos apps/client/src/app/pages/resources/resources-page-routing.module.ts 12 @@ -2687,7 +2687,7 @@ Oops, authentication has failed. - Oops, authentication has failed. + Oops, a autenticação falhou. apps/client/src/app/pages/webauthn/webauthn-page.html 18 @@ -2979,7 +2979,7 @@ Stock - Stock + Ação libs/ui/src/lib/i18n.ts 41 @@ -2987,7 +2987,7 @@ Africa - Africa + África libs/ui/src/lib/i18n.ts 44 @@ -2995,7 +2995,7 @@ Asia - Asia + Ásia libs/ui/src/lib/i18n.ts 45 @@ -3003,7 +3003,7 @@ Europe - Europe + Europa libs/ui/src/lib/i18n.ts 46 @@ -3011,7 +3011,7 @@ North America - North America + América do Norte libs/ui/src/lib/i18n.ts 47 @@ -3019,7 +3019,7 @@ Oceania - Oceania + Oceânia libs/ui/src/lib/i18n.ts 48 @@ -3027,7 +3027,7 @@ South America - South America + América do Sul libs/ui/src/lib/i18n.ts 49 @@ -3035,7 +3035,7 @@ Time to add your first activity. - Time to add your first activity. + Está na hora de adicionar a sua primeira atividade. libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html 12 @@ -3043,7 +3043,7 @@ No data available - No data available + Sem dados disponíveis libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts 375 @@ -3063,7 +3063,7 @@ Refresh - Refresh + Atualizar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 22 @@ -3079,7 +3079,7 @@ User Signup - User Signup + Registo do Utilizador apps/client/src/app/components/admin-overview/admin-overview.html 89 @@ -3087,7 +3087,7 @@ Community - Community + Comunidade apps/client/src/app/app.component.html 108 @@ -3111,7 +3111,7 @@ Market Data - Market Data + Dados de Mercado apps/client/src/app/pages/admin/admin-page-routing.module.ts 25 @@ -3123,7 +3123,7 @@ Summary - Summary + Sumário apps/client/src/app/pages/home/home-page-routing.module.ts 27 @@ -3135,7 +3135,7 @@ Validating data... - Validating data... + A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 179 @@ -3143,7 +3143,7 @@ Import - Import + Importar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 132 @@ -3155,7 +3155,7 @@ Dividend - Dividend + Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 44 @@ -3203,7 +3203,7 @@ Yearly - Yearly + Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 @@ -3211,7 +3211,7 @@ Import Dividends - Import Dividends + Importar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 76 @@ -3219,7 +3219,7 @@ Valid until - Valid until + Válido até apps/client/src/app/pages/account/account-page.html 27 @@ -3243,7 +3243,7 @@ Higher Risk - Higher Risk + Risco mais Elevado libs/ui/src/lib/i18n.ts 13 @@ -3251,7 +3251,7 @@ Lower Risk - Lower Risk + Risco menos Elevado libs/ui/src/lib/i18n.ts 15 @@ -3307,7 +3307,7 @@ Portfolio Summary - Portfolio Summary + Resumo do Portefólio apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 25 @@ -3415,7 +3415,7 @@ Unlimited Accounts - Unlimited Accounts + Contas Ilimitadas apps/client/src/app/pages/pricing/pricing-page.html 53 @@ -3431,7 +3431,7 @@ Portfolio Performance - Portfolio Performance + Desempenho do Portefólio apps/client/src/app/pages/pricing/pricing-page.html 60 @@ -3503,7 +3503,7 @@ Get Started - Get Started + Começar apps/client/src/app/pages/pricing/pricing-page.html 363,365 @@ -3511,7 +3511,7 @@ It’s free. - It’s free. + É gratuito. apps/client/src/app/pages/pricing/pricing-page.html 366 @@ -3519,7 +3519,7 @@ Fees - Fees + Taxas apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html 148 @@ -3527,7 +3527,7 @@ Portfolio Allocations - Portfolio Allocations + Alocações do Portefólio apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 29 @@ -3695,7 +3695,7 @@ Delete User - Delete User + Apagar Utilizador apps/client/src/app/components/admin-users/admin-users.html 129 @@ -3703,7 +3703,7 @@ Do you really want to delete all your activities? - Do you really want to delete all your activities? + Deseja mesmo eliminar todas as suas atividades? apps/client/src/app/pages/portfolio/activities/activities-page.component.ts 143 @@ -3719,7 +3719,7 @@ Delete all Activities - Delete all Activities + Apagar todas as Atividades libs/ui/src/lib/activities-table/activities-table.component.html 62 @@ -3727,7 +3727,7 @@ Update platform - Update platform + Atualizar plataforma apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 2 @@ -3735,7 +3735,7 @@ Add platform - Add platform + Adicionar plataforma apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 3 @@ -3743,7 +3743,7 @@ Url - Url + Url apps/client/src/app/components/admin-platform/admin-platform.component.html 50 @@ -3755,7 +3755,7 @@ Do you really want to delete this platform? - Do you really want to delete this platform? + Deseja mesmo eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts 76 @@ -3763,7 +3763,7 @@ Platforms - Platforms + Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html 4 @@ -3779,7 +3779,7 @@ By Platform - By Platform + Por Plataforma apps/client/src/app/pages/portfolio/allocations/allocations-page.html 42 @@ -3855,7 +3855,7 @@ Select Holding - Select Holding + Selecionar Posição apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 20 @@ -3863,7 +3863,7 @@ Select File - Select File + Selecionar Ficheiro apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 23 @@ -3871,7 +3871,7 @@ Select Dividends - Select Dividends + Selecionar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 96 @@ -3879,7 +3879,7 @@ Select Activities - Select Activities + Selecionar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 99 @@ -3887,7 +3887,7 @@ Import Activities - Import Activities + Importar Atividades libs/ui/src/lib/activities-table/activities-table.component.html 16 @@ -3899,7 +3899,7 @@ Import Dividends - Import Dividends + Importar Dividendos libs/ui/src/lib/activities-table/activities-table.component.html 34 @@ -3927,7 +3927,7 @@ Frequently Asked Questions (FAQ) - Frequently Asked Questions (FAQ) + Perguntas Frequentes (FAQ) apps/client/src/app/app.component.html 87 @@ -3951,7 +3951,7 @@ Months - Months + Meses libs/ui/src/lib/i18n.ts 17 @@ -3959,7 +3959,7 @@ Years - Years + Anos libs/ui/src/lib/i18n.ts 25 @@ -3967,7 +3967,7 @@ Month - Month + Mês libs/ui/src/lib/i18n.ts 16 @@ -3975,7 +3975,7 @@ Year - Year + Ano libs/ui/src/lib/i18n.ts 24 @@ -3983,7 +3983,7 @@ If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. - If you retire today, you would be able to withdraw per year or per month, based on your total assets of and a withdrawal rate of 4%. + Se se reformar-se hoje, teria a possibilidade de efetuar um levantamento por ano ou por mês, com base no seu património total de e uma taxa de levantamento de 4%. apps/client/src/app/pages/portfolio/fire/fire-page.html 57,90 @@ -3991,4 +3991,4 @@ - \ No newline at end of file +