กำลังโหลดข้อมูล...
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();