UI: Fixed incorrect entity details page link in autocomplete component
This commit is contained in:
		
							parent
							
								
									17bd5cc792
								
							
						
					
					
						commit
						e63ae9c7fb
					
				@ -24,8 +24,8 @@
 | 
			
		||||
         (focusin)="onFocus()"
 | 
			
		||||
         [required]="required"
 | 
			
		||||
         [matAutocomplete]="entityAutocomplete"
 | 
			
		||||
         [class.!hidden]="disabled && selectEntityFormGroup.get('entity').value">
 | 
			
		||||
  <a *ngIf="selectEntityFormGroup.get('entity').value && disabled" aria-label="Open device profile" [routerLink]=entityURL>
 | 
			
		||||
         [class.!hidden]="showEntityLink">
 | 
			
		||||
  <a *ngIf="showEntityLink" aria-label="Open entity details page" [routerLink]=entityURL>
 | 
			
		||||
    {{ displayEntityFn(selectEntityFormGroup.get('entity').value) }}
 | 
			
		||||
  </a>
 | 
			
		||||
  <button *ngIf="selectEntityFormGroup.get('entity').value && !disabled"
 | 
			
		||||
@ -53,7 +53,7 @@
 | 
			
		||||
        </div>
 | 
			
		||||
        <ng-template #searchNotEmpty>
 | 
			
		||||
          <span>
 | 
			
		||||
              {{ translate.get(noEntitiesMatchingText, {entity: searchText}) | async }}
 | 
			
		||||
              {{ noEntitiesMatchingText | translate: {entity: searchText} }}
 | 
			
		||||
          </span>
 | 
			
		||||
        </ng-template>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@ -14,24 +14,13 @@
 | 
			
		||||
/// limitations under the License.
 | 
			
		||||
///
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
  AfterViewInit,
 | 
			
		||||
  Component,
 | 
			
		||||
  ElementRef,
 | 
			
		||||
  EventEmitter,
 | 
			
		||||
  forwardRef,
 | 
			
		||||
  Input,
 | 
			
		||||
  OnInit,
 | 
			
		||||
  Output,
 | 
			
		||||
  ViewChild
 | 
			
		||||
} from '@angular/core';
 | 
			
		||||
import { Component, ElementRef, EventEmitter, forwardRef, Input, OnInit, Output, ViewChild } from '@angular/core';
 | 
			
		||||
import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';
 | 
			
		||||
import { ControlValueAccessor, NG_VALUE_ACCESSOR, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
 | 
			
		||||
import { merge, Observable, of, Subject } from 'rxjs';
 | 
			
		||||
import { firstValueFrom, merge, Observable, of, Subject } from 'rxjs';
 | 
			
		||||
import { catchError, debounceTime, map, share, switchMap, tap } from 'rxjs/operators';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import { AppState } from '@app/core/core.state';
 | 
			
		||||
import { TranslateService } from '@ngx-translate/core';
 | 
			
		||||
import { AliasEntityType, EntityType } from '@shared/models/entity-type.models';
 | 
			
		||||
import { BaseData } from '@shared/models/base-data';
 | 
			
		||||
import { EntityId } from '@shared/models/id/entity-id';
 | 
			
		||||
@ -51,22 +40,22 @@ import { coerceArray, coerceBoolean } from '@shared/decorators/coercion';
 | 
			
		||||
    multi: true
 | 
			
		||||
  }]
 | 
			
		||||
})
 | 
			
		||||
