Browse Source

Resolve merge conflict in CHANGELOG.md: combine Unreleased Added entries

pull/5538/head
David Requeno 1 month ago
parent
commit
138a93c114
  1. 2
      .github/FUNDING.yml
  2. 10
      CHANGELOG.md
  3. 1
      apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts
  4. 1
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
  5. 1
      apps/client/src/app/components/home-market/home-market.html
  6. 1
      apps/client/src/app/components/markets/markets.html
  7. 12
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  8. 47
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
  9. 25
      apps/client/src/app/pages/register/register-page.component.ts
  10. 2
      apps/client/src/app/pages/register/user-account-registration-dialog/interfaces/interfaces.ts
  11. 12
      apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
  12. 0
      apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
  13. 0
      apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.scss
  14. 11
      libs/ui/src/lib/activities-table/activities-table.component.ts
  15. 9
      libs/ui/src/lib/benchmark/benchmark.component.html
  16. 1
      libs/ui/src/lib/benchmark/benchmark.component.ts
  17. 8
      package-lock.json
  18. 2
      package.json

2
.github/FUNDING.yml

@ -1 +1 @@
custom: ['https://www.buymeacoffee.com/ghostfolio']
buy_me_a_coffee: ghostfolio

10
CHANGELOG.md

@ -10,10 +10,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Added the latest activities to the public page
- Added the symbol to the benchmark component
- Added pagination to the activities table of the activities import dialog
- Added an option to configure the account column of the activities table component
### Changed
- Hid the account column from the activities table of the account detail dialog to avoid redundant information
- Renamed the show access token dialog component to user account registration dialog component
- Refreshed the cryptocurrencies list
- Upgraded `countup.js` from version `2.8.2` to `2.9.0`
### Fixed
- Fixed an issue with `unitPriceInAssetProfileCurrency` in the value redaction interceptor for the impersonation mode
## 2.200.0 - 2025-09-17

1
apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts

