Spaces:
Running
Running
document.addEventListener('DOMContentLoaded', () => { | |
const tbody = document.getElementById('inventoryBody'); | |
const modal = document.getElementById('inventoryModal'); | |
const form = document.getElementById('actionForm'); | |
// Buttons | |
const editBtn = document.getElementById('editBtn'); | |
const saveBtn = document.getElementById('saveBtn'); | |
const cancelBtn = document.getElementById('cancelBtn'); | |
const deleteBtn = document.getElementById('deleteBtn'); | |
const sellBtn = document.getElementById('sellBtn'); | |
const useBtn = document.getElementById('useBtn'); | |
let currentId = null; | |
async function loadInventory() { | |
const res = await fetch('/api/inventory'); | |
const items = await res.json(); | |
tbody.innerHTML = items.map(item => ` | |
<tr data-id="${item.id}"> | |
<td>${item.id}</td> | |
<td>${item.name}</td> | |
<td>${item.type}</td> | |
<td>${item.color}</td> | |
<td>${item.quantity}</td> | |
<td>${item.price}</td> | |
<td>${item.note || ''}</td> | |
<td><button class="action-btn">Action</button></td> | |
</tr> | |
`).join(''); | |
document.querySelectorAll('.action-btn').forEach(btn => { | |
btn.onclick = openModal; | |
}); | |
} | |
function openModal(e) { | |
const row = e.target.closest('tr'); | |
currentId = row.dataset.id; | |
// Fill form values | |
form.id.value = currentId; | |
form.name.value = row.children[1].textContent; | |
form.type.value = row.children[2].textContent; | |
form.color.value = row.children[3].textContent; | |
form.quantity.value = row.children[4].textContent; | |
form.price.value = row.children[5].textContent; | |
form.note.value = row.children[6].textContent; | |
setFormDisabled(true); | |
saveBtn.style.display = 'none'; | |
modal.style.display = 'block'; | |
} | |
function setFormDisabled(disabled) { | |
form.name.disabled = disabled; | |
form.type.disabled = disabled; | |
form.color.disabled = disabled; | |
form.quantity.disabled = disabled; | |
form.price.disabled = disabled; | |
form.note.disabled = disabled; | |
} | |
// Cancel closes modal | |
cancelBtn.onclick = () => { | |
modal.style.display = 'none'; | |
setFormDisabled(true); | |
saveBtn.style.display = 'none'; | |
}; | |
// Edit button - enables fields | |
editBtn.onclick = () => { | |
setFormDisabled(false); | |
saveBtn.style.display = 'inline-block'; | |
}; | |
// Save edited item | |
form.onsubmit = async (e) => { | |
e.preventDefault(); | |
const updated = { | |
name: form.name.value, | |
type: form.type.value, | |
color: form.color.value, | |
quantity: parseInt(form.quantity.value), | |
price: parseFloat(form.price.value), | |
note: form.note.value | |
}; | |
const res = await fetch(`/api/inventory/${currentId}`, { | |
method: 'PUT', | |
headers: { 'Content-Type': 'application/json' }, | |
body: JSON.stringify(updated) | |
}); | |
if (res.ok) { | |
modal.style.display = 'none'; | |
await loadInventory(); | |
} else { | |
alert('Failed to update.'); | |
} | |
}; | |
// Delete | |
deleteBtn.onclick = async () => { | |
if (!confirm('Delete this item?')) return; | |
const res = await fetch(`/api/inventory/${currentId}`, { method: 'DELETE' }); | |
if (res.ok) { | |
modal.style.display = 'none'; | |
await loadInventory(); | |
} else { | |
alert('Delete failed.'); | |
} | |
}; | |
// Sell | |
sellBtn.onclick = async () => { | |
const qty = prompt("Quantity to sell:", 1); | |
const quantity = parseInt(qty, 10); | |
if (!qty || isNaN(quantity) || quantity <= 0) return alert('Invalid quantity'); | |
const res = await fetch(`/api/inventory/${currentId}/sell`, { | |
method: 'POST', | |
headers: { 'Content-Type': 'application/json' }, | |
body: JSON.stringify({ quantity, payerType: "non-member" }) | |
}); | |
if (res.ok) { | |
modal.style.display = 'none'; | |
await loadInventory(); | |
} else { | |
alert('Sell failed.'); | |
} | |
}; | |
// Use | |
useBtn.onclick = async () => { | |
const qty = prompt("Quantity to use:", 1); | |
const quantity = parseInt(qty, 10); | |
if (!qty || isNaN(quantity) || quantity <= 0) return alert('Invalid quantity'); | |
const res = await fetch(`/api/inventory/${currentId}/use`, { | |
method: 'POST', | |
headers: { 'Content-Type': 'application/json' }, | |
body: JSON.stringify({ quantity }) | |
}); | |
if (res.ok) { | |
modal.style.display = 'none'; | |
await loadInventory(); | |
} else { | |
alert('Use failed.'); | |
} | |
}; | |
// Initial load | |
loadInventory(); | |
}); | |