Improve queue name selector
This commit is contained in:
		
							parent
							
								
									37fd7f4988
								
							
						
					
					
						commit
						0ee4907567
					
				@ -289,6 +289,7 @@ export class DeviceWizardDialogComponent extends
 | 
			
		||||
      const deviceProfile: DeviceProfile = {
 | 
			
		||||
        name: this.deviceWizardFormGroup.get('newDeviceProfileTitle').value,
 | 
			
		||||
        type: DeviceProfileType.DEFAULT,
 | 
			
		||||
        defaultQueueName: this.deviceWizardFormGroup.get('defaultQueueName').value,
 | 
			
		||||
        transportType: this.transportConfigFormGroup.get('transportType').value,
 | 
			
		||||
        provisionType: deviceProvisionConfiguration.type,
 | 
			
		||||
        provisionDeviceKey,
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,12 @@
 | 
			
		||||
    #queueAutocomplete="matAutocomplete"
 | 
			
		||||
    [displayWith]="displayQueueFn">
 | 
			
		||||
    <mat-option *ngFor="let queue of filteredQueues | async" [value]="queue">
 | 
			
		||||
      <span [innerHTML]="queue | highlight:searchText"></span>
 | 
			
		||||
      <span [innerHTML]="queue.queueName | highlight:searchText"></span>
 | 
			
		||||
    </mat-option>
 | 
			
		||||
    <mat-option *ngIf="!(filteredQueues | async)?.length" [value]="null">
 | 
			
		||||
      <span>
 | 
			
		||||
        {{ translate.get('queue.no-queues-matching', {queue: searchText}) | async }}
 | 
			
		||||
      </span>
 | 
			
		||||
    </mat-option>
 | 
			
		||||
  </mat-autocomplete>
 | 
			
		||||
  <mat-error *ngIf="queueFormGroup.get('queue').hasError('required')">
 | 
			
		||||
 | 
			
		||||
@ -34,6 +34,10 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion';
 | 
			
		||||
import { QueueService } from '@core/http/queue.service';
 | 
			
		||||
import { ServiceType } from '@shared/models/queue.models';
 | 
			
		||||
 | 
			
		||||
interface Queue {
 | 
			
		||||
  queueName: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'tb-queue-type-list',
 | 
			
		||||
  templateUrl: './queue-type-list.component.html',
 | 
			
		||||
@ -48,7 +52,7 @@ export class QueueTypeListComponent implements ControlValueAccessor, OnInit, Aft
 | 
			
		||||
 | 
			
		||||
  queueFormGroup: FormGroup;
 | 
			
		||||
 | 
			
		||||
  modelValue: string | null;
 | 
			
		||||
  modelValue: Queue | null;
 | 
			
		||||
 | 
			
		||||
  private requiredValue: boolean;
 | 
			
		||||
  get required(): boolean {
 | 
			
		||||
@ -67,9 +71,9 @@ export class QueueTypeListComponent implements ControlValueAccessor, OnInit, Aft
 | 
			
		||||
 | 
			
		||||
  @ViewChild('queueInput', {static: true}) queueInput: ElementRef<HTMLInputElement>;
 | 
			
		||||
 | 
			
		||||
  filteredQueues: Observable<Array<string>>;
 | 
			
		||||
  filteredQueues: Observable<Array<Queue>>;
 | 
			
		||||
 | 
			
		||||
  queues: Observable<Array<string>>;
 | 
			
		||||
  queues: Observable<Array<Queue>>;
 | 
			
		||||
 | 
			
		||||
  searchText = '';
 | 
			
		||||
 | 
			
		||||
@ -99,9 +103,15 @@ export class QueueTypeListComponent implements ControlValueAccessor, OnInit, Aft
 | 
			
		||||
        debounceTime(150),
 | 
			
		||||
        distinctUntilChanged(),
 | 
			
		||||
        tap(value => {
 | 
			
		||||
          this.updateView(value);
 | 
			
		||||
          let modelValue;
 | 
			
		||||
          if (typeof value === 'string' || !value) {
 | 
			
		||||
            modelValue = null;
 | 
			
		||||
          } else {
 | 
			
		||||
            modelValue = value;
 | 
			
		||||
          }
 | 
			
		||||
          this.updateView(modelValue);
 | 
			
		||||
        }),
 | 
			
		||||
        map(value => value ? value : ''),
 | 
			
		||||
        map(value => value ? (typeof value === 'string' ? value : value.queueName) : ''),
 | 
			
		||||
        switchMap(queue => this.fetchQueues(queue) )
 | 
			
		||||
      );
 | 
			
		||||
  }
 | 
			
		||||
@ -123,8 +133,8 @@ export class QueueTypeListComponent implements ControlValueAccessor, OnInit, Aft
 | 
			
		||||
 | 
			
		||||
  writeValue(value: string | null): void {
 | 
			
		||||
    this.searchText = '';
 | 
			
		||||
    this.modelValue = value;
 | 
			
		||||
    this.queueFormGroup.get('queue').patchValue(value, {emitEvent: false});
 | 
			
		||||
    this.modelValue = value ? { queueName: value } : null;
 | 
			
		||||
    this.queueFormGroup.get('queue').patchValue(this.modelValue, {emitEvent: false});
 | 
			
		||||
    this.dirty = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -135,37 +145,42 @@ export class QueueTypeListComponent implements ControlValueAccessor, OnInit, Aft
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  updateView(value: string | null) {
 | 
			
		||||
  updateView(value: Queue | null) {
 | 
			
		||||
    if (this.modelValue !== value) {
 | 
			
		||||
      this.modelValue = value;
 | 
			
		||||
      this.propagateChange(this.modelValue);
 | 
			
		||||
      this.propagateChange(this.modelValue ? this.modelValue.queueName : null);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  displayQueueFn(queue?: string): string | undefined {
 | 
			
		||||
    return queue ? queue : undefined;
 | 
			
		||||
  displayQueueFn(queue?: Queue): string | undefined {
 | 
			
		||||
    return queue ? queue.queueName : undefined;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fetchQueues(searchText?: string): Observable<Array<string>> {
 | 
			
		||||
  fetchQueues(searchText?: string): Observable<Array<Queue>> {
 | 
			
		||||
    this.searchText = searchText;
 | 
			
		||||
    return this.getQueues().pipe(
 | 
			
		||||
      catchError(() => of([])),
 | 
			
		||||
      catchError(() => of([] as Array<Queue>)),
 | 
			
		||||
      map(queues => {
 | 
			
		||||
        const result = queues.filter( queue => {
 | 
			
		||||
          return searchText ? queue.toUpperCase().startsWith(searchText.toUpperCase()) : true;
 | 
			
		||||
          return searchText ? queue.queueName.toUpperCase().startsWith(searchText.toUpperCase()) : true;
 | 
			
		||||
        });
 | 
			
		||||
        if (result.length) {
 | 
			
		||||
          result.sort();
 | 
			
		||||
          result.sort((q1, q2) => q1.queueName.localeCompare(q2.queueName));
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
      })
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getQueues(): Observable<Array<string>> {
 | 
			
		||||
  getQueues(): Observable<Array<Queue>> {
 | 
			
		||||
    if (!this.queues) {
 | 
			
		||||
      this.queues = this.queueService.
 | 
			
		||||
      getTenantQueuesByServiceType(this.queueType, {ignoreLoading: true}).pipe(
 | 
			
		||||
        map((queues) => {
 | 
			
		||||
          return queues.map((queueName) => {
 | 
			
		||||
            return { queueName };
 | 
			
		||||
          });
 | 
			
		||||
        }),
 | 
			
		||||
        publishReplay(1),
 | 
			
		||||
        refCount()
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
@ -1082,7 +1082,7 @@
 | 
			
		||||
        "default-rule-chain": "Default rule chain",
 | 
			
		||||
        "mobile-dashboard": "Mobile dashboard",
 | 
			
		||||
        "mobile-dashboard-hint": "Used by mobile application as a device details dashboard",
 | 
			
		||||
        "select-queue-hint": "Select from a drop-down list or add a custom name.",
 | 
			
		||||
        "select-queue-hint": "Select from a drop-down list.",
 | 
			
		||||
        "delete-device-profile-title": "Are you sure you want to delete the device profile '{{deviceProfileName}}'?",
 | 
			
		||||
        "delete-device-profile-text": "Be careful, after the confirmation the device profile and all related data will become unrecoverable.",
 | 
			
		||||
        "delete-device-profiles-title": "Are you sure you want to delete { count, plural, 1 {1 device profile} other {# device profiles} }?",
 | 
			
		||||
@ -2570,7 +2570,8 @@
 | 
			
		||||
    "queue": {
 | 
			
		||||
      "select_name": "Select queue name",
 | 
			
		||||
      "name": "Queue Name",
 | 
			
		||||
      "name_required": "Queue name is required!"
 | 
			
		||||
      "name_required": "Queue name is required!",
 | 
			
		||||
      "no-queues-matching": "No queues matching '{{queue}}' were found."
 | 
			
		||||
    },
 | 
			
		||||
    "tenant": {
 | 
			
		||||
        "tenant": "Tenant",
 | 
			
		||||
 | 
			
		||||
@ -959,7 +959,7 @@
 | 
			
		||||
        "profile-configuration": "프로파일 설정",
 | 
			
		||||
        "transport-configuration": "전송 설정",
 | 
			
		||||
        "default-rule-chain": "기본 규칙 사슬",
 | 
			
		||||
        "select-queue-hint": "Select from a drop-down list or add a custom name.",
 | 
			
		||||
        "select-queue-hint": "Select from a drop-down list.",
 | 
			
		||||
        "delete-device-profile-title": "Are you sure you want to delete the device profile '{{deviceProfileName}}'?",
 | 
			
		||||
        "delete-device-profile-text": "Be careful, after the confirmation the device profile and all related data will become unrecoverable.",
 | 
			
		||||
        "delete-device-profiles-title": "Are you sure you want to delete { count, plural, 1 {1 개 장치 프로파일} other {# 개 장치 프로파일} }?",
 | 
			
		||||
 | 
			
		||||
@ -959,7 +959,7 @@
 | 
			
		||||
    "profile-configuration": "Profile configuration",
 | 
			
		||||
    "transport-configuration": "Transport configuration",
 | 
			
		||||
    "default-rule-chain": "Default rule chain",
 | 
			
		||||
    "select-queue-hint": "Select from a drop-down list or add a custom name.",
 | 
			
		||||
    "select-queue-hint": "Select from a drop-down list.",
 | 
			
		||||
    "delete-device-profile-title": "Are you sure you want to delete the device profile '{{deviceProfileName}}'?",
 | 
			
		||||
    "delete-device-profile-text": "Be careful, after the confirmation the device profile and all related data will become unrecoverable.",
 | 
			
		||||
    "delete-device-profiles-title": "Are you sure you want to delete { count, plural, 1 {1 device profile} other {# device profiles} }?",
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user