Commit Graph

75 Commits

Author SHA1 Message Date
Milton Gonzalez f51b3bcd89 feat: version 2.16.5 -- Equipos: se quita el boton Informacion del listado
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 11:36:51 -05:00
Milton Gonzalez eb7cdcbc43 feat: version 2.16.4 -- Equipos: primer y ultimo reporte despues de Departamento
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 11:33:21 -05:00
Milton Gonzalez 75850a3208 feat: version 2.16.3 -- Equipos: seccion Estado/Asignado/Departamento/Notas al inicio de General
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 11:25:47 -05:00
Milton Gonzalez 219169ba9f fix: version 2.16.2 -- el instalador del agente verifica el token y fuerza la configuracion
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 10:39:49 -05:00
Milton Gonzalez ae932eedde feat: version 2.16.1 -- barra superior reducida, barra inferior fija y contador de Contraseñas en ella
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 09:22:02 -05:00
Milton Gonzalez 4a305df73e feat: version 2.16.0 -- contador de cierre en Contraseñas, cierre por inactividad y ajustes de Equipos
Contraseñas: el cierre automatico ahora es por inactividad (no saca al usuario a medio escribir),
token de desbloqueo renovable y contador visible junto al titulo. Equipos: GUID como componente.
Sube la version para que el panel de Actualizaciones ofrezca los cambios 2.15.0 -> 2.16.0
(migraciones 025 y 026, instalador del agente y pestaña Compartir).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 08:52:46 -05:00
Milton Gonzalez d60b4b1d77 feat: version 2.15.0 -- pestaña Compartir en Equipos (acceso de solo lectura)
Admin/superadmin dan acceso de solo lectura (Resumen, Equipos, Software) a otros usuarios;
el backend valida el acceso en cada endpoint y el menu aparece solo a quien lo tenga.
Migracion 026 (device_viewers).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 08:32:53 -05:00
Milton Gonzalez d5f09dc91b feat: version 2.15.0 -- instalador del agente GLPI, filtro de componentes y token recuperable
Instalador .bat generado en el navegador, casilla para ocultar actualizaciones/drivers/componentes
en Software, buscador por pestaña en el detalle, GUIDs como componentes y tokens de ingesta
cifrados (migraciones 024 y 025).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 08:17:53 -05:00
Milton Gonzalez e25c2c3b35 feat: version 2.15.0 -- menu Equipos (inventario de TI con agente GLPI)
Ingesta POST /api/inventory (JSON/XML, token de instalacion), upsert por deviceid,
historial de cambios, pestañas Resumen/Equipos/Software/Agentes, detalle con buscador
por pestaña y casilla para ocultar actualizaciones/drivers/componentes del software.
Migraciones 023 y 024. Diseño en docs/ARQUITECTURA-INVENTARIO.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 19:05:00 -05:00
Milton Gonzalez 7139f1604e feat: version 2.14.0 -- compartir grupo completo y destruir con cascada
Contraseñas: "Compartir grupo" aplica el mismo share de solo lectura a todas
las credenciales de un grupo de una vez (el grupo sigue sin ser una unidad
de permiso -- es una accion de conveniencia). El grupo y cada credencial se
marcan con el icono de compartido. "Destruir grupo" ahora tiene dos
opciones: solo desagrupar (como antes) o destruir tambien las N credenciales,
con advertencia explicita del conteo.

