Add 'Ver tablas' button to list Firebird tables

This commit is contained in:
Lizandro Guarnizo
2026-06-18 09:30:27 -05:00
parent c589090110
commit 71c94375b3
2 changed files with 400 additions and 345 deletions
+35
View File
@@ -152,6 +152,41 @@ async def query_delete(query_id: int, user: dict = Depends(get_current_user)):
return RedirectResponse("/queries", status_code=302) return RedirectResponse("/queries", status_code=302)
@router.post("/tablas")
async def listar_tablas(user: dict = Depends(get_current_user)):
from app.services.firebird_service import FirebirdService
conn = get_connection()
configs = {row["key"]: row["value"] for row in conn.execute("SELECT * FROM config").fetchall()}
conn.close()
fb = FirebirdService()
fb_success, fb_msg = fb.connect(
configs.get("firebird_host", "localhost"),
int(configs.get("firebird_port", 3050)),
configs.get("firebird_database", ""),
configs.get("firebird_user", "SYSDBA"),
configs.get("firebird_password", "masterkey"),
)
if not fb_success:
return JSONResponse({"error": f"Error Firebird: {fb_msg}"}, status_code=400)
success, fb_err, rows = fb.execute_query("""
SELECT RDB$RELATION_NAME as nombre␍
FROM RDB$RELATIONS␍
WHERE RDB$SYSTEM_FLAG = 0␍
AND RDB$RELATION_NAME NOT LIKE 'RDB$%'
ORDER BY 1␍
""", {})
fb.disconnect()
if not success:
return JSONResponse({"error": fb_err}, status_code=400)
return JSONResponse({
"tablas": [r["NOMBRE"].strip() for r in rows]
})
@router.post("/test") @router.post("/test")
async def query_test( async def query_test(
request: Request, request: Request,
+20
View File
@@ -87,6 +87,10 @@
<code class="bg-blue-100 px-1 rounded">:factura</code> para filtro por factura,␍ <code class="bg-blue-100 px-1 rounded">:factura</code> para filtro por factura,␍
<code class="bg-blue-100 px-1 rounded">:fecha_ini</code> y <code class="bg-blue-100 px-1 rounded">:fecha_fin</code> para rango de fechas.␍ <code class="bg-blue-100 px-1 rounded">:fecha_ini</code> y <code class="bg-blue-100 px-1 rounded">:fecha_fin</code> para rango de fechas.␍
</p> </p>
<button onclick="listarTablas(this)" class="mt-3 px-3 py-1.5 bg-green-600 hover:bg-green-700 text-white text-xs rounded-lg">
<i class="fas fa-table mr-1"></i> Ver tablas disponibles␍
</button>
<div id="tablas-list" class="mt-2 hidden"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -111,6 +115,22 @@ function cancelEdit() {
document.querySelector('form').action = '/queries/create'; document.querySelector('form').action = '/queries/create';
} }
async function listarTablas(btn) {
btn.disabled = true;
btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-1"></i> Cargando...';
try {
const resp = await fetch('/queries/tablas', { method: 'POST' });
const data = await resp.json();
if (data.error) { showToast(data.error, 'error'); return; }
const div = document.getElementById('tablas-list');
div.innerHTML = '<div class="max-h-40 overflow-y-auto mt-2"><div class="grid grid-cols-3 gap-1">' +
data.tablas.map(t => '<code class="bg-white px-2 py-1 rounded border text-xs">' + t + '</code>').join('') +
'</div></div>';
div.classList.remove('hidden');
} catch(e) { showToast('Error: ' + e.message, 'error'); }
finally { btn.disabled = false; btn.innerHTML = '<i class="fas fa-table mr-1"></i> Ver tablas disponibles'; }
}
async function ejecutarTest(btn, queryId) { async function ejecutarTest(btn, queryId) {
btn.disabled = true; btn.disabled = true;
btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-1"></i> Probando...'; btn.innerHTML = '<i class="fas fa-spinner fa-spin mr-1"></i> Probando...';