Agregada la opcion de ver una descripcion mas detallada de cada script

This commit is contained in:
Miguel 2025-05-03 22:13:30 +02:00
parent 006e2ed7d6
commit a246c0265c
6 changed files with 78 additions and 50 deletions

2
app.py
View File

@ -139,7 +139,7 @@ def get_scripts(group):
# list_scripts ahora devuelve detalles y filtra los ocultos # list_scripts ahora devuelve detalles y filtra los ocultos
scripts = config_manager.list_scripts(group) scripts = config_manager.list_scripts(group)
# El frontend espera 'name' y 'description', mapeamos desde 'display_name' y 'short_description' # El frontend espera 'name' y 'description', mapeamos desde 'display_name' y 'short_description'
return jsonify([{"name": s['display_name'], "description": s['short_description'], "filename": s['filename']} for s in scripts]) return jsonify([{"name": s['display_name'], "description": s['short_description'], "filename": s['filename'], "long_description": s['long_description']} for s in scripts])
@app.route("/api/working-directory", methods=["POST"]) @app.route("/api/working-directory", methods=["POST"])

View File

@ -0,0 +1,38 @@
{
"x0_main.py": {
"display_name": "Procesar Exportación XML",
"short_description": "LadderToSCL - Conversor de Siemens LAD/FUP XML a SCL",
"long_description": "Este script es el punto de entrada y orquestador principal para el proceso de conversión de archivos XML de Siemens TIA Portal (LAD/FUP) a código SCL y la generación de documentación relacionada.\n\n**Lógica Principal:**\n\n1. **Configuración:** Carga parámetros desde `ParamManagerScripts` (directorio de trabajo, nombres de carpetas de salida, etc.).\n2. **Logging:** Inicia un archivo `log.txt` para registrar detalladamente el progreso y los errores.\n3. **Descubrimiento:** Busca recursivamente todos los archivos `.xml` dentro del subdirectorio `PLC` del directorio de trabajo configurado.\n4. **Procesamiento Individual (Pasos x1-x3):**\n * Itera sobre cada archivo XML encontrado.\n * Implementa lógica para **saltar** pasos si el XML no ha cambiado y las salidas ya existen y están actualizadas.\n * Llama a funciones de `x1_to_json.py`, `x2_process.py`, y `x3_generate_scl.py` para convertir XML -> JSON intermedio -> JSON procesado -> archivo SCL/Markdown final.\n5. **Referencias Cruzadas (Paso x4):** Llama a una función de `x4_cross_reference.py` para generar análisis de llamadas, uso de DBs, etc., basándose en los archivos procesados.\n6. **Agregación (Paso x5):** Llama a una función de `x5_aggregate.py` para combinar las salidas SCL/Markdown y las referencias cruzadas en un único archivo Markdown resumen.\n7. **Resumen y Salida:** Registra un resumen final del proceso (éxitos, saltos, fallos) y finaliza con un código de estado (0 para éxito, 1 si hubo errores).\n",
"hidden": false
},
"x1_to_json.py": {
"display_name": "x1_to_json",
"short_description": "LadderToSCL - Conversor de Siemens LAD/FUP XML a SCL",
"long_description": "",
"hidden": true
},
"x2_process.py": {
"display_name": "x2_process",
"short_description": "LadderToSCL - Conversor de Siemens LAD/FUP XML a SCL",
"long_description": "",
"hidden": true
},
"x3_generate_scl.py": {
"display_name": "x3_generate_scl",
"short_description": "LadderToSCL - Conversor de Siemens LAD/FUP XML a SCL",
"long_description": "",
"hidden": true
},
"x4_cross_reference.py": {
"display_name": "x4_cross_reference",
"short_description": "LadderToSCL - Conversor de Siemens LAD/FUP XML a SCL",
"long_description": "",
"hidden": true
},
"x5_aggregate.py": {
"display_name": "x5_aggregate",
"short_description": "LadderToSCL - Conversor de Siemens LAD/FUP XML a SCL",
"long_description": "",
"hidden": true
}
}

View File

