Files
Ressources-relationnel/resources/views/profile/settings.blade.php
T
sam e5e6f72f92
CD - Déploiement continu / deploy (push) Successful in 6m44s
CI - Intégration continue / quality-and-tests (push) Failing after 2m30s
Sécurisation, déploiement CI/CD Gitea et documentation INFCDAAL3
- CI/CD Gitea Actions: ci.yml (Pint + PHPUnit), deploy.yml (déploiement SSH)
- Suppression de l'ancien workflow GitHub cassé
- En-têtes de sécurité: ajout CSP et Permissions-Policy
- RGPD: droit à l'effacement (anonymisation du compte) + tests
- Correctifs: ForceHttps hors env testing, timestamps du modèle Utilisateur,
  suppression des migrations en doublon (migrate échouait sur base neuve)
- Qualité: formatage Laravel Pint sur l'ensemble du code
- Documentation dossier technique (docs/) + .docx + .pptx

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 11:09:34 +02:00

188 lines
9.8 KiB
PHP

@extends('app')
@section('title', 'Paramètres du Profil - (RE)Sources Relationnelles')
@section('content')
<section class="container mx-auto px-4 py-12">
<div class="max-w-2xl mx-auto">
<!-- En-tête -->
<div class="mb-8">
<h1 class="text-4xl font-bold text-gray-900 mb-2">Paramètres du profil</h1>
<p class="text-gray-600">Gérez vos informations personnelles et vos préférences</p>
</div>
<!-- Messages de succès -->
@if (session('success'))
<div class="mb-6 p-4 bg-green-50 border border-green-200 rounded-lg">
<p class="text-green-700 font-semibold"> {{ session('success') }}</p>
</div>
@endif
<!-- Erreurs -->
@if ($errors->any())
<div class="mb-6 p-4 bg-red-50 border border-red-200 rounded-lg">
@foreach ($errors->all() as $error)
<p class="text-red-700 text-sm">{{ $error }}</p>
@endforeach
</div>
@endif
<!-- Photo de profil -->
<div class="bg-white rounded-xl border border-gray-200 p-8 mb-6">
<h2 class="text-2xl font-bold text-gray-900 mb-6">Photo de profil</h2>
<div class="flex items-center gap-6">
<div class="flex-shrink-0">
<img
src="https://ui-avatars.com/api/?name={{ urlencode(Auth::user()->Pseudo) }}&background=06989e&color=fff&size=120"
alt="Photo de profil"
class="w-32 h-32 rounded-full border-4 border-niagara"
>
</div>
<div>
<p class="text-gray-600 mb-4">Votre photo de profil est générée automatiquement à partir de votre pseudo.</p>
<p class="text-sm text-gray-500">Les avatars sont fournis par ui-avatars.com</p>
</div>
</div>
</div>
<!-- Formulaire de modification -->
<div class="bg-white rounded-xl border border-gray-200 p-8">
<h2 class="text-2xl font-bold text-gray-900 mb-6">Informations personnelles</h2>
<form action="{{ route('profile.update') }}" method="POST" class="space-y-6">
@csrf
@method('PUT')
<!-- Pseudo -->
<div>
<label for="Pseudo" class="block text-sm font-bold mb-2 text-gray-700">Pseudo</label>
<input
type="text"
id="Pseudo"
name="Pseudo"
required
maxlength="100"
value="{{ old('Pseudo', Auth::user()->Pseudo) }}"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-niagara outline-none @error('Pseudo') border-red-500 @enderror">
@error('Pseudo')
<p class="text-red-600 text-xs mt-1">{{ $message }}</p>
@enderror
</div>
<!-- Email -->
<div>
<label for="Email" class="block text-sm font-bold mb-2 text-gray-700">Email</label>
<input
type="email"
id="Email"
name="Email"
required
value="{{ old('Email', Auth::user()->Email) }}"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-niagara outline-none @error('Email') border-red-500 @enderror">
@error('Email')
<p class="text-red-600 text-xs mt-1">{{ $message }}</p>
@enderror
</div>
<hr class="my-8">
<!-- Modification du mot de passe -->
<div>
<h3 class="text-lg font-bold text-gray-900 mb-4">Modifier votre mot de passe</h3>
<p class="text-gray-600 text-sm mb-4">Laissez vide si vous ne voulez pas le modifier.</p>
<!-- Mot de passe actuel -->
<div class="mb-4">
<label for="MotDePasse_Actuel" class="block text-sm font-bold mb-2 text-gray-700">Mot de passe actuel</label>
<input
type="password"
id="MotDePasse_Actuel"
name="MotDePasse_Actuel"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-niagara outline-none @error('MotDePasse_Actuel') border-red-500 @enderror">
@error('MotDePasse_Actuel')
<p class="text-red-600 text-xs mt-1">{{ $message }}</p>
@enderror
</div>
<!-- Nouveau mot de passe -->
<div class="mb-4">
<label for="MotDePasse_Nouveau" class="block text-sm font-bold mb-2 text-gray-700">Nouveau mot de passe</label>
<input
type="password"
id="MotDePasse_Nouveau"
name="MotDePasse_Nouveau"
minlength="8"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-niagara outline-none @error('MotDePasse_Nouveau') border-red-500 @enderror">
@error('MotDePasse_Nouveau')
<p class="text-red-600 text-xs mt-1">{{ $message }}</p>
@enderror
</div>
<!-- Confirmation mot de passe -->
<div>
<label for="MotDePasse_Nouveau_confirmation" class="block text-sm font-bold mb-2 text-gray-700">Confirmer le nouveau mot de passe</label>
<input
type="password"
id="MotDePasse_Nouveau_confirmation"
name="MotDePasse_Nouveau_confirmation"
minlength="8"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-niagara outline-none">
</div>
</div>
<!-- Boutons -->
<div class="flex gap-4 pt-6">
<button type="submit" class="px-8 py-3 gradient-niagara text-white font-bold rounded-lg hover:shadow-lg transition-smooth duration-200">
💾 Enregistrer les modifications
</button>
<a href="{{ route('home') }}" class="px-8 py-3 bg-gray-200 text-gray-900 font-bold rounded-lg hover:bg-gray-300 transition-smooth duration-200">
Annuler
</a>
</div>
</form>
</div>
<!-- Section Danger -->
<div class="bg-white rounded-xl border-2 border-red-200 p-8 mt-6">
<h2 class="text-2xl font-bold text-red-700 mb-4">⚠️ Zone de danger</h2>
<p class="text-gray-600 mb-6">Les actions ci-dessous ne peuvent pas être annulées.</p>
<form action="{{ route('logout') }}" method="POST" class="mb-8">
@csrf
<button type="submit" class="px-8 py-3 bg-red-600 text-white font-bold rounded-lg hover:bg-red-700 transition-smooth duration-200">
🚪 Se déconnecter
</button>
</form>
<hr class="my-6">
<!-- Suppression du compte (droit à l'effacement RGPD) -->
<h3 class="text-lg font-bold text-red-700 mb-2">Supprimer mon compte</h3>
<p class="text-gray-600 text-sm mb-4">
Conformément au RGPD, vous pouvez demander la suppression de votre compte.
Vos données personnelles (e-mail, pseudo) seront définitivement anonymisées.
Cette action est <strong>irréversible</strong>.
</p>
<form action="{{ route('profile.destroy') }}" method="POST"
onsubmit="return confirm('Confirmer la suppression définitive de votre compte ?');">
@csrf
@method('DELETE')
<div class="mb-4 max-w-sm">
<label for="MotDePasse_Confirmation" class="block text-sm font-bold mb-2 text-gray-700">Confirmez avec votre mot de passe</label>
<input
type="password"
id="MotDePasse_Confirmation"
name="MotDePasse_Confirmation"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-red-500 outline-none">
</div>
<button type="submit" class="px-8 py-3 bg-red-800 text-white font-bold rounded-lg hover:bg-red-900 transition-smooth duration-200">
🗑️ Supprimer définitivement mon compte
</button>
</form>
</div>
</div>
</section>
@endsection