From 5aed7d81cedd25e559aba686a7759fb159649a04 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 13 Jun 2026 12:01:19 +0200 Subject: [PATCH] fix mdp see --- .../app/[locale]/admin/login/page.tsx | 37 +++++--- .../app/[locale]/admin/users/page.tsx | 26 ++++-- .../app/[locale]/dashboard/profile/page.tsx | 92 ++++++++++++++----- apps/frontend/app/[locale]/login/page.tsx | 46 ++++++---- apps/frontend/app/[locale]/register/page.tsx | 76 ++++++++++----- .../app/[locale]/reset-password/page.tsx | 76 ++++++++++----- apps/frontend/messages/en.json | 4 +- apps/frontend/messages/fr.json | 4 +- .../src/components/admin/CarrierForm.tsx | 27 ++++-- 9 files changed, 280 insertions(+), 108 deletions(-) diff --git a/apps/frontend/app/[locale]/admin/login/page.tsx b/apps/frontend/app/[locale]/admin/login/page.tsx index befdf59..9392a3e 100644 --- a/apps/frontend/app/[locale]/admin/login/page.tsx +++ b/apps/frontend/app/[locale]/admin/login/page.tsx @@ -4,17 +4,19 @@ import { useState } from 'react'; import { useTranslations } from 'next-intl'; import { Link, useRouter } from '@/i18n/navigation'; import Image from 'next/image'; -import { ShieldCheck } from 'lucide-react'; +import { ShieldCheck, Eye, EyeOff } from 'lucide-react'; import { login as apiLogin, getCurrentUser, logout as apiLogout } from '@/lib/api/auth'; import { useAuth } from '@/lib/context/auth-context'; export default function AdminLoginPage() { const t = useTranslations('admin.login'); + const tCommon = useTranslations('common'); const router = useRouter(); const { refreshUser } = useAuth(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); + const [showPassword, setShowPassword] = useState(false); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); @@ -94,17 +96,28 @@ export default function AdminLoginPage() { - setPassword(e.target.value)} - className="input w-full" - placeholder={t('passwordPlaceholder')} - autoComplete="current-password" - disabled={isLoading} - required - /> +
+ setPassword(e.target.value)} + className="input w-full pr-12" + placeholder={t('passwordPlaceholder')} + autoComplete="current-password" + disabled={isLoading} + required + /> + +
+
+
{passwordForm.formState.errors.currentPassword && (

{passwordForm.formState.errors.currentPassword.message} @@ -347,13 +369,24 @@ export default function ProfilePage() { > {t('passwordForm.new')} - +

+ + +
{passwordForm.formState.errors.newPassword && (

{passwordForm.formState.errors.newPassword.message} @@ -369,13 +402,30 @@ export default function ProfilePage() { > {t('passwordForm.confirm')} - +

+ + +
{passwordForm.formState.errors.confirmPassword && (

{passwordForm.formState.errors.confirmPassword.message} diff --git a/apps/frontend/app/[locale]/login/page.tsx b/apps/frontend/app/[locale]/login/page.tsx index 17e4fe3..106ed1c 100644 --- a/apps/frontend/app/[locale]/login/page.tsx +++ b/apps/frontend/app/[locale]/login/page.tsx @@ -5,6 +5,7 @@ import { Link } from '@/i18n/navigation'; import Image from 'next/image'; import { useSearchParams } from 'next/navigation'; import { useTranslations } from 'next-intl'; +import { Eye, EyeOff } from 'lucide-react'; import { useAuth } from '@/lib/context/auth-context'; function AnimatedCounter({ @@ -97,9 +98,11 @@ function LoginPageContent() { const tLogin = useTranslations('auth.login'); const tPanel = useTranslations('auth.sidePanel'); const tFooter = useTranslations('auth.footerLinks'); + const tCommon = useTranslations('common'); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [rememberMe, setRememberMe] = useState(false); + const [showPassword, setShowPassword] = useState(false); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const [fieldErrors, setFieldErrors] = useState({}); @@ -262,22 +265,33 @@ function LoginPageContent() { > {tLogin('passwordLabel')} - +

+ + +
{fieldErrors.password && (

(1); const [statsActive, setStatsActive] = useState(false); @@ -81,6 +83,8 @@ function RegisterPageContent() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [organizationName, setOrganizationName] = useState(''); const [organizationType, setOrganizationType] = useState('FREIGHT_FORWARDER'); @@ -513,17 +517,28 @@ function RegisterPageContent() { - setPassword(e.target.value)} - className="input w-full" - placeholder={t('passwordPlaceholder')} - autoComplete="new-password" - disabled={isLoading} - /> +

+ setPassword(e.target.value)} + className="input w-full pr-12" + placeholder={t('passwordPlaceholder')} + autoComplete="new-password" + disabled={isLoading} + /> + +

{t('passwordHint')}

@@ -531,17 +546,34 @@ function RegisterPageContent() { - setConfirmPassword(e.target.value)} - className="input w-full" - placeholder={t('passwordPlaceholder')} - autoComplete="new-password" - disabled={isLoading} - /> +
+ setConfirmPassword(e.target.value)} + className="input w-full pr-12" + placeholder={t('passwordPlaceholder')} + autoComplete="new-password" + disabled={isLoading} + /> + +
+

{t('passwordHint')}

@@ -177,17 +192,34 @@ function ResetPasswordContent() { - setConfirmPassword(e.target.value)} - className="input w-full" - placeholder="••••••••••••" - autoComplete="new-password" - disabled={loading} - /> +
+ setConfirmPassword(e.target.value)} + className="input w-full pr-12" + placeholder="••••••••••••" + autoComplete="new-password" + disabled={loading} + /> + +
+ {/* Rate Limit */}