@ -61,6 +61,7 @@ export class RedactValuesInResponseInterceptor<T>
'totalInterestInBaseCurrency',
'totalValueInBaseCurrency',
'unitPrice',
'unitPriceInAssetProfileCurrency',
'value',
'valueInBaseCurrency'
].map((attribute) => {

1
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html

@ -126,6 +126,7 @@
[hasPermissionToFilter]="false"
[hasPermissionToOpenDetails]="false"
[locale]="user?.settings?.locale"
[showAccountColumn]="false"
[showActions]="
!data.hasImpersonationId &&
data.hasPermissionToCreateActivity &&

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

@ -34,6 +34,7 @@
[benchmarks]="benchmarks"
[deviceType]="deviceType"
[locale]="user?.settings?.locale || undefined"
[showSymbol]="false"
[user]="user"
/>
@if (benchmarks?.length > 0) {

1
apps/client/src/app/components/markets/markets.html

@ -43,6 +43,7 @@
[benchmarks]="benchmarks"
[deviceType]="deviceType"
[locale]="user?.settings?.locale || undefined"
[showSymbol]="false"
[user]="user"
/>
@if (benchmarks?.length > 0) {

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

@ -36,6 +36,7 @@ import {
} from '@angular/material/dialog';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatFormFieldModule } from '@angular/material/form-field';
import { PageEvent } from '@angular/material/paginator';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSelectModule } from '@angular/material/select';
import { MatSnackBar } from '@angular/material/snack-bar';
@ -90,8 +91,9 @@ export class GfImportActivitiesDialog implements OnDestroy {
public holdings: PortfolioPosition[] = [];
public importStep: ImportStep = ImportStep.UPLOAD_FILE;
public isLoading = false;
public maxSafeInteger = Number.MAX_SAFE_INTEGER;
public mode: 'DIVIDEND';
public pageIndex = 0;
public pageSize = 8;
public selectedActivities: Activity[] = [];
public sortColumn = 'date';
public sortDirection: SortDirection = 'desc';
@ -236,6 +238,7 @@ export class GfImportActivitiesDialog implements OnDestroy {
.subscribe(({ activities }) => {
this.activities = activities;
this.dataSource = new MatTableDataSource(activities.reverse());
this.pageIndex = 0;
this.totalItems = activities.length;
aStepper.next();
@ -244,10 +247,15 @@ export class GfImportActivitiesDialog implements OnDestroy {
});
}
public onPageChanged({ pageIndex }: PageEvent) {
this.pageIndex = pageIndex;
}
public onReset(aStepper: MatStepper) {
this.details = [];
this.errorMessages = [];
this.importStep = ImportStep.SELECT_ACTIVITIES;
this.pageIndex = 0;
this.assetProfileForm.get('assetProfileIdentifier').enable();
aStepper.reset();
@ -338,6 +346,7 @@ export class GfImportActivitiesDialog implements OnDestroy {
});
this.activities = activities;
this.dataSource = new MatTableDataSource(activities.reverse());
this.pageIndex = 0;
this.totalItems = activities.length;
} catch (error) {
console.error(error);
@ -356,6 +365,7 @@ export class GfImportActivitiesDialog implements OnDestroy {
});
this.activities = data.activities;
this.dataSource = new MatTableDataSource(data.activities.reverse());
this.pageIndex = 0;
this.totalItems = data.activities.length;
} catch (error) {
console.error(error);

47
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html

@ -21,9 +21,10 @@
<ng-container i18n>Select File</ng-container>
}
</ng-template>
<div class="pt-3">
<div>
@if (mode === 'DIVIDEND') {
<form
class="pt-3"
[formGroup]="assetProfileForm"
(ngSubmit)="onLoadDividends(stepper)"
>
@ -114,7 +115,7 @@
<ng-container i18n>Select Activities</ng-container>
}
</ng-template>
<div class="pt-3">
<div>
@if (errorMessages?.length === 0) {
@if (importStep === 1) {
<gf-activities-table
@ -127,7 +128,8 @@
[hasPermissionToFilter]="false"
[hasPermissionToOpenDetails]="false"
[locale]="data?.user?.settings?.locale"
[pageSize]="maxSafeInteger"
[pageIndex]="pageIndex"
[pageSize]="pageSize"
[showActions]="false"
[showCheckbox]="true"
[showSymbolColumn]="false"
@ -135,6 +137,7 @@
[sortDirection]="sortDirection"
[sortDisabled]="true"
[totalItems]="totalItems"
(pageChanged)="onPageChanged($event)"
(selectedActivities)="updateSelection($event)"
/>
}
@ -153,25 +156,27 @@
</button>
</div>
} @else {
<mat-accordion displayMode="flat">
@for (message of errorMessages; track message; let i = $index) {
<mat-expansion-panel [disabled]="!details[i]">
<mat-expansion-panel-header class="pl-1">
<mat-panel-title>
<div class="d-flex">
<div class="align-items-center d-flex mr-2">
<ion-icon name="warning-outline" />
<div class="pt-3">
<mat-accordion displayMode="flat">
@for (message of errorMessages; track message; let i = $index) {
<mat-expansion-panel [disabled]="!details[i]">
<mat-expansion-panel-header class="pl-1">
<mat-panel-title>
<div class="d-flex">
<div class="align-items-center d-flex mr-2">
<ion-icon name="warning-outline" />
</div>
<div>{{ message }}</div>
</div>
<div>{{ message }}</div>
</div>
</mat-panel-title>
</mat-expansion-panel-header>
@if (details[i]) {
<pre class="m-0"><code>{{ details[i] | json }}</code></pre>
}
</mat-expansion-panel>
}
</mat-accordion>
</mat-panel-title>
</mat-expansion-panel-header>
@if (details[i]) {
<pre class="m-0"><code>{{ details[i] | json }}</code></pre>
}
</mat-expansion-panel>
}
</mat-accordion>
</div>
<div class="d-flex justify-content-end mt-3">
<button mat-button (click)="onReset(stepper)">
<ng-container i18n>Back</ng-container>

25
apps/client/src/app/pages/register/register-page.component.ts

@ -18,8 +18,8 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { ShowAccessTokenDialogParams } from './show-access-token-dialog/interfaces/interfaces';
import { GfShowAccessTokenDialogComponent } from './show-access-token-dialog/show-access-token-dialog.component';
import { UserAccountRegistrationDialogParams } from './user-account-registration-dialog/interfaces/interfaces';
import { GfUserAccountRegistrationDialogComponent } from './user-account-registration-dialog/user-account-registration-dialog.component';
@Component({
host: { class: 'page' },
@ -84,15 +84,18 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
}
public openShowAccessTokenDialog() {
const dialogRef = this.dialog.open(GfShowAccessTokenDialogComponent, {
data: {
deviceType: this.deviceType,
needsToAcceptTermsOfService: this.hasPermissionForSubscription
} as ShowAccessTokenDialogParams,
disableClose: true,
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '30rem'
});
const dialogRef = this.dialog.open(
GfUserAccountRegistrationDialogComponent,
{
data: {
deviceType: this.deviceType,
needsToAcceptTermsOfService: this.hasPermissionForSubscription
} as UserAccountRegistrationDialogParams,
disableClose: true,
height: this.deviceType === 'mobile' ? '98vh' : undefined,
width: this.deviceType === 'mobile' ? '100vw' : '30rem'
}
);
dialogRef
.afterClosed()

2
apps/client/src/app/pages/register/show-access-token-dialog/interfaces/interfaces.ts → apps/client/src/app/pages/register/user-account-registration-dialog/interfaces/interfaces.ts

@ -1,4 +1,4 @@
export interface ShowAccessTokenDialogParams {
export interface UserAccountRegistrationDialogParams {
deviceType: string;
needsToAcceptTermsOfService: boolean;
}

12
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts → apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts

@ -30,7 +30,7 @@ import {
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { ShowAccessTokenDialogParams } from './interfaces/interfaces';
import { UserAccountRegistrationDialogParams } from './interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@ -50,11 +50,11 @@ import { ShowAccessTokenDialogParams } from './interfaces/interfaces';
TextFieldModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-show-access-token-dialog',
styleUrls: ['./show-access-token-dialog.scss'],
templateUrl: 'show-access-token-dialog.html'
selector: 'gf-user-account-registration-dialog',
styleUrls: ['./user-account-registration-dialog.scss'],
templateUrl: 'user-account-registration-dialog.html'
})
export class GfShowAccessTokenDialogComponent {
export class GfUserAccountRegistrationDialogComponent {
@ViewChild(MatStepper) stepper!: MatStepper;
public accessToken: string;
@ -69,7 +69,7 @@ export class GfShowAccessTokenDialogComponent {
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: ShowAccessTokenDialogParams,
@Inject(MAT_DIALOG_DATA) public data: UserAccountRegistrationDialogParams,
private dataService: DataService
) {
addIcons({ arrowForwardOutline, checkmarkOutline, copyOutline });

0
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html → apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html

0
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.scss → apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.scss

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

@ -104,6 +104,7 @@ export class GfActivitiesTableComponent
@Input() locale = getLocale();
@Input() pageIndex: number;
@Input() pageSize = DEFAULT_PAGE_SIZE;
@Input() showAccountColumn = true;
@Input() showActions = true;
@Input() showCheckbox = false;
@Input() showNameColumn = true;
@ -168,6 +169,10 @@ export class GfActivitiesTableComponent
}
public ngAfterViewInit() {
if (this.dataSource) {
this.dataSource.paginator = this.paginator;
}
this.sort.sortChange.subscribe((value: Sort) => {
this.sortChanged.emit(value);
});
@ -192,6 +197,12 @@ export class GfActivitiesTableComponent
'actions'
];
if (!this.showAccountColumn) {
this.displayedColumns = this.displayedColumns.filter((column) => {
return column !== 'account';
});
}
if (!this.showCheckbox) {
this.displayedColumns = this.displayedColumns.filter((column) => {
return column !== 'importStatus' && column !== 'select';

9
libs/ui/src/lib/benchmark/benchmark.component.html

@ -12,7 +12,14 @@
Name
</th>
<td *matCellDef="let element" class="px-2 text-nowrap" mat-cell>
{{ element?.name }}
<div class="text-truncate">
{{ element?.name }}
</div>
@if (showSymbol) {
<div>
<small class="text-muted">{{ element?.symbol }}</small>
</div>
}
</td>
</ng-container>

1
libs/ui/src/lib/benchmark/benchmark.component.ts

@ -62,6 +62,7 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy {
@Input() deviceType: string;
@Input() hasPermissionToDeleteItem: boolean;
@Input() locale = getLocale();
@Input() showSymbol = true;
@Input() user: User;
@Output() itemDeleted = new EventEmitter<AssetProfileIdentifier>();

8
package-lock.json

@ -64,7 +64,7 @@
"color": "5.0.0",
"countries-and-timezones": "3.8.0",
"countries-list": "3.1.1",
"countup.js": "2.8.2",
"countup.js": "2.9.0",
"date-fns": "4.1.0",
"envalid": "8.1.0",
"fuse.js": "7.1.0",
@ -18619,9 +18619,9 @@
"license": "MIT"
},
"node_modules/countup.js": {
"version": "2.8.2",
"resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.8.2.tgz",
"integrity": "sha512-UtRoPH6udaru/MOhhZhI/GZHJKAyAxuKItD2Tr7AbrqrOPBX/uejWBBJt8q86169AMqKkE9h9/24kFWbUk/Bag==",
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.9.0.tgz",
"integrity": "sha512-llqrvyXztRFPp6+i8jx25phHWcVWhrHO4Nlt0uAOSKHB8778zzQswa4MU3qKBvkXfJKftRYFJuVHez67lyKdHg==",
"license": "MIT"
},
"node_modules/create-jest": {

2
package.json

@ -110,7 +110,7 @@
"color": "5.0.0",
"countries-and-timezones": "3.8.0",
"countries-list": "3.1.1",
"countup.js": "2.8.2",
"countup.js": "2.9.0",
"date-fns": "4.1.0",
"envalid": "8.1.0",
"fuse.js": "7.1.0",

Loading…
Cancel
Save