const ADMIN_CODE_KEY = 'adminBoxCode'; const adminCodeInput = document.getElementById('admin-code'); const loadButton = document.getElementById('load-boxes'); const saveButton = document.getElementById('save-boxes'); const adminForm = document.getElementById('admin-form'); const adminActions = document.getElementById('admin-actions'); const adminMessage = document.getElementById('admin-message'); adminCodeInput.value = localStorage.getItem(ADMIN_CODE_KEY) || ''; function setAdminMessage(message) { adminMessage.textContent = message; } function apiBase() { return `${window.location.protocol}//${window.location.host}/api`; } function boxCard(box, index) { const boxNumber = index + 1; const imageValue = box.image || ''; const imagePreview = imageValue ? `box${boxNumber} preview` : '
No picture
'; return `

box${boxNumber}

${box.sku || `BOX-${String(boxNumber).padStart(3, '0')}`}
${imagePreview}
`; } function renderBoxes(boxes) { adminForm.innerHTML = boxes.map(boxCard).join(''); adminForm.style.display = 'grid'; adminActions.style.display = 'flex'; adminForm.querySelectorAll('.admin-image').forEach(input => { input.addEventListener('input', () => { const card = input.closest('.admin-box-card'); const oldPreview = card.querySelector('.admin-image-preview, .admin-image-placeholder'); const value = input.value.trim(); const replacement = document.createElement(value ? 'img' : 'div'); if (value) { replacement.className = 'admin-image-preview'; replacement.src = value; replacement.alt = `${card.querySelector('h2').textContent} preview`; } else { replacement.className = 'admin-image-placeholder'; replacement.textContent = 'No picture'; } oldPreview.replaceWith(replacement); }); }); } async function loadBoxes() { const code = adminCodeInput.value.trim(); localStorage.setItem(ADMIN_CODE_KEY, code); setAdminMessage('Loading boxes...'); const response = await fetch(`${apiBase()}/admin/boxes`); const data = await response.json(); if (!data.success) { setAdminMessage(data.message || 'Could not load boxes.'); return; } renderBoxes(data.boxes); setAdminMessage('Boxes loaded. Make changes, then save.'); } function collectBoxes() { return Array.from(adminForm.querySelectorAll('.admin-box-card')).map((card, index) => { const boxNumber = index + 1; return { _id: card.dataset.id || `box-${boxNumber}`, name: `box${boxNumber}`, sku: `BOX-${String(boxNumber).padStart(3, '0')}`, price: Number(card.querySelector('.admin-price').value || 0), image: card.querySelector('.admin-image').value.trim(), description: card.querySelector('.admin-description').value.trim(), stock: 100, isActive: true, }; }); } async function saveBoxes() { const code = adminCodeInput.value.trim(); if (!code) { setAdminMessage('Enter the admin code before saving.'); return; } localStorage.setItem(ADMIN_CODE_KEY, code); setAdminMessage('Saving boxes...'); const response = await fetch(`${apiBase()}/admin/boxes`, { method: 'PUT', headers: { 'Content-Type': 'application/json', 'x-admin-code': code, }, body: JSON.stringify({ boxes: collectBoxes() }), }); const data = await response.json(); if (data.success) { renderBoxes(data.boxes); setAdminMessage('Saved. The order page and home menu now use these box details.'); } else { setAdminMessage(data.message || 'Save failed.'); } } loadButton.addEventListener('click', loadBoxes); saveButton.addEventListener('click', saveBoxes); if (adminCodeInput.value) { loadBoxes(); }