|  |  | @ -7,6 +7,7 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   EventEmitter, | 
			
		
	
		
			
				
					|  |  |  |   HostListener, | 
			
		
	
		
			
				
					|  |  |  |   Input, | 
			
		
	
		
			
				
					|  |  |  |   OnChanges, | 
			
		
	
		
			
				
					|  |  |  |   OnDestroy, | 
			
		
	
		
			
				
					|  |  |  |   OnInit, | 
			
		
	
		
			
				
					|  |  |  |   Output, | 
			
		
	
	
		
			
				
					|  |  | @ -22,6 +23,7 @@ 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 { Tag } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { EMPTY, Observable, Subject, lastValueFrom } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   catchError, | 
			
		
	
	
		
			
				
					|  |  | @ -41,7 +43,7 @@ import { ISearchResultItem, ISearchResults } from './interfaces/interfaces'; | 
			
		
	
		
			
				
					|  |  |  |   styleUrls: ['./assistant.scss'], | 
			
		
	
		
			
				
					|  |  |  |   templateUrl: './assistant.html' | 
			
		
	
		
			
				
					|  |  |  | }) | 
			
		
	
		
			
				
					|  |  |  | export class AssistantComponent implements OnDestroy, OnInit { | 
			
		
	
		
			
				
					|  |  |  | export class AssistantComponent implements OnChanges, OnDestroy, OnInit { | 
			
		
	
		
			
				
					|  |  |  |   @HostListener('document:keydown', ['$event']) onKeydown( | 
			
		
	
		
			
				
					|  |  |  |     event: KeyboardEvent | 
			
		
	
		
			
				
					|  |  |  |   ) { | 
			
		
	
	
		
			
				
					|  |  | @ -80,6 +82,7 @@ export class AssistantComponent implements OnDestroy, OnInit { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   @Output() closed = new EventEmitter<void>(); | 
			
		
	
		
			
				
					|  |  |  |   @Output() dateRangeChanged = new EventEmitter<DateRange>(); | 
			
		
	
		
			
				
					|  |  |  |   @Output() selectedTagChanged = new EventEmitter<Tag>(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   @ViewChild('menuTrigger') menuTriggerElement: MatMenuTrigger; | 
			
		
	
		
			
				
					|  |  |  |   @ViewChild('search', { static: true }) searchElement: ElementRef; | 
			
		
	
	
		
			
				
					|  |  | @ -98,6 +101,8 @@ export class AssistantComponent implements OnDestroy, OnInit { | 
			
		
	
		
			
				
					|  |  |  |     assetProfiles: [], | 
			
		
	
		
			
				
					|  |  |  |     holdings: [] | 
			
		
	
		
			
				
					|  |  |  |   }; | 
			
		
	
		
			
				
					|  |  |  |   public tags: Tag[] = []; | 
			
		
	
		
			
				
					|  |  |  |   public tagsFormControl = new FormControl<string>(undefined); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   private keyManager: FocusKeyManager<AssistantListItemComponent>; | 
			
		
	
		
			
				
					|  |  |  |   private unsubscribeSubject = new Subject<void>(); | 
			
		
	
	
		
			
				
					|  |  | @ -109,6 +114,15 @@ export class AssistantComponent implements OnDestroy, OnInit { | 
			
		
	
		
			
				
					|  |  |  |   ) {} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   public ngOnInit() { | 
			
		
	
		
			
				
					|  |  |  |     const { tags } = this.dataService.fetchInfo(); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.tags = tags.map(({ id, name }) => { | 
			
		
	
		
			
				
					|  |  |  |       return { | 
			
		
	
		
			
				
					|  |  |  |         id, | 
			
		
	
		
			
				
					|  |  |  |         name: translate(name) | 
			
		
	
		
			
				
					|  |  |  |       }; | 
			
		
	
		
			
				
					|  |  |  |     }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.searchFormControl.valueChanges | 
			
		
	
		
			
				
					|  |  |  |       .pipe( | 
			
		
	
		
			
				
					|  |  |  |         map((searchTerm) => { | 
			
		
	
	
		
			
				
					|  |  | @ -148,6 +162,12 @@ export class AssistantComponent implements OnDestroy, OnInit { | 
			
		
	
		
			
				
					|  |  |  |       }); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   public ngOnChanges() { | 
			
		
	
		
			
				
					|  |  |  |     this.tagsFormControl.setValue( | 
			
		
	
		
			
				
					|  |  |  |       this.user?.settings?.['filters.tags']?.[0] ?? null | 
			
		
	
		
			
				
					|  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   public async initialize() { | 
			
		
	
		
			
				
					|  |  |  |     this.isLoading = true; | 
			
		
	
		
			
				
					|  |  |  |     this.keyManager = new FocusKeyManager(this.assistantListItems).withWrap(); | 
			
		
	
	
		
			
				
					|  |  | @ -181,6 +201,16 @@ export class AssistantComponent implements OnDestroy, OnInit { | 
			
		
	
		
			
				
					|  |  |  |     this.closed.emit(); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   public onTagChange() { | 
			
		
	
		
			
				
					|  |  |  |     const selectedTag = this.tags.find(({ id }) => { | 
			
		
	
		
			
				
					|  |  |  |       return id === this.tagsFormControl.value; | 
			
		
	
		
			
				
					|  |  |  |     }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.selectedTagChanged.emit(selectedTag); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.onCloseAssistant(); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   public setIsOpen(aIsOpen: boolean) { | 
			
		
	
		
			
				
					|  |  |  |     this.isOpen = aIsOpen; | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
	
		
			
				
					|  |  | 
 |