กำลังโหลดข้อมูล...
cfg.fields.forEach(f=>{ if(f.type==='computed') return; const val = editingRec ? editingRec[f.key] : (f.default ?? ''); const field = document.createElement('div'); field.className='field'; if(f.type==='checkbox'){ field.innerHTML = `
`; } else if(f.type==='select'){ field.innerHTML = ``; } else if(f.type==='ref'){ const opts = (DB[f.ref]||[]).map(r=>``).join(''); field.innerHTML = ``; } else if(f.type==='textarea'){ field.innerHTML = ``; } else { field.innerHTML = ``; } form.appendChild(field); }); const errDiv = document.createElement('div'); errDiv.className='err'; errDiv.style.display='none'; form.appendChild(errDiv); const actions = document.createElement('div'); actions.className='modal-actions'; actions.innerHTML = ``; form.appendChild(actions); modal.appendChild(form); overlay.appendChild(modal); setTimeout(()=>{ document.getElementById('cancel-btn').onclick = ()=>{ state.modal=null; render(); }; if(key==='orders'){ document.getElementById('add-item-btn').onclick = addOrderItem; renderOrderItemsTable(); } form.onsubmit = async (e)=>{ e.preventDefault(); let rec = editingRec ? {...editingRec} : {id:uid()}; let missing = false; cfg.fields.forEach(f=>{ if(f.type==='computed') return; const inputEl = document.getElementById('f_'+f.key); if(f.type==='checkbox') rec[f.key] = inputEl.checked; else if(f.type==='number') rec[f.key] = inputEl.value===''? '' : Number(inputEl.value); else rec[f.key] = inputEl.value; if(f.required && !rec[f.key]) missing = true; }); if(key==='orders'){ rec.items = currentOrderItems.filter(it=>it.product && it.product.trim()); } if(missing){ errDiv.style.display='block'; errDiv.textContent='กรุณากรอกข้อมูลที่จำเป็น (*)'; return; } if(cfg.beforeSave) rec = cfg.beforeSave(rec, editingRec); const submitBtn = form.querySelector('button[type=submit]'); if(submitBtn){ submitBtn.disabled = true; submitBtn.textContent = 'กำลังบันทึก...'; } const ok = await persistUpsert(key, rec); if(!ok){ if(submitBtn){ submitBtn.disabled = false; submitBtn.textContent = 'บันทึก'; } return; } if(!editingRec) DB[key].push(rec); else { const idx = DB[key].findIndex(r=>r.id===rec.id); DB[key][idx]=rec; } if(cfg.afterSave) await cfg.afterSave(rec); state.modal=null; state.editing=null; render(); showToast('บันทึกเรียบร้อย'); }; },0); return overlay; } loadDB();