// ── Gears page logic ────────────────────────────────────────────────────────── let inventory = []; // UserGear[] let rigs = []; // Rig[] // ── Toast helper ───────────────────────────────────────────────────────────── function showToast(msg, type = 'success') { const el = document.createElement('div'); el.className = `toast align-items-center text-bg-${type} border-0 show`; el.innerHTML = `
No results found.
'; results.innerHTML = listHtml + ` `; if (all.length) { document.getElementById('catalogResultsList').addEventListener('click', e => { const btn = e.target.closest('[data-gear-id]'); if (!btn) return; chooseGear(parseInt(btn.dataset.gearId), btn.dataset.gearName); }); } document.getElementById('toggleSuggestGear').addEventListener('click', e => { e.preventDefault(); const box = document.getElementById('suggestGearForm'); if (box.innerHTML) { box.classList.toggle('d-none'); return; } box.classList.remove('d-none'); box.innerHTML = buildSuggestGearForm(); document.getElementById('suggestGearType').addEventListener('change', onSuggestTypeChange); document.getElementById('submitSuggestGear').addEventListener('click', submitSuggestGear); }); } catch(e) { results.innerHTML = 'Search failed.
'; } finally { spinner.classList.add('d-none'); } } function chooseGear(id, name) { document.getElementById('chosenGearId').value = id; document.getElementById('chosenGearName').textContent = name; document.getElementById('gearDetailsForm').classList.remove('d-none'); document.getElementById('confirmAddGearBtn').classList.remove('d-none'); document.getElementById('gearNickname').value = ''; document.getElementById('gearSerial').value = ''; document.getElementById('gearPurchase').value = ''; document.getElementById('gearNotes').value = ''; document.getElementById('addGearAlert').classList.add('d-none'); } document.getElementById('confirmAddGearBtn').addEventListener('click', async () => { const alertEl = document.getElementById('addGearAlert'); alertEl.classList.add('d-none'); const payload = { gear: parseInt(document.getElementById('chosenGearId').value), }; const nick = document.getElementById('gearNickname').value.trim(); const ser = document.getElementById('gearSerial').value.trim(); const pur = document.getElementById('gearPurchase').value; const not = document.getElementById('gearNotes').value.trim(); if (nick) payload.nickname = nick; if (ser) payload.serial_number = ser; if (pur) payload.purchase_date = pur; if (not) payload.notes = not; try { const ug = await apiPost('/inventory/', payload); inventory.push(ug); renderInventory(); addGearModal.hide(); showToast('Gear added to inventory!'); } catch(e) { alertEl.textContent = formatErrors(e.data); alertEl.classList.remove('d-none'); } }); // ── Edit UserGear ───────────────────────────────────────────────────────────── const editGearModal = new bootstrap.Modal('#editGearModal'); function openEditGear(id) { const ug = inventory.find(g => g.id === id); if (!ug) return; document.getElementById('editGearId').value = id; document.getElementById('editNickname').value = ug.nickname || ''; document.getElementById('editSerial').value = ug.serial_number || ''; document.getElementById('editPurchase').value = ug.purchase_date || ''; document.getElementById('editNotes').value = ug.notes || ''; document.getElementById('editGearAlert').classList.add('d-none'); editGearModal.show(); } document.getElementById('saveEditGearBtn').addEventListener('click', async () => { const id = parseInt(document.getElementById('editGearId').value); const alertEl = document.getElementById('editGearAlert'); alertEl.classList.add('d-none'); try { const updated = await apiPatch(`/inventory/${id}/`, { nickname: document.getElementById('editNickname').value.trim(), serial_number: document.getElementById('editSerial').value.trim(), purchase_date: document.getElementById('editPurchase').value || null, notes: document.getElementById('editNotes').value.trim(), }); const idx = inventory.findIndex(g => g.id === id); if (idx >= 0) inventory[idx] = updated; renderInventory(); editGearModal.hide(); showToast('Gear updated!'); } catch(e) { alertEl.textContent = formatErrors(e.data); alertEl.classList.remove('d-none'); } }); async function deleteGear(id) { if (!confirm('Remove this gear from your inventory?')) return; try { await apiDelete(`/inventory/${id}/`); inventory = inventory.filter(g => g.id !== id); renderInventory(); showToast('Gear removed.'); } catch(e) { showToast('Failed to delete gear.', 'danger'); } } // ── Rigs ────────────────────────────────────────────────────────────────────── function renderRigs() { const container = document.getElementById('rigCards'); const empty = document.getElementById('rigEmpty'); document.getElementById('rigSpinner').classList.add('d-none'); if (!rigs.length) { empty.classList.remove('d-none'); container.innerHTML = ''; return; } empty.classList.add('d-none'); container.innerHTML = rigs.map(rig => `${rig.description}
` : ''}No items yet.
'}Your suggestion will be available to you immediately and visible to everyone once an admin verifies it.