import { Component, OnInit, NgZone } from '@angular/core'; import { Subject } from 'rxjs'; import { FormBuilder, FormControl, Validators, FormGroup } from '@angular/forms'; import { InsulationMaterialSizeModel } from '../../../../models/dictionaries/insulation-material-size.model'; import { MainPageService } from '../../../main-page.service'; @Component({ selector: 'app-insulation-material-managment', templateUrl: './insulation-material-managment.component.html', styleUrls: ['./insulation-material-managment.component.scss'] }) export class InsulationMaterialManagmentComponent implements OnInit { public insulationMaterialData: any; public isInsulationMaterialNew: boolean = false; public stateSubject: Subject = new Subject(); public insulationMaterialSizeGridData: InsulationMaterialSizeModel[]; public editedSizeData: InsulationMaterialSizeModel; public canAddRowToSizeGrid = true; private sizesOpenedGridRows: number = 0; public isSizesGridInChangeMode = false; public currentOpenRow: number; public formGroup: FormGroup; public rowNumber: number; private removeData: any; constructor(private mainPageService: MainPageService, private formBuilder: FormBuilder, private zone: NgZone) { } public ngOnInit(): void { this.insulationMaterialSizeGridData = []; this.mainPageService.deleteInsulationMaterialSizeSubject.subscribe((value) => { this.insulationMaterialSizeGridData = this.insulationMaterialSizeGridData.filter(x => x._id !== value); }); } loadData(): void { this.mainPageService.loadInsulationMaterialSizes(this.insulationMaterialData.id).subscribe((response) => { this.insulationMaterialSizeGridData = response; }); } public showManagmentPage(sender, isNew?) { this.insulationMaterialData = sender; if (isNew) { this.isInsulationMaterialNew = isNew; } this.loadData(); } save(): void { this.mainPageService.updateInsulationMaterialInDb(JSON.stringify(this.insulationMaterialData)).subscribe((res) => { }); if (this.isInsulationMaterialNew) { this.isInsulationMaterialNew = false; } } returnHandler() { if (this.isInsulationMaterialNew) { this.mainPageService.removeInsulationMaterial(this.insulationMaterialData._id).subscribe(() => { }); this.mainPageService.deleteInsulationMaterialSubject.next(this.insulationMaterialData._id); this.insulationMaterialData = null; } this.stateSubject.next(this.insulationMaterialData); this.insulationMaterialData = null; } public editHandlerForSizeData({ sender, rowIndex, dataItem }) { this.canAddRowToSizeGrid = false; this.sizesOpenedGridRows++; this.isSizesGridInChangeMode = true; this.currentOpenRow = rowIndex; this.formGroup = this.createFormGroupForSizeData(this.insulationMaterialSizeGridData[rowIndex]); sender.editRow(rowIndex, this.formGroup); } public cancelHandlerForSizeData({ sender, rowIndex }) { if (this.isSizesGridInChangeMode) { this.sizesOpenedGridRows--; sender.closeRow(rowIndex); if (this.sizesOpenedGridRows === 0) { this.isSizesGridInChangeMode = false; } this.canAddRowToSizeGrid = true; } else { this.sizesOpenedGridRows--; this.insulationMaterialSizeGridData = this.insulationMaterialSizeGridData.filter( item => item !== this.insulationMaterialSizeGridData[rowIndex] ); sender.closeRow(rowIndex); this.canAddRowToSizeGrid = true; } } public saveHandlerForSizeData({ sender, formGroup, rowIndex }) { this.rowNumber = rowIndex; if (this.isSizesGridInChangeMode) { if (this.formGroup.valid ) { this.sizesOpenedGridRows--; this.overwriteDataInGrid(rowIndex, formGroup); sender.closeRow(rowIndex); this.canAddRowToSizeGrid = true; if (this.sizesOpenedGridRows === 0) { this.isSizesGridInChangeMode = false; } this.editedSizeData = this.insulationMaterialSizeGridData[rowIndex]; this.saveEditedSizes(); } } else { if (this.formGroup.valid ) { this.sizesOpenedGridRows--; this.overwriteDataInGrid(rowIndex, formGroup); sender.closeRow(rowIndex); this.canAddRowToSizeGrid = true; if (this.sizesOpenedGridRows === 0) { this.isSizesGridInChangeMode = false; } this.editedSizeData = this.insulationMaterialSizeGridData[rowIndex]; this.saveNewSize(); } } } public addHandlerForSizeData({ sender }) { this.sizesOpenedGridRows++; this.insulationMaterialSizeGridData.push(new InsulationMaterialSizeModel(null, null, this.insulationMaterialData.id)); this.canAddRowToSizeGrid = false; this.currentOpenRow = this.insulationMaterialSizeGridData.length - 1; sender.editRow( this.insulationMaterialSizeGridData.length - 1, this.formGroup = this.createFormGroupForSizeData( this.insulationMaterialSizeGridData[this.insulationMaterialSizeGridData.length - 1] ) ); } public removeHandler({ sender, dataItem }) { this.removeData = dataItem; } public createFormGroupForSizeData(dataItem: any): FormGroup { return this.formBuilder.group({ _id: dataItem._id, id: dataItem.id, insulationMaterialId: dataItem.InsulationMaterialId, size: new FormControl(dataItem.size, Validators.compose([Validators.required, Validators.pattern('^\\d+(?:\\.\\d{1,1})?$')])), }); } overwriteDataInGrid(rowIndex, formGroup) { this.insulationMaterialSizeGridData[rowIndex].size = formGroup.value.size; } saveNewSize() { console.log(this.editedSizeData); this.mainPageService.addNewInsulationMaterialSizeIntoDb( JSON.stringify(this.insulationMaterialSizeGridData[this.rowNumber])).subscribe((response) => { this.editedSizeData._id = response._id; this.editedSizeData.id = response.id; this.insulationMaterialSizeGridData[this.rowNumber] = this.editedSizeData; }); } saveEditedSizes() { console.log(this.insulationMaterialSizeGridData[this.rowNumber]); this.mainPageService.updateInsulationMaterialSizeInDb(JSON.stringify(this.editedSizeData)).subscribe((response) => { }); } public removeSize() { let index; for (let i = 0; i < this.insulationMaterialSizeGridData.length; i++) { if (this.insulationMaterialSizeGridData[i]._id === this.removeData._id) { index = i; } } this.deleteInsulationMaterialSize(this.insulationMaterialSizeGridData[index]); } deleteInsulationMaterialSize(size) { this.mainPageService.removeInsulationMaterialSize(size._id).subscribe((res) => { }, (error: any) => { }); this.mainPageService.deleteInsulationMaterialSizeSubject.next(size._id); } }