v1.13.0
Added
- Filtros server-side en Audit Log —
/activity-logsahora usa DataTables server-side processing con filtros por evento, usuario y rango de fechas:- Nuevo endpoint
GET /activity-logs/dataque devuelve JSON para DataTables (protocolodraw/recordsTotal/recordsFiltered/data) - Formulario de filtros colapsable (Bootstrap collapse) sobre la tabla: select de evento, input de username (match parcial), inputs
date_from/date_to; badge warning en el toggle cuando hay filtros activos - DataTables reconfigured to
serverSide: true— la tabla empieza vacía y carga datos vía AJAX;searching: falsedesactiva el input nativo de DT (reemplazado por el formulario propio) - Botones de export (Copy, PDF, Excel, CSV, Print) y ColVis conservados; exportan la página visible (comportamiento esperado con server-side processing)
- Seguridad:
eventvalidado con allow-list de constantesEVENT_*; fechas validadas estrictamente conDateTime::createFromFormat;usernamecontrim()+ cap de 100 caracteres;lengthrestringido a[10, 25, 50, 100]; XSS en JSON mitigado conhtmlspecialchars()por celda - 8 nuevos tests en
tests/Unit/ActivityLogTest.php— filtro por evento, match parcial de username, rango de fechas, LIMIT/OFFSET,getTotalCount()con y sin filtros, combinación AND; 58 tests en total
- Nuevo endpoint
Changed
app/Model/ActivityLog.php—getAll()reescrito con prepared statements y WHERE dinámico; nueva firmagetAll(array $filters = [], ?int $limit = null, ?int $offset = null): array; nuevo métodogetTotalCount(array $filters = []): int; método privadobuildWhere(array $filters): arrayapp/Controller/ActivityLogController.php— nuevo métododata(): void(endpoint JSON); método privadosanitizeFilters(array $input): array;index()sin cambios de lógicaroutes/web.php— nueva rutaGET /activity-logs/dataregistrada antes de/activity-logsviews/activity-log/index.php—<tbody>vacío (DataTables llena vía AJAX); formulario de filtros colapsable añadido;$hasActiveFiltersbadge en togglepublic/js/activity-logs-table.js— migrado aserverSide: true;ajax.datacallback pasa los valores del formulario; botón "Filtrar" llamaajax.reload()
Full Changelog
https://github.com/Jandres25/Encriptacion_PHP/blob/master/CHANGELOG.md