feat: showing recipe list values

- add displaying for values in recipe list, with some editable fields except topping, string params, feed pattern/level

Signed-off-by: pakintada@gmail.com <Pakin>
This commit is contained in:
pakintada@gmail.com 2026-03-04 13:28:14 +07:00
parent 4866674f26
commit dbb5ce466c
14 changed files with 640 additions and 37 deletions

View file

@ -137,4 +137,137 @@ function buildOverviewFromServer() {
}
}
export { buildOverviewFromServer };
const rangeMaterialMapping: { [key: string]: (id: number) => boolean } = {
soda: (id: number) => id == 1031,
water: (id: number) => id == 1,
ice: (id: number) => id == 9100,
whipper: (id: number) => id == 8102,
bean: (id: number) => inRange(1001, 1009, id) || inRange(1100, 1199, id),
leaves: (id: number) => inRange(1600, 1799, id),
syrup: (id: number) =>
inRange(1032, 1039, id) || inRange(1020, 1030, id) || inRange(1200, 1299, id),
powder: (id: number) => inRange(1040, 1080, id) || inRange(1300, 1399, id),
cup: (id: number) => inRange(9500, 9549, id),
lid: (id: number) => inRange(9600, 9649, id),
straw: (id: number) => inRange(9700, 9749, id),
icecream: (id: number) => inRange(2100, 2200, id),
topping: (id: number) => inRange(8110, 8130, id)
};
function inRange(min: number, max: number, value: number) {
// console.log(min, max, value, value >= min && value <= max);
return value >= min && value <= max;
}
function getCategories() {
let keys = Object.keys(rangeMaterialMapping);
keys.push('equipment');
return keys;
}
function getMaterialType(materialId: number) {
for (const key of Object.keys(rangeMaterialMapping)) {
if (rangeMaterialMapping[key](materialId)) {
return key;
}
}
return 'others';
}
function isNonMaterial(materialId: number) {
// test cup, lid, straw
return (
rangeMaterialMapping['cup'](materialId) ||
rangeMaterialMapping['lid'](materialId) ||
rangeMaterialMapping['straw'](materialId) ||
rangeMaterialMapping['whipper'](materialId) ||
rangeMaterialMapping['ice'](materialId)
);
}
const MATERIAL_INTER_GUARD = 300000;
// Inter mode checker
function convertFromInterProductCode(materialId: number) {
if (materialId > MATERIAL_INTER_GUARD) {
try {
let pure_id = materialId.toString().slice(2);
return parseInt(pure_id);
} catch (e) {}
}
return materialId;
}
// Extract material id from display
function extractMaterialIdFromDisplay(material_id: string): number {
// console.log('extracting from ', material_id);
let mat_split = material_id.split(' ');
let pure_mat_id = mat_split[mat_split.length - 1] ?? '0';
try {
// console.log('pure mat', pure_mat_id);
let mat_id_int = parseInt(pure_mat_id.replace('(', '').replace(')', '').trim());
return mat_id_int;
} catch (ignored) {}
return -1;
}
// StringParam
class StringParam {
StringParam: string;
extractedParams: { [key: string]: any } = {};
constructor(StringParam: string) {
this.StringParam = StringParam;
}
extract() {
// split by ,
const params = this.StringParam.split(',');
for (const param of params) {
const [key, value] = param.split('=');
if (key != '') {
this.extractedParams[key] = value;
}
}
return this;
}
as_list() {
let res: { pkey: string; pvalue: any }[] = [];
// iter through param
for (let p of Object.keys(this.extractedParams)) {
res.push({
pkey: p,
pvalue: this.extractedParams[p]
});
}
return res;
}
}
const stringParamsDefinition: { [key: string]: string } = {
'esp-v2-press-value': 'Current 100 x mA ( 10 - 24 )'
};
const conditionTests: { [key: string]: (arg: any) => boolean } = {
'not-zero': (arg: any) => arg != 0,
zero: (arg: any) => arg == 0,
'false-if-another-exist': (arg: any) => arg[1] != undefined
};
export {
buildOverviewFromServer,
StringParam,
convertFromInterProductCode,
getMaterialType,
getCategories,
isNonMaterial,
extractMaterialIdFromDisplay
};