Skip to content
Snippets Groups Projects
execution-detail.component.ts 4.54 KiB
Newer Older
import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core';
import {Job, JobExecution} from "../../../model/job";
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;
  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();