// Admin dashboard functionality let items = []; let reservations = []; let currentView = 'grid'; // Default view mode // Check authentication function checkAuth() { const token = localStorage.getItem('token'); const role = localStorage.getItem('userRole'); if (!token || role !== 'admin') { window.location.href = '/index.html'; } } // Initialize page async function initializePage() { try { checkAuth(); await loadItems(); displayUserInfo(); setupEventListeners(); // Move this after displayUserInfo to ensure DOM is ready startAutoRefresh(); console.log('Page initialization complete'); } catch (error) { console.error('Error during page initialization:', error); throw error; // Re-throw to be caught by the outer try-catch } } // Reload content when language changes function reloadContent() { displayItems(); } // Make reloadContent available globally for translation manager window.reloadContent = reloadContent; // Display user info function displayUserInfo() { const username = localStorage.getItem('username'); document.getElementById('userInfo').textContent = `Admin: ${username}`; } // Load items from server async function loadItems() { try { console.log('Loading items...'); const response = await fetch('/api/items', { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` } }); const data = await response.json(); console.log('Received items:', data); if (!response.ok) { throw new Error(data.message || 'Failed to load items'); } items = data; displayItems(); } catch (error) { console.error('Error loading items:', error); alert('Failed to load items: ' + error.message); } } // Filter items based on search term function getFilteredItems() { const searchTerm = document.getElementById('searchInput') ? document.getElementById('searchInput').value.toLowerCase() : ''; if (searchTerm.trim() === '') { return items; } return items.filter(item => { const translationManager = window.ensureTranslationManager ? window.ensureTranslationManager() : null; if (translationManager) { const localizedItem = translationManager.getLocalizedItem(item); return localizedItem.name.toLowerCase().includes(searchTerm) || (localizedItem.description && localizedItem.description.toLowerCase().includes(searchTerm)) || item.location.toLowerCase().includes(searchTerm); } else if (window.getItemDisplayText) { const currentLang = localStorage.getItem('language') || 'nl'; const name = window.getItemDisplayText(item, 'name', currentLang); const description = window.getItemDisplayText(item, 'description', currentLang); return name.toLowerCase().includes(searchTerm) || description.toLowerCase().includes(searchTerm) || item.location.toLowerCase().includes(searchTerm); } else { // Fallback for when translation manager isn't loaded yet (default to Dutch) const name = item.name?.nl || item.name?.en || item.name || ''; const description = item.description?.nl || item.description?.en || item.description || ''; return name.toLowerCase().includes(searchTerm) || description.toLowerCase().includes(searchTerm) || item.location.toLowerCase().includes(searchTerm); } }); } // Display items based on current view mode function displayItems() { if (currentView === 'grid') { displayGridView(); } else { displayListView(); } } // Display items in grid view function displayGridView() { const itemsGrid = document.getElementById('itemsGrid'); document.getElementById('itemsList').classList.add('d-none'); itemsGrid.classList.remove('d-none'); const filteredItems = getFilteredItems(); itemsGrid.innerHTML = filteredItems.map(item => { // Use multiple fallback strategies const translationManager = window.ensureTranslationManager ? window.ensureTranslationManager() : null; let localizedItem; if (translationManager) { localizedItem = translationManager.getLocalizedItem(item); } else if (window.getItemDisplayText) { // Use debug helper fallback const currentLang = localStorage.getItem('language') || 'nl'; localizedItem = { ...item, name: window.getItemDisplayText(item, 'name', currentLang), description: window.getItemDisplayText(item, 'description', currentLang) }; } else { // Final fallback localizedItem = { ...item, name: (typeof item.name === 'object') ? (item.name?.nl || item.name?.en || 'Onbekend Artikel') : (item.name || 'Onbekend Artikel'), description: (typeof item.description === 'object') ? (item.description?.nl || item.description?.en || 'Geen beschrijving beschikbaar') : (item.description || 'Geen beschrijving beschikbaar') }; } return `
${localizedItem.description || 'No description available'}
Location: ${item.location}
Quantity: ${item.quantity}
Reserved: ${item.reserved || 0}
