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

71.01% Statements 49/69
30% Branches 3/10
55.55% Functions 10/18
97.82% Lines 45/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         28x       6x         6x       1x       3x 2x 2x   2x 2x     2x       1x   1x 1x         1x 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 {
    if (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;
  }
}