allerta-vvf/frontend/src/app/_routes/edit-user/edit-user.component.ts

337 lines
12 KiB
TypeScript

import { Component, OnInit, TemplateRef } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ApiClientService } from 'src/app/_services/api-client.service';
import { AuthService } from 'src/app/_services/auth.service';
import { TranslateService } from '@ngx-translate/core';
import { ModalAddTrainingCourseComponent } from 'src/app/_components/modal-add-traning-course/modal-add-training-course.component';
import { ModalAddMedicalExaminationComponent } from 'src/app/_components/modal-add-medical-examination/modal-add-medical-examination.component';
import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';
import Swal from 'sweetalert2';
@Component({
selector: 'app-edit-user',
templateUrl: './edit-user.component.html',
styleUrls: ['./edit-user.component.scss']
})
export class EditUserComponent implements OnInit {
id: number | undefined;
user: any = {};
profileForm: FormGroup = this.formBuilder.group({
name: ['', [Validators.required, Validators.minLength(3)]],
surname: [''],
username: ['', [Validators.required, Validators.minLength(3)]],
birthday: [null],
birthplace: [''],
birthplace_province: [''],
ssn: [''],
course_date: [null],
driver: [false, [Validators.required]],
chief: [false, [Validators.required]],
banned: [false, [Validators.required]],
hidden: [false, [Validators.required]],
address: [''],
address_zip_code: [''],
phone_number: [''],
email: [''],
driving_license: this.formBuilder.group({
number: [''],
type: [''],
expiration_date: [null],
scan: [null]
}),
suit_size: [''],
boot_size: ['']
});
hideTCAddBtn = true;
hideMECertCol = true;
hideMEAddBtn = true;
birthdayMaxDate = new Date(new Date().setFullYear(new Date().getFullYear() - 18)); //18 years ago
dlExpirationMinDate = new Date(new Date().setDate(new Date().getDate() + 1)); //Tomorrow
allowedImageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'];
maxImageSize = 1024 * 1024 * 5; //5MB
creation_date: string = this.translateService.instant("never").toUpperCase();
update_date: string = this.translateService.instant("never").toUpperCase();
last_access_date: string = this.translateService.instant("never").toUpperCase();
tmpDrivingLicenseImgData: string | null = null;
dlScanNotUploadedYet = true;
dlCurrScanUrl: string | null = null;
resetPwdModalRef: BsModalRef | undefined;
newPwd: string = '';
newPwdConfirm: string = '';
constructor(
private route: ActivatedRoute,
private formBuilder: FormBuilder,
private api: ApiClientService,
private auth: AuthService,
private translateService: TranslateService,
private modalService: BsModalService
) {
this.route.paramMap.subscribe(params => {
this.id = typeof params.get('id') === 'string' ? parseInt(params.get('id') || '') : undefined;
if (this.id) {
this.api.get(`users/${this.id}`).then((response) => {
this.user = response;
console.log(response);
this.profileForm.patchValue({
name: this.user.name,
surname: this.user.surname,
username: this.user.username,
birthday: this.user.birthday ? new Date(this.user.birthday) : null,
birthplace: this.user.birthplace,
birthplace_province: this.user.birthplace_province,
ssn: this.user.ssn,
course_date: this.user.course_date ? new Date(this.user.course_date) : null,
driver: this.user.driver,
chief: this.user.chief,
banned: this.user.banned,
hidden: this.user.hidden,
address: this.user.address,
address_zip_code: this.user.address_zip_code,
phone_number: this.user.phone_number,
email: this.user.email,
driving_license: {
number: this.user.driving_license ? this.user.driving_license.doc_number : null,
type: this.user.driving_license ? this.user.driving_license.doc_type : null,
expiration_date: (this.user.driving_license && this.user.driving_license.expiration_date) ? new Date(this.user.driving_license.expiration_date) : null,
scan: this.user.driving_license ? this.user.driving_license.scan_uuid : null
},
suit_size: this.user.suit_size,
boot_size: this.user.boot_size
});
const convertToItalianDate = (date: string | null): string => {
if(!date) return this.translateService.instant("never").toUpperCase();
const dateObj = new Date(date);
return dateObj.toLocaleString('it-IT', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' });
}
this.creation_date = convertToItalianDate(this.user.created_at);
this.update_date = convertToItalianDate(this.user.updated_at);
this.last_access_date = convertToItalianDate(this.user.last_access);
if(this.user.driving_license && this.user.driving_license.scan_uuid) {
this.dlCurrScanUrl = this.api.apiEndpoint(this.user.driving_license.scan_url);
}
//If medical examination is present, check if at least one row has cert_url
if(this.user.medical_examinations && this.user.medical_examinations.length > 0) {
this.hideMECertCol = !this.user.medical_examinations.some((me: any) => {
return me.cert_url;
});
}
}).catch((err) => {
console.log(err);
});
}
});
}
ngOnInit(): void {
let canSetChief = this.id == this.auth.profile.id ?
this.auth.profile.can('user-set-chief') :
this.auth.profile.can('users-set-chief');
let canSetDriver = this.id == this.auth.profile.id ?
this.auth.profile.can('user-set-driver') :
this.auth.profile.can('users-set-driver');
let canBan = this.id == this.auth.profile.id ?
this.auth.profile.can('user-ban') :
this.auth.profile.can('users-ban');
let canHide = this.id == this.auth.profile.id ?
this.auth.profile.can('user-hide') :
this.auth.profile.can('users-hide');
let canAddTrainingCourse = this.id == this.auth.profile.id ?
this.auth.profile.can('user-add-training-course') :
this.auth.profile.can('users-add-training-course');
let canAddMedicalExamination = this.id == this.auth.profile.id ?
this.auth.profile.can('user-add-medical-examination') :
this.auth.profile.can('users-add-medical-examination');
if(!canSetChief) this.profileForm.get('chief')?.disable();
if(!canSetDriver) this.profileForm.get('driver')?.disable();
if(!canBan) this.profileForm.get('banned')?.disable();
if(!canHide) this.profileForm.get('hidden')?.disable();
this.hideTCAddBtn = !canAddTrainingCourse;
this.hideMEAddBtn = !canAddMedicalExamination;
}
onDrivingLicenseScanSelected(event: any) {
const file: File = event.target.files[0];
this.dlScanNotUploadedYet = true;
if (file) {
if(!this.allowedImageTypes.includes(file.type)) {
event.target.value = null;
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("validation.image_format_not_supported"),
icon: 'error',
confirmButtonText: 'Ok'
});
return;
}
if(file.size > this.maxImageSize) {
event.target.value = null;
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("validation.file_too_big"),
icon: 'error',
confirmButtonText: 'Ok'
});
return;
}
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = (_event) => {
this.tmpDrivingLicenseImgData = reader.result as string;
}
}
}
uploadDrivingLicenseScan(input: HTMLInputElement) {
if(!input.files || !input.files[0]) return;
console.log(input.files[0]);
const formData = new FormData();
formData.append('file', input.files[0], input.files[0].name);
this.api.post("documents/driving_license", formData).then((response) => {
console.log(response);
this.dlScanNotUploadedYet = false;
this.profileForm.patchValue({
driving_license: {
scan: response.uuid
}
});
}).catch((err) => {
console.log(err);
});
}
formSubmit() {
let data = this.profileForm.value;
data.birthday = data.birthday ? new Date(data.birthday) : null;
data.course_date = data.course_date ? new Date(data.course_date) : null;
data.driving_license.expiration_date = data.driving_license.expiration_date ? new Date(data.driving_license.expiration_date) : null;
if (this.id) {
this.api.put(`users/${this.id}`, data).then((response) => {
console.log(response);
Swal.fire({
title: this.translateService.instant("success_title"),
text: this.translateService.instant("edit_user.success_text"),
icon: 'success',
confirmButtonText: 'Ok'
});
}).catch((err) => {
console.log(err);
Swal.fire({
title: this.translateService.instant("error_title"),
text: err.error.message ? err.error.message : this.translateService.instant("edit_user.error_text"),
icon: 'error',
confirmButtonText: 'Ok'
});
});
}
}
openModalAddTrainingCourse() {
const modalReference = this.modalService.show(ModalAddTrainingCourseComponent, {
initialState: {
userId: this.id
}
});
modalReference.content?.submitEvents.subscribe(() => {
//Refresh user data after modal is closed
this.api.get(`users/${this.id}`).then((response) => {
this.user = response;
console.log(response);
}).catch((err) => {
console.log(err);
});
});
}
openModalAddMedicalExamination() {
const modalReference = this.modalService.show(ModalAddMedicalExaminationComponent, {
initialState: {
userId: this.id
}
});
modalReference.content?.submitEvents.subscribe(() => {
//Refresh user data after modal is closed
this.api.get(`users/${this.id}`).then((response) => {
this.user = response;
console.log(response);
//If medical examination is present, check if at least one row has cert_url
if(this.user.medical_examinations && this.user.medical_examinations.length > 0) {
this.hideMECertCol = !this.user.medical_examinations.some((me: any) => {
return me.cert_url;
});
}
}).catch((err) => {
console.log(err);
});
});
}
openResetPwdModal(template: TemplateRef<any>) {
this.resetPwdModalRef = this.modalService.show(template);
}
resetPwdSubmit() {
//Check if min size 6
if(this.newPwd.length < 6) {
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("validation.password_min_length"),
icon: 'error',
confirmButtonText: 'Ok'
});
return;
}
//Check if pwd and confirm are equal
if(this.newPwd !== this.newPwdConfirm) {
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("password_not_match"),
icon: 'error',
confirmButtonText: 'Ok'
});
return;
}
this.api.put(`users/${this.id}/reset_password`, {
password: this.newPwd
}).then((response) => {
console.log(response);
Swal.fire({
title: this.translateService.instant("success_title"),
text: this.translateService.instant("password_changed_successfully"),
icon: 'success',
confirmButtonText: 'Ok'
});
this.resetPwdModalRef?.hide();
}).catch((err) => {
console.log(err);
Swal.fire({
title: this.translateService.instant("error_title"),
text: err.error.message,
icon: 'error',
confirmButtonText: 'Ok'
});
});
}
}