All files / src/app/features/jobs/forms/job-activities-form job-activities-form.component.ts

55.07% Statements 38/69
0% Branches 0/9
38.88% Functions 7/18
73.91% Lines 34/46

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 10911x 11x 11x 11x   11x     11x   11x 11x 11x 11x 11x 11x 11x 11x 11x                 11x   8x 8x   8x   8x     8x 8x 8x 8x 8x 8x       8x       8x 2x         26x       6x         6x       1x       1x                                                                      
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { AbstractControl, FormArray, FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatFormField, MatLabel } from '@angular/material/form-field';
import { JobService } from '@core/services/job.service';
import { Job } from '@core/model/job.interface';
import { catchError, take } from 'rxjs';
import { ApiError } from '@core/errors/api-error';
import { CreateJobActivitiesRequest } from '@core/model/create-job-activities-request.interface';
import { NotificationService } from '@core/services/notification.service';
import { CreateJobActivityRequest } from '@core/model/create-job-activity-request.interface';
import { MatButton } from '@angular/material/button';
import { UserActitivityType } from '@core/model/activity-type';
import { ActivityLabelPipe } from '@core/pipe/activity-label.pipe';
import { MatOption, MatSelect } from '@angular/material/select';
import { MatIcon } from '@angular/material/icon';
import { ErrorProcessorService } from '@core/services/error-processor.service';
import { TranslatorService } from '@app/core/services/translator.service';
import { ActivityCommentInputComponent } from "../inputs/activity-comment-input.component";
import { MatTooltip } from '@angular/material/tooltip';
 
 
@Component({
  selector: 'app-job-activities-form',
  imports: [ActivityLabelPipe, ReactiveFormsModule, MatFormField, MatLabel, MatButton, MatSelect, MatOption, MatIcon, ActivityCommentInputComponent, MatTooltip],
  templateUrl: './job-activities-form.component.html',
  styleUrl: './job-activities-form.component.scss'
})
export class JobActivitiesFormComponent implements OnInit {
  @Input({ required: true }) job!: Job;
  @Input() defaultActivities = 0;
  @Output() activitiesSaved = new EventEmitter<Job>();
 
  loading = false;
  activityForm!: FormGroup;
  activityTypeKeys: string[] = [];
 
  constructor(
    private readonly fb: FormBuilder, 
    private readonly jobService: JobService, 
    private readonly notificationService: NotificationService,
    private readonly errorProcessorService: ErrorProcessorService,
    private readonly translatorService: TranslatorService) {
    this.activityTypeKeys = Object.keys(UserActitivityType);
  }
 
  ngOnInit(): void {
    this.activityForm = this.fb.group({
      activities: this.fb.array([])
    });
    
    for(let a=0; a<this.defaultActivities; a++) {
      this.addActivity();
    }
  }
 
  get activities(): FormArray {
    return this.activityForm.get('activities') as FormArray;
  }
 
  addActivity(): void {
    const activityGroup = this.fb.group({
      type: ['', Validators.required],
      // the comment field will be added by the activity-comment-input component
      // comment: ['', Validators.required]
    });
    this.activities.push(activityGroup);
  }
 
  removeActivity(index: number): void {
    this.activities.removeAt(index);
  }
 
  submit(): void {
    Iif (this.activityForm.valid) {
      this.loading = true;
      const activities: {}[] = new Array();
      
      this.activities.controls.forEach((activity, index) => {
        activities[index] = {'type': activity.value.type, 'comment':  activity.value.comment} as CreateJobActivityRequest;
      });
      
      this.jobService.createActivities(this.job.id, {activities: activities} as CreateJobActivitiesRequest).pipe(
            take(1),
            catchError(
              (error: ApiError) => {
                  this.loading = false;
                  // set an explicit error message
                  error.message = $localize `:@@error.activities.creation:Activities could not be created.`+this.translatorService.translateError(error.message);
                  return this.errorProcessorService.processError(error);
              }
            )
          )
          .subscribe((job) => {
            this.loading = false;
            this.notificationService.confirmation(
              activities.length > 1 ?
                $localize`:@@message.activities.created:${activities.length} activities created successfully`
                : $localize`:@@message.activity.created:Activity created successfully`
            );
            this.activitiesSaved.emit(job);
          });
    }
  }
 
  asFormGroup(control: AbstractControl): FormGroup {
    return control as FormGroup;
  }
}