import {Component, inject, input, OnInit, signal} from '@angular/core'; import { FormArray, FormBuilder, FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms"; import {NzColDirective} from "ng-zorro-antd/grid"; import {NzFlexDirective} from "ng-zorro-antd/flex"; import {NzFormControlComponent, NzFormItemComponent, NzFormLabelComponent} from "ng-zorro-antd/form"; import {NzInputDirective} from "ng-zorro-antd/input"; import {NzInputNumberComponent} from "ng-zorro-antd/input-number"; import {NzTableComponent} from "ng-zorro-antd/table"; import {CustomersService, GetCustomerDto, GetProductDto, GetSupplierDto} from "../../services/api"; import {NzOptionComponent, NzSelectComponent} from "ng-zorro-antd/select"; import {firstValueFrom} from "rxjs"; import {NzNotificationService} from "ng-zorro-antd/notification"; @Component({ selector: 'app-create-quotation-form', imports: [ FormsModule, NzColDirective, NzFlexDirective, NzFormControlComponent, NzFormItemComponent, NzFormLabelComponent, NzInputDirective, NzInputNumberComponent, NzTableComponent, ReactiveFormsModule, NzOptionComponent, NzSelectComponent ], templateUrl: './create-quotation-form.html', styleUrl: './create-quotation-form.css', }) export class CreateQuotationForm implements OnInit { private customersService = inject(CustomersService); private notificationService = inject(NzNotificationService); suppliers = input.required(); products = input.required(); customers = signal([]); async ngOnInit() { try { const customers = await firstValueFrom(this.customersService.getAllCustomersEndpoint()) this.customers.set(customers); } catch { this.notificationService.error('Erreur', 'Erreur de communication avec l\'API') } } createQuotationForm: FormGroup = new FormGroup({ message: new FormControl(null, Validators.required), conditionsSale: new FormControl(null, Validators.required), supplierId: new FormControl(null, Validators.required), customerId: new FormControl(null, Validators.required), lines: new FormArray([], Validators.required), }) get lines(): FormArray { return this.createQuotationForm.get('lines') as FormArray; } getDefaultSupplier() { let defaultSupplier: GetSupplierDto = this.suppliers()[0]; let maxProducts = 0; const selectedProducts = this.products().map(x => x.id); this.suppliers().forEach(x => { const supplierProductsCount = x.prices.filter(p => selectedProducts.includes(p.productId)).length ?? 0; if (supplierProductsCount > maxProducts) { maxProducts = supplierProductsCount; defaultSupplier = x; } }) return defaultSupplier; } addProductToForm() { this.lines.clear(); this.products().forEach(x => { this.lines.push( new FormGroup({ productId: new FormControl(x.id), name: new FormControl(x.name), quantity: new FormControl(1, [Validators.required, Validators.min(1)]) }) ); }); this.createQuotationForm.patchValue({ supplierId: this.getDefaultSupplier().id, }); } }