/** * Setup Wizard functionality */ function renderSetup() { const appElement = document.getElementById('app'); // Create setup wizard layout appElement.innerHTML = `

DMARQ Setup Wizard

1. Admin Account
2. System Configuration
3. Email Configuration

Create Admin Account

`; // Add event listeners and setup functionality for the wizard setupWizardEventListeners(); } function setupWizardEventListeners() { // Step 1: Admin Account setup const adminForm = document.getElementById('admin-setup-form'); if (adminForm) { adminForm.addEventListener('submit', (e) => { e.preventDefault(); const email = document.getElementById('admin-email').value; const username = document.getElementById('admin-username').value; const password = document.getElementById('admin-password').value; const confirmPassword = document.getElementById('admin-password-confirm').value; const errorElement = document.getElementById('admin-error'); // Simple validation if (password !== confirmPassword) { errorElement.textContent = 'Passwords do not match'; errorElement.classList.remove('hidden'); return; } // Store values (in a real app, you'd save these to the server) localStorage.setItem('setup_admin_email', email); localStorage.setItem('setup_admin_username', username); // Move to step 2 goToStep(2); }); } // Step 2: System Configuration const systemForm = document.getElementById('system-setup-form'); if (systemForm) { // Toggle Cloudflare settings visibility const enableCloudflare = document.getElementById('enable-cloudflare'); const cloudflareSettings = document.getElementById('cloudflare-settings'); enableCloudflare.addEventListener('change', () => { if (enableCloudflare.checked) { cloudflareSettings.classList.remove('hidden'); } else { cloudflareSettings.classList.add('hidden'); } }); // Previous button document.getElementById('system-prev-button').addEventListener('click', () => { goToStep(1); }); // Next button systemForm.addEventListener('submit', (e) => { e.preventDefault(); // Store values const appName = document.getElementById('app-name').value; const baseUrl = document.getElementById('base-url').value; localStorage.setItem('setup_app_name', appName); localStorage.setItem('setup_base_url', baseUrl); if (enableCloudflare.checked) { const cloudflareToken = document.getElementById('cloudflare-token').value; const cloudflareZone = document.getElementById('cloudflare-zone').value; // Store only the flag that Cloudflare is enabled // Credentials should be sent directly to backend, never stored client-side localStorage.setItem('setup_cloudflare_enabled', 'true'); // TODO: Send cloudflareToken and cloudflareZone to backend API instead of localStorage // For now, these credentials are not persisted client-side for security } // Move to step 3 goToStep(3); }); } // Step 3: Email Configuration const emailForm = document.getElementById('email-setup-form'); if (emailForm) { // Previous button document.getElementById('email-prev-button').addEventListener('click', () => { goToStep(2); }); // Test IMAP connection document.getElementById('test-imap-button').addEventListener('click', async () => { const testButton = document.getElementById('test-imap-button'); const resultSpan = document.getElementById('test-imap-result'); testButton.disabled = true; testButton.textContent = 'Testing...'; resultSpan.textContent = ''; try { // In a real app, you'd make an API call to test the connection // Here we'll just simulate it await new Promise(resolve => setTimeout(resolve, 1500)); resultSpan.textContent = '✓ Connection successful'; resultSpan.style.color = 'green'; } catch (error) { resultSpan.textContent = '✗ Connection failed'; resultSpan.style.color = 'red'; } finally { testButton.disabled = false; testButton.textContent = 'Test Connection'; } }); // Finish setup emailForm.addEventListener('submit', async (e) => { e.preventDefault(); const imapServer = document.getElementById('imap-server').value; const imapPort = document.getElementById('imap-port').value; const imapUsername = document.getElementById('imap-username').value; const imapPassword = document.getElementById('imap-password').value; const finishButton = document.getElementById('email-finish-button'); const errorElement = document.getElementById('email-error'); finishButton.disabled = true; finishButton.textContent = 'Completing Setup...'; errorElement.classList.add('hidden'); try { // In a real app, you'd send all the setup data to the server // For this example, we'll simulate the API call await new Promise(resolve => setTimeout(resolve, 2000)); // Update app state appState.isSetupComplete = true; // Redirect to login router.navigate('/login'); } catch (error) { errorElement.textContent = 'Setup failed: ' + (error.message || 'Unknown error'); errorElement.classList.remove('hidden'); finishButton.disabled = false; finishButton.textContent = 'Finish Setup'; } }); } } function goToStep(stepNumber) { // Hide all steps document.querySelectorAll('.setup-form').forEach(form => { form.classList.add('hidden'); }); // Show selected step document.getElementById(`setup-step-${stepNumber}`).classList.remove('hidden'); // Update step indicators document.querySelectorAll('.setup-step').forEach((step, index) => { if (index + 1 === stepNumber) { step.classList.add('active'); } else if (index + 1 < stepNumber) { step.classList.add('completed'); step.classList.remove('active'); } else { step.classList.remove('active', 'completed'); } }); }