|
|
|
@ -8,15 +8,17 @@ import { |
|
|
|
ChangeDetectionStrategy, |
|
|
|
ChangeDetectorRef, |
|
|
|
Component, |
|
|
|
DestroyRef, |
|
|
|
DoCheck, |
|
|
|
ElementRef, |
|
|
|
Input, |
|
|
|
OnChanges, |
|
|
|
OnDestroy, |
|
|
|
OnInit, |
|
|
|
SimpleChanges, |
|
|
|
ViewChild |
|
|
|
inject, |
|
|
|
viewChild |
|
|
|
} from '@angular/core'; |
|
|
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; |
|
|
|
import { |
|
|
|
FormControl, |
|
|
|
FormsModule, |
|
|
|
@ -35,13 +37,12 @@ import { |
|
|
|
import { MatInput, MatInputModule } from '@angular/material/input'; |
|
|
|
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; |
|
|
|
import { isString } from 'lodash'; |
|
|
|
import { Subject, tap } from 'rxjs'; |
|
|
|
import { tap } from 'rxjs'; |
|
|
|
import { |
|
|
|
debounceTime, |
|
|
|
distinctUntilChanged, |
|
|
|
filter, |
|
|
|
switchMap, |
|
|
|
takeUntil |
|
|
|
switchMap |
|
|
|
} from 'rxjs/operators'; |
|
|
|
|
|
|
|
import { translate } from '../i18n'; |
|
|
|
@ -77,21 +78,21 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field'; |
|
|
|
}) |
|
|
|
export class GfSymbolAutocompleteComponent |
|
|
|
extends AbstractMatFormField<LookupItem> |
|
|
|
implements DoCheck, OnChanges, OnDestroy, OnInit |
|
|
|
implements DoCheck, OnChanges, OnInit |
|
|
|
{ |
|
|
|
@Input() public defaultLookupItems: LookupItem[] = []; |
|
|
|
@Input() public isLoading = false; |
|
|
|
|
|
|
|
@ViewChild('symbolAutocomplete') public symbolAutocomplete: MatAutocomplete; |
|
|
|
|
|
|
|
@Input() private includeIndices = false; |
|
|
|
|
|
|
|
@ViewChild(MatInput) private input: MatInput; |
|
|
|
|
|
|
|
public control = new FormControl(); |
|
|
|
public readonly control = new FormControl(); |
|
|
|
public lookupItems: (LookupItem & { assetSubClassString: string })[] = []; |
|
|
|
|
|
|
|
private unsubscribeSubject = new Subject<void>(); |
|
|
|
protected readonly symbolAutocomplete = |
|
|
|
viewChild.required<MatAutocomplete>('symbolAutocomplete'); |
|
|
|
|
|
|
|
private readonly destroyRef = inject(DestroyRef); |
|
|
|
private readonly input = viewChild.required(MatInput); |
|
|
|
|
|
|
|
public constructor( |
|
|
|
public readonly _elementRef: ElementRef, |
|
|
|
@ -105,13 +106,22 @@ export class GfSymbolAutocompleteComponent |
|
|
|
this.controlType = 'symbol-autocomplete'; |
|
|
|
} |
|
|
|
|
|
|
|
public get empty() { |
|
|
|
return this.input().empty; |
|
|
|
} |
|
|
|
|
|
|
|
public set value(value: LookupItem) { |
|
|
|
this.control.setValue(value); |
|
|
|
super.value = value; |
|
|
|
} |
|
|
|
|
|
|
|
public ngOnInit() { |
|
|
|
if (this.disabled) { |
|
|
|
this.control.disable(); |
|
|
|
} |
|
|
|
|
|
|
|
this.control.valueChanges |
|
|
|
.pipe(takeUntil(this.unsubscribeSubject)) |
|
|
|
.pipe(takeUntilDestroyed(this.destroyRef)) |
|
|
|
.subscribe(() => { |
|
|
|
if (super.value) { |
|
|
|
super.value.dataSource = null; |
|
|
|
@ -136,7 +146,7 @@ export class GfSymbolAutocompleteComponent |
|
|
|
}), |
|
|
|
debounceTime(400), |
|
|
|
distinctUntilChanged(), |
|
|
|
takeUntil(this.unsubscribeSubject), |
|
|
|
takeUntilDestroyed(this.destroyRef), |
|
|
|
switchMap((query: string) => { |
|
|
|
return this.dataService.fetchSymbols({ |
|
|
|
query, |
|
|
|
@ -168,12 +178,8 @@ export class GfSymbolAutocompleteComponent |
|
|
|
return aLookupItem?.symbol ?? ''; |
|
|
|
} |
|
|
|
|
|
|
|
public get empty() { |
|
|
|
return this.input?.empty; |
|
|
|
} |
|
|
|
|
|
|
|
public focus() { |
|
|
|
this.input.focus(); |
|
|
|
this.input().focus(); |
|
|
|
} |
|
|
|
|
|
|
|
public isValueInOptions(value: string) { |
|
|
|
@ -185,7 +191,7 @@ export class GfSymbolAutocompleteComponent |
|
|
|
public ngDoCheck() { |
|
|
|
if (this.ngControl) { |
|
|
|
this.validateRequired(); |
|
|
|
this.errorState = this.ngControl.invalid && this.ngControl.touched; |
|
|
|
this.errorState = !!(this.ngControl.invalid && this.ngControl.touched); |
|
|
|
this.stateChanges.next(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -197,18 +203,6 @@ export class GfSymbolAutocompleteComponent |
|
|
|
} 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 showDefaultOptions() { |
|
|
|
this.lookupItems = this.defaultLookupItems.map((lookupItem) => { |
|
|
|
return { |
|
|
|
@ -224,8 +218,9 @@ export class GfSymbolAutocompleteComponent |
|
|
|
const requiredCheck = super.required |
|
|
|
? !super.value?.dataSource || !super.value?.symbol |
|
|
|
: false; |
|
|
|
|
|
|
|
if (requiredCheck) { |
|
|
|
this.ngControl.control.setErrors({ invalidData: true }); |
|
|
|
this.ngControl.control?.setErrors({ invalidData: true }); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|