import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { BomQuantity, ListItemModel, Utils } from '@arrow/bom/core'; import { FormControl } from '@angular/forms'; // TODO: Causes circular dependency error cuz Row model from List module has dependency upon ListItemModel from core module. // Either move Row into Core module or ListItemModel into List module? // import { Row } from '@arrow/bom/list'; @Component({ selector: 'bom-part-quantity', templateUrl: './bom-part-quantity.component.html', styleUrls: ['./bom-part-quantity.component.scss'] }) export class BomPartQuantityComponent implements OnInit { @Input() row: any; @Input() quantityColumn: BomQuantity; @Input() disabled: boolean; @Input() validateStock = false; @Input() arrowReel = false; /* eslint-disable-next-line @angular-eslint/no-input-rename */ @Input('control') qtyCtrl: FormControl; @Output() quantityChange: EventEmitter = new EventEmitter(); @Output() buy: EventEmitter = new EventEmitter(); /* eslint-disable-next-line @angular-eslint/no-output-rename */ @Output('buying-options') buyingOptions: EventEmitter = new EventEmitter(); item : ListItemModel; quantityId: string; isSelected: boolean; isValid = true; userUploadedQuantity : number; isAutoRounded : boolean = false; translatedInputAriaLabel: string = ""; translatedAddToCartAriaLabel: string = ""; constructor(private utils: Utils) {} ngOnInit() { this.item = this.row.item; this.quantityId = this.quantityColumn.key; this.isSelected = this.quantityColumn.isActive; this.isValid = this._isQuantityValid(this.validateStock, this.item); this.translatedInputAriaLabel = this.isSelected ? this.utils.translateByKeyWithFallback('edit-part-quantity', '', { active: this.isSelected ? this.utils.translateByKeyWithFallback("active", "active") : "", quantityColumnName: this.utils.translateByKeyWithFallback(this.quantityColumn.nameId, this.quantityColumn.name), partName: this.item.partName }) // Pattern: "Edit {active} {quantityColumnName} value for {item.partName}" : this.utils.translateByKeyWithFallback('read-part-quantity', '', { quantityColumnName: this.utils.translateByKeyWithFallback(this.quantityColumn.nameId, this.quantityColumn.name), partName: this.item.partName }) // Pattern: "Read {quantityColumnName} value for {item.partName}" this.translatedAddToCartAriaLabel = this.utils.translateByKeyWithFallback('add-part-quantity-to-cart', '', { active: this.isSelected ? this.utils.translateByKeyWithFallback("active", "active") : "", quantityColumnName: this.utils.translateByKeyWithFallback(this.quantityColumn.nameId, this.quantityColumn.name), partName: this.item.partName }); // Pattern: "Add {active} {quantityColumnName} for {item.partName} to Cart" this.isAutoRounded = this.item?.quantities?.find(q => q.autoRoundedState?.isAutoRounded) != undefined; // At least one quantity is auto-rounded // TODO: replace with the next line if requirement is to display label only for actually auto-rounded quantities // this.isAutoRounded = this.item?.quantities?.find(q => q.id === this.quantityId.key && q.autoRoundedState?.isAutoRounded) !== undefined; this.userUploadedQuantity = this.getUserUploadedQuantity(this.quantityId, this.row); } onQuantityChange(quantity: string): void { this.quantityChange.emit(Number(quantity)); } onBuy(): void { this.buy.emit(null); } showBuyingOptions(item: ListItemModel) { // Disable showing the qty edit modal if not multiplier or item/prices still loading & if not a match if (item.multiplier === 1 || item.priceSourceLoading || item.isLoading) return; this.buyingOptions.emit(null); // this.buyingOptionsModal(row, false); } /** * Check if item quantity is valid (if prices loaded, within stock, over min quantity & within increment) * @param validateStock * @param item * @returns quantity valid true/false */ private _isQuantityValid( validateStock: boolean, item: ListItemModel ): boolean { // TODO: This validation is working backwards, return true when invalid and false when valid. Need fix if (!validateStock) { // When in MyArrow mode we don't care about stock return ( !item.priceSourceLoading && (!!((item.quantity + item.inCart) % item.increment) || item.quantity + item.inCart < item.minQuantity) ); } return ( !item.priceSourceLoading && (!!!item.stock || item.quantity + item.inCart > item.stock || !!((item.quantity + item.inCart) % item.increment) || item.quantity + item.inCart < item.minQuantity) ); } private getUserUploadedQuantity(quantityId: string, row: any): number | null { if (row.userUploadData?.uploadedQuantities) { return row.userUploadData.uploadedQuantities.find(x => x.id == quantityId)?.displayQuantity || null; } return null; } }