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

72.05% Statements 49/68
22.22% Branches 2/9
62.5% Functions 10/16
100% Lines 45/45

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 10411x 11x 11x 11x 11x   11x     11x   11x 11x 11x 11x 11x 11x 11x                 11x   7x 7x   7x   7x     7x 7x 7x 7x 7x 7x       7x       7x 2x         24x       6x       6x       1x       3x 2x 2x   2x 2x     2x       1x   1x 1x         1x 1x 1x         1x          
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormArray, FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatFormField, MatLabel } from '@angular/material/form-field';
import { MatInput } from '@angular/material/input';
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';
 
 
@Component({
  selector: 'app-job-activities-form',
  imports: [ActivityLabelPipe, ReactiveFormsModule, MatFormField, MatInput, MatLabel, MatButton, MatSelect, MatOption, MatIcon],
  templateUrl: './job-actitivities-form.component.html',
  styleUrl: './job-actitivities-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],
      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) => {
            console.log('received 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);
          });
    }
  }
}