annotate src/app/feature-extraction-menu/feature-extraction-menu.component.ts @ 324:e433a2da0ada

Refactor the import library logic slightly to waterfall the loading of the libraries and list requests, and send one response when all libraries have been loaded.
author Lucas Thompson <dev@lucas.im>
date Tue, 16 May 2017 16:16:57 +0100
parents 89208e8af8cc
children 4387175f594b
rev   line source
dev@74 1 import {
dev@236 2 Component,
dev@236 3 OnInit,
dev@236 4 Output,
dev@236 5 EventEmitter,
dev@236 6 Input,
dev@74 7 OnDestroy
dev@74 8 } from '@angular/core';
dev@236 9 import {
dev@236 10 FeatureExtractionService
dev@236 11 } from '../services/feature-extraction/feature-extraction.service';
dev@236 12 import {ListResponse} from 'piper';
dev@236 13 import {Subscription} from 'rxjs/Subscription';
dev@269 14 import {MdSelect} from '@angular/material';
dev@44 15
dev@47 16 export interface ExtractorOutputInfo {
dev@47 17 extractorKey: string;
dev@47 18 combinedKey: string;
dev@47 19 outputId: string;
dev@44 20 name: string;
dev@44 21 }
dev@44 22
dev@44 23 @Component({
dev@236 24 selector: 'ugly-feature-extraction-menu',
dev@44 25 templateUrl: './feature-extraction-menu.component.html',
dev@44 26 styleUrls: ['./feature-extraction-menu.component.css']
dev@44 27 })
dev@74 28 export class FeatureExtractionMenuComponent implements OnInit, OnDestroy {
dev@44 29
dev@48 30 @Input()
dev@48 31 set disabled(isDisabled: boolean) {
dev@48 32 this.isDisabled = isDisabled;
dev@48 33 }
dev@48 34
dev@48 35 get disabled() {
dev@48 36 return this.isDisabled;
dev@48 37 }
dev@48 38
dev@47 39 @Output() requestOutput: EventEmitter<ExtractorOutputInfo>;
dev@47 40
dev@48 41 private isDisabled: boolean;
dev@47 42 private extractorsMap: Map<string, ExtractorOutputInfo>;
dev@74 43 private populateExtractors: (available: ListResponse) => void;
dev@47 44 extractors: Iterable<ExtractorOutputInfo>;
dev@74 45 private librariesUpdatedSubscription: Subscription;
dev@44 46
dev@44 47 constructor(private piperService: FeatureExtractionService) {
dev@47 48 this.extractorsMap = new Map();
dev@44 49 this.extractors = [];
dev@51 50 this.requestOutput = new EventEmitter<ExtractorOutputInfo>();
dev@48 51 this.isDisabled = true;
dev@74 52 this.populateExtractors = available => {
dev@46 53 const maxCharacterLimit = 50;
dev@46 54 available.available.forEach(staticData => {
dev@47 55 const isSingleOutputExtractor = staticData.basicOutputInfo.length === 1;
dev@47 56 staticData.basicOutputInfo.forEach(output => {
dev@47 57 const combinedKey = `${staticData.key}:${output.identifier}`;
dev@47 58 this.extractorsMap.set(combinedKey, {
dev@47 59 extractorKey: staticData.key,
dev@47 60 combinedKey: combinedKey,
dev@47 61 name: (
dev@47 62 isSingleOutputExtractor
dev@47 63 ? staticData.basic.name
dev@47 64 : `${staticData.basic.name}: ${output.name}`
dev@47 65 ).substr(0, maxCharacterLimit) + '...',
dev@47 66 outputId: output.identifier
dev@46 67 });
dev@47 68 });
dev@46 69 });
dev@47 70 this.extractors = [...this.extractorsMap.values()];
dev@74 71 };
dev@74 72 }
dev@74 73
dev@269 74 private getFirstSelectedItemOrEmpty(select: MdSelect): string {
dev@269 75 const selected = select.selected;
dev@269 76 if (selected) {
dev@269 77 return selected instanceof Array ? selected[0].value : selected.value;
dev@269 78 }
dev@269 79 return '';
dev@269 80 }
dev@269 81
dev@74 82 ngOnInit() {
dev@236 83 this.librariesUpdatedSubscription =
dev@236 84 this.piperService.librariesUpdated$.subscribe(this.populateExtractors);
dev@324 85 this.piperService.list().then(this.populateExtractors);
dev@44 86 }
dev@44 87
dev@47 88 extract(combinedKey: string): void {
dev@100 89 const info: ExtractorOutputInfo =
dev@100 90 this.extractorsMap.get(combinedKey);
dev@100 91 if (info) {
dev@100 92 this.requestOutput.emit(info);
dev@100 93 }
dev@47 94 }
dev@47 95
dev@238 96 load(): void {
dev@324 97 this.piperService.updateAvailableLibraries();
dev@74 98 }
dev@74 99
dev@74 100 ngOnDestroy(): void {
dev@74 101 this.librariesUpdatedSubscription.unsubscribe();
dev@74 102 }
dev@44 103 }