Personal finance, cloud synced.
Masrofy V6.5 — responsive UI, budget guardrails, debts and gold fixes.
Jewelry':opts.map(x=>``).join('');if(t!=='jewelry'){const selected=$('g_item').value||opts[0]?.[0];$('g_item').value=selected;const w=opts.find(x=>x[0]===selected)?.[1];if(w)$('g_grams').value=w;$('g_grams').readOnly=false}else{$('g_grams').readOnly=false}} function goldItemChanged(){const t=$('g_type').value,item=$('g_item').value,opts=goldOptions(t),w=opts.find(x=>x[0]===item)?.[1];if(w&&$('g_grams'))$('g_grams').value=w} async function saveGold(id){try{const type=$('g_type').value,item=$('g_item').value,grams=Number($('g_grams').value||0),purity=Number($('g_purity').value||24);if(grams<=0)throw Error('Weight must be greater than zero');await upsert('assets',{id:id||uid(),name:item,type:'gold',asset_category_id:null,value:grams,note:JSON.stringify({goldType:type,item,purity,purchaseDate:$('g_date').value,purchase:Number($('g_purchase').value||0),manualWeight:true})});closeForm();render();toast('Saved')}catch(e){toast(e.message)}} >