feat: version 4.16.1 -- Equipos: filas sin subniveles alineadas con los grupos

Incluye el registro del despliegue de 4.16.0 en ESTADO y PRODUCCION.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-10-30 12:43:03 -05:00
parent 420a794c9e
commit 053f51afe7
8 changed files with 27 additions and 9 deletions
+5
View File
@@ -1,5 +1,10 @@
# Changelog - project.linkedcorp.net # Changelog - project.linkedcorp.net
## [4.16.1] - 2026-10-30
### Changed
- Equipos → Software: los programas sin subniveles llevan un punto y quedan alineados con los
grupos por fabricante; los programas desplegados van más adentro.
## [4.16.0] - 2026-10-30 ## [4.16.0] - 2026-10-30
### Added ### Added
- Equipos → Software (detalle del equipo y pestaña general): columna "Tipo" y filtro con Gratuito, - Equipos → Software (detalle del equipo y pestaña general): columna "Tipo" y filtro con Gratuito,
+2 -2
View File
@@ -8,8 +8,8 @@ autorregistro/aprobacion/SMTP.
- v4.16.0 (2026-10-30): Software con tipo de licencia, grupos por fabricante y corrección manual; - v4.16.0 (2026-10-30): Software con tipo de licencia, grupos por fabricante y corrección manual;
migración `040` aplicada en dev. Backend probado contra la BD de dev; pantalla probada con API migración `040` aplicada en dev. Backend probado contra la BD de dev; pantalla probada con API
simulada (sin login real) y **falta probarla con un usuario real**. Pendiente: servidor LinkedCorp simulada (sin login real) y **falta probarla con un usuario real**. Desplegada en LinkedCorp `.3`
`.3` sigue en 2.19.0 (decidir si se sube) y aplicar el actualizador en Exilaser. el 2026-10-30 (ver `PRODUCCION.md`). Exilaser se actualiza por su panel.
- Conector FoxPro **1.1.0 instalado en Exilaser** (`C:\api_project\foxpro`, puerto 8455, tarea - Conector FoxPro **1.1.0 instalado en Exilaser** (`C:\api_project\foxpro`, puerto 8455, tarea
`LinkedCorp-Conector-FoxPro`). Token en `~/.config/linkedcorp/conector-foxpro-exilaser.token`. `LinkedCorp-Conector-FoxPro`). Token en `~/.config/linkedcorp/conector-foxpro-exilaser.token`.
- **Módulo del sistema hecho en dev**: migración 038 aplicada en dev, `modules/integrations`, job - **Módulo del sistema hecho en dev**: migración 038 aplicada en dev, `modules/integrations`, job
+12
View File
@@ -624,3 +624,15 @@ sudo journalctl -u project-linkedcorp-frontend -n 100 --no-pager
- No dejar secretos en el repo (`.env` de produccion vive solo en `backend/.env` del servidor). - No dejar secretos en el repo (`.env` de produccion vive solo en `backend/.env` del servidor).
- No reemplazar `storage/` ni `logs/` durante un deploy. - No reemplazar `storage/` ni `logs/` durante un deploy.
- Documentar cambios de version y estado real en este archivo y en `CHANGELOG.md`. - Documentar cambios de version y estado real en este archivo y en `CHANGELOG.md`.
## Actualizacion v4.16.0 (2026-10-30) — salto desde v2.19.0
- Servidor `.3`, salto de 2.19.0 a 4.16.0 (commit `420a794`). `migrate-db.js` aplico las 40
migraciones; la BD paso de 36 a 55 tablas. Conteos iguales antes y despues: 3 usuarios,
12 proyectos, 38 actividades, 186 tareas.
- Antes de migrar se confirmo el marcador `seed_it_baseline_2026_09`: sin el, `006` borraria proyectos.
- Respaldos: `backups/pre_v4.16.0_20261030_173843.sql` y `backups/dist_2.19.0_20261030_173843/`.
- Reversion: restaurar ese SQL, `git reset --hard 8ed1d63` en `source/`, reinstalar dependencias,
recompilar frontend y reiniciar los dos servicios.
- PID cambiados y `/health` OK. Publico: `version.json` 4.16.0, login sin errores de consola.
- Las sesiones anteriores quedan invalidas (JWT sin `sid`): todos inician sesion una vez.
+1 -1
View File
@@ -1 +1 @@
4.16.0 4.16.1
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "project-linkedcorp-backend", "name": "project-linkedcorp-backend",
"version": "4.16.0", "version": "4.16.1",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/server.js", "main": "src/server.js",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "project-linkedcorp-frontend", "name": "project-linkedcorp-frontend",
"private": true, "private": true,
"version": "4.16.0", "version": "4.16.1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
+4 -4
View File
@@ -67,12 +67,12 @@ export function ListView({ columns, rows, searchValue, getSearchHaystack, onRowC
</td> </td>
)} )}
{columns.map((col, index) => ( {columns.map((col, index) => (
<td key={col.key} style={index === 0 && child ? { paddingLeft: 38 } : undefined}> <td key={col.key} style={index === 0 && child ? { paddingLeft: 54 } : undefined}>
{index === 0 && isParent ? ( {index === 0 && getChildren && !child ? (
<span className="list-tree-cell"> <span className="list-tree-cell">
<button type="button" className="tree-toggle" aria-expanded={open} aria-label={t(open ? 'common_collapse' : 'common_expand')} onClick={(e) => { e.stopPropagation(); onToggle(); }}> {isParent ? <button type="button" className="tree-toggle" aria-expanded={open} aria-label={t(open ? 'common_collapse' : 'common_expand')} onClick={(e) => { e.stopPropagation(); onToggle(); }}>
{open ? <ChevronDown size={14} /> : <ChevronRight size={14} />} {open ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
</button> </button> : <span className="tree-toggle list-tree-dot" aria-hidden="true" />}
{col.render ? col.render(row) : row[col.key]} {col.render ? col.render(row) : row[col.key]}
</span> </span>
) : (col.render ? col.render(row) : row[col.key])} ) : (col.render ? col.render(row) : row[col.key])}
+1
View File
@@ -231,6 +231,7 @@ table.list-table { width: 100%; border-collapse: collapse; font-size: .8rem; }
.list-table tbody tr:hover { background: rgb(var(--panel)); } .list-table tbody tr:hover { background: rgb(var(--panel)); }
.list-table tbody tr:last-child td { border-bottom: none; } .list-table tbody tr:last-child td { border-bottom: none; }
.list-tree-cell { display: inline-flex; align-items: center; gap: 6px; } .list-tree-cell { display: inline-flex; align-items: center; gap: 6px; }
.list-tree-dot::before { content: ''; width: 4px; height: 4px; border-radius: 50%; background: rgb(var(--muted)); }
.list-empty { padding: 40px 16px; text-align: center; color: rgb(var(--muted)); } .list-empty { padding: 40px 16px; text-align: center; color: rgb(var(--muted)); }
.row-menu-btn { opacity: .6; } .row-menu-btn { opacity: .6; }
.row-menu-btn:hover { opacity: 1; } .row-menu-btn:hover { opacity: 1; }