Repository navigation
TecnoFix v1.4.0
v1.4.0
Alineación del frontend con los cambios de permisos por rol y rutas reales
del backend (auditoría 2026-06-03), más correcciones de UI en diálogos de
cotizaciones.
Añadido
- Endpoint dedicado de técnicos (
GET /users/tecnicos/): los dropdowns de
técnicos en Órdenes ya no listan todos los usuarios. Como la lectura de usuarios
pasó a ser solo-admin en el backend, ahora se usa este endpoint ligero
([{ id, nombre }], no paginado) accesible a cualquier rol autenticado. - Apertura de enlaces externos en la app de escritorio: helper
openExternalUrl()/handleExternalClick(). En Tauri un<a target="_blank">
no abre el navegador del sistema; ahora esos enlaces se abren con el plugin
opener. En web el comportamiento nativo del enlace se conserva. - Documento de auditoría de permisos
(docs/backend-docs/auditoria-permisos-endpoints.md): verificación cruzada
frontend↔backend del control de acceso por rol de toda la API/api/v1/.
Corregido
- Rutas de usuarios desalineadas con el backend:
cambiar-password/→reset-password/(reset de contraseña por admin).activar/→activate/,desactivar/→deactivate/.
- Compatibles de inventario (404): el front llamaba
/inventario/compatibles/pero el backend expone
/inventario/compatibilidades/. Corregido. - Visor de PDF — X de cerrar duplicada:
DialogContent(shadcn) ya provee su
propia X; se eliminó el botón X manual del header delPdfPreviewDialog. - Diálogo "Autorizar cotización" — responsividad:
- Ancho
w-[95vw]para dejar margen en pantallas medianas/chicas. - Stepper: los títulos de paso se ocultan en móvil (
hidden sm:inline),
dejando solo los círculos numerados. - Selector de modo de cliente: la fila Label + 3 botones ahora apila en móvil y
los botones envuelven (flex-wrap) en vez de cortarse. - Focus ring recortado: el contenido del
ScrollArease envolvió en un
contenedor con padding interno para que el anillo de foco de inputs/selects de
la columna izquierda y la fila superior no se corte contra eloverflow-hidden.
- Ancho
- Login — "¿Olvidaste tu contraseña?": el flujo simulaba el envío sin llamar a
ningún endpoint (el backend aún no implementaPOST /users/auth/password-reset/).
Se ocultó el acceso para no mostrar un flujo que no hace nada; las vistas quedan
dormidas para reactivarlas cuando exista la ruta.
Detalles técnicos
| Archivo | Cambio |
|---|---|
src/lib/config.ts |
+ users.tecnicos; rutas reset-password/activate/deactivate; compatibles → compatibilidades |
src/api/users.ts |
+ usersApi.tecnicos(); cambiarPassword → resetPassword |
src/types/user.ts |
+ interface Tecnico |
src/features/ordenes/OrdenesPage.tsx |
dropdown técnicos vía usersApi.tecnicos() |
src/features/ordenes/OrdenDetailPage.tsx |
idem (conserva enabled: isAdmin) |
src/features/users/UsersPage.tsx |
resetPassword; DialogDescription en diálogos |
src/lib/external.ts |
nuevo — openExternalUrl / handleExternalClick |
src/features/cotizaciones/components/ItemWizard.tsx |
enlace url_producto usa el handler externo |
src/features/cotizaciones/CotizacionDetailPage.tsx |
enlace link_referencia usa el handler externo |
src/features/cotizaciones/components/PdfPreviewDialog.tsx |
eliminada X manual duplicada |
src/features/cotizaciones/components/AutorizarCotizacionDialog.tsx |
responsividad + focus ring |
src/features/auth/LoginPage.tsx |
oculto el flujo de recuperación de contraseña |
src-tauri/capabilities/default.json |
+ permiso opener:allow-open-url |
Nota de build: el permiso
opener:allow-open-urles un cambio de Tauri;
requiere recompilar el lado Rust (npm run tauri dev/ build de Windows) para
que la apertura de enlaces externos funcione en la app de escritorio. En web
(npm run dev) no requiere recompilar.