diff --git a/public/app.js b/public/app.js index 22c8c88..59dfdc7 100644 --- a/public/app.js +++ b/public/app.js @@ -45,6 +45,11 @@ const elements = { userAdminPanel: document.getElementById('user-admin-panel'), adminUsersList: document.getElementById('admin-users-list'), btnAdminAddUser: document.getElementById('btn-admin-add-user'), + btnAdminTabUsers: document.getElementById('btn-admin-tab-users'), + btnAdminTabShares: document.getElementById('btn-admin-tab-shares'), + adminUsersSection: document.getElementById('admin-users-section'), + adminSharesSection: document.getElementById('admin-shares-section'), + adminSharesList: document.getElementById('admin-shares-list'), // Admin Create User Modal adminCreateUserModal: document.getElementById('admin-create-user-modal'), @@ -195,6 +200,10 @@ function registerEvents() { elements.adminCreateUserForm.addEventListener('submit', handleAdminCreateUser); elements.btnAdminConfirmDelete.addEventListener('click', handleAdminDeleteUser); + // Admin Sub-Tab Switchers + elements.btnAdminTabUsers.addEventListener('click', () => switchAdminSubTab('users')); + elements.btnAdminTabShares.addEventListener('click', () => switchAdminSubTab('shares')); + // Servings Scaler Buttons elements.scalerMinus.addEventListener('click', () => adjustMultiplier(-0.5)); elements.scalerPlus.addEventListener('click', () => adjustMultiplier(0.5)); @@ -1321,7 +1330,7 @@ function switchTab(tabName) { elements.userAdminPanel.style.display = 'block'; if (filters) filters.style.display = 'none'; activeTab = 'user-admin'; - fetchAdminUsers(); + switchAdminSubTab('users'); } lucide.createIcons(); @@ -1399,6 +1408,144 @@ function renderAdminUsers(users) { lucide.createIcons(); } +function switchAdminSubTab(subTabName) { + if (subTabName === 'users') { + elements.btnAdminTabUsers.classList.add('btn-primary'); + elements.btnAdminTabUsers.classList.remove('btn-outline'); + elements.btnAdminTabShares.classList.add('btn-outline'); + elements.btnAdminTabShares.classList.remove('btn-primary'); + + elements.adminUsersSection.style.display = 'block'; + elements.adminSharesSection.style.display = 'none'; + fetchAdminUsers(); + } else if (subTabName === 'shares') { + elements.btnAdminTabShares.classList.add('btn-primary'); + elements.btnAdminTabShares.classList.remove('btn-outline'); + elements.btnAdminTabUsers.classList.add('btn-outline'); + elements.btnAdminTabUsers.classList.remove('btn-primary'); + + elements.adminUsersSection.style.display = 'none'; + elements.adminSharesSection.style.display = 'block'; + fetchAdminSharedRecipes(); + } + lucide.createIcons(); +} + +async function fetchAdminSharedRecipes() { + try { + const response = await fetch('/api/admin/shared-recipes', { + headers: getAuthHeaders() + }); + + if (response.status === 401) { + logout(); + return; + } + + if (!response.ok) throw new Error('Failed to load shared recipe records.'); + + const recipes = await response.json(); + renderAdminSharedRecipes(recipes); + } catch (error) { + console.error('Error fetching admin shared recipes:', error); + } +} + +function renderAdminSharedRecipes(recipes) { + elements.adminSharesList.innerHTML = ''; + + if (recipes.length === 0) { + const tr = document.createElement('tr'); + tr.innerHTML = ` +