import {Component, Input, OnInit, Output, EventEmitter, ViewChild} from '@angular/core'; import {FormControl, FormGroup, Validators} from '@angular/forms'; import {AuthService} from '../../service/auth.service'; import {LoanModel} from '../../models/loan.model'; import {RewardModel} from '../../models/reward.model'; import {PeopleModel, RelevantPeopleModel} from '../../models/people.model'; import {debounce} from 'ts-debounce'; import {LoanSingleService} from '../../service/loan.single.service'; import {ClonerService} from '../../service/clone.service'; import {PeopleService} from '../../service/people.service'; import {Observable, of} from 'rxjs'; import {map} from 'rxjs/operators'; const createFormGroup = dataItem => new FormGroup({ Id: new FormControl(dataItem.Id), To: new FormControl(dataItem.To, [Validators.required, Validators.maxLength(128), Validators.minLength(1)]), From: new FormControl(dataItem.From), Role: new FormControl({value: dataItem.Role, disabled: true} , [Validators.required, Validators.minLength(2), Validators.maxLength(40)]), Amount: new FormControl(dataItem.Amount, Validators.compose([Validators.required, Validators.min(0), Validators.max(1000000)])), Description: new FormControl(dataItem.Description, [Validators.required, Validators.maxLength(128)]), Ts: new FormControl( dataItem.Ts, Validators.required) }); @Component({ selector: 'app-loan-people-reward', templateUrl: './people-reward.component.html', styleUrls: ['./people-reward.component.scss'] }) export class PeopleRewardComponent implements OnInit { @Input() public Loan: LoanModel; @Output() public NotifyNext = new EventEmitter(); @Output() public NotifyPrev = new EventEmitter(); @Output() public errorOccurred = new EventEmitter(); public relevantPeople: RelevantPeopleModel[] = []; public total = 0; public pendingReward: RewardModel[] = []; public paidReward: RewardModel[] = []; public formGroup: FormGroup; private editedRowIndex: number; public existingRoles: string[] = [ 'Broker', 'Client', 'Referral', 'Admin' ]; public existingPayDescription: string[] = [ 'Upfront', 'Broker Fee', 'SFM Incentive', 'Special Reward', 'Discount', 'Fringe Cost', 'Unknown', 'Trail' ]; private debounceFilter: any ; constructor(private ls: LoanSingleService, private auth: AuthService, private dcs: ClonerService ) { } public ngOnInit(): void { this.initPeople(); // make sure people has the one that we need this.initReward(); } public initPeople(): void{ this.relevantPeople = this.Loan.getRelevantPeople(); } public initReward(): void { this.Loan.Reward.forEach((r) => { const o = this.dcs.deepClone(r); if ( r.PayOutId > 0 ){ this.paidReward.push(o); }else{ this.pendingReward.push(o); this.pendingReward.sort((a, b) => a.Ts > b.Ts ? -1 : 1 ); } }); } public addHandler({ sender }): void { this.closeEditor(sender); this.formGroup = createFormGroup({ Id: 0, To: '', From: '', Role: 'Unknown', Amount: 0, Description: '', PayOutId: 0, Ts: new Date() }); sender.addRow(this.formGroup); } public editHandler({ sender, rowIndex, dataItem }): void { this.closeEditor(sender); // console.log(sender); this.formGroup = createFormGroup(dataItem); this.editedRowIndex = rowIndex; sender.editRow(rowIndex, this.formGroup); // console.log('editing' , dataItem, this.formGroup); } public cancelHandler({ sender, rowIndex }): void{ // console.log(sender); this.closeEditor(sender, rowIndex); } public saveHandler({ sender, rowIndex, formGroup, isNew }): void { const reward = formGroup.value; reward.From = '0'; // Admin // reward.Ts = new Date(); // Now reward.LoanId = this.Loan.Id; // Enforce LoanId reward.PayOutId = 0; // make sure it is not paid this.ls.saveReward(reward, isNew).subscribe( resp => { if ( reward.Id === 0 ) { const r = this.Loan.addReward(resp.Amount, resp.Description, resp.Id, resp.LoanId, resp.PayOutId, resp.To, resp.From, resp.Ts); this.pendingReward.unshift(r); }else{ const idx = this.pendingReward.findIndex( v => v.Id === reward.Id); // update this.pendingReward[idx].To = reward.To; this.pendingReward[idx].Amount = reward.Amount; this.pendingReward[idx].Description = reward.Description; this.pendingReward[idx].Ts = reward.Ts; // update Loan this.Loan.updateReward(resp.Amount, resp.Description, resp.Id, resp.LoanId, resp.PayOutId, resp.To, resp.From, resp.Ts); } } ); sender.closeRow(rowIndex); } peopleChanged(id: string): void { this.formGroup.get('Role').setValue(this.Loan.getRoleById(id)); } public removeHandler({ dataItem }): void { const na = this.pendingReward.filter(v => { return v.Id !== dataItem.Id; }); this.Loan.removeReward(dataItem.Id); this.pendingReward = na; this.ls.removeReward(dataItem); } private closeEditor(grid, rowIndex = this.editedRowIndex): void { grid.closeRow(rowIndex); this.editedRowIndex = undefined; this.formGroup = undefined; } public getContactImageUrl(contactId: string): string { return this.auth.getUrl('avatar/' + contactId); } public photoURL(peopleId: string): string { const url = this.auth.getUrl('avatar/') + peopleId; return 'url("' + url + '")'; } public UserName(dataItem: RewardModel): string { return dataItem.UserName; } public next(): void{ this.NotifyNext.emit(true); } public prev(): void { this.NotifyPrev.emit(true); } }