Browse Source

Extend assistant by date range selector

pull/2815/head
Thomas Kaul 2 years ago
parent
commit
7affe12458
  1. 10
      apps/client/src/app/components/header/header.component.html
  2. 19
      apps/client/src/app/components/header/header.component.ts
  3. 2
      apps/client/src/app/components/home-holdings/home-holdings.html
  4. 5
      apps/client/src/app/components/home-overview/home-overview.html
  5. 2
      apps/client/src/app/pages/portfolio/analysis/analysis-page.html
  6. 10
      libs/ui/src/lib/assistant/assistant.component.ts
  7. 16
      libs/ui/src/lib/assistant/assistant.html
  8. 4
      libs/ui/src/lib/assistant/assistant.module.ts

10
apps/client/src/app/components/header/header.component.html

@ -119,7 +119,13 @@
[matMenuTriggerRestoreFocus]="false" [matMenuTriggerRestoreFocus]="false"
(menuOpened)="onOpenAssistant()" (menuOpened)="onOpenAssistant()"
> >
<ion-icon name="search-outline"></ion-icon> <ion-icon
[name]="
user?.settings?.isExperimentalFeatures
? 'options-outline'
: 'search-outline'
"
></ion-icon>
</button> </button>
<mat-menu <mat-menu
#assistantMenu="matMenu" #assistantMenu="matMenu"
@ -134,7 +140,9 @@
[hasPermissionToAccessAdminControl]=" [hasPermissionToAccessAdminControl]="
hasPermissionToAccessAdminControl hasPermissionToAccessAdminControl
" "
[user]="user"
(closed)="closeAssistant()" (closed)="closeAssistant()"
(dateRangeChanged)="onDateRangeChange($event)"
/> />
</mat-menu> </mat-menu>
</li> </li>

19
apps/client/src/app/components/header/header.component.ts

