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 | 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 10x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 1x 1x 1x | import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Job } from '@core/model/job.interface';
import { JobService } from '@core/services/job.service';
import { Attachment } from '@core/model/attachment.interface';
import { catchError, EMPTY, of, switchMap, take, tap } from 'rxjs';
import { ConfirmDialogService } from '@core/services/confirm-dialog.service';
import { FileService } from '@core/services/file.service';
import { MatButton } from '@angular/material/button';
import { JobAttachmentsFormComponent } from '@app/features/jobs/forms/job-attachments-form/job-attachments-form.component';
import { ModalService } from '@core/services/modal.service';
import { DatePipe } from '@angular/common';
import { ProtectedFile } from '@app/core/model/protected-file.interface';
import { NotificationService } from '@app/core/services/notification.service';
@Component({
selector: 'app-job-attachments',
imports: [MatButton, JobAttachmentsFormComponent, DatePipe],
templateUrl: './job-attachments.component.html',
styleUrl: './job-attachments.component.scss'
})
export class JobAttachmentsComponent implements OnInit {
@Input({ required: true }) job!: Job;
@Input() formMode = 'inline';
@Output() attachmentsSaved = new EventEmitter<Job>();
protected displayForm = this.formMode === 'inline';
constructor(
private jobService: JobService,
private confirmDialogService: ConfirmDialogService,
private fileService: FileService,
private modalService: ModalService,
private notificationService: NotificationService){}
ngOnInit(): void {
this.displayForm = this.formMode === 'inline';
}
downloadAttachement(job: Job, attachment: Attachment) :void {
this.jobService.getProtectedFile(job.id, attachment.id)
.pipe(
switchMap((p: ProtectedFile) =>
this.fileService.downloadFile(p.url, true).pipe(
tap((blob) => {
const objectUrl = URL.createObjectURL(blob);
window.open(objectUrl, '_blank');
URL.revokeObjectURL(objectUrl);
})
)
),
catchError((err) => {
this.notificationService.error($localize `:download file|message indicating file download has failed@@error.file.download:File download failed`, err);
return EMPTY;
})
)
.subscribe();
}
confirmDeleteAttachment(job: Job, attachment: Attachment) :void {
this.jobService.deleteAttachment(job.id, attachment.id).pipe(
take(1),
tap(() => {
this.notificationService.confirmation($localize `:@@message.attachment.deleted:Attachment deleted successfully`);
job.attachments = job.attachments.filter((a) => a.id != attachment.id )
})
).subscribe(() => {
});
}
deleteAttachment(job: Job, attachment: Attachment) :void {
this.confirmDialogService.openConfirmDialog($localize `:@@info.attachment.delete.confirmation_required:Delete attachment "${attachment.name}" ?`, () => this.confirmDeleteAttachment(job, attachment));
}
cancelForm() :void {
this.displayForm = false;
}
addAttachment(job: Job) :void {
if(this.formMode === 'inline') {
this.displayForm = true;
}
else {
this.modalService.openJobModal('attachments-form', job, () => this.onAttachmentsSaved(job), {defaultAttachments: 1});
}
}
onAttachmentsSaved(job: Job): void {
this.attachmentsSaved.emit(job);
}
}
|