/** * Email Testing Interface * Handles email preview, testing, and logging functionality */ class EmailTesting { constructor() { this.apiClient = new APIClient(); this.currentFilter = 'all'; // 'all', 'test', 'live' this.logLimit = 50; this.logOffset = 0; } /** * Initialize the email testing interface */ async init() { this.bindEvents(); await this.loadConfiguration(); await this.loadEmailLogs(); } /** * Bind event listeners to UI elements */ bindEvents() { // Quick test buttons document.getElementById('quick-test-btn').addEventListener('click', () => this.sendQuickTest()); document.getElementById('smtp-test-btn').addEventListener('click', () => this.testSMTPConnection()); // Email form buttons document.getElementById('preview-btn').addEventListener('click', () => this.previewEmail()); document.getElementById('send-test-btn').addEventListener('click', () => this.sendTestEmail()); // Log control buttons document.getElementById('refresh-logs-btn').addEventListener('click', () => this.loadEmailLogs()); document.getElementById('filter-test-btn').addEventListener('click', () => this.filterLogs('test')); document.getElementById('filter-all-btn').addEventListener('click', () => this.filterLogs('all')); // Form validation document.getElementById('email-test-form').addEventListener('input', () => this.validateForm()); } /** * Send a quick test email with default content */ async sendQuickTest() { const button = document.getElementById('quick-test-btn'); button.disabled = true; button.textContent = 'Sending...'; try { const response = await this.apiClient.post('/api/emails/test', { subject: 'Quick Test Email', message: 'This is a quick test email sent from the Alberta Influence Campaign Tool email testing interface.' }); if (response.success) { this.showMessage(`Test email sent successfully to ${response.sentTo}`, 'success'); await this.loadEmailLogs(); // Refresh logs } else { this.showMessage(`Failed to send test email: ${response.message}`, 'error'); } } catch (error) { this.showMessage(`Error sending test email: ${error.message}`, 'error'); } finally { button.disabled = false; button.textContent = 'Send Quick Test Email'; } } /** * Test SMTP connection */ async testSMTPConnection() { const button = document.getElementById('smtp-test-btn'); button.disabled = true; button.textContent = 'Testing...'; try { // Note: This endpoint would need to be added to the API const response = await this.apiClient.get('/api/test-smtp'); if (response.success) { this.showMessage('SMTP connection test successful', 'success'); } else { this.showMessage(`SMTP connection failed: ${response.message}`, 'error'); } } catch (error) { this.showMessage(`SMTP test error: ${error.message}`, 'error'); } finally { button.disabled = false; button.textContent = 'Test SMTP Connection'; } } /** * Preview email content */ async previewEmail() { const formData = this.getFormData(); if (!formData) return; const button = document.getElementById('preview-btn'); button.disabled = true; try { const recipientEmail = formData.recipientEmail || 'recipient@example.com'; const response = await this.apiClient.post('/api/emails/preview', { recipientEmail: recipientEmail, subject: formData.subject, message: formData.message }); if (response.success) { this.displayEmailPreview(response.preview, response.html); } else { this.showMessage(`Preview failed: ${response.message}`, 'error'); } } catch (error) { this.showMessage(`Preview error: ${error.message}`, 'error'); } finally { button.disabled = false; } } /** * Send test email */ async sendTestEmail() { const formData = this.getFormData(); if (!formData) return; const button = document.getElementById('send-test-btn'); button.disabled = true; button.textContent = 'Sending...'; try { const response = await this.apiClient.post('/api/emails/test', { subject: formData.subject, message: formData.message }); if (response.success) { this.showMessage(`Test email sent successfully to ${response.sentTo}`, 'success'); await this.loadEmailLogs(); // Refresh logs } else { this.showMessage(`Failed to send test email: ${response.message}`, 'error'); } } catch (error) { this.showMessage(`Error sending test email: ${error.message}`, 'error'); } finally { button.disabled = false; button.textContent = 'Send Test Email'; } } /** * Get form data and validate */ getFormData() { const subject = document.getElementById('test-subject').value.trim(); const message = document.getElementById('test-message').value.trim(); const recipientEmail = document.getElementById('test-recipient').value.trim(); if (!subject || !message) { this.showMessage('Please fill in subject and message', 'error'); return null; } return { subject, message, recipientEmail: recipientEmail || null }; } /** * Validate form and update button states */ validateForm() { const subject = document.getElementById('test-subject').value.trim(); const message = document.getElementById('test-message').value.trim(); const isValid = subject && message; document.getElementById('preview-btn').disabled = !isValid; document.getElementById('send-test-btn').disabled = !isValid; } /** * Display email preview */ displayEmailPreview(preview, html) { const previewDiv = document.getElementById('email-preview'); previewDiv.classList.remove('empty'); const testModeWarning = preview.testMode ? `