Ajout de l'assistant d'installation web et corrections de navigation

- Wizard d'installation en 5 étapes (/setup) : prérequis PHP, base de données
  (PostgreSQL/MySQL avec test de connexion AJAX), paramètres app, compte admin,
  résultat — génère le .env, migre et crée l'administrateur
- CheckInstallation middleware : redirige vers /setup si non installé,
  protège /setup si déjà installé ; storage/installed comme marqueur
- Menu Administration : remplacé par le composant x-dropdown Breeze (même
  positionnement que le menu utilisateur — corrige le débordement en haut)
- Logo navbar : adaptatif via h-full/py-1.5 (s'adapte à la hauteur de la barre)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 18:39:55 +02:00
parent 236d37976c
commit caf7ad7fe2
12 changed files with 906 additions and 42 deletions
+77
View File
@@ -0,0 +1,77 @@
@extends('setup.layout')
@php $currentStep = 4; @endphp
@section('title', 'Compte administrateur')
@section('content')
<div class="p-8" x-data="{ installing: false }">
<h2 class="text-xl font-semibold text-slate-800 mb-1">Compte administrateur</h2>
<p class="text-slate-500 text-sm mb-6">Ce compte aura les droits complets sur l'application. Vous pourrez en créer d'autres ensuite.</p>
@if($errors->any())
<div class="mb-5 p-4 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700 space-y-1">
@foreach($errors->all() as $e)<p>{{ $e }}</p>@endforeach
</div>
@endif
<form method="POST" action="{{ route('setup.install') }}" @submit="installing = true">
@csrf
<div class="mb-4">
<label for="name" class="block text-sm font-medium text-slate-700 mb-1">
Nom complet <span class="text-red-500">*</span>
</label>
<input type="text" id="name" name="name" required autofocus
value="{{ old('name') }}"
class="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div class="mb-4">
<label for="email" class="block text-sm font-medium text-slate-700 mb-1">
Adresse e-mail <span class="text-red-500">*</span>
</label>
<input type="email" id="email" name="email" required
value="{{ old('email') }}"
class="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div class="mb-4">
<label for="password" class="block text-sm font-medium text-slate-700 mb-1">
Mot de passe <span class="text-red-500">*</span>
</label>
<input type="password" id="password" name="password" required minlength="8"
class="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
<p class="mt-1 text-xs text-slate-400">8 caractères minimum.</p>
</div>
<div class="mb-8">
<label for="password_confirmation" class="block text-sm font-medium text-slate-700 mb-1">
Confirmation du mot de passe <span class="text-red-500">*</span>
</label>
<input type="password" id="password_confirmation" name="password_confirmation" required
class="w-full px-3 py-2 border border-slate-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div class="mb-6 p-4 bg-amber-50 border border-amber-200 rounded-xl text-sm text-amber-800">
<strong>Prêt à installer ?</strong><br>
L'installation va écrire le fichier <code class="bg-amber-100 px-1 rounded">.env</code>,
générer une clé secrète, exécuter les migrations de base de données et créer votre compte.
Cette opération peut prendre quelques instants.
</div>
<div class="flex items-center justify-between">
<a href="{{ route('setup.application') }}" class="text-sm text-slate-500 hover:text-slate-700" x-show="!installing">
Retour
</a>
<button type="submit" :disabled="installing"
class="ml-auto flex items-center gap-2 px-6 py-2.5 rounded-lg bg-blue-600 text-white font-medium text-sm
hover:bg-blue-700 transition disabled:opacity-70">
<svg x-show="installing" x-cloak class="animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path>
</svg>
<span x-text="installing ? 'Installation en cours…' : 'Installer MesRelevés'"></span>
</button>
</div>
</form>
</div>
@endsection