feat: version 3.0.0 -- Correcciones de auditoria de seguridad, accesibilidad y redundancia

Permisos (superadmin, viewer, busqueda, tareas recurrentes), bootstrap atomico,
revocacion de JWT por version de sesion (028), control optimista de edicion (029),
logo sin SVG + CSP, ingesta endurecida, correos escapados, borradores, paginacion
de proyectos, accesibilidad de dialogos/controles e i18n.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-10-23 11:36:02 -05:00
parent 8ed1d63505
commit e65111a7f4
112 changed files with 2285 additions and 651 deletions
+46 -2
View File
@@ -54,7 +54,7 @@ export const messages = {
config_company: 'Empresa',
company_name: 'Nombre de la empresa',
company_logo: 'Logo',
company_logo_hint: 'PNG, JPG, WEBP o SVG. Se usa en el menu lateral y en las pantallas de acceso.',
company_logo_hint: 'PNG, JPG o WEBP. Se usa en el menu lateral y en las pantallas de acceso.',
company_logo_none: 'Sin logo',
company_logo_choose: 'Elegir imagen',
@@ -117,6 +117,8 @@ export const messages = {
common_delete: 'Eliminar',
common_close: 'Cerrar',
common_search: 'Buscar...',
common_select: 'Seleccionar',
common_actions: 'Acciones',
common_search_no_results: 'Sin resultados',
common_actions: 'Acciones',
common_view: 'Ver',
@@ -155,11 +157,31 @@ export const messages = {
dashboard_today_activities: 'Para hoy',
dashboard_average_progress: 'Avance promedio',
common_of: 'de',
draft_leave_title: 'Cambios sin guardar',
draft_leave_msg: 'Vas a salir de una sección con cambios que todavía no guardaste:',
draft_leave_hint: 'Si los dejas pendientes, se conservan en este navegador y se reabre la edición al volver.',
draft_discard: 'Descartar cambios',
draft_keep_pending: 'Dejar pendiente',
draft_keep_editing: 'Seguir editando',
draft_pending_mark: 'Cambios sin guardar',
draft_field_modified: 'modificado',
draft_restored_msg: 'Se recuperaron cambios que no habías guardado. Revisa y guarda, o descártalos.',
draft_conflict_title: 'El registro cambió',
draft_conflict_reload_msg: 'El registro cambió en el servidor. Recarga para revisar la versión actual antes de guardar. Tus cambios pendientes se conservarán.',
draft_conflict_reload: 'Descartar y recargar',
draft_conflict_msg: 'Este registro cambió en el servidor desde que empezaste a editarlo. Si guardas tus cambios pendientes, reemplazarás esos cambios.',
draft_conflict_save_msg: 'Este registro cambió en el servidor desde que empezaste a editarlo (otra persona u otra pestaña). ¿Quieres sobrescribirlo con tus cambios?',
draft_conflict_overwrite: 'Sobrescribir',
draft_keep_mine: 'Mantener mis cambios',
draft_use_server: 'Descartar mis cambios',
session_expired_login_msg: 'Tu sesión venció. Inicia sesión otra vez para volver a donde estabas; los cambios sin guardar se conservaron.',
dashboard_cards: 'Tarjetas',
dashboard_no_cards: 'No hay tarjetas seleccionadas. Elige cuáles mostrar en "Tarjetas".',
dashboard_projects_by_status: 'Proyectos por estado',
projects_title: 'Proyectos',
project_page_range: 'Mostrando', project_page_of: 'de', project_page_previous: 'Anterior', project_page_next: 'Siguiente',
draft_conflict_check_failed: 'No se pudo comprobar la versión actual. Intenta de nuevo.',
project_code: 'Codigo',
project_new: 'Nuevo proyecto',
project_objective: 'Objetivo',
@@ -541,7 +563,7 @@ export const messages = {
config_company: 'Company',
company_name: 'Company name',
company_logo: 'Logo',
company_logo_hint: 'PNG, JPG, WEBP or SVG. Used in the sidebar and on the sign-in screens.',
company_logo_hint: 'PNG, JPG or WEBP. Used in the sidebar and on the sign-in screens.',
company_logo_none: 'No logo',
company_logo_choose: 'Choose image',
@@ -604,6 +626,8 @@ export const messages = {
common_delete: 'Delete',
common_close: 'Close',
common_search: 'Search...',
common_select: 'Select',
common_actions: 'Actions',
common_search_no_results: 'No results',
common_actions: 'Actions',
common_view: 'View',
@@ -642,11 +666,31 @@ export const messages = {
dashboard_today_activities: 'Due today',
dashboard_average_progress: 'Average progress',
common_of: 'of',
draft_leave_title: 'Unsaved changes',
draft_leave_msg: 'You are leaving a section with changes you have not saved yet:',
draft_leave_hint: 'If you leave them pending, they are kept in this browser and editing reopens when you come back.',
draft_discard: 'Discard changes',
draft_keep_pending: 'Leave pending',
draft_keep_editing: 'Keep editing',
draft_pending_mark: 'Unsaved changes',
draft_field_modified: 'modified',
draft_restored_msg: 'Unsaved changes were recovered. Review and save them, or discard them.',
draft_conflict_title: 'The record changed',
draft_conflict_reload_msg: 'The record changed on the server. Reload to review the current version before saving. Your pending changes will be kept.',
draft_conflict_reload: 'Discard and reload',
draft_conflict_msg: 'This record changed on the server since you started editing it. Saving your pending changes will replace those changes.',
draft_conflict_save_msg: 'This record changed on the server since you started editing it (someone else or another tab). Do you want to overwrite it with your changes?',
draft_conflict_overwrite: 'Overwrite',
draft_keep_mine: 'Keep my changes',
draft_use_server: 'Discard my changes',
session_expired_login_msg: 'Your session expired. Sign in again to return where you were; unsaved changes were kept.',
dashboard_cards: 'Cards',
dashboard_no_cards: 'No cards selected. Choose which ones to show in "Cards".',
dashboard_projects_by_status: 'Projects by status',
projects_title: 'Projects',
project_page_range: 'Showing', project_page_of: 'of', project_page_previous: 'Previous', project_page_next: 'Next',
draft_conflict_check_failed: 'Could not check the current version. Try again.',
project_code: 'Code',
project_new: 'New project',
project_objective: 'Objective',