diff --git a/orchestrator/src/components/Sidebar.vue b/orchestrator/src/components/Sidebar.vue index 6c4a86d..99ca33d 100644 --- a/orchestrator/src/components/Sidebar.vue +++ b/orchestrator/src/components/Sidebar.vue @@ -37,21 +37,31 @@ async function cargar() { } } -// Clientes y planes solo los necesita el staff para asignarlos; si el endpoint -// no está disponible (portal del cliente) el formulario sigue funcionando. +// Los endpoints del panel no comparten una forma de respuesta: el de clientes +// devuelve el array pelado y el de planes lo envuelve en {items}. Aceptar las +// dos evita que un select quede vacío sin que nadie se entere. +function lista(r) { + if (Array.isArray(r)) return r + return r?.items || r?.registros || [] +} + +// Clientes y planes solo los necesita el staff para asignarlos; en el portal +// del cliente esos endpoints no se alcanzan y el formulario no los muestra. +// Se cargan por separado a propósito: que falle uno no debe vaciar el otro. async function cargarAsignables() { - if (contexto.esPortal) return // endpoints de staff: el cliente no los alcanza - try { - const [c, p] = await Promise.all([ - api.get('/app/api/clientes/select'), - api.get('/app/umind-planes/list'), - ]) - clientes.value = c.registros || c.items || [] - planes.value = p.items || [] - } catch { - clientes.value = [] - planes.value = [] - } + if (contexto.esPortal) return + const [c, p] = await Promise.allSettled([ + api.get('/app/api/clientes/select'), + api.get('/app/umind-planes/list'), + ]) + clientes.value = c.status === 'fulfilled' ? lista(c.value) : [] + planes.value = p.status === 'fulfilled' ? lista(p.value) : [] + // Sin esto un fallo se veía igual que "no hay nada configurado", que es + // justo lo que hizo que los campos Cliente y Plan no aparecieran. + const fallos = [] + if (c.status === 'rejected') fallos.push('clientes') + if (p.status === 'rejected') fallos.push('planes') + if (fallos.length) error.value = `No se pudo cargar la lista de ${fallos.join(' ni ')}.` } function nuevoTenant() { @@ -202,7 +212,7 @@ onMounted(() => { class="input" /> -
+
-

Define quién ve este tenant desde el portal.

+

+ {{ clientes.length ? 'Define quién ve este tenant desde el portal.' : 'No hay clientes activos — creá uno en Clientes.' }} +

@@ -225,7 +237,9 @@ onMounted(() => { {{ p.nombre }} ({{ p.max_agentes === 0 ? '∞' : p.max_agentes }} agentes) -

Límite de agentes y precios de consumo.

+

+ {{ planes.length ? 'Límite de agentes y precios de consumo.' : 'No hay planes — creá uno en uMind Planes.' }} +