import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { PermissionsService, AnalyticsService, SocketsService, AnalyticsEvent, ApiSocketEmitAction, PaginationParamsModel } from '@arrow/bom/core'; import { Subscription } from 'rxjs'; import { WptDialog } from '@arrow/warpaint/dialog'; import { AddPartModalComponent } from '@arrow/bom/shared'; @Component({ selector: 'bom-add-part', templateUrl: 'add-part.component.html', styleUrls: ['add-part.component.scss'] }) export class AddPartComponent implements OnInit, OnDestroy { @Input() bomLoading: boolean; @Input() bomId: string; @Input() paginationParams: PaginationParamsModel; subscriptions: Array = []; permissions: any; constructor( private wptDialog: WptDialog, private analyticsService: AnalyticsService, private sockets: SocketsService, private ps: PermissionsService ) {} ngOnInit() { this.subscriptions.push( this.ps .getPermissions() .subscribe((permissions: any) => (this.permissions = permissions)) ); } ngOnDestroy() { this.subscriptions.forEach((sub: Subscription) => sub.unsubscribe()); } /** * Handles add part click. Launches an addPartModal instance. Is enabled only when bom fully loaded * @param bomLoading */ onAddPart(bomLoading: boolean) { if (bomLoading) return; this.wptDialog .open(AddPartModalComponent, { width: '480px' }) .beforeClosed() .subscribe((partNumbers: string) => { if (!partNumbers || !partNumbers.length || partNumbers.length === 0) return; const parts = partNumbers .split(/\r?\n/) .map((part: string) => part.trim()) .filter(part => part !== ''); this.addPartsToBom({ parts }); }); } private addPartsToBom(newParts: { parts: string[] }): void { if (newParts && newParts.parts) { this.analyticsService.googleTrackEvent(AnalyticsEvent.CLICK, { category: 'BOM', action: 'addParts', label: newParts.parts.length }); const multiRowModel = { bomId: this.bomId, partNumbers: newParts.parts, paginationRequest: this.paginationParams }; this.sockets.emitAction(ApiSocketEmitAction.ADD_MULTI_ROW, multiRowModel); } } }