El usuario en a76-e2e-credentials no tiene permisos de KC admin (403).
En lugar de crear usuario efímero vía Admin API:
- Eliminar global-setup.ts, global-teardown.ts, fixtures/keycloak.ts
- Quitar globalSetup/globalTeardown de playwright.config.ts
- auth.setup.ts ya navega a /login → Workspace → llena form → /dashboard
- a76-e2e-credentials = usuario de prueba existente en Workspace (E2E_USER/E2E_PASS)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- fixtures/keycloak.ts: Admin REST API helpers (createTestUser, assignRoles,
deleteTestUser) — copia exacta del hub
- global-setup.ts: crea usuario e2e-anexo76 en KC antes de los tests
- global-teardown.ts: elimina el usuario al finalizar
- auth.setup.ts: navega a /login → Workspace → llena form → /dashboard
(ya no usa password grant ni Direct Access Grants)
- playwright.config.ts: agrega globalSetup y globalTeardown
- Jenkinsfile: a76-e2e-credentials ahora son credenciales de KC admin;
usuario de prueba es efímero (creado/borrado por global-setup/teardown)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Introduced `permissionsHydrated` writable store to track if RBAC permissions are loaded for the active company.
- Added `markPermissionsHydrated` function to set the hydration state.
- Updated dashboard components to wait for permissions to be hydrated before rendering restricted content, enhancing user experience by avoiding "Access Denied" flashes.
- Refactored permission checks in `pedimento-permissions.ts` to consistently use `userHasPermission` for clarity and maintainability.
fetchBlob no implementaba silent refresh ni propagaba X-Tenant-Override,
por lo que reportes que descargan archivo (Descargos, Vencimientos) fallaban
con "token inválido o expirado" cuando el access_token estaba vencido,
mientras el resto del dashboard refrescaba sin problema.
- Extrae buildAuthHeaders compartido por fetchApi y fetchBlob.
- fetchBlob ahora hace silent refresh y reintenta una vez en 401.
- fetchBlob muestra toast consistente en 403.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sembrar authStore desde data.user en el script de +layout.svelte
(SSR + hidratación) en lugar de en onMount, para que $currentUser
ya esté poblado en el primer render de las páginas hijas. Antes,
canView quedaba en false durante el SSR/hidratación y las páginas
renderizaban ErrorState 403 hasta que onMount llenaba el store.
Aplica al refrescar la página (F5) y al botón "Refrescar" de los
módulos que usan window.location.reload (countries, material_types,
payment_methods, document_types_digitization, clients_and_providers).
No se modificaron permisos, helpers de permisos, ni el patrón
canView/isError de las páginas afectadas.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Clic en fila hace toggle multi-select; el registro clickeado queda primero en el array para que el cuadro informativo siempre muestre su info
- Clic en checkbox mantiene comportamiento independiente para selección múltiple (eliminar)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Agrega INTERNAL_API_URL, INTERNAL_HUB_URL, HUB_URL, KEYCLOAK_URL y ORIGIN
al ejemplo para que el dev local tenga el mismo conjunto de variables que
usa Docker Compose, evitando que el SSO exchange y el refresh proactivo
fallen silenciosamente por vars indefinidas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Todos los page.server.ts que hacían throw redirect(302, '/login') ahora
usan redirectToWorkspaceLogin(cookies, url) para enviar al usuario directo
al login del workspace en lugar de pasar por la página /login local de Anexo76.
Archivos actualizados:
- dashboard/pedimentos/+page.server.ts
- dashboard/pedimentos/edit/[id]/+page.server.ts (2 redirects)
- dashboard/invoices/+page.server.ts
- dashboard/invoices/edit/[id]/+page.server.ts
- dashboard/invoices/settings/+page.server.ts
- dashboard/goods/parts/edit/[[id]]/+page.server.ts
- dashboard/general_catalogs/ports/+page.server.ts
- dashboard/general_catalogs/seal/+page.server.ts
- dashboard/reports/vencimiento/+page.server.ts
- dashboard/reports/invoices/+page.server.ts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Reduce ACCESS_TOKEN_MAX_SINGLE y ACCESS_TOKEN_CHUNK_SIZE de 3500 a 2800
para garantizar que cada cookie fragmentada no supere el límite de 4096 bytes
del navegador (incluye overhead del nombre, path, attrs).
- Agrega try/catch alrededor de response.json() en el load de /auth/sso para
evitar SyntaxError no manejado si el body no es JSON.
- Type guards explícitos en tokens.access_token, refresh_token y tenant_id
para detectar respuestas incompletas del hub antes de llamar cookies.set().
- .catch(() => ({})) en refreshRes.json() para que el refresh proactivo nunca
bloquee el flujo SSO aunque el body sea inesperado.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>