// frontend/static/js/scripts.js // Script groups state let scriptGroups = []; // Load script groups when page loads document.addEventListener('DOMContentLoaded', async () => { await loadScriptGroups(); }); // Load script groups when page loads document.addEventListener('DOMContentLoaded', async () => { await loadScriptGroups(); }); async function loadScriptGroups() { try { // Obtener los grupos desde el servidor const groups = await apiRequest('/script-groups'); console.log('Loaded script groups:', groups); // Obtener el selector y el último grupo seleccionado const select = document.getElementById('groupSelect'); const lastGroupId = localStorage.getItem('lastGroupId'); console.log('Last group ID:', lastGroupId); // Remover event listener anterior si existe select.removeEventListener('change', handleGroupChange); // Construir las opciones select.innerHTML = ` ${groups.map(group => ` `).join('')} `; // Agregar event listener para cambios select.addEventListener('change', handleGroupChange); console.log('Added change event listener to groupSelect'); // Si hay un grupo guardado, cargarlo if (lastGroupId) { console.log('Loading last group scripts:', lastGroupId); await loadGroupScripts(lastGroupId); } } catch (error) { console.error('Error al cargar grupos de scripts:', error); showError('Error al cargar grupos de scripts'); } } // Función para manejar el cambio de grupo async function handleGroupChange(event) { const groupId = event.target.value; console.log('Group selection changed:', groupId); if (groupId) { localStorage.setItem('lastGroupId', groupId); console.log('Saved lastGroupId:', groupId); } else { localStorage.removeItem('lastGroupId'); console.log('Removed lastGroupId'); } await loadGroupScripts(groupId); } // Actualizar función de cambio de perfil para mantener la persistencia async function changeProfile() { const select = document.getElementById('profileSelect'); if (select.value) { await selectProfile(select.value); localStorage.setItem('lastProfileId', select.value); // Al cambiar de perfil, intentamos mantener el último grupo seleccionado const lastGroupId = localStorage.getItem('lastGroupId'); if (lastGroupId) { const groupSelect = document.getElementById('groupSelect'); if (groupSelect) { groupSelect.value = lastGroupId; await loadGroupScripts(lastGroupId); } } } } async function loadGroupScripts(groupId) { const scriptList = document.getElementById('scriptList'); if (!groupId) { scriptList.style.display = 'none'; localStorage.removeItem('lastGroupId'); // Limpiar selección return; } // Guardar grupo seleccionado localStorage.setItem('lastGroupId', groupId); console.log('Group saved:', groupId); if (!currentProfile?.work_dir) { scriptList.innerHTML = `

Por favor, seleccione primero un directorio de trabajo

`; scriptList.style.display = 'block'; return; } try { console.log('Loading data for group:', groupId); // Actualizar el selector para reflejar la selección actual const groupSelect = document.getElementById('groupSelect'); if (groupSelect && groupSelect.value !== groupId) { groupSelect.value = groupId; } // Cargar y loguear scripts let groupScripts, configSchema; try { groupScripts = await apiRequest(`/script-groups/${groupId}/scripts`); console.log('Scripts loaded:', groupScripts); } catch (e) { console.error('Error loading scripts:', e); throw e; } try { configSchema = await apiRequest(`/script-groups/${groupId}/config-schema`); console.log('Config schema loaded:', configSchema); } catch (e) { console.error('Error loading config schema:', e); throw e; } // Intentar cargar configuración actual let currentConfig = {}; try { currentConfig = await apiRequest( `/workdir-config/${encodeURIComponent(currentProfile.work_dir)}/group/${groupId}` ); console.log('Current config loaded:', currentConfig); } catch (e) { console.warn('No existing configuration found, using defaults'); } // Verificar que tenemos los datos necesarios if (!groupScripts || !configSchema) { throw new Error('Failed to load required data'); } console.log('Rendering UI with:', { groupScripts, configSchema, currentConfig }); scriptList.innerHTML = `

