dev@74: import { dev@74: Component, OnInit, Output, EventEmitter, Input, dev@74: OnDestroy dev@74: } from '@angular/core'; dev@44: import {FeatureExtractionService} from "../services/feature-extraction/feature-extraction.service"; dev@74: import {ListResponse} from "piper"; dev@74: import {Subscription} from "rxjs"; dev@44: dev@47: export interface ExtractorOutputInfo { dev@47: extractorKey: string; dev@47: combinedKey: string; dev@47: outputId: string; dev@44: name: string; dev@44: } dev@44: dev@44: @Component({ dev@44: selector: 'app-feature-extraction-menu', dev@44: templateUrl: './feature-extraction-menu.component.html', dev@44: styleUrls: ['./feature-extraction-menu.component.css'] dev@44: }) dev@74: export class FeatureExtractionMenuComponent implements OnInit, OnDestroy { dev@44: dev@48: @Input() dev@48: set disabled(isDisabled: boolean) { dev@48: this.isDisabled = isDisabled; dev@48: } dev@48: dev@48: get disabled() { dev@48: return this.isDisabled; dev@48: } dev@48: dev@47: @Output() requestOutput: EventEmitter; dev@47: dev@48: private isDisabled: boolean; dev@47: private extractorsMap: Map; dev@74: private populateExtractors: (available: ListResponse) => void; dev@47: extractors: Iterable; dev@74: private librariesUpdatedSubscription: Subscription; dev@44: dev@44: constructor(private piperService: FeatureExtractionService) { dev@47: this.extractorsMap = new Map(); dev@44: this.extractors = []; dev@51: this.requestOutput = new EventEmitter(); dev@48: this.isDisabled = true; dev@74: this.populateExtractors = available => { dev@46: const maxCharacterLimit = 50; dev@46: available.available.forEach(staticData => { dev@47: const isSingleOutputExtractor = staticData.basicOutputInfo.length === 1; dev@47: staticData.basicOutputInfo.forEach(output => { dev@47: const combinedKey = `${staticData.key}:${output.identifier}`; dev@47: this.extractorsMap.set(combinedKey, { dev@47: extractorKey: staticData.key, dev@47: combinedKey: combinedKey, dev@47: name: ( dev@47: isSingleOutputExtractor dev@47: ? staticData.basic.name dev@47: : `${staticData.basic.name}: ${output.name}` dev@47: ).substr(0, maxCharacterLimit) + '...', dev@47: outputId: output.identifier dev@46: }); dev@47: }); dev@46: }); dev@47: this.extractors = [...this.extractorsMap.values()]; dev@74: }; dev@74: } dev@74: dev@74: ngOnInit() { dev@74: this.piperService.list().then(this.populateExtractors); dev@74: this.librariesUpdatedSubscription = this.piperService.librariesUpdated$.subscribe(this.populateExtractors); dev@44: } dev@44: dev@47: extract(combinedKey: string): void { dev@100: const info: ExtractorOutputInfo = dev@100: this.extractorsMap.get(combinedKey); dev@100: if (info) { dev@100: this.requestOutput.emit(info); dev@100: } dev@47: } dev@47: dev@74: load(): void { dev@74: this.piperService.updateAvailableLibraries().subscribe(res => { dev@74: Object.keys(res).forEach(key => this.piperService.load(key)); dev@74: }); dev@74: } dev@74: dev@74: ngOnDestroy(): void { dev@74: this.librariesUpdatedSubscription.unsubscribe(); dev@74: } dev@44: }