From 0cffd351dfee4ac0e927db8fde2c7f60549b58ba Mon Sep 17 00:00:00 2001 From: Ernesto Herrera Date: Fri, 17 Jul 2026 17:03:36 -0600 Subject: [PATCH] =?UTF-8?q?fix(crm):=20alta=20de=20usuarios=20carga=20comp?= =?UTF-8?q?a=C3=B1=C3=ADas=20del=20tenant=20en=20vez=20de=20slug=20a=20man?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La organización destino salía como texto libre (o fallaba al listar todos los tenants del Hub con un token KC caduco). Ahora se carga desde /v1/auth/my-companies (mismo origen que el switcher) y se elige la compañía; el tenant_slug se resuelve de la compañía seleccionada. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../workspace/usuarios/+page.server.ts | 35 +++++++++---------- .../dashboard/workspace/usuarios/+page.svelte | 31 ++++++---------- 2 files changed, 26 insertions(+), 40 deletions(-) diff --git a/frontend/src/routes/dashboard/workspace/usuarios/+page.server.ts b/frontend/src/routes/dashboard/workspace/usuarios/+page.server.ts index 76f63be..4488b97 100644 --- a/frontend/src/routes/dashboard/workspace/usuarios/+page.server.ts +++ b/frontend/src/routes/dashboard/workspace/usuarios/+page.server.ts @@ -1,27 +1,24 @@ import { fail } from '@sveltejs/kit'; import type { PageServerLoad, Actions } from './$types'; -import { getKcAccessToken } from '$lib/server/api'; -import { listWorkspaceTenants, createWorkspaceInvite } from '$lib/server/workspace-provision'; +import { getUserCompanies } from '$lib/server/api'; +import { createWorkspaceInvite } from '$lib/server/workspace-provision'; import { WORKSPACE_INVITE_ROLES } from '$lib/server/workspace-provision.shared'; export const load: PageServerLoad = async ({ cookies, fetch }) => { - const accessToken = getKcAccessToken(cookies); - if (!accessToken) { - return { tenants: [], canListTenants: false, roles: WORKSPACE_INVITE_ROLES }; - } + // La organización destino sale de las compañías del usuario (mismo origen que + // el switcher, vía /v1/auth/my-companies). Así no se escribe el slug a mano ni + // se depende de listar todos los tenants del Hub con un token KC que caduca. + const companiesRaw = await getUserCompanies(cookies, fetch); + const companies = (companiesRaw ?? []) + .filter((c) => c && c.tenant_slug) + .map((c) => ({ + id: c.id as number, + name: c.name as string, + tenant_slug: c.tenant_slug as string, + tenant_name: (c.tenant_name as string) || (c.tenant_slug as string) + })); - // Los hub_admin pueden listar todos los tenants (dropdown). Un admin de tenant - // no puede listarlos (403) pero sí puede invitar a SU tenant escribiendo el slug. - const res = await listWorkspaceTenants(accessToken, fetch); - if (!res.ok) { - return { tenants: [], canListTenants: false, roles: WORKSPACE_INVITE_ROLES }; - } - - return { - tenants: res.data.map((t) => ({ slug: t.slug, name: t.display_name || t.name })), - canListTenants: true, - roles: WORKSPACE_INVITE_ROLES - }; + return { companies, roles: WORKSPACE_INVITE_ROLES }; }; export const actions: Actions = { @@ -42,7 +39,7 @@ export const actions: Actions = { return fail(422, { error: 'Ingresa un email válido para invitar.', values }); } if (!tenant_slug) { - return fail(422, { error: 'Selecciona (o escribe) el slug de la organización destino.', values }); + return fail(422, { error: 'Selecciona la compañía destino.', values }); } if (!WORKSPACE_INVITE_ROLES.includes(role as (typeof WORKSPACE_INVITE_ROLES)[number])) { return fail(422, { error: 'Rol inválido.', values }); diff --git a/frontend/src/routes/dashboard/workspace/usuarios/+page.svelte b/frontend/src/routes/dashboard/workspace/usuarios/+page.svelte index 4b156fd..0401ff3 100644 --- a/frontend/src/routes/dashboard/workspace/usuarios/+page.svelte +++ b/frontend/src/routes/dashboard/workspace/usuarios/+page.svelte @@ -75,13 +75,7 @@ Nueva invitación - - {#if data.canListTenants} - Elige la organización destino y el rol del usuario. - {:else} - Escribe el slug de tu organización y el rol del usuario. - {/if} - + Elige la compañía destino y el rol del usuario.
@@ -142,7 +131,7 @@
-