import { AfterViewInit, Component, ViewEncapsulation } from '@angular/core'; import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { TdDialogService } from '@covalent/core'; import { TranslateService } from '@ngx-translate/core'; import { environment } from '../../../environments/environment'; import { DataManagementPlanProfileModel } from '../../models/data-management-plan-profile/DataManagementPlanProfileModel'; import { DataManagementProfileField, DMPProfileFieldDataType, DMPProfileType } from '../../models/data-management-plan-profile/DataManagementProfileField'; import { BaseErrorModel } from '../../models/error/BaseErrorModel'; import { DataManagementPlanProfileService } from '../../services/data-management-plan-profile/datamanagement-profile.service'; import { SnackBarNotificationComponent } from '../../shared/components/notificaiton/snack-bar-notification.component'; import { JsonSerializer } from '../../utilities/JsonSerializer'; import { Utilities } from '../../utilities/utilities'; @Component({ selector: 'app-dmp-profile-editor-component', templateUrl: 'dmp-profile-editor.component.html', styleUrls: ['./dmp-profile-editor.component.scss'], providers: [DataManagementPlanProfileService, Utilities], encapsulation: ViewEncapsulation.None }) export class DataManagementPlanProfileEditorComponent implements AfterViewInit { isNew = true; dataManagementPlanProfileModel: DataManagementPlanProfileModel; formGroup: FormGroup = null; host = environment.Server; baseErrorModel: BaseErrorModel; constructor( private dmpProfileService: DataManagementPlanProfileService, private route: ActivatedRoute, public snackBar: MatSnackBar, public router: Router, public language: TranslateService, private dialogService: TdDialogService, private utilities: Utilities ) { } ngAfterViewInit() { this.route.params.subscribe((params: Params) => { const itemId = params['id']; if (itemId != null) { this.isNew = false; this.dmpProfileService.getSingle(itemId).map(data => data as DataManagementPlanProfileModel) .subscribe(data => { this.dataManagementPlanProfileModel = JsonSerializer.fromJSONObject(data, DataManagementPlanProfileModel); this.baseErrorModel = this.dataManagementPlanProfileModel.errorModel; this.formGroup = this.dataManagementPlanProfileModel.buildForm(); }); } else { this.dataManagementPlanProfileModel = new DataManagementPlanProfileModel(); this.baseErrorModel = this.dataManagementPlanProfileModel.errorModel; setTimeout(() => { this.formGroup = this.dataManagementPlanProfileModel.buildForm(); }); } }); } formSubmit(): void { this.touchAllFormFields(this.formGroup); if (!this.isFormValid()) { return; } this.onSubmit(); } public isFormValid() { return this.formGroup.valid; } onSubmit(): void { this.dmpProfileService.createDataManagementPlan(this.formGroup.value).subscribe( complete => this.onCallbackSuccess(), error => this.onCallbackError(error) ); } onCallbackSuccess(): void { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, duration: 3000, }); this.router.navigate(['/dmp-profiles']); } onCallbackError(errorResponse: any) { this.setErrorModel(errorResponse.error); this.validateAllFormFields(this.formGroup); } public setErrorModel(errorModel: BaseErrorModel) { Object.keys(errorModel).forEach(item => { (this.dataManagementPlanProfileModel.errorModel)[item] = (errorModel)[item]; }); } public cancel(): void { this.router.navigate(['/dmp-profiles']); } public touchAllFormFields(formControl: AbstractControl) { if (formControl instanceof FormControl) { formControl.markAsTouched(); } else if (formControl instanceof FormGroup) { Object.keys(formControl.controls).forEach(item => { const control = formControl.get(item); this.touchAllFormFields(control); }); } else if (formControl instanceof FormArray) { formControl.controls.forEach(item => { this.touchAllFormFields(item); }); } } public validateAllFormFields(formControl: AbstractControl) { if (formControl instanceof FormControl) { formControl.updateValueAndValidity({ emitEvent: false }); } else if (formControl instanceof FormGroup) { Object.keys(formControl.controls).forEach(item => { const control = formControl.get(item); this.validateAllFormFields(control); }); } else if (formControl instanceof FormArray) { formControl.controls.forEach(item => { this.validateAllFormFields(item); }); } } addField() { (this.formGroup.get('definition').get('fields')).push(new DataManagementProfileField().buildForm()); } getDMPProfileFieldDataTypeValues(): Number[] { let keys: string[] = Object.keys(DMPProfileFieldDataType); keys = keys.slice(0, keys.length / 2); const values: Number[] = keys.map(Number); return values; } getDMPProfileFieldDataTypeWithLanguage(role: DMPProfileFieldDataType): string { let result = ''; this.language.get(this.utilities.convertFromDMPProfileDataType(role)).subscribe((value: string) => { result = value; }); return result; } getDMPProfileFieldTypeValues(): Number[] { let keys: string[] = Object.keys(DMPProfileType); keys = keys.slice(0, keys.length / 2); const values: Number[] = keys.map(Number); return values; } getDMPProfileFieldTypeWithLanguage(role: DMPProfileType): string { let result = ''; this.language.get(this.utilities.convertFromDMPProfileType(role)).subscribe((value: string) => { result = value; }); return result; } }