update brew route

Signed-off-by: pakintada@gmail.com <Pakin>
This commit is contained in:
pakintada@gmail.com 2026-02-24 17:32:51 +07:00
parent 7075f4a664
commit 29a1a82cfb
12 changed files with 344 additions and 203 deletions

View file

@ -8,14 +8,18 @@
import { columns, type RecipelistMaterial } from './columns';
import { get, readable, writable } from 'svelte/store';
import { materialFromMachineQuery } from '$lib/core/stores/recipeStore';
import { materialFromMachineQuery, materialFromServerQuery } from '$lib/core/stores/recipeStore';
import { generateIcing } from '$lib/helpers/icingGen';
import { machineInfoStore } from '$lib/core/stores/machineInfoStore';
import MachineInfo from '../machine-info.svelte';
import { v4 as uuidv4 } from 'uuid';
//
let { recipeData, onPendingChange }: { recipeData: any; onPendingChange: any } = $props();
let {
recipeData,
onPendingChange,
refPage
}: { recipeData: any; onPendingChange: any; refPage: string } = $props();
let menuName: string = $state('');
@ -31,9 +35,12 @@
if (materialSnapshot) {
let d_cnt = 0;
for (let rpl of data) {
let mat = materialSnapshot.filter(
(x: any) => x['id'].toString() === rpl['materialPathId'].toString()
)[0];
let mat =
refPage == 'brew'
? materialSnapshot.filter(
(x: any) => x['id'].toString() === rpl['materialPathId'].toString()
)[0]
: materialSnapshot[rpl['materialPathId']];
// console.log('mat filter get', Object(mat), Object.keys(mat));
@ -99,7 +106,14 @@
if (recipeData) {
menuName =
recipeData['name'] ?? (recipeData['otherName'] ? recipeData['otherName'] : 'Not set');
materialSnapshot = get(materialFromMachineQuery);
if (refPage == 'overview') {
materialSnapshot = get(materialFromServerQuery);
} else if (refPage == 'brew') {
materialSnapshot = get(materialFromMachineQuery);
}
console.log(`detail : ${JSON.stringify(recipeData)}`);
recipeListMatState = remappingToColumn(recipeData['recipes']);
// save old value\

View file

@ -1,5 +1,5 @@
<script lang="ts">
import { recipeFromMachineQuery } from '$lib/core/stores/recipeStore';
import { recipeFromMachineQuery, recipeFromServerQuery } from '$lib/core/stores/recipeStore';
import { onMount } from 'svelte';
import { MediaQuery } from 'svelte/reactivity';
import { get } from 'svelte/store';
@ -72,6 +72,15 @@
}
}
} else if (refPage === 'overview') {
let recipeServerSnapshot = get(recipeFromServerQuery) ?? {};
let recipe01Snap = recipeServerSnapshot['recipe'];
if (recipe01Snap) {
currentData = recipe01Snap[productCode] ?? {};
console.log(`current data : ${JSON.stringify(Object.keys(recipe01Snap))}`);
if (currentData.MenuStatus) {
currentMenuStatus = matchMenuStatus(currentData.MenuStatus);
}
}
}
});
</script>
@ -89,7 +98,7 @@
</Dialog.Header>
<!-- render more -->
<RecipeDetail recipeData={currentData} {onPendingChange} />
<RecipeDetail recipeData={currentData} {onPendingChange} {refPage} />
</Dialog.Content>
</Dialog.Root>
{:else}{/if}

View file

@ -1,12 +1,14 @@
import { get, writable } from 'svelte/store';
import { addNotification, notiStore } from '../stores/noti';
import {
materialFromServerQuery,
recipeData,
recipeDataError,
recipeLoading,
recipeOverviewData,
recipeStreamMeta
} from '../stores/recipeStore';
import { buildOverviewFromServer } from '$lib/data/recipeService';
export const messages = writable<string[]>([]);
@ -82,6 +84,39 @@ const handlers: Record<string, (payload: any) => void> = {
},
stream_data_end: (p) => {
recipeLoading.set(false);
// build overview for recipe from server
//
buildOverviewFromServer();
},
stream_data_extra: (p) => {
// extended data from server, may be extra infos
//
// expected last stream_id + count
let exid = p.exid;
let extp = p.extp;
let ex_payload = p.payload;
if (extp) {
// know type
switch (extp) {
case 'matset':
let curr_mat_query = get(materialFromServerQuery);
// ex_payload has chunks of material setting
for (let m of ex_payload) {
let mid = m.id;
curr_mat_query[mid] = m;
}
materialFromServerQuery.set(curr_mat_query);
break;
case 'topplist':
break;
case 'toppgrp':
break;
}
}
},
stream_patch_update: (p) => {}
};

