// frontend/static/js/main.js // Global state let currentProfile = null; async function initializeApp() { try { console.log('Initializing app...'); // Cargar perfiles const profiles = await apiRequest('/profiles'); console.log('Profiles loaded:', profiles); // Obtener último perfil usado const lastProfileId = localStorage.getItem('lastProfileId') || 'default'; console.log('Last profile ID:', lastProfileId); // Actualizar selector de perfiles updateProfileSelector(profiles); // Seleccionar el último perfil usado const selectedProfile = profiles.find(p => p.id === lastProfileId) || profiles[0]; if (selectedProfile) { console.log('Selecting profile:', selectedProfile.id); await selectProfile(selectedProfile.id); } // Cargar grupos de scripts y restaurar la última selección await restoreScriptGroup(); // Actualizar la interfaz updateWorkDirDisplay(); } catch (error) { console.error('Error initializing app:', error); showError('Failed to initialize application'); } } async function restoreScriptGroup() { try { // Primero cargar los grupos disponibles await loadScriptGroups(); // Luego intentar restaurar el último grupo seleccionado const lastGroupId = localStorage.getItem('lastGroupId'); if (lastGroupId) { console.log('Restoring last group:', lastGroupId); const groupSelect = document.getElementById('groupSelect'); if (groupSelect) { groupSelect.value = lastGroupId; if (groupSelect.value) { // Verifica que el valor se haya establecido correctamente await loadGroupScripts(lastGroupId); } else { console.log('Selected group no longer exists:', lastGroupId); localStorage.removeItem('lastGroupId'); } } } } catch (error) { console.error('Error restoring script group:', error); } } // Función para restaurar el último estado async function restoreLastState() { const lastProfileId = localStorage.getItem('lastProfileId'); const lastGroupId = localStorage.getItem('lastGroupId'); console.log('Restoring last state:', { lastProfileId, lastGroupId }); if (lastProfileId) { const profileSelect = document.getElementById('profileSelect'); profileSelect.value = lastProfileId; await selectProfile(lastProfileId); } if (lastGroupId) { const groupSelect = document.getElementById('groupSelect'); if (groupSelect) { groupSelect.value = lastGroupId; await loadGroupScripts(lastGroupId); } } } // API functions async function apiRequest(endpoint, options = {}) { try { const response = await fetch(`/api${endpoint}`, { ...options, headers: { 'Content-Type': 'application/json', ...options.headers } }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || 'API request failed'); } return await response.json(); } catch (error) { console.error('API Error:', error); showError(error.message); throw error; } } async function loadProfiles() { try { const profiles = await apiRequest('/profiles'); updateProfileSelector(profiles); // Obtener último perfil usado const lastProfileId = localStorage.getItem('lastProfileId'); // Seleccionar perfil guardado o el default const defaultProfile = profiles.find(p => p.id === (lastProfileId || 'default')) || profiles[0]; if (defaultProfile) { await selectProfile(defaultProfile.id); } } catch (error) { showError('Failed to load profiles'); } } async function selectProfile(profileId) { try { console.log('Selecting profile:', profileId); currentProfile = await apiRequest(`/profiles/${profileId}`); // Guardar en localStorage localStorage.setItem('lastProfileId', profileId); console.log('Profile ID saved to storage:', profileId); // Actualizar explícitamente el valor del combo const select = document.getElementById('profileSelect'); if (select) { select.value = profileId; console.log('Updated profileSelect value to:', profileId); } updateWorkDirDisplay(); // Recargar scripts con el último grupo seleccionado await restoreScriptGroup(); } catch (error) { console.error('Error in selectProfile:', error); showError('Failed to load profile'); } } // Initialize when page loads document.addEventListener('DOMContentLoaded', initializeApp); function updateProfileSelector(profiles) { const select = document.getElementById('profileSelect'); const lastProfileId = localStorage.getItem('lastProfileId') || 'default'; console.log('Updating profile selector. Last profile ID:', lastProfileId); // Construir las opciones select.innerHTML = profiles.map(profile => ` `).join(''); // Asegurar que el valor seleccionado sea correcto select.value = lastProfileId; console.log('Set profileSelect value to:', lastProfileId); } async function changeProfile() { const select = document.getElementById('profileSelect'); if (select.value) { await selectProfile(select.value); await loadScriptGroups(); // Reload scripts when profile changes } } // Work directory functions function updateWorkDirDisplay() { const input = document.getElementById('workDirPath'); if (input && currentProfile) { input.value = currentProfile.work_dir || ''; } } async function selectWorkDir() { try { console.log('Requesting directory selection...'); // Debug const response = await apiRequest('/select-directory'); console.log('Directory selection response:', response); // Debug if (response.path) { console.log('Updating profile with new work_dir:', response.path); // Debug const updateResponse = await apiRequest(`/profiles/${currentProfile.id}`, { method: 'PUT', body: JSON.stringify({ ...currentProfile, work_dir: response.path }) }); console.log('Profile update response:', updateResponse); // Debug await selectProfile(currentProfile.id); showSuccess('Work directory updated successfully'); } } catch (error) { console.error('Error in selectWorkDir:', error); // Debug showError('Failed to update work directory'); } } // Output functions function showError(message) { const output = document.getElementById('outputArea'); const timestamp = new Date().toLocaleTimeString(); output.innerHTML += `\n[${timestamp}] ERROR: ${message}`; output.scrollTop = output.scrollHeight; } function showSuccess(message) { const output = document.getElementById('outputArea'); const timestamp = new Date().toLocaleTimeString(); output.innerHTML += `\n[${timestamp}] SUCCESS: ${message}`; output.scrollTop = output.scrollHeight; } function clearOutput() { const output = document.getElementById('outputArea'); output.innerHTML = ''; } // Modal helper functions function closeModal(button) { const modal = button.closest('.modal'); if (modal) { modal.remove(); } } // Global error handler window.addEventListener('unhandledrejection', function(event) { console.error('Unhandled promise rejection:', event.reason); showError('An unexpected error occurred'); }); // Export functions for use in other modules window.showError = showError; window.showSuccess = showSuccess; window.closeModal = closeModal; window.currentProfile = currentProfile;