Fix de paso en ComboBox (afecta a toda la app): el panel se cerraba solo al
abrirse si el trigger estaba cerca del borde de un contenedor con scroll,
por un micro-scroll automatico del navegador al enfocar el boton.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 17:42:39 -05:00
Milton Gonzalez dad73b841d feat: version 2.13.2 -- "Destruir" con advertencia fuerte en Contraseñas
Solo en el modulo Contraseñas (entradas y grupos): "Eliminar" pasa a decir
"Destruir", con dialogo en tono error (franja roja) y mensaje explicito de
que la destruccion es permanente e irreversible. El resto de la app
(Notas, Proyectos, etc.) sigue igual. El audit_log de borrado ya existia
(usuario/accion/fecha, sin el contenido) -- sin cambios ahi.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 17:22:59 -05:00
Milton Gonzalez 3da652c136 feat: version 2.13.0 -- grupos y compartir en Contraseñas
Grupos de un solo nivel (tarjetas, clic entra a ver sus credenciales) y compartir
una credencial individual de solo lectura con otro usuario registrado (puede
revelar/copiar la contraseña real, nunca editar/borrar/compartir/mover de grupo).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 16:14:36 -05:00
Milton Gonzalez e5dfc2feff fix: version 2.11.3 -- badges de Comentarios/Documentos de actividad no se actualizaban en vivo
CommentsPanel/AttachmentsPanel ya soportaban un onChanged opcional (agregado en 2.11.1 para
el nivel de proyecto), pero ActivityDetailPanel.jsx no se lo pasaba -- el badge de su propia
pestaña se quedaba con el numero viejo hasta cambiar de pestaña y volver (que es lo unico que
dispara el refetch de comments/attachments ahi). Se conecta reloadComments/reloadAttachments
como onChanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 12:12:03 -05:00
Milton Gonzalez 47fe36a64e fix: version 2.11.2 -- badge de Tareas pasa a hechas/total en vez de pendientes/total
"3/4" se leia como "3 pendientes de 4", confuso. Ahora "1/4" = 1 hecha de 4, mismo criterio
que el resto de contadores nuevos (siempre n/n, nunca se oculta).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 12:01:45 -05:00
Milton Gonzalez d44f96bb6c fix: version 2.11.1 -- mueve los contadores de 2.11.0 de columnas de grilla a badges de pestaña
La 2.11.0 agrego los contadores de dependencias/comentarios/documentos/miembros como columnas
nuevas en las tablas de Proyectos y Actividades -- no era el pedido original, desbordaba la
grilla. Se revierten esas columnas (y el componente CountBadge que solo ellas usaban) y los
contadores van donde correspondia desde el principio: como badge junto al nombre de cada
pestaña, al mismo estilo que ya usaba "Tareas n/n" (componente Tabs + .tab-badge):
- Proyecto: pestañas Miembros, Actividades (completas/total), Comentarios, Documentos.
- Actividad: pestaña Dependencias (ya existia Tareas/Comentarios/Documentos, solo faltaba esta).

De paso: Tabs.jsx ocultaba el badge cuando count era 0 (!!tab.count) -- se cambia a mostrar
siempre que la pestaña mande la prop (count !== undefined), para que 0 se vea como "0" y no
desaparezca. CommentsPanel/AttachmentsPanel ganan un onChanged opcional para que el contador
de Comentarios/Documentos del PROYECTO se actualice al tiro sin tener que recargar la pagina
(el de la actividad ya se refrescaba solo al cambiar de pestaña).

El backend de 2.11.0 (subconsultas dependencies_count/comments_count/documents_count/
members_count/activities_total/activities_complete en los LIST_SELECT) se mantiene igual,
solo cambia donde el frontend los usa.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 11:53:43 -05:00
Milton Gonzalez 4520abe96f feat: version 2.11.0 -- contadores de dependencias/comentarios/documentos/miembros en listados
Actividades (dentro de un proyecto): nuevas columnas con la cantidad de dependencias,
comentarios y documentos de cada fila -- subconsultas correlacionadas agregadas al
LIST_SELECT existente (mismo patron que share_count de notas/proyectos), siempre numericas
(0 si no hay, nunca oculto).

Proyectos: nuevas columnas con la cantidad de miembros, actividades completas al 100% sobre
el total (ej. "1/4", mismo patron pendientes/total que ya usa la pestaña de tareas de una
actividad), comentarios y documentos.