${configSchema.group_name || 'Configuración'}

${configSchema.description || ''}

${Object.entries(configSchema.config_schema || {}).map(([key, field]) => `
${generateFormField(key, field, currentConfig[key])}
`).join('')}
${groupScripts.map(script => `

${script.name || script.id}

${script.description || 'Sin descripción disponible'}

`).join('')}
`; scriptList.style.display = 'block'; // Agregar evento para guardar configuración const form = document.getElementById('groupConfigForm'); form.addEventListener('submit', async (e) => { e.preventDefault(); await saveGroupConfig(groupId, form); }); } catch (error) { console.error('Error in loadGroupScripts:', error); showError('Failed to load scripts and configuration'); } } // Update script groups display function updateScriptGroupsDisplay() { const container = document.getElementById('scriptGroups'); if (!scriptGroups.length) { container.innerHTML = '

No script groups available

'; return; } container.innerHTML = scriptGroups.map(group => `

${group.name}

${group.scripts.map(script => `

${script.name}

${script.description || 'No description available'}

`).join('')}
`).join(''); } // Run a script async function runScript(groupId, scriptId) { if (!currentProfile?.work_dir) { showError('Please select a work directory first'); return; } try { const result = await apiRequest(`/scripts/${groupId}/${scriptId}/run`, { method: 'POST', body: JSON.stringify({ work_dir: currentProfile.work_dir, profile: currentProfile }) }); if (result.status === 'error') { showError(result.error); } else { showSuccess(`Script ${scriptId} executed successfully`); if (result.output) { const output = document.getElementById('outputArea'); output.innerHTML += `\n[${new Date().toLocaleTimeString()}] ${result.output}`; output.scrollTop = output.scrollHeight; } } } catch (error) { showError(`Failed to run script: ${error.message}`); } } // Configure script group async function configureGroup(groupId) { if (!currentProfile?.work_dir) { showError('Please select a work directory first'); return; } try { const config = await getGroupConfig(groupId); showGroupConfigEditor(groupId, config); } catch (error) { showError('Failed to load group configuration'); } } // Show group configuration editor function showGroupConfigEditor(groupId, config) { const group = scriptGroups.find(g => g.id === groupId); if (!group) return; const modal = document.createElement('div'); modal.className = 'modal active'; modal.innerHTML = ` `; document.body.appendChild(modal); } function generateFormField(key, field, currentValue) { switch (field.type) { case 'string': return ` `; case 'number': return ` `; case 'boolean': return ` `; case 'select': return ` `; default: return ``; } } async function loadGroupScripts(groupId) { const scriptList = document.getElementById('scriptList'); if (!groupId) { scriptList.style.display = 'none'; localStorage.removeItem('lastGroupId'); return; } if (!currentProfile?.work_dir) { scriptList.innerHTML = `

Por favor, seleccione primero un directorio de trabajo

`; scriptList.style.display = 'block'; return; } try { console.log('Loading data for group:', groupId); // Cargar y loguear scripts let groupScripts, configSchema; try { groupScripts = await apiRequest(`/script-groups/${groupId}/scripts`); console.log('Scripts loaded:', groupScripts); } catch (e) { console.error('Error loading scripts:', e); throw e; } try { configSchema = await apiRequest(`/script-groups/${groupId}/config-schema`); console.log('Config schema loaded:', configSchema); } catch (e) { console.error('Error loading config schema:', e); throw e; } // Intentar cargar configuración actual let currentConfig = {}; try { console.log('Loading current config for work_dir:', currentProfile.work_dir); currentConfig = await apiRequest( `/workdir-config/${encodeURIComponent(currentProfile.work_dir)}/group/${groupId}` ); console.log('Current config loaded:', currentConfig); } catch (e) { console.warn('No existing configuration found, using defaults'); } // Verificar que tenemos los datos necesarios if (!groupScripts || !configSchema) { throw new Error('Failed to load required data'); } console.log('Rendering UI with:', { groupScripts, configSchema, currentConfig }); scriptList.innerHTML = `

