diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e64f546d..cc3cefd97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Harmonized the data providers management style of the admin control panel - Renamed `Order` to `activities` in the `User` database schema - Improved the language localization for Catalan (`ca`) - Improved the language localization for Chinese (`zh`) diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.html b/apps/client/src/app/components/admin-settings/admin-settings.component.html index 977c8a372..997d34aa5 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.html +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -1,105 +1,109 @@
-
+

Data Providers

- - - @for (dataProvider of dataProviders; track dataProvider.name) { -
- @if (dataProvider.name === 'Ghostfolio') { -
-
- + + + Name + + +
+ +
+ @if (isGhostfolioDataProvider(element)) { + + Ghostfolio Premium + -
- Early Access - Ghostfolio Premium - - @if (isGhostfolioApiKeyValid === false) { - Early Access - } - - @if (isGhostfolioApiKeyValid === true) { -
- - Valid until - {{ - ghostfolioApiStatus?.subscription?.expiresAt - | date: defaultDateFormat - }} -
- } -
-
-
-
+ } + @if (isGhostfolioApiKeyValid === true) { -
-
+
+ + Valid until + {{ + ghostfolioApiStatus?.subscription?.expiresAt + | date: defaultDateFormat + }} + +
+
+ {{ ghostfolioApiStatus.dailyRequests }} of {{ ghostfolioApiStatus.dailyRequestsMax }} daily requests -
- - - - +
- } @else if (isGhostfolioApiKeyValid === false) { - } -
- } @else { -
-
- - {{ dataProvider.name }} -
-
-
- } + } @else { + {{ element.name }} + } +
- } - - + + + + + + + + @if (isGhostfolioDataProvider(element)) { + @if (isGhostfolioApiKeyValid === true) { + + + + + } @else if (isGhostfolioApiKeyValid === false) { + + } + } + + + + + + + @if (isLoading) { + + }
diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index 68c196962..f18e49d10 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -22,6 +22,7 @@ import { OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; +import { MatTableDataSource } from '@angular/material/table'; import { DeviceDetectorService } from 'ngx-device-detector'; import { catchError, filter, of, Subject, takeUntil } from 'rxjs'; @@ -36,10 +37,12 @@ import { GhostfolioPremiumApiDialogParams } from './ghostfolio-premium-api-dialo standalone: false }) export class AdminSettingsComponent implements OnDestroy, OnInit { - public dataProviders: DataProviderInfo[]; + public dataSource = new MatTableDataSource(); public defaultDateFormat: string; + public displayedColumns = ['name', 'actions']; public ghostfolioApiStatus: DataProviderGhostfolioStatusResponse; public isGhostfolioApiKeyValid: boolean; + public isLoading = false; public pricingUrl: string; private deviceType: string; @@ -83,6 +86,10 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { this.initialize(); } + public isGhostfolioDataProvider(provider: DataProviderInfo): boolean { + return provider.dataSource === 'GHOSTFOLIO'; + } + public onRemoveGhostfolioApiKey() { this.notificationService.confirm({ confirmFn: () => { @@ -125,14 +132,20 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { } private initialize() { + this.isLoading = true; + + this.dataSource = new MatTableDataSource(); + this.adminService .fetchAdminData() .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(({ dataProviders, settings }) => { - this.dataProviders = dataProviders.filter(({ dataSource }) => { + const filteredProviders = dataProviders.filter(({ dataSource }) => { return dataSource !== 'MANUAL'; }); + this.dataSource = new MatTableDataSource(filteredProviders); + this.adminService .fetchGhostfolioDataProviderStatus( settings[PROPERTY_API_KEY_GHOSTFOLIO] as string @@ -157,6 +170,8 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { this.changeDetectorRef.markForCheck(); }); + this.isLoading = false; + this.changeDetectorRef.markForCheck(); }); } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.module.ts b/apps/client/src/app/components/admin-settings/admin-settings.module.ts index 79b269a62..c5148f681 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.module.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.module.ts @@ -6,9 +6,10 @@ import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; import { MatMenuModule } from '@angular/material/menu'; +import { MatTableModule } from '@angular/material/table'; import { RouterModule } from '@angular/router'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { AdminSettingsComponent } from './admin-settings.component'; @@ -21,8 +22,9 @@ import { AdminSettingsComponent } from './admin-settings.component'; GfAssetProfileIconComponent, GfPremiumIndicatorComponent, MatButtonModule, - MatCardModule, MatMenuModule, + MatTableModule, + NgxSkeletonLoaderModule, RouterModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA]