parent
7075f4a664
commit
29a1a82cfb
12 changed files with 344 additions and 203 deletions
|
|
@ -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\
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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) => {}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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>({});
|
||||
|
|
|
|||
140
src/lib/data/recipeService.ts
Normal file
140
src/lib/data/recipeService.ts
Normal 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 };
|
||||
Loading…
Add table
Add a link
Reference in a new issue