export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit, AfterViewInit {
 | 
			
		||||
export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit {
 | 
			
		||||
 | 
			
		||||
  selectEntityFormGroup: UntypedFormGroup;
 | 
			
		||||
 | 
			
		||||
  modelValue: string | EntityId | null;
 | 
			
		||||
  private modelValue: string | EntityId | null;
 | 
			
		||||
 | 
			
		||||
  entityTypeValue: EntityType | AliasEntityType;
 | 
			
		||||
  private entityTypeValue: EntityType | AliasEntityType;
 | 
			
		||||
 | 
			
		||||
  entitySubtypeValue: string;
 | 
			
		||||
  private entitySubtypeValue: string;
 | 
			
		||||
 | 
			
		||||
  entityText: string;
 | 
			
		||||
  private entityText: string;
 | 
			
		||||
 | 
			
		||||
  noEntitiesMatchingText: string;
 | 
			
		||||
  notFoundEntities = 'entity.no-entities-text';
 | 
			
		||||
 | 
			
		||||
  entityRequiredText: string;
 | 
			
		||||
  private entityRequiredText: string;
 | 
			
		||||
 | 
			
		||||
  filteredEntities: Observable<Array<BaseData<EntityId>>>;
 | 
			
		||||
 | 
			
		||||
@ -78,7 +67,7 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
 | 
			
		||||
  private refresh$ = new Subject<Array<BaseData<EntityId>>>();
 | 
			
		||||
 | 
			
		||||
  private propagateChange = (v: any) => { };
 | 
			
		||||
  private propagateChange: (value: any) => void = () => { };
 | 
			
		||||
 | 
			
		||||
  @Input()
 | 
			
		||||
  set entityType(entityType: EntityType) {
 | 
			
		||||
@ -166,7 +155,6 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  constructor(private store: Store<AppState>,
 | 
			
		||||
              public translate: TranslateService,
 | 
			
		||||
              private entityService: EntityService,
 | 
			
		||||
              private fb: UntypedFormBuilder) {
 | 
			
		||||
    this.selectEntityFormGroup = this.fb.group({
 | 
			
		||||
@ -178,7 +166,7 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
    this.propagateChange = fn;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  registerOnTouched(fn: any): void {
 | 
			
		||||
  registerOnTouched(_fn: any): void {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngOnInit() {
 | 
			
		||||
@ -188,7 +176,7 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
        .pipe(
 | 
			
		||||
          debounceTime(150),
 | 
			
		||||
          tap(value => {
 | 
			
		||||
            let modelValue;
 | 
			
		||||
            let modelValue: string | EntityId;
 | 
			
		||||
            if (typeof value === 'string' || !value) {
 | 
			
		||||
              modelValue = null;
 | 
			
		||||
            } else {
 | 
			
		||||
@ -207,9 +195,7 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngAfterViewInit(): void {}
 | 
			
		||||
 | 
			
		||||
  load(): void {
 | 
			
		||||
  private load(): void {
 | 
			
		||||
    if (this.entityTypeValue) {
 | 
			
		||||
      switch (this.entityTypeValue) {
 | 
			
		||||
        case EntityType.ASSET:
 | 
			
		||||
@ -327,7 +313,7 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getCurrentEntity(): BaseData<EntityId> | null {
 | 
			
		||||
  private getCurrentEntity(): BaseData<EntityId> | null {
 | 
			
		||||
    const currentEntity = this.selectEntityFormGroup.get('entity').value;
 | 
			
		||||
    if (currentEntity && typeof currentEntity !== 'string') {
 | 
			
		||||
      return currentEntity as BaseData<EntityId>;
 | 
			
		||||
@ -359,16 +345,17 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
      }
 | 
			
		||||
      let entity: BaseData<EntityId> = null;
 | 
			
		||||
      try {
 | 
			
		||||
        entity = await this.entityService.getEntity(targetEntityType, id, {ignoreLoading: true, ignoreErrors: true}).toPromise();
 | 
			
		||||
        entity = await firstValueFrom(this.entityService.getEntity(targetEntityType, id, {ignoreLoading: true, ignoreErrors: true}));
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        this.propagateChange(null);
 | 
			
		||||
      }
 | 
			
		||||
      this.modelValue = entity !== null ? (this.useFullEntityId ? entity.id : entity.id.id) : null;
 | 
			
		||||
      this.entityURL = getEntityDetailsPageURL(this.modelValue as string, targetEntityType);
 | 
			
		||||
      this.entityURL = !entity ? '' : getEntityDetailsPageURL(entity.id.id, targetEntityType);
 | 
			
		||||
      this.selectEntityFormGroup.get('entity').patchValue(entity !== null ? entity : '', {emitEvent: false});
 | 
			
		||||
      this.entityChanged.emit(entity);
 | 
			
		||||
    } else {
 | 
			
		||||
      this.modelValue = null;
 | 
			
		||||
      this.entityURL = '';
 | 
			
		||||
      this.selectEntityFormGroup.get('entity').patchValue('', {emitEvent: false});
 | 
			
		||||
    }
 | 
			
		||||
    this.dirty = true;
 | 
			
		||||
@ -381,13 +368,14 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  reset() {
 | 
			
		||||
  private reset() {
 | 
			
		||||
    this.selectEntityFormGroup.get('entity').patchValue('', {emitEvent: false});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  updateView(value: string | null, entity: BaseData<EntityId> | null) {
 | 
			
		||||
  private updateView(value: string | EntityId | null, entity: BaseData<EntityId> | null) {
 | 
			
		||||
    if (!isEqual(this.modelValue, value)) {
 | 
			
		||||
      this.modelValue = value;
 | 
			
		||||
      this.entityURL = !entity ? '' : getEntityDetailsPageURL(entity.id.id, entity.id.entityType as EntityType);
 | 
			
		||||
      this.propagateChange(this.modelValue);
 | 
			
		||||
      this.entityChanged.emit(entity);
 | 
			
		||||
    }
 | 
			
		||||
@ -397,7 +385,7 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
    return entity ? entity.name : undefined;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fetchEntities(searchText?: string): Observable<Array<BaseData<EntityId>>> {
 | 
			
		||||
  private fetchEntities(searchText?: string): Observable<Array<BaseData<EntityId>>> {
 | 
			
		||||
    this.searchText = searchText;
 | 
			
		||||
    const targetEntityType = this.checkEntityType(this.entityTypeValue);
 | 
			
		||||
    return this.entityService.getEntitiesByNameFilter(targetEntityType, searchText,
 | 
			
		||||
@ -432,7 +420,7 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
    }, 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  checkEntityType(entityType: EntityType | AliasEntityType): EntityType {
 | 
			
		||||
  private checkEntityType(entityType: EntityType | AliasEntityType): EntityType {
 | 
			
		||||
    if (entityType === AliasEntityType.CURRENT_CUSTOMER) {
 | 
			
		||||
      return EntityType.CUSTOMER;
 | 
			
		||||
    } else if (entityType === AliasEntityType.CURRENT_TENANT) {
 | 
			
		||||
@ -454,4 +442,8 @@ export class EntityAutocompleteComponent implements ControlValueAccessor, OnInit
 | 
			
		||||
    $event.stopPropagation();
 | 
			
		||||
    this.createNew.emit();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get showEntityLink(): boolean {
 | 
			
		||||
    return this.selectEntityFormGroup.get('entity').value && this.disabled && this.entityURL !== '';
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user