import {Component, OnDestroy, OnInit} from '@angular/core'; import {Subscription} from "rxjs"; import {FormControl, FormGroup} from "@angular/forms"; import {debounceTime, distinctUntilChanged, map} from "rxjs/operators"; import {JobsService} from "../services/jobs.service"; import {Job, JobQueue, JobSpec} from "../model/job"; import {ActivatedRoute} from "@angular/router"; import {AlertService} from "../services/alert.service"; import {FiltersService} from "../services/filters.service"; import {Setting} from "../model/setting"; import {SettingsService} from "../services/settings.service"; @Component({ selector: 'app-jobspecs', templateUrl: './jobspecs.component.html', styleUrls: ['./jobspecs.component.scss'] }) export class JobspecsComponent implements OnInit, OnDestroy { public queues: Array<JobQueue>; public statuses: Array<string>; public jobs$: Subscription; public jobs: Array<Job>; public pattern: string = ""; private readonly settings$: Subscription; public canDeleteJobs = false; private filters$: Subscription; public filters: object; public formGroup: FormGroup; constructor( private jobService: JobsService, private route: ActivatedRoute, private alertService: AlertService, private filterService: FiltersService, private settingsService: SettingsService ) { this.queues = this.filterService.getFilter('JOB_QUEUE'); this.statuses = this.filterService.getFilter('JOB_STATUS'); this.settings$ = this.settingsService.getSettings().subscribe((s: Setting) => { if (s) { this.canDeleteJobs = s.allowJobDeletion; } else { this.canDeleteJobs = false; } }, error => { this.canDeleteJobs = false; }); } ngOnInit() { this.formGroup = new FormGroup({ pattern: new FormControl() }); this.route.queryParams.subscribe(params => { if (params.hasOwnProperty('pattern')) { this.pattern = params.pattern; this.formGroup.get('pattern').setValue(params.pattern); } if (params.hasOwnProperty('status')) { this.filterService.setCurrentSetting('JOB_STATUS', params.status); } if (params.hasOwnProperty('queue')) { const paramQueue = Job.getQueueFromName(params.queue); if (paramQueue) { this.filterService.setCurrentSetting('JOB_QUEUE', paramQueue); } } }); this.formGroup.get('pattern').valueChanges.pipe( debounceTime(400), distinctUntilChanged(), map(results => results) ).subscribe((val: string) => { this.pattern = val; this.getJobs(); }); this.filters$ = this.filterService.currentSettings$.subscribe((filters: object) => { this.filters = filters; this.getJobs(); }); } setQueue(queue: JobQueue): void { this.filterService.setCurrentSetting('JOB_QUEUE', queue); } setStatus(status: string): void { this.filterService.setCurrentSetting('JOB_STATUS', status); } getJobs(): void { if (this.jobs$) { this.jobs$.unsubscribe(); } this.jobs = null; var possibleId = parseInt(this.pattern); var id = null; if (!isNaN(possibleId)) { id = possibleId; } const queue = this.filterService.getCurrentSetting('JOB_QUEUE'); const status = this.filterService.getCurrentSetting('JOB_STATUS'); this.alertService.info('Getting ' + queue.label + ' Jobs'); if (!!id) { this.jobs$ = this.jobService.getJobSpec(id).subscribe((j: JobSpec) => { this.alertService.success(queue.label + ' jobs retrieved'); const arr = []; arr.push(this.jobService.jobSpecToJob(j)); this.jobs = arr; }); } else { this.jobs$ = this.jobService.getJobSpecs(queue.name, id, this.pattern, status).subscribe((j: Array<Job>) => { if (j && j.length > 0) { this.alertService.success(queue.label + ' jobs retrieved'); this.jobs = j; } else { this.jobs = []; this.alertService.error('No ' + queue.label + ' jobs found'); } }); } } ngOnDestroy(): void { if (this.jobs$) { this.jobs$.unsubscribe(); } if (this.filters$) { this.filters$.unsubscribe(); } if (this.settings$) { this.settings$.unsubscribe(); } } }