@ -19,8 +19,10 @@ import {
SettingsStorageService SettingsStorageService
} from '@ghostfolio/client/services/settings-storage.service'; } from '@ghostfolio/client/services/settings-storage.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { DateRange } from '@ghostfolio/common/types';
import { AssistantComponent } from '@ghostfolio/ui/assistant/assistant.component'; import { AssistantComponent } from '@ghostfolio/ui/assistant/assistant.component';
import { EMPTY, Subject } from 'rxjs'; import { EMPTY, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators'; import { catchError, takeUntil } from 'rxjs/operators';
@ -88,7 +90,8 @@ export class HeaderComponent implements OnChanges {
private impersonationStorageService: ImpersonationStorageService, private impersonationStorageService: ImpersonationStorageService,
private router: Router, private router: Router,
private settingsStorageService: SettingsStorageService, private settingsStorageService: SettingsStorageService,
private tokenStorageService: TokenStorageService private tokenStorageService: TokenStorageService,
private userService: UserService
) { ) {
this.impersonationStorageService this.impersonationStorageService
.onChangeHasImpersonation() .onChangeHasImpersonation()
@ -144,6 +147,20 @@ export class HeaderComponent implements OnChanges {
window.location.reload(); window.location.reload();
} }
public onDateRangeChange(dateRange: DateRange) {
this.dataService
.putUserSetting({ dateRange })
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(() => {
this.userService.remove();
this.userService
.get()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe();
});
}
public onMenuClosed() { public onMenuClosed() {
this.isMenuOpen = false; this.isMenuOpen = false;
} }

2
apps/client/src/app/components/home-holdings/home-holdings.html

@ -1,5 +1,5 @@
<div class="container justify-content-center p-3"> <div class="container justify-content-center p-3">
<div class="mb-3 text-center"> <div *ngIf="!user?.settings?.isExperimentalFeatures" class="mb-3 text-center">
<gf-toggle <gf-toggle
[defaultValue]="user?.settings?.dateRange" [defaultValue]="user?.settings?.dateRange"
[isLoading]="positions === undefined" [isLoading]="positions === undefined"

5
apps/client/src/app/components/home-overview/home-overview.html

@ -96,7 +96,10 @@
[showDetails]="showDetails" [showDetails]="showDetails"
[unit]="unit" [unit]="unit"
></gf-portfolio-performance> ></gf-portfolio-performance>
<div *ngIf="showDetails" class="text-center"> <div
*ngIf="showDetails && !user?.settings?.isExperimentalFeatures"
class="text-center"
>
<gf-toggle <gf-toggle
[defaultValue]="user?.settings?.dateRange" [defaultValue]="user?.settings?.dateRange"
[isLoading]="isLoadingPerformance" [isLoading]="isLoadingPerformance"

2
apps/client/src/app/pages/portfolio/analysis/analysis-page.html

@ -1,6 +1,6 @@
<div class="container"> <div class="container">
<h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Analysis</h1> <h1 class="d-none d-sm-block h3 mb-3 text-center" i18n>Analysis</h1>
<div class="my-4 text-center"> <div *ngIf="!user?.settings?.isExperimentalFeatures" class="my-4 text-center">
<gf-toggle <gf-toggle
[defaultValue]="user?.settings?.dateRange" [defaultValue]="user?.settings?.dateRange"
[isLoading]="isLoadingBenchmarkComparator || isLoadingInvestmentChart" [isLoading]="isLoadingBenchmarkComparator || isLoadingInvestmentChart"

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

@ -16,8 +16,11 @@ import {
} from '@angular/core'; } from '@angular/core';
import { FormControl } from '@angular/forms'; import { FormControl } from '@angular/forms';
import { MatMenuTrigger } from '@angular/material/menu'; import { MatMenuTrigger } from '@angular/material/menu';
import { ToggleComponent } from '@ghostfolio/client/components/toggle/toggle.component';
import { AdminService } from '@ghostfolio/client/services/admin.service'; import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { User } from '@ghostfolio/common/interfaces';
import { DateRange } from '@ghostfolio/common/types';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { EMPTY, Observable, Subject, lastValueFrom } from 'rxjs'; import { EMPTY, Observable, Subject, lastValueFrom } from 'rxjs';
import { import {
@ -73,8 +76,10 @@ export class AssistantComponent implements OnDestroy, OnInit {
@Input() deviceType: string; @Input() deviceType: string;
@Input() hasPermissionToAccessAdminControl: boolean; @Input() hasPermissionToAccessAdminControl: boolean;
@Input() user: User;
@Output() closed = new EventEmitter<void>(); @Output() closed = new EventEmitter<void>();
@Output() dateRangeChanged = new EventEmitter<DateRange>();
@ViewChild('menuTrigger') menuTriggerElement: MatMenuTrigger; @ViewChild('menuTrigger') menuTriggerElement: MatMenuTrigger;
@ViewChild('search', { static: true }) searchElement: ElementRef; @ViewChild('search', { static: true }) searchElement: ElementRef;
@ -84,6 +89,7 @@ export class AssistantComponent implements OnDestroy, OnInit {
public static readonly SEARCH_RESULTS_DEFAULT_LIMIT = 5; public static readonly SEARCH_RESULTS_DEFAULT_LIMIT = 5;
public dateRangeOptions = ToggleComponent.DEFAULT_DATE_RANGE_OPTIONS;
public isLoading = false; public isLoading = false;
public isOpen = false; public isOpen = false;
public placeholder = $localize`Find holding...`; public placeholder = $localize`Find holding...`;
@ -165,6 +171,10 @@ export class AssistantComponent implements OnDestroy, OnInit {
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
} }
public onChangeDateRange(dateRangeString: string) {
this.dateRangeChanged.emit(dateRangeString as DateRange);
}
public onCloseAssistant() { public onCloseAssistant() {
this.setIsOpen(false); this.setIsOpen(false);

16
libs/ui/src/lib/assistant/assistant.html

@ -86,3 +86,19 @@
</div> </div>
</div> </div>
</div> </div>
<div
*ngIf="!(isLoading || searchFormControl.value) && user?.settings?.isExperimentalFeatures"
>
<mat-tab-group mat-align-tabs="start" [mat-stretch-tabs]="false">
<mat-tab>
<ng-template i18n mat-tab-label>Date Range</ng-template>
<div class="d-flex justify-content-center p-3">
<gf-toggle
[defaultValue]="user?.settings?.dateRange"
[options]="dateRangeOptions"
(change)="onChangeDateRange($event.value)"
></gf-toggle>
</div>
</mat-tab>
</mat-tab-group>
</div>

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

@ -2,7 +2,9 @@ import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatTabsModule } from '@angular/material/tabs';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';
import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfAssistantListItemModule } from './assistant-list-item/assistant-list-item.module'; import { GfAssistantListItemModule } from './assistant-list-item/assistant-list-item.module';
@ -15,7 +17,9 @@ import { AssistantComponent } from './assistant.component';
CommonModule, CommonModule,
FormsModule, FormsModule,
GfAssistantListItemModule, GfAssistantListItemModule,
GfToggleModule,
MatButtonModule, MatButtonModule,
MatTabsModule,
NgxSkeletonLoaderModule, NgxSkeletonLoaderModule,
ReactiveFormsModule, ReactiveFormsModule,
RouterModule RouterModule

Loading…
Cancel
Save