${configSchema.group_name || 'Configuración'}

${configSchema.description || ''}

${Object.entries(configSchema.config_schema || {}).map(([key, field]) => `
${generateFormField(key, field, currentConfig[key])}
`).join('')}
${groupScripts.map(script => `

${script.name || script.id}

${script.description || 'Sin descripción disponible'}

`).join('')}
`; scriptList.style.display = 'block'; // Agregar evento para guardar configuración const form = document.getElementById('groupConfigForm'); form.addEventListener('submit', async (e) => { e.preventDefault(); await saveGroupConfig(groupId, form); }); } catch (error) { console.error('Error in loadGroupScripts:', error); showError('Failed to load scripts and configuration'); } } async function editConfigSchema(groupId) { try { const schema = await apiRequest(`/script-groups/${groupId}/config-schema`); const configSection = document.createElement('div'); configSection.id = 'schemaEditor'; configSection.className = 'mb-6 bg-white shadow sm:rounded-lg'; configSection.innerHTML = `

Editar Configuración del Esquema

Parámetros

${Object.entries(schema.config_schema).map(([key, param]) => `
${param.type === 'select' ? `
` : ''}
`).join('')}
`; // Insertamos el editor justo después del botón "Edit Schema" const scriptList = document.getElementById('scriptList'); const existingEditor = document.getElementById('schemaEditor'); if (existingEditor) { existingEditor.remove(); } scriptList.insertBefore(configSection, scriptList.firstChild); } catch (error) { showError('Error al cargar el esquema de configuración'); } } function createModal(title, content, onSave = null) { const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-gray-500 bg-opacity-75 flex items-center justify-center z-50 p-4'; modal.innerHTML = `

${title}

${content}
${onSave ? ` ` : ''}
`; document.body.appendChild(modal); return modal; } function addParameter(button) { const parametersDiv = button.closest('.space-y-4').querySelector('#parameters'); const newParam = document.createElement('div'); newParam.className = 'parameter-item bg-gray-50 p-4 rounded-md relative'; newParam.innerHTML = `
`; parametersDiv.appendChild(newParam); } function removeParameter(button) { button.closest('.parameter-item').remove(); } function handleTypeChange(select) { const paramItem = select.closest('.parameter-item'); const optionsDiv = paramItem.querySelector('[name="param_options"]')?.closest('div'); if (select.value === 'select') { if (!optionsDiv) { const div = document.createElement('div'); div.className = 'col-span-2'; div.innerHTML = ` `; paramItem.querySelector('.grid').appendChild(div); } } else { optionsDiv?.remove(); } } async function saveConfigSchema(groupId, modal) { const form = modal.querySelector('div'); const schema = { group_name: form.querySelector('[name="group_name"]').value, description: form.querySelector('[name="description"]').value, config_schema: {} }; // Recopilar parámetros form.querySelectorAll('.parameter-item').forEach(item => { const name = item.querySelector('[name="param_name"]').value; const type = item.querySelector('[name="param_type"]').value; const description = item.querySelector('[name="param_description"]').value; const defaultValue = item.querySelector('[name="param_default"]').value; const param = { type, description, default: type === 'boolean' ? defaultValue === 'true' : defaultValue }; if (type === 'select') { const options = item.querySelector('[name="param_options"]').value .split(',') .map(opt => opt.trim()) .filter(Boolean); param.options = options; } schema.config_schema[name] = param; }); try { await apiRequest(`/script-groups/${groupId}/config-schema`, { method: 'PUT', body: JSON.stringify(schema) }); closeModal(modal.querySelector('button')); showSuccess('Configuration schema updated successfully'); // Recargar la página para mostrar los cambios loadGroupScripts(groupId); } catch (error) { showError('Failed to update configuration schema'); } } function showScriptForm(script) { const modal = document.createElement('div'); modal.className = 'modal active'; modal.innerHTML = ` `; document.body.appendChild(modal); }