/**
* 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
`;
// 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');
}
});
}