diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cbb7f6..e90ab71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog - project.linkedcorp.net +## [1.4.0] - 2026-09-09 +### Added +- Boton de revelar/ocultar clave (icono de ojo) en todos los campos de contraseña de la app: + login, registro, restablecer clave, cambiar clave (usuario logueado), crear usuario y la clave + SMTP en Configuración. Nuevo componente reutilizable `PasswordInput`. +### Fixed +- El fix de espacios en SMTP del v1.3.0 usaba `trim()`, que solo recorta los bordes. El caso real + en producción tenía el espacio a mitad del host (`"mail.linkedcorp." + " " + "net"`), asi que + seguia fallando tras el primer fix. Corregido para quitar cualquier espacio, no solo los bordes. + ## [1.3.0] - 2026-09-06 ### Added - Configuración → Correo (SMTP): botón "Enviar prueba" con campo de destinatario. Ejecuta un envío diff --git a/VERSION b/VERSION index f0bb29e..88c5fb8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.0 +1.4.0 diff --git a/backend/package.json b/backend/package.json index 93f90b6..692be5a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "project-linkedcorp-backend", - "version": "1.3.0", + "version": "1.4.0", "private": true, "type": "module", "main": "src/server.js", diff --git a/frontend/package.json b/frontend/package.json index 3c9aa04..86cc16d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "project-linkedcorp-frontend", "private": true, - "version": "1.3.0", + "version": "1.4.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/app/AppShell.jsx b/frontend/src/app/AppShell.jsx index b9c29d8..a209fd9 100644 --- a/frontend/src/app/AppShell.jsx +++ b/frontend/src/app/AppShell.jsx @@ -6,6 +6,7 @@ import { Flyout, FlyoutItem, FlyoutSeparator } from '../components/Flyout.jsx'; import { DetailPopup } from '../components/DetailPopup.jsx'; import { Field } from '../components/Field.jsx'; import { Button } from '../components/Button.jsx'; +import { PasswordInput } from '../components/PasswordInput.jsx'; import { useAuth } from '../context/auth-context.jsx'; import { useUi } from '../context/ui-context.jsx'; import { useAsync } from '../hooks/useAsync.js'; @@ -131,13 +132,13 @@ export default function AppShell() { setChangingPassword(false)} width={420} height={380}> {passwordError &&
{passwordError}
} - setPasswordForm((f) => ({ ...f, currentPassword: e.target.value }))} autoFocus /> + setPasswordForm((f) => ({ ...f, currentPassword: e.target.value }))} autoFocus /> - setPasswordForm((f) => ({ ...f, newPassword: e.target.value }))} /> + setPasswordForm((f) => ({ ...f, newPassword: e.target.value }))} /> - setPasswordForm((f) => ({ ...f, confirmPassword: e.target.value }))} /> + setPasswordForm((f) => ({ ...f, confirmPassword: e.target.value }))} />
diff --git a/frontend/src/components/PasswordInput.jsx b/frontend/src/components/PasswordInput.jsx new file mode 100644 index 0000000..fc499ec --- /dev/null +++ b/frontend/src/components/PasswordInput.jsx @@ -0,0 +1,32 @@ +import { useState } from 'react'; +import { Eye, EyeOff } from 'lucide-react'; +import { useUi } from '../context/ui-context.jsx'; + +export function PasswordInput({ value, onChange, required, autoFocus, placeholder, id }) { + const { t } = useUi(); + const [visible, setVisible] = useState(false); + return ( +
+ + +
+ ); +} diff --git a/frontend/src/i18n/messages.js b/frontend/src/i18n/messages.js index 8f48c02..4072fe6 100644 --- a/frontend/src/i18n/messages.js +++ b/frontend/src/i18n/messages.js @@ -59,6 +59,8 @@ export const messages = { smtp_test_send: 'Enviar prueba', smtp_test_sending: 'Enviando...', smtp_test_success: 'Correo de prueba enviado correctamente a', + password_show: 'Mostrar clave', + password_hide: 'Ocultar clave', common_new: 'Nuevo', common_edit: 'Editar', common_save: 'Guardar', @@ -242,6 +244,8 @@ export const messages = { smtp_test_send: 'Send test', smtp_test_sending: 'Sending...', smtp_test_success: 'Test email sent successfully to', + password_show: 'Show password', + password_hide: 'Hide password', common_new: 'New', common_edit: 'Edit', common_save: 'Save', diff --git a/frontend/src/pages/Configuracion/SmtpSettingsPanel.jsx b/frontend/src/pages/Configuracion/SmtpSettingsPanel.jsx index 2f6d2f1..fd400ab 100644 --- a/frontend/src/pages/Configuracion/SmtpSettingsPanel.jsx +++ b/frontend/src/pages/Configuracion/SmtpSettingsPanel.jsx @@ -6,6 +6,7 @@ import { getSmtpConfig, updateSmtpConfig, testSmtpConfig } from '../../services/ import { Field, FieldRow } from '../../components/Field.jsx'; import { Button } from '../../components/Button.jsx'; import { InfoBar } from '../../components/InfoBar.jsx'; +import { PasswordInput } from '../../components/PasswordInput.jsx'; export default function SmtpSettingsPanel() { const { t, pushToast } = useUi(); @@ -66,7 +67,7 @@ export default function SmtpSettingsPanel() { - setForm((f) => ({ ...f, pass: e.target.value }))} /> + setForm((f) => ({ ...f, pass: e.target.value }))} /> diff --git a/frontend/src/pages/Login/LoginPage.jsx b/frontend/src/pages/Login/LoginPage.jsx index 64c7a41..1ce1246 100644 --- a/frontend/src/pages/Login/LoginPage.jsx +++ b/frontend/src/pages/Login/LoginPage.jsx @@ -5,6 +5,7 @@ import { useAuth } from '../../context/auth-context.jsx'; import { useUi } from '../../context/ui-context.jsx'; import { Field } from '../../components/Field.jsx'; import { Button } from '../../components/Button.jsx'; +import { PasswordInput } from '../../components/PasswordInput.jsx'; import logoDark from '../../assets/logoLinkedCorpTxt.png'; import logoLight from '../../assets/logoLinkedCorpTxtBlack.png'; @@ -43,7 +44,7 @@ export default function LoginPage() { setEmail(e.target.value)} required autoFocus /> - setPassword(e.target.value)} required /> + setPassword(e.target.value)} required />