import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core'; import {Job, JobExecution} from "../../../model/job"; import {Subject} from "rxjs"; import {JobsService} from "../../../services/jobs.service"; import {FormControl, FormGroup} from "@angular/forms"; import {ConfigurationService} from "../../../env/configuration.service"; import {faCheckCircle, faCopy, faList, faSave, faStickyNote} from "@fortawesome/free-solid-svg-icons"; import {AlertService} from "../../../services/alert.service"; import {auditTime, takeUntil} from "rxjs/operators"; @Component({ selector: 'app-execution-detail', templateUrl: './execution-detail.component.html', styleUrls: ['./execution-detail.component.scss'] }) export class ExecutionDetailComponent implements OnInit, OnDestroy { private ngUnsubscribe = new Subject<void>(); @Input() job: Job; @Output() reload = new EventEmitter(); public jobDetail: JobExecution; noteFormGroup: FormGroup; public faSave = faSave; public faList = faList; public faCheckCircle = faCheckCircle; public faStickyNote = faStickyNote; public faCopy = faCopy; constructor( private configService: ConfigurationService, private jobService: JobsService, private alertService: AlertService ) { this.noteFormGroup = new FormGroup({ notes: new FormControl(), id: new FormControl() }); } ngOnInit() { this.jobService.getJobExecution(this.job.job_id).pipe(takeUntil(this.ngUnsubscribe)).subscribe((j: JobExecution) => { if (j) { this.jobDetail = j; this.noteFormGroup.get('notes').setValue(j.notes); this.noteFormGroup.get('id').setValue(j.id); } }); // autosave the form on changes this.noteFormGroup.valueChanges.pipe(auditTime(2000),takeUntil(this.ngUnsubscribe)).subscribe(() => this.updateNotes()); } copyToClipboard(text: string): void { const selBox = document.createElement('textarea'); selBox.style.position = 'fixed'; selBox.style.left = '0'; selBox.style.top = '0'; selBox.style.opacity = '0'; selBox.value = text; document.body.appendChild(selBox); selBox.focus(); selBox.select(); document.execCommand('copy'); document.body.removeChild(selBox); } getTaskStatusBgClass(status: string) { switch (status) { case 'ERROR': return 'badge-danger'; case 'SUCCESS': return 'badge-success'; default: return 'badge-info'; } } canAcceptArchive(status: string, archiveStatus: string): boolean { if (status === 'QA_READY' || status === 'QA_MANUAL' || archiveStatus === 'ARCHIVE_ERROR') { return true; } else { return false; } } getConfigRootDataDirectory(): string { return this.configService.config.rootDataDirectory; } getConfigWebLogBaseUrl(): string { return this.configService.config.weblogbaseurl; } updateNotes() { this.alertService.info('Saving Notes'); let notes = this.noteFormGroup.get('notes').value; let id = this.noteFormGroup.get('id').value; this.jobService.updateNotes(id, notes).subscribe(response => { this.alertService.success('Notes Saved'); }, error => { this.alertService.error('Notes did not save. ' + error); }); } acceptQa() { this.updateNotes(); // make sure notes are saved before submitting this.alertService.info('Accepting ' + this.job.job_id); this.performQa(this.job.job_id, 'accept'); } rejectQa() { let yesno = confirm("Are you sure you want to reject this image?"); if (yesno) { this.alertService.info('Rejecting ' + this.job.job_id); this.performQa(this.job.job_id, 'reject'); } } performQa(id: number, status: string) { //console.log(status + 'ing QA'); let newStatus; if (status == 'accept' && (this.job.job_status === 'QA_READY' || this.job.job_status === 'QA_MANUAL')) { newStatus = 'QA_ACCEPTED'; } else if (status == 'reject' && (this.job.job_status === 'QA_READY' || this.job.job_status === 'QA_MANUAL')) { newStatus = 'QA_REJECTED'; } if (['QA_ACCEPTED', 'QA_MANUAL_ACCEPTED', 'QA_REJECTED', 'QA_MANUAL_REJECTED'].indexOf(newStatus) > -1) { this.jobService.performQA(this.job.job_id, newStatus, this.jobDetail.queueName).subscribe(response => { this.alertService.success('QA Performed for ' + id); this.reload.emit('reload'); }, error => { this.alertService.error('QA Failed for ' + id); }); } }; ngOnDestroy(): void { this.ngUnsubscribe.next(); this.ngUnsubscribe.complete(); } }