import { NgFor } from '@angular/common'; import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core'; import { FormArray, FormBuilder, FormsModule, ReactiveFormsModule, } from '@angular/forms'; import { forEach, isEqual } from 'lodash'; import { Topping, ToppingGroup, ToppingList, ToppingSet, } from 'src/app/core/models/recipe.model'; import { RecipeService } from 'src/app/core/services/recipe.service'; import { ToppingService } from 'src/app/core/services/topping.service'; import { NgSelectModule } from '@ng-select/ng-select'; import { CommonModule } from '@angular/common'; @Component({ selector: 'app-recipe-toppingset', templateUrl: './recipe-toppingset.component.html', standalone: true, imports: [ NgFor, FormsModule, ReactiveFormsModule, CommonModule, NgSelectModule, ], }) export class RecipeToppingsetComponent implements OnInit { @Input() productCode!: string; @Output() toppingSetChange = new EventEmitter(); allToppings: Topping | undefined = undefined; allToppingsDefinitions: | { groupId: string; name: string; members: string; default: string }[] | null = [{ groupId: '0', name: 'none', members: '0', default: '0' }]; allToppingMembersByGroup: { id: string; members: { id: string; name: string }[]; }[] = []; private _toppingSetOriginalArray!: ToppingSet[]; constructor( private _recipeService: RecipeService, private _toppingService: ToppingService, private _formBuilder: FormBuilder ) {} toppingForm = this._formBuilder.group( { toppingList: this._formBuilder.array([]), }, { updateOn: 'blur' } ); get toppingList(): FormArray { return this.toppingForm.get('toppingList') as FormArray; } async ngOnInit(): Promise { this._toppingService .getToppingsOfRecipe( await this._recipeService.getCurrentCountry(), this._recipeService.getCurrentFile(), this.productCode ) .subscribe((data) => { // this.toppingForm.patchValue({toppingList: data}); this._toppingSetOriginalArray = data; data.forEach((toppingSet: ToppingSet) => { this.toppingList.push( this._formBuilder.group({ isUse: toppingSet.isUse, groupID: toppingSet.groupID, defaultIDSelect: toppingSet.defaultIDSelect, ListGroupID: toppingSet.ListGroupID, }) ); }); // console.log('controls', this.toppingList.controls); // this.toppingSetChange.emit(this.toppingSetList); }); // fetch all toppings : group and list this._toppingService .getToppings( await this._recipeService.getCurrentCountry(), this._recipeService.getCurrentFile() ) .subscribe((data) => { this.allToppings = data; // console.log('allToppings', data); data.ToppingGroup.forEach((group: ToppingGroup) => { if (this.allToppingsDefinitions != null) { // this.allToppingsDefinitions = {}; this.allToppingsDefinitions.push({ groupId: group.groupID, name: group.name, members: group.idInGroup, default: group.idDefault, }); this.allToppingMembersByGroup.push({ id: group.groupID, members: this.mapToppingListToMember(group.idInGroup.split(',')), }); } }); // console.log(this.allToppingsDefinitions); // console.log('allToppingMembersByGroup', this.allToppingMembersByGroup); }); this.toppingForm.valueChanges.subscribe((value) => { //validator for (let i = 0; i < value.toppingList!.length; i++) { let toppingSet = value.toppingList![i] as any; // handle null case if (toppingSet.defaultIDSelect == null) { toppingSet.defaultIDSelect = 0; } // handle null case if (toppingSet.groupID == null) { toppingSet.groupID = '0'; } // handle null case if (!Array.isArray(toppingSet.ListGroupID)) { toppingSet.ListGroupID = [parseInt(toppingSet.groupID), 0, 0, 0]; } } let isDiff = !isEqual(this._toppingSetOriginalArray, value.toppingList!); if (isDiff) { let newToppingSetList: any[] = []; forEach(value.toppingList!, (toppingSet: any) => { // transform value toppingSet.defaultIDSelect = parseInt(toppingSet.defaultIDSelect); newToppingSetList.push(toppingSet); }); // console.log('newToppingList', newToppingSetList); this.toppingSetChange.emit(newToppingSetList as unknown[]); } else { // console.log('newToppingListNoChange', value.toppingList); this.toppingSetChange.emit([]); } }); } // match group id to its name getGroupName(groupID: string) { // check if array if (Array.isArray(this.allToppings!.ToppingGroup)) { return (this.allToppings!.ToppingGroup as ToppingGroup[]).find( (group) => group.groupID == groupID )?.name; } else { return undefined; } } openToppingList(i: any) { console.log('select', i); } currentGroupId(i: any) { console.log('currentGroupId', i); return (this.toppingForm.value.toppingList![i] as any).groupID as string; } getMembersByGroupId(groupID: string) { return this.allToppingMembersByGroup.find((x) => x.id == groupID)?.members; } getGroupIdByIndex(i: number) { // console.log("getGroupId",this.toppingList.value![i]) return (this.toppingList.value![i] as any).groupID as string; } mapToppingListToMember = (mm: string[]) => mm.map((m) => { // find actual topping from toppingList let actualTopping = this.allToppings!.ToppingList.find((t) => t.id == m); return { id: actualTopping!.id, name: actualTopping?.name == null ? m : actualTopping!.name, }; }); getDefaultOfGroup(groupID: any) { this.toppingList.controls.forEach((control) => { if ((control.value as any).groupID == groupID) { let newDefault = this.allToppingsDefinitions!.find( (x) => x.groupId == groupID )!.default; // set new defaultid control.get('defaultIDSelect')?.setValue(newDefault); } }); } compareFunc = (a: any, b: any) => a.toString() === b.toString(); }