View file

@ -21,6 +21,9 @@ export const recipeFromMachine = writable<any>(null);
export const recipeFromMachineLoading = writable(false);
export const recipeFromMachineError = writable<string | null>(null);
export const recipeFromServerQuery = writable<any>({});
export const materialFromServerQuery = writable<any>({});
// NOTE: must not have any nested structures
// { recipe: {}, materials: {}, toppings: { groups: {}, lists: {} } }
export const recipeFromMachineQuery = writable<any>({});

View file

View file

@ -0,0 +1,140 @@
import {
materialFromServerQuery,
recipeData,
recipeFromServerQuery,
recipeOverviewData
} from '$lib/core/stores/recipeStore';
import { get } from 'svelte/store';
import type { RecipeOverview } from '../../routes/(authed)/recipe/overview/columns';
function getMenuStatus(ms: number): RecipeOverview['status'] {
switch (ms) {
case 0:
return 'ready';
case 2:
return 'obsolete';
case 11:
return 'pending/online';
case 12:
return 'pending/offline';
default:
return 'drafted';
}
}
function getMenuCategory(pd: string): string {
// [country_code]-[category_code]-[drink_Type]-[id]
let pd_spl = pd.split('-');
let category = pd_spl[1] ?? '';
if (category) {
if (category.endsWith('1')) {
let result = 'coffee';
if (category === '01') {
result += ',v1';
} else {
result += ',v2+';
}
return result;
} else if (category.endsWith('2')) {
return 'tea';
} else if (category.endsWith('3')) {
return 'milk';
} else if (category.endsWith('4')) {
return 'whey';
} else if (category.endsWith('5')) {
return 'soda';
} else if (category == '99') {
return 'special';
}
}
return 'unknown';
}
function getDrinkType(pd: string): string {
// [country_code]-[category_code]-[drink_Type]-[id]
let pd_spl = pd.split('-');
let drink_type = pd_spl[2] ?? '';
if (drink_type) {
if (drink_type.endsWith('1')) {
return 'hot';
} else if (drink_type.endsWith('2')) {
return 'cold / iced';
} else if (drink_type.endsWith('3')) {
return 'smoothie / frappe';
}
}
return '';
}
// set material used in recipe to tags for using in filter
function getMainMaterialOfRecipe(rp: any): string {
let recipeList = rp['recipes'] ?? [];
let mat_lists = '';
for (let rpl of recipeList) {
let mat_id = rpl['materialPathId'];
let mat_in_use = rpl['isUse'];
if (mat_in_use && !mat_lists.includes(mat_id)) {
mat_lists += mat_id + ',';
}
}
mat_lists = mat_lists.substring(0, mat_lists.length - 1);
return mat_lists;
}
function buildTags(rp: any): string {
let result = '';
result += getMenuCategory(rp['productCode']);
let dt = getDrinkType(rp['productCode']);
let mats = getMainMaterialOfRecipe(rp);
if (dt !== '') result += ',' + dt;
if (mats !== '') result += ',' + mats;
return result;
}
function buildOverviewFromServer() {
let server_recipe01 = get(recipeData);
let result = [];
let r01_query: any = {};
if (server_recipe01) {
recipeOverviewData.set([]);
for (let rp of server_recipe01) {
result.push({
productCode: rp['productCode'] ?? '<not set>',
name: rp['name'] ? rp['name'] : (rp['otherName'] ?? '<not set>'),
description: rp['desciption'] ? rp['desciption'] : (rp['otherDescription'] ?? '<not set>'),
tags: buildTags(rp),
status: getMenuStatus(rp['MenuStatus'])
});
r01_query[rp['productCode']] = rp;
}
let currentQuery = get(recipeFromServerQuery);
let currentMaterial = get(materialFromServerQuery);
currentQuery = {
recipe: r01_query,
material: currentMaterial
};
recipeOverviewData.set(result);
recipeFromServerQuery.set(currentQuery);
}
}
export { buildOverviewFromServer };