diff --git a/app.py b/app.py index 150e464..2ddc32a 100644 --- a/app.py +++ b/app.py @@ -2,6 +2,7 @@ from flask import Flask, render_template, request, jsonify from flask_sock import Sock from config_manager import ConfigurationManager import os +import json # Added import app = Flask(__name__) sock = Sock(app) @@ -159,5 +160,35 @@ def handle_logs(): return jsonify({"status": "success" if success else "error"}) +@app.route("/api/group-description/", methods=["GET", "POST"]) +def handle_group_description(group): + description_path = os.path.join( + config_manager.script_groups_path, group, "description.json" + ) + + if request.method == "GET": + try: + with open(description_path, "r", encoding="utf-8") as f: + return jsonify(json.load(f)) + except FileNotFoundError: + return jsonify( + { + "name": group, + "description": "Sin descripción", + "version": "1.0", + "author": "Unknown", + } + ) + else: # POST + try: + data = request.json + os.makedirs(os.path.dirname(description_path), exist_ok=True) + with open(description_path, "w", encoding="utf-8") as f: + json.dump(data, f, indent=2, ensure_ascii=False) + return jsonify({"status": "success"}) + except Exception as e: + return jsonify({"status": "error", "message": str(e)}), 500 + + if __name__ == "__main__": app.run(debug=True) diff --git a/backend/script_groups/example_group/description.json b/backend/script_groups/example_group/description.json index 0e0f8c1..dd93ecb 100644 --- a/backend/script_groups/example_group/description.json +++ b/backend/script_groups/example_group/description.json @@ -1,6 +1,6 @@ { - "name": "Grupo de Ejemplo", - "description": "Scripts de demostración que muestran las funcionalidades básicas del sistema", - "version": "1.0", - "author": "Admin" -} + "name": "Grupo de Ejemplo Auto", + "description": "Scripts de demostración que muestran las funcionalidades básicas del sistema.", + "version": "1.0", + "author": "Admin" +} \ No newline at end of file diff --git a/backend/script_groups/example_group/esquema.json b/backend/script_groups/example_group/esquema.json index 74e1f04..d51d1a3 100644 --- a/backend/script_groups/example_group/esquema.json +++ b/backend/script_groups/example_group/esquema.json @@ -1,21 +1,30 @@ { "type": "object", "properties": { + "debug_mode": { + "type": "boolean", + "title": "Modo Debug", + "description": "Activar logging detallado" + }, + "process_type": { + "type": "string", + "title": "Tipo de Proceso", + "description": "Nivel de procesamiento a aplicar", + "enum": [ + "basic", + "advanced", + "full" + ] + }, "project_name": { "type": "string", "title": "Nombre del Proyecto", "description": "Identificador único del proyecto" }, - "process_type": { + "campo_1739099176331": { "type": "string", - "title": "Tipo de Proceso", - "enum": ["basic", "advanced", "full"], - "description": "Nivel de procesamiento a aplicar" - }, - "debug_mode": { - "type": "boolean", - "title": "Modo Debug", - "description": "Activar logging detallado" + "title": "Nuevo Campo", + "description": "" } } -} +} \ No newline at end of file diff --git a/data/log.txt b/data/log.txt index 7119ef2..e69de29 100644 --- a/data/log.txt +++ b/data/log.txt @@ -1,28 +0,0 @@ - -Iniciando ejecución de x1.py... -=== Ejecutando Script de Prueba 1 === - -Configuraciones cargadas: -Nivel 1: { - "api_key": "your-api-key-here", - "model": "gpt-3.5-turbo" -} -Nivel 2: { - "input_dir": "D:/Datos/Entrada", - "output_dir": "D:/Datos/Salida", - "batch_size": 50 -} -Nivel 3: { - "project_name": "Test" -} - -Simulando procesamiento... -Progreso: 20% -Progreso: 40% -Progreso: 60% -Progreso: 80% -Progreso: 100% - -¡Proceso completado! - -Ejecución completada. diff --git a/templates/index.html b/templates/index.html index f469011..1ce5f8d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -157,37 +157,33 @@ return value; } + // Modificar la función generateInputField para quitar el onchange function generateInputField(def, key, value, level) { - const baseClasses = "w-full p-2 border rounded bg-green-50"; // Agregado bg-green-50 para fondo verde claro + const baseClasses = "w-full p-2 border rounded bg-green-50"; switch (def.type) { case 'string': if (def.enum) { - return ` ${def.enum.map(opt => ``).join('')} `; } return ``; + class="${baseClasses}" data-key="${key}">`; case 'number': return ``; + class="${baseClasses}" data-key="${key}">`; case 'boolean': return `
+ class="form-checkbox h-5 w-5 bg-green-50" data-key="${key}">
`; default: return ``; + class="${baseClasses}" data-key="${key}">`; } } @@ -632,11 +628,17 @@ function addLogLine(message) { const logArea = document.getElementById('log-area'); const timestamp = getTimestamp(); - const lines = message.split('\n').map(line => - line.trim() ? `[${timestamp}] ${line}` : line - ).join('\n'); - logArea.innerHTML += lines; - logArea.scrollTop = logArea.scrollHeight; + + // Filtrar líneas vacías y aplicar timestamp solo a líneas con contenido + const lines = message.split('\n') + .filter(line => line.trim()) // Eliminar líneas vacías + .map(line => `[${timestamp}] ${line}`) + .join('\n'); + + if (lines) { + logArea.innerHTML += lines + '\n'; + logArea.scrollTop = logArea.scrollHeight; + } } function updateGroupDescription() { @@ -659,6 +661,157 @@ sidebar.classList.toggle('open'); overlay.classList.toggle('show'); } + + async function editGroupDescription() { + if (!currentGroup) { + alert('Por favor, seleccione un grupo de scripts primero'); + return; + } + + try { + const response = await fetch(`/api/group-description/${currentGroup}`); + if (!response.ok) throw new Error('Error cargando descripción del grupo'); + const description = await response.json(); + + // Show schema editor modal with description data + const modal = document.getElementById('schema-editor'); + const modalTitle = modal.querySelector('h3'); + const visualEditor = document.getElementById('visual-editor'); + const jsonEditor = document.getElementById('json-editor'); + const tabs = document.getElementById('editor-tabs'); + + // Configurar modal para edición de descripción + modalTitle.textContent = 'Editar Descripción del Grupo'; + tabs.classList.add('hidden'); + + // Crear el formulario en el visualEditor + visualEditor.innerHTML = ` +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ `; + visualEditor.classList.remove('hidden'); + jsonEditor.classList.add('hidden'); + + modal.classList.remove('hidden'); + + // Cambiar comportamiento de todos los botones de guardar + const saveButtons = modal.querySelectorAll('button[onclick="saveSchema()"]'); + saveButtons.forEach(btn => { + btn.onclick = async () => { + try { + const form = document.getElementById('group-description-form'); + const formData = new FormData(form); + + const updatedDescription = { + name: formData.get('name') || '', + description: formData.get('description') || '', + version: formData.get('version') || '1.0', + author: formData.get('author') || '' + }; + + const saveResponse = await fetch(`/api/group-description/${currentGroup}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(updatedDescription) + }); + + if (!saveResponse.ok) throw new Error('Error guardando descripción'); + + // Restaurar modal a su estado original + modalTitle.textContent = 'Editor de Esquema'; + tabs.classList.remove('hidden'); + saveButtons.forEach(btn => btn.onclick = saveSchema); + modal.classList.add('hidden'); + + // Recargar la página para actualizar la descripción + location.reload(); + } catch (e) { + alert('Error guardando descripción: ' + e.message); + } + }; + }); + + } catch (e) { + alert('Error: ' + e.message); + } + } + + // Agregar función para recolectar datos del formulario + function collectFormData(level) { + const formContainer = document.getElementById(`level${level}-form`); + const data = {}; + + formContainer.querySelectorAll('input, select').forEach(input => { + const key = input.getAttribute('data-key'); + if (!key) return; + + let value; + if (input.type === 'checkbox') { + value = input.checked; + } else if (input.type === 'number') { + value = Number(input.value); + } else { + value = input.value; + } + + // Manejar claves anidadas (por ejemplo: "parent.child") + const keys = key.split('.'); + let current = data; + for (let i = 0; i < keys.length - 1; i++) { + current[keys[i]] = current[keys[i]] || {}; + current = current[keys[i]]; + } + current[keys[keys.length - 1]] = value; + }); + + return data; + } + + // Agregar función para guardar configuración + async function saveConfig(level) { + try { + const data = collectFormData(level); + const response = await fetch(`/api/config/${level}?group=${currentGroup}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); + + if (!response.ok) throw new Error('Error al guardar la configuración'); + + // Mostrar mensaje de éxito + alert('Configuración guardada correctamente'); + + // Recargar el formulario para mostrar los datos actualizados + const configResponse = await fetch(`/api/config/${level}?group=${currentGroup}`); + const updatedData = await configResponse.json(); + await renderForm(`level${level}-form`, updatedData); + } catch (error) { + alert('Error: ' + error.message); + } + } @@ -737,9 +957,14 @@ @@ -754,9 +979,14 @@ @@ -767,11 +997,18 @@

Grupo de Scripts

- +
+ + +

@@ -806,9 +1043,14 @@
@@ -833,27 +1075,47 @@