Nuevo componente CountBadge (icono + numero) reutilizado en ambos listados -- a diferencia de
SharedWithIcon/Tabs que ocultan el badge en 0, este siempre lo muestra.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 11:40:07 -05:00
Milton Gonzalez 24169237e1 fix: version 2.10.6 -- icono de compartida junto al de arrastre + fix de actualizacion en vivo
El icono de compartida de las tarjetas de Notas se mueve de junto a la fecha a la esquina
inferior derecha, a la izquierda del icono de arrastre. De paso se corrige que no se
actualizaba en la tarjeta tras compartir/dejar de compartir sin recargar la pagina (faltaba
un reload() de la lista principal, que es de donde sale el share_count de cada tarjeta).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 17:31:56 -05:00
Milton Gonzalez 0964ffb8a8 feat: version 2.10.4 -- tarjetas de Notas arrastrables para reordenar
Nueva columna sort_order en notes (migracion 020, mismo patron que 012_sort_order.sql de
activities/tasks). Se reusa el hook useDragReorder ya existente (drag & drop nativo, sin
libreria nueva) -- el icono de agarre va solo en una esquina de la tarjeta, nunca en la
tarjeta completa, para no pisar el click que abre la edicion (mismo truco que ya usa
ListView.jsx: stopPropagation en el handle).

