// Admin Panel JavaScript class AdminPanel { constructor() { this.currentCampaign = null; this.campaigns = []; this.authManager = null; } async init() { // Check authentication first if (typeof authManager !== 'undefined') { this.authManager = authManager; const isAuth = await this.authManager.checkSession(); if (!isAuth || !this.authManager.user?.isAdmin) { window.location.href = '/login.html'; return; } this.setupUserInterface(); } else { // Fallback if authManager not loaded window.location.href = '/login.html'; return; } this.setupEventListeners(); this.setupFormInteractions(); this.loadCampaigns(); } setupUserInterface() { // Add user info to header const adminHeader = document.querySelector('.admin-header .admin-container'); if (adminHeader && this.authManager.user) { const userInfo = document.createElement('div'); userInfo.style.cssText = 'position: absolute; top: 1rem; right: 2rem; color: white; font-size: 0.9rem;'; userInfo.innerHTML = ` Welcome, ${this.authManager.user.name || this.authManager.user.email} `; adminHeader.style.position = 'relative'; adminHeader.appendChild(userInfo); // Add logout event listener document.getElementById('logout-btn').addEventListener('click', () => { this.authManager.logout(); }); } } setupEventListeners() { } setupEventListeners() { // Tab navigation document.querySelectorAll('.nav-btn').forEach(btn => { btn.addEventListener('click', (e) => { const tab = e.target.dataset.tab; this.switchTab(tab); }); }); // Form submissions document.getElementById('create-campaign-form').addEventListener('submit', (e) => { this.handleCreateCampaign(e); }); document.getElementById('edit-campaign-form').addEventListener('submit', (e) => { this.handleUpdateCampaign(e); }); // Cancel buttons - using event delegation for proper handling document.addEventListener('click', (e) => { if (e.target.matches('[data-action="cancel-create"]')) { this.switchTab('campaigns'); } if (e.target.matches('[data-action="cancel-edit"]')) { this.switchTab('campaigns'); } }); this.loadCampaigns(); } setupFormInteractions() { // Create campaign button const createBtn = document.querySelector('[data-action="create-campaign"]'); if (createBtn) { createBtn.addEventListener('click', () => this.switchTab('create')); } // Cancel buttons const cancelCreateBtn = document.querySelector('[data-action="cancel-create"]'); if (cancelCreateBtn) { cancelCreateBtn.addEventListener('click', () => this.switchTab('campaigns')); } const cancelEditBtn = document.querySelector('[data-action="cancel-edit"]'); if (cancelEditBtn) { cancelEditBtn.addEventListener('click', () => this.switchTab('campaigns')); } // Handle checkbox changes for government levels document.querySelectorAll('input[name="target_government_levels"]').forEach(checkbox => { checkbox.addEventListener('change', () => { this.updateGovernmentLevelsPreview(); }); }); // Handle settings toggles document.querySelectorAll('input[type="checkbox"]').forEach(checkbox => { checkbox.addEventListener('change', () => { this.handleSettingsChange(checkbox); }); }); } switchTab(tabName) { // Hide all tabs document.querySelectorAll('.tab-content').forEach(tab => { tab.classList.remove('active'); }); // Remove active class from nav buttons document.querySelectorAll('.nav-btn').forEach(btn => { btn.classList.remove('active'); }); // Show selected tab const targetTab = document.getElementById(`${tabName}-tab`); if (targetTab) { targetTab.classList.add('active'); } // Update nav button const targetNavBtn = document.querySelector(`[data-tab="${tabName}"]`); if (targetNavBtn) { targetNavBtn.classList.add('active'); } // Special handling for different tabs if (tabName === 'campaigns') { this.loadCampaigns(); } else if (tabName === 'edit' && this.currentCampaign) { this.populateEditForm(); } } async loadCampaigns() { const loadingDiv = document.getElementById('campaigns-loading'); const listDiv = document.getElementById('campaigns-list'); loadingDiv.classList.remove('hidden'); listDiv.innerHTML = ''; try { const response = await window.apiClient.get('/admin/campaigns'); if (response.success) { this.campaigns = response.campaigns; this.renderCampaignList(); } else { throw new Error(response.error || 'Failed to load campaigns'); } } catch (error) { console.error('Load campaigns error:', error); this.showMessage('Failed to load campaigns: ' + error.message, 'error'); } finally { loadingDiv.classList.add('hidden'); } } renderCampaignList() { const listDiv = document.getElementById('campaigns-list'); if (this.campaigns.length === 0) { listDiv.innerHTML = `
Create your first campaign to get started.