allerta-vvf/frontend/src/app/_components/modal-alert/modal-alert.component.ts

151 lines
4.3 KiB
TypeScript

import { Component, OnInit, OnDestroy } from '@angular/core';
import { BsModalRef } from 'ngx-bootstrap/modal';
import { ApiClientService } from 'src/app/_services/api-client.service';
import { AuthService } from 'src/app/_services/auth.service';
import { ToastrService } from 'ngx-toastr';
import { TranslateService } from '@ngx-translate/core';
import Swal from 'sweetalert2';
const isEqual = (...objects: any[]) => objects.every(obj => JSON.stringify(obj) === JSON.stringify(objects[0]));
@Component({
selector: 'modal-alert',
templateUrl: './modal-alert.component.html',
styleUrls: ['./modal-alert.component.scss']
})
export class ModalAlertComponent implements OnInit, OnDestroy {
id = 0;
crewUsers: any[] = [];
loadDataInterval: any = undefined;
notes = "";
originalNotes = "";
notesHasUnsavedChanges = false;
alertClosed = 0;
private etag = "";
constructor(
public bsModalRef: BsModalRef,
private api: ApiClientService,
public auth: AuthService,
private toastr: ToastrService,
private translate: TranslateService
) { }
loadResponsesData() {
this.api.get(`alerts/${this.id}`, {}, this.etag).then((response) => {
if(this.api.isLastSame) return;
this.etag = this.api.lastEtag;
this.alertClosed = response.closed;
this.crewUsers = response.crew;
if (!this.notesHasUnsavedChanges) {
if(this.notes !== response.notes) {
this.notes = response.notes;
this.originalNotes = response.notes;
}
}
}).catch((err) => {
console.log(err);
});
}
ngOnInit() {
this.loadDataInterval = setInterval(() => {
if (typeof (window as any).skipTableReload !== 'undefined' && (window as any).skipTableReload) {
return;
}
console.log("Refreshing responses data...");
this.loadResponsesData();
}, 15000);
this.loadResponsesData();
}
ngOnDestroy() {
if (this.loadDataInterval) {
console.log("Clearing interval...");
clearInterval(this.loadDataInterval);
}
}
notesUpdated() {
this.notesHasUnsavedChanges = this.notes !== this.originalNotes;
}
saveAlertSettings() {
if(!this.auth.profile.can('alerts-update')) return;
this.api.patch(`alerts/${this.id}`, {
notes: this.notes
}).then((response) => {
this.translate.get('alert.settings_updated_successfully').subscribe((res: string) => {
this.toastr.success(res);
});
this.notesHasUnsavedChanges = false;
this.originalNotes = this.notes;
}).catch((err) => {
console.log(err);
});
}
deleteAlert() {
if(!this.auth.profile.can('alerts-update')) return;
this.translate.get([
'alert.delete_confirm_title',
'alert.delete_confirm_text',
'yes_remove',
'cancel',
'alert.deleted_successfully',
'alert.delete_failed'
]).subscribe((res: any) => {
console.log(res);
Swal.fire({
title: res['alert.delete_confirm_title'],
text: res['alert.delete_confirm_text'],
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: res['yes_remove'],
cancelButtonText: res['cancel']
}).then((result: any) => {
if (result.isConfirmed) {
this.api.patch(`alerts/${this.id}`, {
closed: true
}).then((response) => {
console.log(response);
this.bsModalRef.hide();
this.api.alertsChanged.next();
this.toastr.success(res['alert.deleted_successfully']);
this.api.alertsChanged.next();
}).catch((e) => {
this.toastr.error(res['alert.delete_failed']);
});
}
});
});
}
getCurrentUserResponse() {
const r = this.crewUsers.filter((c) => c.user.id === this.auth.profile.id);
if(r.length === 0) return -1;
return r[0].accepted;
}
setCurrentUserResponse(response: number) {
if(!this.auth.profile.can('alerts-read')) return;
this.api.post(`alerts/${this.id}/response`, {
response
}).then((response) => {
this.translate.get('alert.response_updated_successfully').subscribe((res: string) => {
this.toastr.success(res);
});
this.loadResponsesData();
}).catch((e) => {
this.toastr.error(e.error.message);
});
}
}