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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-18 16:59:06 +07:00
|
|
|
async ngOnInit(): Promise<void> {
|
2024-01-05 11:54:31 +07:00
|
|
|
this._toppingService
|
|
|
|
|
.getToppingsOfRecipe(
|
2024-01-18 16:59:06 +07:00
|
|
|
await this._recipeService.getCurrentCountry(),
|
2024-01-05 11:54:31 +07:00
|
|
|
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(
|
2024-01-18 16:59:06 +07:00
|
|
|
await this._recipeService.getCurrentCountry(),
|
2024-01-05 11:54:31 +07:00
|
|
|
this._recipeService.getCurrentFile()
|
|
|
|
|
)
|
|
|
|
|
.subscribe((data) => {
|
|
|
|
|
this.allToppings = data;
|
2024-01-09 17:11:15 +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
|
|
|
|
2024-01-09 17:11:15 +07:00
|
|
|
// console.log(this.allToppingsDefinitions);
|
|
|
|
|
// 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 {
|
2024-01-09 17:11:15 +07:00
|
|
|
// console.log('newToppingListNoChange', value.toppingList);
|
2024-01-05 15:09:52 +07:00
|
|
|
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
|
|
|
}
|