Solo las notas propias son arrastrables/reordenables; las compartidas conmigo quedan
siempre despues, ordenadas por fecha (el orden manual de otro usuario no tiene sentido para
mi vista). Se desactiva mientras hay un filtro de busqueda activo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 16:17:51 -05:00
Milton Gonzalez 2d1bfc0bfd feat: version 2.10.3 -- reenviar correo de invitacion/verificacion desde Usuarios
Nueva opcion "Reenviar correo" en el menu de 3 puntos de Organizacion -> Usuarios, para
usuarios en estado 'invited' o 'pending_verification'. Reusa las mismas columnas
(verification_token/verification_token_expires) y plantillas que el envio original
(inviteUser / auth/service.js#register), solo genera un token nuevo -- el anterior pudo
vencer o perderse en spam.

De paso se corrige que el estado "invited" no tenia rama propia en el menu de acciones (caia
en el branch generico de editar/activar-desactivar, que no aplica a una cuenta placeholder sin
clave real todavia) ni traduccion de su badge (user_status_invited faltaba en i18n).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 16:02:24 -05:00
Milton Gonzalez 98d9196791 feat: version 2.10.2 -- icono de compartida + buscador en tarjetas de Notas
Tarjetas de Notas: icono junto a la fecha cuando la nota esta compartida (propia compartida
con alguien, via share_count nuevo en la consulta; o recibida de otro usuario). Buscador
junto al titulo que filtra las tarjetas en vivo por contenido (client-side, sin ida y vuelta
al backend ya que el contenido no esta cifrado como en Contraseñas).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 15:37:31 -05:00
Milton Gonzalez 926215297e feat: version 2.10.0 -- Notas en tarjetas, crear/editar en popup, compartir de solo lectura
Rediseno completo del modulo Notas (era lista inline, sin popup, sin compartir):
- Tarjetas con resumen del contenido en vez de lista vertical; la primera tarjeta siempre es
  un "+" para crear.
- Crear y editar se hacen en un DetailPopup (antes: textarea fijo arriba + edicion inline por
  tarjeta).
- Nueva tabla note_shares (migracion 019): compartir una nota con otro usuario ya registrado,
  siempre de solo lectura -- el dueño sigue siendo el unico que edita/borra/comparte (mismo
  patron que project_members pero sin rol ni invitacion por correo, ya que acá no hace falta).
  Quien recibe la nota la ve con "Compartida por {nombre}", sin ningun control de edicion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 12:09:04 -05:00
Milton Gonzalez 27cf2712fb fix: version 2.8.13 -- mueve el logo de LinkedCorp al pie del login, junto al texto
El bloque de LinkedCorp pasa de estar junto al logo de empresa (arriba) a quedar debajo de
los links de "olvidaste tu contraseña"/"crear cuenta", centrado, con el texto a la derecha
del icono. El logo de empresa vuelve a mostrarse solo y centrado como antes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-02 20:14:18 -05:00
Milton Gonzalez 4387b23f45 fix: version 2.8.12 -- logo de LinkedCorp en el login con clase propia (40px) y layout izq/der
El icono de LinkedCorp reusaba la clase del logo de empresa (80px), asi que se salia de la
tarjeta al querer achicarlo. Se le da su propia clase (40px) y el layout del login pasa a
alinear el logo de empresa a la izquierda y LinkedCorp a la derecha, sin desbordar margenes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-02 20:08:35 -05:00
Milton Gonzalez 7134bdda26 feat: version 2.8.10 -- logo de LinkedCorp junto al de empresa en el login
Cuando hay un logo de empresa configurado (Configuracion > Empresa, caso exilaser), el login
ahora muestra tambien el logo de LinkedCorp a la derecha, a la misma altura, con el texto
"LinkedCorp" debajo del icono. Sin logo de empresa configurado, el login sigue igual.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-02 19:51:54 -05:00
Milton Gonzalez 2b18c8d004 fix: version 2.8.6 -- flecha roja mas visible para ocultar logos de marca
El boton "-" para colapsar el catalogo de marcas casi no se distinguia; se reemplaza por una
flecha hacia arriba en rojo (ChevronUp), mucho mas clara.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 16:32:28 -05:00
Milton Gonzalez 2dd2aeae8c fix: version 2.8.5 -- boton para volver a ocultar el catalogo de marcas
Al "+" para desplegar los logos de marca le faltaba su contraparte: un boton "-" junto al
titulo del bloque para volver a colapsarlo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 16:26:10 -05:00
Milton Gonzalez de5984b9d6 feat: version 2.8.4 -- catalogo de logos de marca oculto tras boton +
El selector de icono generico de Contraseñas queda igual; el catalogo de marcas (simple-icons)
pasa a estar colapsado por defecto detras de un boton "+", y se abre solo si la entrada ya
tenia un logo de marca asignado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 15:12:00 -05:00
Milton Gonzalez 79a2e7f6d8 fix: version 2.8.3 -- PIN de Contraseñas ya no dispara el gestor de contraseñas de Chrome
Los campos de PIN (desbloqueo, crear, cambiar, resetear) usaban type="password", lo que hacia
que Chrome ofreciera guardar/actualizar una "contraseña de sitio" cada vez que se ingresaba.
Un PIN de 4 digitos no es una credencial de login, asi que se cambia a type="text" con
enmascarado puramente visual (-webkit-text-security), sin perder el aspecto de puntos.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 14:54:23 -05:00
Milton Gonzalez d5f3f05470 fix: version 2.8.2 -- overlay de progreso al actualizar + fix mountedRef en StrictMode
Agrega un overlay de pantalla completa (circulo girando + porcentaje estimado +
"Actualizando...") que bloquea todo clic mientras corre la auto-actualizacion, y recarga la
pagina sola al terminar. De paso corrige un bug real: el useEffect de mountedRef no
reactivaba el flag en su setup, asi que con React.StrictMode (dev) el polling de estado
nunca llegaba a correr -- no afectaba produccion (StrictMode no duplica efectos ahi) pero
ocultaba el problema al probar en dev. Tambien se corrigen un par de voseos que quedaron
en los textos de Actualizaciones.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 14:33:55 -05:00
Milton Gonzalez 8214df62ae feat: version 2.8.1 -- catalogo de logos de marca en Contraseñas (simple-icons, CC0)
Amplia el selector de icono de una credencial con ~70 logos reales de marcas conocidas
(Google, GitHub, Cloudflare, cPanel, MikroTik, WordPress, etc.), empaquetados localmente
desde el paquete simple-icons (dominio publico) y tree-shakeados por Vite. Se mantiene el
criterio de privacidad ya establecido: ninguna consulta externa de favicon por entrada.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 14:16:31 -05:00
Milton Gonzalez 551ed9b790 feat: version 2.8.0 -- buscador en Contraseñas (nombre/usuario/enlace/notas)
Filtra las tarjetas mientras se escribe. Nombre/usuario/enlace se
comparan en texto plano; las notas (cifradas) se descifran solo en
el servidor para la comparacion -- el contenido nunca viaja de vuelta
al cliente salvo al revelar esa entrada puntual.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:57:10 -05:00
Milton Gonzalez 127ca2ba7e feat: version 2.7.2 -- tarjetas con icono en Contraseñas + fix borrado de password al editar
Listado de Contraseñas pasa de tabla a tarjetas: icono elegible (
catalogo fijo, sin servicios externos de favicon por privacidad) o
inicial del nombre como fallback, junto con nombre y enlace.

Fix real: editar una credencial sin revelar la contraseña antes la
dejaba vacia al guardar -- ahora se conserva la que ya estaba si no
se escribe una nueva.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:41:22 -05:00
Milton Gonzalez 28e339f19a fix: version 2.7.1 -- Contraseñas pide PIN de nuevo al volver, auto-salida a los 3 min
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:27:34 -05:00
Milton Gonzalez 0be0712ff0 feat: version 2.7.0 -- menu Contraseñas (repositorio de credenciales privado)
Nuevo modulo backend/src/modules/vault/: contraseña y notas cifradas
en el servidor (AES-256-GCM, mismo mecanismo ya usado para la clave
SMTP). Acceso al menu protegido con un PIN de 4 digitos independiente
del login (token corto propio, header X-Vault-Token, nunca el JWT de
sesion). El PIN no participa del cifrado -- cambiarlo o restablecerlo
por correo nunca afecta las contraseñas ya guardadas. Privado por
usuario, sin excepcion. Cada accion sensible (crear/editar/eliminar/
revelar/desbloquear) queda en audit_log. Compartir con otro usuario
queda para una proxima version.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:12:54 -05:00
Milton Gonzalez 82308faeb1 feat: version 2.6.0 -- barra de progreso rediseñada + icono de compartido
Porcentaje de avance dentro de la barra (antes aparte), fondo gris
visible en vez de casi invisible sobre el tema oscuro. Nuevo icono en
el listado de Proyectos que muestra con quien esta compartido cada
proyecto y su permiso, solo si aplica.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-30 08:04:50 -05:00
Milton Gonzalez fda83e9dff fix: version 2.5.0 -- compartir proyectos con permisos reales (Lectura/Escritura)
Bug de seguridad real corregido: cualquier usuario autenticado veia
TODOS los proyectos (listado, detalle, actividades, tareas,
comentarios, adjuntos, KPIs del panel), sin importar si era miembro.
Ahora nadie ve un proyecto ajeno sin que su dueno se lo comparta --
los roles de administracion (superadmin/admin/it_manager) mantienen
visibilidad total para soporte.

Nuevo modelo de permisos por proyecto, simple y no granular:
- Solo el dueno original puede compartir un proyecto (agregar/quitar
  miembros, cambiar su nivel) -- ni un admin del proyecto ni un rol
  global pueden hacerlo por el.
- Dos niveles: Lectura (solo ver) y Escritura (crear/editar/eliminar
  actividades y tareas -- nunca el proyecto en si: no lo borra, no
  edita sus datos, no crea proyectos nuevos).

Actividades y tareas pasan a borrado logico (antes se borraban
fisico sin poder recuperar) -- nueva papelera por proyecto con
restaurar.

Incluye tambien el filtro "Usuario" en Proyectos (probado en dev en
un paso anterior), que va de la mano con este cambio de visibilidad.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-25 18:19:41 -05:00
Milton Gonzalez ea0feb7e3a feat: version 2.3.0 -- aviso de actualizacion pendiente al iniciar sesion
Superadmin ve un popup con acceso directo a Configuracion >
Actualizaciones si hay una version nueva disponible, en vez de tener
que acordarse de revisar el panel manualmente.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 12:49:00 -05:00
Milton Gonzalez 74dc1ce5d7 fix: version 2.2.4 -- ocultar boton Actualizar automaticamente al terminar
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 12:38:31 -05:00
Milton Gonzalez fa4ddbe164 feat: version 2.2.0 -- boton real de actualizacion (auto-update)
POST /api/updater/apply dispara scripts/apply-update.sh (backup +
git pull + migraciones + build + restart) en un proceso separado.
Apagado por defecto: solo se activa si el servidor define
UPDATE_APP_DIR/UPDATE_BACKEND_SERVICE/UPDATE_FRONTEND_SERVICE en su
backend/.env. Sin esa config, el panel se comporta igual que antes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 12:18:12 -05:00
Milton Gonzalez ceda779b75 feat: menu Notas -- apuntes rapidos personales
Nuevo menu "Notas" en el sidebar: crear, editar y eliminar apuntes rapidos, con fecha y hora de
creacion (y de ultima edicion si aplica). Siempre privadas de cada usuario -- una nota de otro
usuario responde 404, no 403, para no revelar que existe. Sin restriccion de rol.

Nuevo notes (tabla) + GET/POST/PUT/DELETE /api/notes. Probado de punta a punta en dev: crear,
editar, borrar y el formato de fecha/hora funcionan correctamente.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:54:05 -05:00
Milton Gonzalez feadd2e715 feat: filtro de severidad (Alta/Media/Baja) en el log de errores
Se asigna sola, sin etiquetar nada a mano: backend y errores de render de React (rompen toda la
pantalla) = alta; errores JS sueltos = media; promesas rechazadas sin manejar = baja (suelen ser
fallos de red puntuales, no criticos). Nuevo filtro en el panel ademas del de origen ya existente.

Migracion 014_error_logs_severity.sql (ALTER TABLE ADD COLUMN IF NOT EXISTS). Probado en dev: las
tres severidades se asignan correctamente segun el origen, un valor invalido del frontend cae en
media, y el filtro combinado con origen funciona.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:50:36 -05:00
Milton Gonzalez dec8891506 feat: log de errores para el admin (backend + frontend)
Panel nuevo en Configuracion ("Errores del sistema", solo superadmin): errores de backend
(excepciones 500 no manejadas, con stack/ruta/metodo/usuario) y de frontend (errores JS y
promesas sin catch en el navegador del usuario, antes invisibles para cualquiera mas alla de esa
persona). Filtro por origen, boton para limpiar el historial.

Error Boundary de React: si algo rompe el render, ya no queda pantalla en blanco -- aviso simple
con boton de recargar, y el error queda reportado igual.

Nuevo error_logs (tabla, se recorta sola a 1000 filas) + GET/DELETE /api/error-logs (superadmin)
+ POST /api/error-logs (publico, rate-limited, para reportar incluso sin sesion).

Probado de punta a punta en dev: error real de backend (500) capturado con stack completo y
usuario correcto, error JS global y promesa rechazada capturados desde el navegador, panel
muestra ambos y el boton de limpiar funciona. Se encontro y corrigio un bug real en el camino: la
identificacion de usuario opcional leia jwt.payload.id en vez de .sub (como realmente lo firma
auth/service.js), asi que nunca identificaba a nadie.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:31:40 -05:00
Milton Gonzalez 043433bf9b feat: convertir una actividad en proyecto (con sus tareas)
Una tarea siempre necesita una actividad contenedora, asi que convertir crea DOS cosas: el
proyecto nuevo y, dentro, una actividad nueva que recibe las tareas -- y comentarios/adjuntos --
de la actividad original. Se piden ambos nombres (precargados con el nombre actual) antes de
confirmar. La actividad original se borra al final, ya vacia de tareas (no choca con el bloqueo
de removeActivity). Exige el mismo permiso que crear un proyecto, no solo escribir la actividad.

Nuevo POST /api/activities/:id/convert-to-project. Probado de punta a punta en dev: prioridad
heredada, tareas y comentario movidos correctamente, actividad original eliminada, navega al
proyecto nuevo al terminar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 08:59:16 -05:00
Milton Gonzalez 59aadc6a35 feat: panel de Actualizaciones en Configuracion (solo informativo)
Compara la version instalada contra el CHANGELOG.md de main en Gitea (lectura anonima por HTTPS,
sin token) y muestra cada version pendiente con su criticidad -- derivada del digito que cambio
(1ro=Alta, 2do=Media, 3ro=Baja, sin etiquetar nada a mano, regla ya documentada en
VERSIONADO.md), una descripcion breve, y si trae migraciones de base de datos nuevas. Banner en
rojo avisando que la actualizacion requiere reiniciar el sistema.

No instala nada automaticamente -- solo informa. Aplicar la actualizacion (git pull, build,
migrar, reiniciar servicios) sigue siendo manual, a criterio del administrador de cada
instalacion, tal cual DEPLOY_WEB.md ya documenta.

Nuevo GET /api/updater/status (solo superadmin). Requiere que el repo en Gitea sea publico con
vista anonima habilitada -- documentado en DEPLOY_WEB.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 17:11:58 -05:00
Milton Gonzalez 67cb58ed0b feat: el buscador de Proyectos y Actividades tambien busca en tareas
Buscador de Proyectos: ahora busca tambien en actividades y tareas de cualquier proyecto (antes
solo nombre/codigo del proyecto). Resultados en un panel flotante con la ruta completa
"Proyecto - Actividad - Tarea"; clic navega al proyecto y abre la actividad encontrada
(pestaña Tareas si el resultado era una tarea).

Buscador de Actividades (dentro de un proyecto): busca tambien en las tareas de esa actividad,
mismo panel con "Actividad - Tarea".

Nuevo GET /api/search?q=...&projectId= (global o acotado a un proyecto). Nuevos componentes/hooks
reutilizables: SearchResultsDropdown, useDebouncedValue.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 15:04:53 -05:00
Milton Gonzalez 53570bd4f8 feat: mover una actividad (con sus tareas) a otro proyecto
Menu de tres puntos en el listado de Actividades -> elegir proyecto destino -> confirmar
("Se movera la actividad... (junto con sus tareas)... Aceptar/Cancelar) antes de ejecutar.

Tareas, comentarios y adjuntos se mueven solos (referencian la actividad, no el proyecto). Las
dependencias existentes se eliminan al mover -- solo tienen sentido dentro del mismo proyecto
(addDependency ya lo exigia). Nuevo PUT /api/activities/:id/move, exige permiso de escritura en
ambos proyectos (origen y destino).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:47:57 -05:00
Milton Gonzalez 9d76e1b79b feat: columna Actualizado (fecha y hora) en el listado de Actividades
Mismo formato que ya existia en Proyectos. Ordenable por columna; no cambia el orden por
defecto (sigue siendo el orden manual arrastrado con el mouse).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:38:44 -05:00
Milton Gonzalez 696ab0d092 fix: arrastrar tareas para reordenar dejo de funcionar
Regresion del fix del checkbox (v1.15.2): draggable/onDragStart quedaron directo sobre el <svg>
del icono de agarre, que solo capta el mousedown sobre lo pintado (huecos entre sus formas), no
sobre todo su recuadro -- el navegador no siempre detectaba el inicio del arrastre. Envuelto en
un <span> con area de agarre solida, mismo patron ya usado en el listado de Actividades.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:22:26 -05:00
Milton Gonzalez 60347fab72 feat: contador de Tareas muestra pendientes/total (ej. 2/3)
Solo la pestaña Tareas -- Comentarios y Documentos siguen con el total simple. Se recalcula al
agregar, quitar o marcar/desmarcar tareas.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 13:02:34 -05:00
Milton Gonzalez 1b23da7151 feat: contador en las pestañas de Tareas/Comentarios/Documentos de una actividad
Circulo con el numero al lado del nombre de la pestaña: Tareas muestra las pendientes (sin
marcar), Comentarios y Documentos el total. Soporte agregado al componente Tabs reutilizable
(tab.count), no solo al detalle de actividad.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:52:00 -05:00