Taobin-Recipe-Manager/client/src/app/features/recipes/recipe-details/recipe-toppingset/recipe-toppingset.component.ts

221 lines
6.3 KiB
TypeScript
Raw Normal View History

2024-01-05 11:54:31 +07:00
import { NgFor } from '@angular/common';
import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';
2024-01-05 15:09:52 +07:00
import {
FormArray,
FormBuilder,
FormsModule,
ReactiveFormsModule,
} from '@angular/forms';
2024-01-05 11:54:31 +07:00
import { forEach, isEqual } from 'lodash';
2024-01-05 15:09:52 +07:00
import {
Topping,
ToppingGroup,
ToppingList,
ToppingSet,
} from 'src/app/core/models/recipe.model';
2024-01-05 11:54:31 +07:00
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,
2024-01-05 15:09:52 +07:00
imports: [
NgFor,
FormsModule,
ReactiveFormsModule,
CommonModule,
NgSelectModule,
],
2024-01-05 11:54:31 +07:00
})
export class RecipeToppingsetComponent implements OnInit {
@Input() productCode!: string;
@Output() toppingSetChange = new EventEmitter<unknown[]>();
allToppings: Topping | undefined = undefined;
2024-01-05 15:09:52 +07:00
allToppingsDefinitions:
| { groupId: string; name: string; members: string; default: string }[]
| null = [{ groupId: '0', name: 'none', members: '0', default: '0' }];
2024-01-08 10:37:31 +07:00
allToppingMembersByGroup: {
id: string;
members: { id: string; name: string }[];
}[] = [];
2024-01-05 11:54:31 +07:00
private _toppingSetOriginalArray!: ToppingSet[];
constructor(
private _recipeService: RecipeService,
private _toppingService: ToppingService,
2024-01-05 15:09:52 +07:00
private _formBuilder: FormBuilder
2024-01-05 11:54:31 +07:00
) {}
2024-01-05 15:09:52 +07:00
toppingForm = this._formBuilder.group(
{
2024-01-05 11:54:31 +07:00
toppingList: this._formBuilder.array([]),
2024-01-05 15:09:52 +07:00
},
{ updateOn: 'blur' }
);
2024-01-05 11:54:31 +07:00
get toppingList(): FormArray {
return this.toppingForm.get('toppingList') as FormArray;
}
ngOnInit(): void {
this._toppingService
.getToppingsOfRecipe(
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(
2024-01-05 15:09:52 +07:00
this._formBuilder.group({
isUse: toppingSet.isUse,
groupID: toppingSet.groupID,
defaultIDSelect: toppingSet.defaultIDSelect,
ListGroupID: toppingSet.ListGroupID,
})
);
});
2024-01-05 11:54:31 +07:00
2024-01-08 10:37:31 +07:00
// console.log('controls', this.toppingList.controls);
2024-01-05 11:54:31 +07:00
// this.toppingSetChange.emit(this.toppingSetList);
});
2024-01-05 15:09:52 +07:00
// fetch all toppings : group and list
2024-01-05 11:54:31 +07:00
this._toppingService
.getToppings(
this._recipeService.getCurrentCountry(),
this._recipeService.getCurrentFile()
)
.subscribe((data) => {
this.allToppings = data;
2024-01-05 15:09:52 +07:00
console.log('allToppings', data);
2024-01-05 11:54:31 +07:00
data.ToppingGroup.forEach((group: ToppingGroup) => {
2024-01-05 15:09:52 +07:00
if (this.allToppingsDefinitions != null) {
2024-01-05 11:54:31 +07:00
// this.allToppingsDefinitions = {};
2024-01-05 15:09:52 +07:00
this.allToppingsDefinitions.push({
groupId: group.groupID,
name: group.name,
members: group.idInGroup,
2024-01-08 10:37:31 +07:00
default: group.idDefault,
2024-01-05 15:09:52 +07:00
});
this.allToppingMembersByGroup.push({
id: group.groupID,
2024-01-08 10:37:31 +07:00
members: this.mapToppingListToMember(group.idInGroup.split(',')),
2024-01-05 15:09:52 +07:00
});
2024-01-05 11:54:31 +07:00
}
2024-01-05 15:09:52 +07:00
});
2024-01-05 11:54:31 +07:00
console.log(this.allToppingsDefinitions);
2024-01-05 15:09:52 +07:00
console.log('allToppingMembersByGroup', this.allToppingMembersByGroup);
2024-01-05 11:54:31 +07:00
});
2024-01-05 15:09:52 +07:00
this.toppingForm.valueChanges.subscribe((value) => {
//validator
for (let i = 0; i < value.toppingList!.length; i++) {
let toppingSet = value.toppingList![i] as any;
2024-01-05 11:54:31 +07:00
2024-01-05 15:09:52 +07:00
// handle null case
if (toppingSet.defaultIDSelect == null) {
toppingSet.defaultIDSelect = 0;
2024-01-05 11:54:31 +07:00
}
2024-01-05 15:09:52 +07:00
// handle null case
if (toppingSet.groupID == null) {
toppingSet.groupID = '0';
}
2024-01-05 11:54:31 +07:00
2024-01-05 15:09:52 +07:00
// handle null case
if (!Array.isArray(toppingSet.ListGroupID)) {
toppingSet.ListGroupID = [parseInt(toppingSet.groupID), 0, 0, 0];
}
}
let isDiff = !isEqual(this._toppingSetOriginalArray, value.toppingList!);
2024-01-05 11:54:31 +07:00
2024-01-05 15:09:52 +07:00
if (isDiff) {
let newToppingSetList: any[] = [];
2024-01-05 11:54:31 +07:00
2024-01-05 15:09:52 +07:00
forEach(value.toppingList!, (toppingSet: any) => {
// transform value
toppingSet.defaultIDSelect = parseInt(toppingSet.defaultIDSelect);
2024-01-05 11:54:31 +07:00
2024-01-05 15:09:52 +07:00
newToppingSetList.push(toppingSet);
});
2024-01-05 11:54:31 +07:00
2024-01-08 10:37:31 +07:00
// console.log('newToppingList', newToppingSetList);
2024-01-05 15:09:52 +07:00
this.toppingSetChange.emit(newToppingSetList as unknown[]);
} else {
console.log('newToppingListNoChange', value.toppingList);
this.toppingSetChange.emit([]);
}
});
2024-01-05 11:54:31 +07:00
}
// match group id to its name
getGroupName(groupID: string) {
// check if array
2024-01-05 15:09:52 +07:00
if (Array.isArray(this.allToppings!.ToppingGroup)) {
return (this.allToppings!.ToppingGroup as ToppingGroup[]).find(
(group) => group.groupID == groupID
)?.name;
2024-01-05 11:54:31 +07:00
} else {
return undefined;
}
}
2024-01-05 15:09:52 +07:00
openToppingList(i: any) {
console.log('select', i);
2024-01-05 11:54:31 +07:00
}
2024-01-05 15:09:52 +07:00
currentGroupId(i: any) {
console.log('currentGroupId', i);
2024-01-05 11:54:31 +07:00
return (this.toppingForm.value.toppingList![i] as any).groupID as string;
}
2024-01-05 15:09:52 +07:00
getMembersByGroupId(groupID: string) {
2024-01-08 10:37:31 +07:00
return this.allToppingMembersByGroup.find((x) => x.id == groupID)?.members;
2024-01-05 15:09:52 +07:00
}
getGroupIdByIndex(i: number) {
2024-01-08 10:37:31 +07:00
// console.log("getGroupId",this.toppingList.value![i])
return (this.toppingList.value![i] as any).groupID as string;
2024-01-05 15:09:52 +07:00
}
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,
};
});
2024-01-08 10:37:31 +07:00
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);
}
});
}
2024-01-05 11:54:31 +07:00
2024-01-05 15:09:52 +07:00
compareFunc = (a: any, b: any) => a.toString() === b.toString();
2024-01-05 11:54:31 +07:00
}