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: `
Fechar
✏️ Editar
Excluir `,
});
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: `
Cancelar
${isEdit ? 'Salvar' : 'Criar'} `,
});
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');
});
}