From f57ae068b97ce046f977b58c6c8f38b9d38b2063 Mon Sep 17 00:00:00 2001 From: yann64 Date: Thu, 4 Jun 2026 18:01:38 +0200 Subject: [PATCH] =?UTF-8?q?Logo=20du=20site,=20favicon=20et=20contr=C3=B4l?= =?UTF-8?q?e=20des=20inscriptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SiteSettingsService : persistance JSON dans storage/app/site_settings.json (pas de migration DB — survit aux mises à jour sans table supplémentaire) Logo : - Upload admin (PNG/JPG/SVG/WebP, max 2 Mo) → storage/app/public/site/logo.{ext} - Favicon injecté dans app.blade.php et guest.blade.php - Logo affiché dans la barre de navigation (h-8, object-contain) - Logo affiché sur la page de connexion (guest layout) - Page d'accueil welcome.blade.php entièrement refaite : logo + bouton connexion (remplacement du template Laravel par défaut) - Suppression du logo possible depuis Admin > Paramètres du site Inscriptions : - Désactivées par défaut (registration_enabled=false dans site_settings.json) - RegisteredUserController : redirige vers /login si inscription désactivée (GET /register → redirect + message ; POST /register → abort 403) - Page d'accueil : bouton "Créer un compte" masqué si inscriptions désactivées - Admin > Paramètres du site : toggle checkbox pour activer/désactiver AppServiceProvider : partage $siteLogoUrl et $registrationEnabled avec toutes les vues Navigation : lien "Paramètres du site" en bas du menu Administration Co-Authored-By: Claude Sonnet 4.6 --- .../Controllers/Admin/SettingController.php | 61 ++++ .../Auth/RegisteredUserController.php | 13 +- app/Providers/AppServiceProvider.php | 20 +- app/Services/SiteSettingsService.php | 70 ++++ .../views/admin/parametres/index.blade.php | 77 +++++ resources/views/layouts/app.blade.php | 6 +- resources/views/layouts/guest.blade.php | 14 +- resources/views/layouts/navigation.blade.php | 13 +- resources/views/welcome.blade.php | 316 +++--------------- routes/admin.php | 7 + 10 files changed, 312 insertions(+), 285 deletions(-) create mode 100644 app/Http/Controllers/Admin/SettingController.php create mode 100644 app/Services/SiteSettingsService.php create mode 100644 resources/views/admin/parametres/index.blade.php diff --git a/app/Http/Controllers/Admin/SettingController.php b/app/Http/Controllers/Admin/SettingController.php new file mode 100644 index 0000000..f7ff310 --- /dev/null +++ b/app/Http/Controllers/Admin/SettingController.php @@ -0,0 +1,61 @@ + SiteSettingsService::logoUrl(), + 'registrationEnabled' => SiteSettingsService::registrationEnabled(), + ]); + } + + public function updateLogo(Request $request): RedirectResponse + { + $request->validate([ + 'logo' => ['required', 'file', 'max:2048', 'mimes:png,jpg,jpeg,gif,webp,svg'], + ]); + + // Supprimer l'ancien logo + $old = SiteSettingsService::get('logo_path'); + if ($old && Storage::disk('public')->exists($old)) { + Storage::disk('public')->delete($old); + } + + $file = $request->file('logo'); + $ext = strtolower($file->getClientOriginalExtension()); + $path = Storage::disk('public')->putFileAs('site', $file, "logo.{$ext}"); + + SiteSettingsService::set('logo_path', $path); + + return back()->with('success', 'Logo mis à jour.'); + } + + public function deleteLogo(): RedirectResponse + { + $path = SiteSettingsService::get('logo_path'); + if ($path && Storage::disk('public')->exists($path)) { + Storage::disk('public')->delete($path); + } + + SiteSettingsService::set('logo_path', null); + + return back()->with('success', 'Logo supprimé.'); + } + + public function updateSettings(Request $request): RedirectResponse + { + SiteSettingsService::set('registration_enabled', $request->boolean('registration_enabled')); + + return back()->with('success', 'Paramètres enregistrés.'); + } +} diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 44a3930..550d2b0 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -4,9 +4,11 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Models\User; +use App\Services\SiteSettingsService; use Illuminate\Auth\Events\Registered; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules; @@ -18,8 +20,13 @@ class RegisteredUserController extends Controller /** * Display the registration view. */ - public function create(): View + public function create(): View|RedirectResponse { + if (! SiteSettingsService::registrationEnabled()) { + return redirect()->route('login') + ->with('status', 'Les inscriptions sont actuellement désactivées.'); + } + return view('auth.register'); } @@ -30,6 +37,10 @@ class RegisteredUserController extends Controller */ public function store(Request $request): RedirectResponse { + if (! SiteSettingsService::registrationEnabled()) { + abort(403, 'Les inscriptions sont désactivées.'); + } + $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..0bb5275 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,23 +2,21 @@ namespace App\Providers; +use App\Services\SiteSettingsService; +use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { - /** - * Register any application services. - */ - public function register(): void - { - // - } + public function register(): void {} - /** - * Bootstrap any application services. - */ public function boot(): void { - // + // Partage le logo et les paramètres globaux avec toutes les vues + $logoUrl = SiteSettingsService::logoUrl(); + $registrationEnabled = SiteSettingsService::registrationEnabled(); + + View::share('siteLogoUrl', $logoUrl); + View::share('registrationEnabled', $registrationEnabled); } } diff --git a/app/Services/SiteSettingsService.php b/app/Services/SiteSettingsService.php new file mode 100644 index 0000000..9bb8502 --- /dev/null +++ b/app/Services/SiteSettingsService.php @@ -0,0 +1,70 @@ +exists($logoPath)) { + return null; + } + return Storage::disk('public')->url($logoPath); + } catch (\Exception) { + return null; + } + } + + // ── Inscriptions ───────────────────────────────────────────────────────── + + public static function registrationEnabled(): bool + { + // Désactivées par défaut + return (bool) self::get('registration_enabled', false); + } +} diff --git a/resources/views/admin/parametres/index.blade.php b/resources/views/admin/parametres/index.blade.php new file mode 100644 index 0000000..78c7850 --- /dev/null +++ b/resources/views/admin/parametres/index.blade.php @@ -0,0 +1,77 @@ + + +

Paramètres du site

+
+ +
+ + @if(session('success')) +
{{ session('success') }}
+ @endif + + {{-- Logo --}} +
+

Logo du site

+ + @if($logoUrl) +
+ Logo actuel +
+

Logo actuel

+
+ @csrf @method('DELETE') + +
+
+
+ @else +

Aucun logo configuré — le nom de l'application est affiché.

+ @endif + +
+ @csrf +
+ + +

PNG, JPG, SVG ou WebP · max 2 Mo · format recommandé : carré ou paysage, fond transparent

+ @error('logo')

{{ $message }}

@enderror +
+ +
+
+ + {{-- Inscriptions --}} +
+

Inscriptions

+

+ Autorise ou non les visiteurs à créer un compte via la page d'inscription publique. + Quand désactivées, seul un administrateur peut créer des comptes (via la gestion des utilisateurs). +

+ +
+ @csrf + +
+ +
+
+
+
+
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index c5ff315..6f6c860 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -5,7 +5,11 @@ - {{ config('app.name', 'Laravel') }} + {{ config('app.name', 'MesRelevés') }} + + @if($siteLogoUrl) + + @endif diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php index 11feb47..44d0064 100644 --- a/resources/views/layouts/guest.blade.php +++ b/resources/views/layouts/guest.blade.php @@ -5,7 +5,11 @@ - {{ config('app.name', 'Laravel') }} + {{ config('app.name', 'MesRelevés') }} + + @if($siteLogoUrl) + + @endif @@ -16,9 +20,13 @@
-
+ diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index 98d7c3e..283ec87 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -4,8 +4,13 @@
@@ -58,6 +63,10 @@ class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-50">Types de sources Types de lieux + @endif
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index b7355d7..bf4f80a 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,277 +1,59 @@ - - - - - - {{ config('app.name', 'Laravel') }} - - + + + + + {{ config('app.name') }} + @if($siteLogoUrl) + + @endif + @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) + @vite(['resources/css/app.css', 'resources/js/app.js']) + @else - + + @endif + + - - @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) - @vite(['resources/css/app.css', 'resources/js/app.js']) +
+ + {{-- Logo ou nom de l'application --}} + @if($siteLogoUrl) + {{ config('app.name') }} @else - +

{{ config('app.name') }}

@endif - - -
- @if (Route::has('login')) - - @endif -
-
-
-
-

Let's get started

-

Laravel has an incredibly rich ecosystem.
We suggest starting with the following.

- - -
-
- {{-- Laravel Logo --}} - - - - - - - - - +

+ Application de relevés généalogiques +

- {{-- Light Mode 12 SVG --}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @auth + + Accéder à l'application → + + @else +
+ + Se connecter + + @if($registrationEnabled && Route::has('register')) + + Créer un compte + + @endif +
+ @endauth +
- {{-- Dark Mode 12 SVG --}} - -
-
- -
+
+ {{ config('app.name') }} +
- @if (Route::has('login')) - - @endif - + diff --git a/routes/admin.php b/routes/admin.php index 44871c4..9a99a65 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Admin\DashboardController; use App\Http\Controllers\Admin\DepotController; use App\Http\Controllers\Admin\LieuTypeController; use App\Http\Controllers\Admin\SectionController; +use App\Http\Controllers\Admin\SettingController; use App\Http\Controllers\Admin\SourceTypeController; use App\Http\Controllers\Admin\UserController; use Illuminate\Support\Facades\Route; @@ -11,6 +12,12 @@ use Illuminate\Support\Facades\Route; Route::middleware(['auth', 'role:admin'])->prefix('admin')->name('admin.')->group(function () { Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard'); + // Paramètres du site (logo, inscriptions) + Route::get('parametres', [SettingController::class, 'index'])->name('parametres'); + Route::post('parametres/logo', [SettingController::class, 'updateLogo'])->name('parametres.logo.update'); + Route::delete('parametres/logo', [SettingController::class, 'deleteLogo'])->name('parametres.logo.delete'); + Route::post('parametres/settings', [SettingController::class, 'updateSettings'])->name('parametres.update'); + Route::resource('utilisateurs', UserController::class)->only(['index', 'edit', 'update']); Route::post('utilisateurs/{utilisateur}/toggle-active', [UserController::class, 'toggleActive'])->name('utilisateurs.toggle-active'); Route::resource('lieu-types', LieuTypeController::class)