@ -1,44 +0,0 @@
[20:54:12] Iniciando ejecución de x1.py en C:\Estudio...
[20:54:12] === Ejecutando Script de Prueba 1 ===
[20:54:12] Configuraciones cargadas:
[20:54:12] Nivel 1: {
[20:54:12] "api_key": "your-api-key-here",
[20:54:12] "model": "gpt-3.5-turbo"
[20:54:12] }
[20:54:12] Nivel 2: {
[20:54:12] "input_dir": "D:/Datos/Entrada",
[20:54:12] "output_dir": "D:/Datos/Salida",
[20:54:12] "batch_size": 50
[20:54:12] }
[20:54:12] Nivel 3: {}
[20:54:12] Simulando procesamiento...
[20:54:13] Progreso: 20%
[20:54:14] Progreso: 40%
[20:54:15] Progreso: 60%
[20:54:16] Progreso: 80%
[20:54:17] Progreso: 100%
[20:54:17] ¡Proceso completado!
[20:54:17] Ejecución de x1.py finalizada (success). Duración: 0:00:05.196719.
[20:54:17] Log completo guardado en: d:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\example_group\log_x1.txt
[21:21:53] Iniciando ejecución de x1.py en C:\Estudio...
[21:21:53] === Ejecutando Script de Prueba 1 ===
[21:21:53] Configuraciones cargadas:
[21:21:53] Nivel 1: {
[21:21:53] "api_key": "your-api-key-here",
[21:21:53] "model": "gpt-3.5-turbo"
[21:21:53] }
[21:21:53] Nivel 2: {
[21:21:53] "input_dir": "D:/Datos/Entrada",
[21:21:53] "output_dir": "D:/Datos/Salida",
[21:21:53] "batch_size": 50
[21:21:53] }
[21:21:53] Nivel 3: {}
[21:21:53] Simulando procesamiento...
[21:21:54] Progreso: 20%
[21:21:55] Progreso: 40%
[21:21:56] Progreso: 60%
[21:21:57] Progreso: 80%
[21:21:58] Progreso: 100%
[21:21:58] ¡Proceso completado!
[21:21:58] Ejecución de x1.py finalizada (success). Duración: 0:00:05.144464.
[21:21:58] Log completo guardado en: d:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\example_group\log_x1.txt

View File

@ -256,7 +256,7 @@ class ConfigurationManager:
"filename": filename, # Nombre real del archivo "filename": filename, # Nombre real del archivo
"display_name": details.get("display_name", filename.replace('.py', '')), "display_name": details.get("display_name", filename.replace('.py', '')),
"short_description": details.get("short_description", "Sin descripción corta."), "short_description": details.get("short_description", "Sin descripción corta."),
# No necesitamos enviar la descripción larga aquí "long_description": details.get("long_description", "") # Añadir descripción larga
}) })
if updated: if updated:

View File

@ -177,8 +177,23 @@ async function loadScripts(group) {
div.className = 'script-item p-4 border rounded bg-white shadow-sm flex justify-between items-start gap-4'; div.className = 'script-item p-4 border rounded bg-white shadow-sm flex justify-between items-start gap-4';
div.innerHTML = ` div.innerHTML = `
<div> <div>
<div class="font-bold text-lg">${script.name}</div> <div class="font-bold text-lg mb-1">${script.name}</div>
<div class="text-gray-600 text-sm mt-1">${script.description}</div> <div class="flex items-center gap-2">
<span class="text-gray-600 text-sm">${script.description}</span>
${script.long_description ? `
<button class="toggle-long-desc-button text-blue-500 hover:text-blue-700 p-0.5 rounded" data-target-id="long-desc-${script.filename}" title="Mostrar/Ocultar detalles">
<svg class="w-4 h-4 chevron-down" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
<svg class="w-4 h-4 chevron-up hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15l7-7 7 7"></path>
</svg>
</button>
` : ''}
</div>
<div id="long-desc-${script.filename}" class="long-description-content prose prose-sm max-w-none mt-2 border-t pt-2 hidden">
${script.long_description ? marked.parse(script.long_description) : ''}
</div>
</div> </div>
<div class="flex items-center gap-2 flex-shrink-0"> <div class="flex items-center gap-2 flex-shrink-0">
<div class="flex flex-col items-center"> <div class="flex flex-col items-center">
@ -208,6 +223,21 @@ async function loadScripts(group) {
editButton.addEventListener('click', () => { editButton.addEventListener('click', () => {
editScriptDetails(group, script.filename); editScriptDetails(group, script.filename);
}); });
// Añadir event listener para el botón de descripción larga (si existe)
const toggleDescButton = div.querySelector('.toggle-long-desc-button');
if (toggleDescButton) {
toggleDescButton.addEventListener('click', (e) => {
const button = e.currentTarget;
const targetId = button.dataset.targetId;
const targetElement = document.getElementById(targetId);
if (targetElement) {
targetElement.classList.toggle('hidden');
button.querySelector('.chevron-down').classList.toggle('hidden');
button.querySelector('.chevron-up').classList.toggle('hidden');
}
});
}
}); });
} }
@ -1168,8 +1198,11 @@ function clearLogs() {
// Necesitarás una función showToast o similar si la usas // Necesitarás una función showToast o similar si la usas
function showToast(message, type = 'success') { function showToast(message, type = 'success') {
// Implementa tu lógica de Toast aquí // Implementa tu lógica de Toast aquí
console.log(`Toast (${type}): ${message}`); console.log(`UI (${type}): ${message}`); // Siempre loguea en consola
alert(`Toast (${type}): ${message}`); // Simple alert como placeholder
if (type === 'error') {
alert(`Error: ${message}`); // Muestra alerta solo para errores
}
} }
// Llama a fetchLogs al cargar la página si es necesario // Llama a fetchLogs al cargar la página si es necesario

View File

@ -251,6 +251,7 @@
</div> </div>
<!-- Corregir la ruta del script --> <!-- Corregir la ruta del script -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <!-- Librería Markdown -->
<script src="{{ url_for('static', filename='js/scripts.js') }}" defer></script> <script src="{{ url_for('static', filename='js/scripts.js') }}" defer></script>
<script> <script>
window.addEventListener('load', () => { window.addEventListener('load', () => {