export async function renderMesas(container) { container.innerHTML = `
🟢 Livre   🔴 Ocupada (tem comanda aberta)   ⚫ Inativa
`; await loadMesas(); document.getElementById('btn-nova-mesa').addEventListener('click', () => abrirModalMesa()); document.getElementById('btn-refresh-mesas').addEventListener('click', loadMesas); } async function loadMesas() { const grid = document.getElementById('mesas-container'); if (!grid) return; grid.innerHTML = `
`; // Carrega mesas e comandas em paralelo para determinar ocupação const [mesasRes, comandasRes] = await Promise.all([ window.electronAPI.get('/mesas/'), window.electronAPI.get('/comandas/'), ]); if (!mesasRes.ok) { grid.innerHTML = `
Erro ao carregar mesas.
`; return; } const mesas = mesasRes.data; // IDs de mesas com pelo menos uma comanda ativa (OPEN ou PAYING) const mesasOcupadas = new Set(); if (comandasRes.ok) { comandasRes.data.forEach(c => { if ((c.status === 'OPEN' || c.status === 'PAYING') && c.mesa) mesasOcupadas.add(c.mesa); }); } if (!mesas.length) { grid.innerHTML = `
Nenhuma mesa cadastrada.
`; return; } grid.innerHTML = mesas.map(mesa => { const inativa = !mesa.active; const ocupada = !inativa && mesasOcupadas.has(mesa.id); const classe = inativa ? 'inativa' : (ocupada ? 'ocupada' : 'livre'); const icone = inativa ? '⚫' : (ocupada ? '🔴' : '🟢'); const statusTxt = inativa ? 'Inativa' : (ocupada ? 'Ocupada' : 'Livre'); return `
${mesa.name}
${icone} ${statusTxt}
${mesa.location ? `
${mesa.location}
` : ''}
`; }).join(''); // Click em cada mesa abre detalhes/ações grid.querySelectorAll('.mesa-card').forEach(card => { card.addEventListener('click', () => { const mesa = mesas.find(m => m.id === parseInt(card.dataset.id)); if (mesa) abrirDetalheMesa(mesa, mesasOcupadas.has(mesa.id)); }); }); } function abrirDetalheMesa(mesa, ocupada) { const inativa = !mesa.active; openModal({ title: mesa.name, body: `
${inativa ? 'Inativa' : (ocupada ? 'Ocupada' : 'Livre')} ${mesa.active ? 'Ativa no sistema' : ''}
${mesa.location ? `
📍 Localização: ${mesa.location}
` : ''}
`, footer: ` `, }); document.getElementById('btn-edit-mesa').addEventListener('click', () => { closeModal(); abrirModalMesa(mesa); }); document.getElementById('btn-del-mesa').addEventListener('click', async () => { const r = await window.electronAPI.delete(`/mesas/${mesa.id}/`); if (r.ok) { showToast('Mesa excluída!', 'success'); closeModal(); loadMesas(); } else showToast(r.error, 'error'); }); } function abrirModalMesa(mesa = null) { const isEdit = !!mesa; openModal({ title: isEdit ? `Editar: ${mesa.name}` : 'Nova Mesa', body: `
`, footer: ` `, }); document.getElementById('btn-salvar-mesa').addEventListener('click', async () => { const data = { name: document.getElementById('mesa-nome').value.trim(), location: document.getElementById('mesa-loc').value.trim(), active: document.getElementById('mesa-active').value === 'true', }; if (!data.name) return showToast('Informe o nome da mesa.', 'error'); const r = isEdit ? await window.electronAPI.put(`/mesas/${mesa.id}/`, data) : await window.electronAPI.post('/mesas/', data); if (r.ok) { showToast(isEdit ? 'Mesa atualizada!' : 'Mesa criada!', 'success'); closeModal(); loadMesas(); } else showToast(r.error, 'error'); }); }