templates/security/forgot_password.html.twig line 1

  1. {% extends 'base.html.twig' %}
  2. {% block title %}Mot de passe oublié | {{ parent() }}{% endblock %}
  3. {% block body %}
  4. <!-- ==================== MESSAGES ==================== -->
  5. <div class="container mx-auto px-4 mb-6 max-w-md">
  6.     {% include 'partials/_flash_messages.html.twig' %}
  7. </div>
  8. <!-- ==================== FORMULAIRE ==================== -->
  9. <div class="container mx-auto px-4 pb-16">
  10.     <div class="max-w-md mx-auto">
  11.         <div class="bg-white rounded-2xl shadow-xl border border-slate-200 overflow-hidden">
  12.             
  13.             <!-- Titre -->
  14.             <div class="px-6 pt-8 pb-2 text-center">
  15.                 <h2 class="text-2xl font-bold text-slate-800 mb-1">
  16.                     {% if step == 1 %}Mot de passe oublié{% else %}Nouveau mot de passe{% endif %}
  17.                 </h2>
  18.                 <p class="text-sm text-slate-500">
  19.                     {% if step == 1 %}Vérifiez votre identité pour réinitialiser{% else %}Créez un nouveau mot de passe{% endif %}
  20.                 </p>
  21.             </div>
  22.             <div class="p-6 md:p-8 pt-2">
  23.                 {% if step == 1 %}
  24.                 <!-- ========== ÉTAPE 1 : Vérification ========== -->
  25.                 <form method="post" class="space-y-6">
  26.                     <!-- Identifiant (email ou téléphone) -->
  27.                     <div>
  28.                         <label for="identifier" class="block text-sm font-medium text-slate-700 mb-2">
  29.                             E-mail ou numéro de téléphone
  30.                         </label>
  31.                         <input type="text" 
  32.                                name="identifier" 
  33.                                id="identifier" 
  34.                                class="w-full px-4 py-3 rounded-lg border border-slate-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition"
  35.                                placeholder="exemple@email.com ou 0123456789"
  36.                                required 
  37.                                autofocus>
  38.                         <p class="text-xs text-slate-400 mt-1">Entrez l'email ou le numéro de téléphone utilisé lors de l'inscription</p>
  39.                     </div>
  40.                     <!-- 4 derniers chiffres du téléphone -->
  41.                     <div>
  42.                         <label for="lastFourDigits" class="block text-sm font-medium text-slate-700 mb-2">
  43.                             4 derniers chiffres du numéro de téléphone
  44.                         </label>
  45.                         <input type="text" 
  46.                                name="last_four_digits" 
  47.                                id="lastFourDigits" 
  48.                                class="w-full px-4 py-3 rounded-lg border border-slate-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition"
  49.                                placeholder="Ex: 6789"
  50.                                maxlength="4"
  51.                                pattern="[0-9]{4}"
  52.                                required>
  53.                         <p class="text-xs text-slate-400 mt-1">Entrez les 4 derniers chiffres de votre numéro de téléphone</p>
  54.                     </div>
  55.                     <!-- Bouton -->
  56.                     <button type="submit" 
  57.                             name="verify_user"
  58.                             class="w-full py-3 px-4 bg-gradient-to-r from-indigo-600 to-purple-600 text-white font-semibold rounded-lg hover:from-indigo-700 hover:to-purple-700 transition transform hover:scale-[1.02] shadow-lg flex items-center justify-center">
  59.                         <i class="fas fa-check mr-2"></i>
  60.                         Vérifier
  61.                     </button>
  62.                 </form>
  63.                 {% else %}
  64.                 <!-- ========== ÉTAPE 2 : Nouveau mot de passe ========== -->
  65.                 <form method="post" class="space-y-6">
  66.                     <!-- Info utilisateur -->
  67.                     <div class="bg-indigo-50 border border-indigo-200 rounded-lg p-4 text-center">
  68.                         <p class="text-sm text-indigo-700">
  69.                             <i class="fas fa-user-check mr-2"></i>
  70.                             Identité vérifiée pour <strong>{{ identifier }}</strong>
  71.                         </p>
  72.                     </div>
  73.                     <!-- Nouveau mot de passe -->
  74.                     <div>
  75.                         <label for="newPassword" class="block text-sm font-medium text-slate-700 mb-2">
  76.                             Nouveau mot de passe
  77.                         </label>
  78.                         <div class="relative">
  79.                             <input type="password" 
  80.                                    name="new_password" 
  81.                                    id="newPassword" 
  82.                                    class="w-full px-4 py-3 rounded-lg border border-slate-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition"
  83.                                    placeholder="••••••••"
  84.                                    minlength="6"
  85.                                    required>
  86.                             <button type="button" 
  87.                                     onclick="togglePassword('newPassword', 'toggleNewIcon')" 
  88.                                     class="absolute inset-y-0 right-0 pr-4 flex items-center">
  89.                                 <i class="fas fa-eye text-slate-400 hover:text-indigo-600 transition" id="toggleNewIcon"></i>
  90.                             </button>
  91.                         </div>
  92.                         <p class="text-xs text-slate-400 mt-1">Minimum 6 caractères</p>
  93.                     </div>
  94.                     <!-- Confirmation mot de passe -->
  95.                     <div>
  96.                         <label for="confirmPassword" class="block text-sm font-medium text-slate-700 mb-2">
  97.                             Confirmer le mot de passe
  98.                         </label>
  99.                         <div class="relative">
  100.                             <input type="password" 
  101.                                    name="confirm_password" 
  102.                                    id="confirmPassword" 
  103.                                    class="w-full px-4 py-3 rounded-lg border border-slate-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent transition"
  104.                                    placeholder="••••••••"
  105.                                    minlength="6"
  106.                                    required>
  107.                             <button type="button" 
  108.                                     onclick="togglePassword('confirmPassword', 'toggleConfirmIcon')" 
  109.                                     class="absolute inset-y-0 right-0 pr-4 flex items-center">
  110.                                 <i class="fas fa-eye text-slate-400 hover:text-indigo-600 transition" id="toggleConfirmIcon"></i>
  111.                             </button>
  112.                         </div>
  113.                     </div>
  114.                     <!-- Bouton -->
  115.                     <button type="submit" 
  116.                             name="reset_password"
  117.                             class="w-full py-3 px-4 bg-gradient-to-r from-green-600 to-emerald-600 text-white font-semibold rounded-lg hover:from-green-700 hover:to-emerald-700 transition transform hover:scale-[1.02] shadow-lg flex items-center justify-center">
  118.                         <i class="fas fa-save mr-2"></i>
  119.                         Enregistrer le mot de passe
  120.                     </button>
  121.                 </form>
  122.                 {% endif %}
  123.                 <!-- Lien retour -->
  124.                 <div class="mt-6 pt-6 border-t border-slate-200 text-center">
  125.                     <a href="{{ path('app_login') }}" class="text-sm text-indigo-600 hover:text-indigo-800 font-medium inline-flex items-center">
  126.                         <i class="fas fa-arrow-left mr-1"></i>
  127.                         Retour à la connexion
  128.                     </a>
  129.                 </div>
  130.             </div>
  131.         </div>
  132.     </div>
  133. </div>
  134. <!-- ==================== JAVASCRIPT ==================== -->
  135. <script>
  136. function togglePassword(inputId, iconId) {
  137.     const passwordInput = document.getElementById(inputId);
  138.     const toggleIcon = document.getElementById(iconId);
  139.     
  140.     if (passwordInput.type === 'password') {
  141.         passwordInput.type = 'text';
  142.         toggleIcon.classList.remove('fa-eye');
  143.         toggleIcon.classList.add('fa-eye-slash');
  144.     } else {
  145.         passwordInput.type = 'password';
  146.         toggleIcon.classList.remove('fa-eye-slash');
  147.         toggleIcon.classList.add('fa-eye');
  148.     }
  149. }
  150. </script>
  151. {% endblock %}