Eliminato Wizard, tutto verrà gestito da impostazioni
This commit is contained in:
11
README.md
11
README.md
@@ -149,13 +149,9 @@ docker compose up -d --build
|
|||||||
| `MAILPIT_UI_PORT` | `8025` | UI Mailpit per debug email |
|
| `MAILPIT_UI_PORT` | `8025` | UI Mailpit per debug email |
|
||||||
| `USER_ID` / `GROUP_ID`| `1000` | UID/GID container (match con host) |
|
| `USER_ID` / `GROUP_ID`| `1000` | UID/GID container (match con host) |
|
||||||
|
|
||||||
### Primo avvio — Wizard
|
### Configurazione iniziale
|
||||||
|
|
||||||
Al primo accesso l'applicazione forza il **wizard di configurazione** in 3 step:
|
La configurazione viene gestita dalla sezione **Impostazioni** (menu amministrazione), senza wizard iniziale.
|
||||||
|
|
||||||
1. **Nome congregazione** (visualizzato in header)
|
|
||||||
2. **Soglie**: mesi priorità (default 4), giorni rientro (default 120), retention audit log (default 365 gg)
|
|
||||||
3. **Creazione utente admin** (email + password)
|
|
||||||
|
|
||||||
### Utenti di sviluppo (DevSeeder)
|
### Utenti di sviluppo (DevSeeder)
|
||||||
|
|
||||||
@@ -175,14 +171,13 @@ Al primo accesso l'applicazione forza il **wizard di configurazione** in 3 step:
|
|||||||
TerManager2/
|
TerManager2/
|
||||||
├── app/
|
├── app/
|
||||||
│ ├── Console/Commands/ # AuditCleanup (pulizia log schedulata)
|
│ ├── Console/Commands/ # AuditCleanup (pulizia log schedulata)
|
||||||
│ ├── Http/Middleware/ # SetupRequired (wizard forzato)
|
│ ├── Http/Middleware/ # Middleware HTTP applicativi
|
||||||
│ ├── Livewire/
|
│ ├── Livewire/
|
||||||
│ │ ├── Assegnazioni/ # Assegna, Rientra
|
│ │ ├── Assegnazioni/ # Assegna, Rientra
|
||||||
│ │ ├── Auth/ # Login
|
│ │ ├── Auth/ # Login
|
||||||
│ │ ├── Campagne/ # Index, Create, Edit, Show
|
│ │ ├── Campagne/ # Index, Create, Edit, Show
|
||||||
│ │ ├── Proclamatori/ # Index, Create, Edit, Show, Cestino
|
│ │ ├── Proclamatori/ # Index, Create, Edit, Show, Cestino
|
||||||
│ │ ├── Settings/ # SettingsEdit, ZoneIndex, TipologieIndex
|
│ │ ├── Settings/ # SettingsEdit, ZoneIndex, TipologieIndex
|
||||||
│ │ ├── Setup/ # Wizard (3 step)
|
|
||||||
│ │ ├── Territori/ # Index, Create, Edit, Show, Cestino
|
│ │ ├── Territori/ # Index, Create, Edit, Show, Cestino
|
||||||
│ │ ├── AuditLog.php # Log attività (filtri, diff)
|
│ │ ├── AuditLog.php # Log attività (filtri, diff)
|
||||||
│ │ ├── Home.php # Dashboard
|
│ │ ├── Home.php # Dashboard
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
namespace App\Http\Controllers\Auth;
|
namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Models\Setting;
|
|
||||||
use App\Models\User;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
use Illuminate\Http\RedirectResponse;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
@@ -15,10 +13,6 @@ class LoginController extends Controller
|
|||||||
{
|
{
|
||||||
public function __invoke(Request $request): RedirectResponse
|
public function __invoke(Request $request): RedirectResponse
|
||||||
{
|
{
|
||||||
if (! Setting::isSetupComplete() || User::count() === 0) {
|
|
||||||
return redirect()->route('setup.index');
|
|
||||||
}
|
|
||||||
|
|
||||||
$credentials = $request->validate([
|
$credentials = $request->validate([
|
||||||
'email' => ['required', 'email'],
|
'email' => ['required', 'email'],
|
||||||
'password' => ['required', 'string', 'min:6'],
|
'password' => ['required', 'string', 'min:6'],
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Middleware;
|
|
||||||
|
|
||||||
use Closure;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
|
||||||
use App\Models\Setting;
|
|
||||||
|
|
||||||
class SetupRequired
|
|
||||||
{
|
|
||||||
public function handle(Request $request, Closure $next): Response
|
|
||||||
{
|
|
||||||
if ($request->is('setup*') || $request->is('login') || $request->is('logout')) {
|
|
||||||
return $next($request);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Setting::isSetupComplete()) {
|
|
||||||
return redirect()->route('setup.index');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $next($request);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,18 +3,9 @@
|
|||||||
namespace App\Livewire\Auth;
|
namespace App\Livewire\Auth;
|
||||||
|
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
use App\Models\Setting;
|
|
||||||
use App\Models\User;
|
|
||||||
|
|
||||||
class Login extends Component
|
class Login extends Component
|
||||||
{
|
{
|
||||||
public function mount()
|
|
||||||
{
|
|
||||||
if (! Setting::isSetupComplete() || User::count() === 0) {
|
|
||||||
return redirect()->route('setup.index');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function render()
|
public function render()
|
||||||
{
|
{
|
||||||
return view('livewire.auth.login')
|
return view('livewire.auth.login')
|
||||||
|
|||||||
@@ -8,16 +8,20 @@ use App\Models\Setting;
|
|||||||
class SettingsEdit extends Component
|
class SettingsEdit extends Component
|
||||||
{
|
{
|
||||||
public string $congregazione_nome = '';
|
public string $congregazione_nome = '';
|
||||||
|
public int $giorni_giacenza_da_assegnare = 120;
|
||||||
public int $giorni_giacenza_prioritari = 180;
|
public int $giorni_giacenza_prioritari = 180;
|
||||||
public int $giorni_per_smarrito = 120;
|
public int $giorni_per_smarrito = 120;
|
||||||
|
public int $home_limit_list = 10;
|
||||||
public int $audit_retention_days = 365;
|
public int $audit_retention_days = 365;
|
||||||
|
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
$settings = Setting::instance();
|
$settings = Setting::instance();
|
||||||
$this->congregazione_nome = $settings->congregazione_nome ?? '';
|
$this->congregazione_nome = $settings->congregazione_nome ?? '';
|
||||||
|
$this->giorni_giacenza_da_assegnare = $settings->giorni_giacenza_da_assegnare ?? 120;
|
||||||
$this->giorni_giacenza_prioritari = $settings->giorni_giacenza_prioritari ?? 180;
|
$this->giorni_giacenza_prioritari = $settings->giorni_giacenza_prioritari ?? 180;
|
||||||
$this->giorni_per_smarrito = $settings->giorni_per_smarrito ?? 120;
|
$this->giorni_per_smarrito = $settings->giorni_per_smarrito ?? 120;
|
||||||
|
$this->home_limit_list = $settings->home_limit_list ?? 10;
|
||||||
$this->audit_retention_days = $settings->audit_retention_days ?? 365;
|
$this->audit_retention_days = $settings->audit_retention_days ?? 365;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,8 +29,10 @@ class SettingsEdit extends Component
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'congregazione_nome' => 'required|string|max:255',
|
'congregazione_nome' => 'required|string|max:255',
|
||||||
|
'giorni_giacenza_da_assegnare' => 'required|integer|min:1|max:730',
|
||||||
'giorni_giacenza_prioritari' => 'required|integer|min:1|max:730',
|
'giorni_giacenza_prioritari' => 'required|integer|min:1|max:730',
|
||||||
'giorni_per_smarrito' => 'required|integer|min:30|max:365',
|
'giorni_per_smarrito' => 'required|integer|min:30|max:365',
|
||||||
|
'home_limit_list' => 'required|integer|min:1|max:100',
|
||||||
'audit_retention_days' => 'required|integer|min:30|max:3650',
|
'audit_retention_days' => 'required|integer|min:30|max:3650',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -38,8 +44,10 @@ class SettingsEdit extends Component
|
|||||||
$settings = Setting::instance();
|
$settings = Setting::instance();
|
||||||
$settings->update([
|
$settings->update([
|
||||||
'congregazione_nome' => $this->congregazione_nome,
|
'congregazione_nome' => $this->congregazione_nome,
|
||||||
|
'giorni_giacenza_da_assegnare' => $this->giorni_giacenza_da_assegnare,
|
||||||
'giorni_giacenza_prioritari' => $this->giorni_giacenza_prioritari,
|
'giorni_giacenza_prioritari' => $this->giorni_giacenza_prioritari,
|
||||||
'giorni_per_smarrito' => $this->giorni_per_smarrito,
|
'giorni_per_smarrito' => $this->giorni_per_smarrito,
|
||||||
|
'home_limit_list' => $this->home_limit_list,
|
||||||
'audit_retention_days' => $this->audit_retention_days,
|
'audit_retention_days' => $this->audit_retention_days,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -1,129 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Livewire\Setup;
|
|
||||||
|
|
||||||
use Livewire\Component;
|
|
||||||
use Livewire\WithFileUploads;
|
|
||||||
use App\Models\Setting;
|
|
||||||
use App\Models\User;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\Support\Facades\Hash;
|
|
||||||
|
|
||||||
class Wizard extends Component
|
|
||||||
{
|
|
||||||
use WithFileUploads;
|
|
||||||
|
|
||||||
public int $step = 1;
|
|
||||||
|
|
||||||
// Step 1
|
|
||||||
public string $congregazione_nome = '';
|
|
||||||
public $logo;
|
|
||||||
|
|
||||||
// Step 2
|
|
||||||
public int $giorni_giacenza_da_assegnare = 120;
|
|
||||||
public int $giorni_giacenza_prioritari = 180;
|
|
||||||
public int $giorni_per_smarrito = 120;
|
|
||||||
public int $home_limit_list = 10;
|
|
||||||
|
|
||||||
// Step 3 (admin creation if no users)
|
|
||||||
public string $admin_name = '';
|
|
||||||
public string $admin_email = '';
|
|
||||||
public string $admin_password = '';
|
|
||||||
public string $admin_password_confirmation = '';
|
|
||||||
public bool $needsAdmin = false;
|
|
||||||
|
|
||||||
public function mount()
|
|
||||||
{
|
|
||||||
if (Setting::isSetupComplete() && User::count() > 0) {
|
|
||||||
return redirect()->route('dashboard');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->needsAdmin = User::count() === 0;
|
|
||||||
|
|
||||||
$setting = Setting::first();
|
|
||||||
if ($setting) {
|
|
||||||
$this->congregazione_nome = $setting->congregazione_nome ?? '';
|
|
||||||
$this->giorni_giacenza_da_assegnare = $setting->giorni_giacenza_da_assegnare;
|
|
||||||
$this->giorni_giacenza_prioritari = $setting->giorni_giacenza_prioritari;
|
|
||||||
$this->giorni_per_smarrito = $setting->giorni_per_smarrito;
|
|
||||||
$this->home_limit_list = $setting->home_limit_list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function nextStep()
|
|
||||||
{
|
|
||||||
if ($this->step === 1) {
|
|
||||||
$this->validate([
|
|
||||||
'congregazione_nome' => 'required|string|max:255',
|
|
||||||
'logo' => 'nullable|image|max:2048',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->step === 2) {
|
|
||||||
$this->validate([
|
|
||||||
'giorni_giacenza_da_assegnare' => 'required|integer|min:1|max:999',
|
|
||||||
'giorni_giacenza_prioritari' => 'required|integer|min:1|max:999',
|
|
||||||
'giorni_per_smarrito' => 'required|integer|min:1|max:999',
|
|
||||||
'home_limit_list' => 'required|integer|min:1|max:100',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->step++;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function previousStep()
|
|
||||||
{
|
|
||||||
$this->step = max(1, $this->step - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function finish()
|
|
||||||
{
|
|
||||||
if ($this->needsAdmin) {
|
|
||||||
$this->validate([
|
|
||||||
'admin_name' => 'required|string|max:255',
|
|
||||||
'admin_email' => 'required|email|unique:users,email',
|
|
||||||
'admin_password' => 'required|min:8|confirmed',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$setting = Setting::instance();
|
|
||||||
$setting->congregazione_nome = $this->congregazione_nome;
|
|
||||||
$setting->giorni_giacenza_da_assegnare = $this->giorni_giacenza_da_assegnare;
|
|
||||||
$setting->giorni_giacenza_prioritari = $this->giorni_giacenza_prioritari;
|
|
||||||
$setting->giorni_per_smarrito = $this->giorni_per_smarrito;
|
|
||||||
$setting->home_limit_list = $this->home_limit_list;
|
|
||||||
$setting->setup_completed = true;
|
|
||||||
|
|
||||||
if ($this->logo) {
|
|
||||||
$path = $this->logo->store('logos', 'public');
|
|
||||||
$setting->logo_path = $path;
|
|
||||||
}
|
|
||||||
|
|
||||||
$setting->save();
|
|
||||||
|
|
||||||
if ($this->needsAdmin && $this->admin_email) {
|
|
||||||
$admin = User::create([
|
|
||||||
'name' => $this->admin_name,
|
|
||||||
'email' => $this->admin_email,
|
|
||||||
'password' => Hash::make($this->admin_password),
|
|
||||||
]);
|
|
||||||
$admin->assignRole('amministratore');
|
|
||||||
Auth::login($admin);
|
|
||||||
request()->session()->regenerate();
|
|
||||||
}
|
|
||||||
|
|
||||||
session()->flash('success', 'Setup completato con successo!');
|
|
||||||
|
|
||||||
if (auth()->check()) {
|
|
||||||
return redirect()->route('dashboard');
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route('login');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function render()
|
|
||||||
{
|
|
||||||
return view('livewire.setup.wizard')
|
|
||||||
->layout('components.layouts.guest', ['title' => 'Setup iniziale']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,11 +15,6 @@ return Application::configure(basePath: dirname(__DIR__))
|
|||||||
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
|
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
|
||||||
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
|
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
|
||||||
'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
|
'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
|
||||||
'setup.required' => \App\Http\Middleware\SetupRequired::class,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$middleware->web(append: [
|
|
||||||
\App\Http\Middleware\SetupRequired::class,
|
|
||||||
]);
|
]);
|
||||||
})
|
})
|
||||||
->withExceptions(function (Exceptions $exceptions) {
|
->withExceptions(function (Exceptions $exceptions) {
|
||||||
|
|||||||
@@ -18,6 +18,13 @@
|
|||||||
@error('congregazione_nome') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
@error('congregazione_nome') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="giorni_giacenza_da_assegnare" class="block text-sm font-medium text-gray-700">Soglia Da Assegnare (giorni)</label>
|
||||||
|
<p class="text-xs text-gray-500 mb-1">Dopo quanti giorni dal rientro un territorio compare nella lista "da assegnare".</p>
|
||||||
|
<input wire:model="giorni_giacenza_da_assegnare" type="number" min="1" max="730" id="giorni_giacenza_da_assegnare" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:ring-indigo-500 focus:border-indigo-500 text-sm">
|
||||||
|
@error('giorni_giacenza_da_assegnare') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="giorni_giacenza_prioritari" class="block text-sm font-medium text-gray-700">Soglia Priorità (giorni)</label>
|
<label for="giorni_giacenza_prioritari" class="block text-sm font-medium text-gray-700">Soglia Priorità (giorni)</label>
|
||||||
<p class="text-xs text-gray-500 mb-1">Dopo quanti giorni dal rientro un territorio diventa prioritario automaticamente.</p>
|
<p class="text-xs text-gray-500 mb-1">Dopo quanti giorni dal rientro un territorio diventa prioritario automaticamente.</p>
|
||||||
@@ -32,6 +39,13 @@
|
|||||||
@error('giorni_per_smarrito') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
@error('giorni_per_smarrito') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="home_limit_list" class="block text-sm font-medium text-gray-700">Limite Liste Home</label>
|
||||||
|
<p class="text-xs text-gray-500 mb-1">Numero massimo di elementi mostrati nelle liste rapide in dashboard.</p>
|
||||||
|
<input wire:model="home_limit_list" type="number" min="1" max="100" id="home_limit_list" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:ring-indigo-500 focus:border-indigo-500 text-sm">
|
||||||
|
@error('home_limit_list') <p class="text-red-500 text-xs mt-1">{{ $message }}</p> @enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="audit_retention_days" class="block text-sm font-medium text-gray-700">Conservazione Audit (giorni)</label>
|
<label for="audit_retention_days" class="block text-sm font-medium text-gray-700">Conservazione Audit (giorni)</label>
|
||||||
<p class="text-xs text-gray-500 mb-1">I log più vecchi di questo periodo verranno cancellati automaticamente.</p>
|
<p class="text-xs text-gray-500 mb-1">I log più vecchi di questo periodo verranno cancellati automaticamente.</p>
|
||||||
|
|||||||
@@ -1,105 +0,0 @@
|
|||||||
<div class="bg-white shadow-xl rounded-2xl p-8 w-full max-w-lg mx-auto">
|
|
||||||
<div class="text-center mb-6">
|
|
||||||
<h2 class="text-2xl font-bold text-gray-900">Setup iniziale</h2>
|
|
||||||
<p class="text-gray-500 text-sm mt-1">Passo {{ $step }} di 3</p>
|
|
||||||
<div class="flex gap-2 justify-center mt-3">
|
|
||||||
@for($i = 1; $i <= 3; $i++)
|
|
||||||
<div class="h-2 w-12 rounded-full {{ $i <= $step ? 'bg-indigo-600' : 'bg-gray-200' }}"></div>
|
|
||||||
@endfor
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{-- Step 1: Congregazione --}}
|
|
||||||
@if($step === 1)
|
|
||||||
<div class="space-y-4">
|
|
||||||
<h3 class="text-lg font-semibold text-gray-800">Dati Congregazione</h3>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Nome Congregazione *</label>
|
|
||||||
<input wire:model="congregazione_nome" type="text" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5" placeholder="Nome della congregazione">
|
|
||||||
@error('congregazione_nome') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Logo (opzionale)</label>
|
|
||||||
<input wire:model="logo" type="file" accept="image/*" class="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100">
|
|
||||||
@error('logo') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<button wire:click="nextStep" class="w-full py-2.5 px-4 rounded-lg text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 transition">Avanti</button>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Step 2: Soglie --}}
|
|
||||||
@if($step === 2)
|
|
||||||
<div class="space-y-4">
|
|
||||||
<h3 class="text-lg font-semibold text-gray-800">Soglie e limiti</h3>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Giorni giacenza per "da assegnare"</label>
|
|
||||||
<input wire:model="giorni_giacenza_da_assegnare" type="number" min="1" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
@error('giorni_giacenza_da_assegnare') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Giorni giacenza per "prioritari"</label>
|
|
||||||
<input wire:model="giorni_giacenza_prioritari" type="number" min="1" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
@error('giorni_giacenza_prioritari') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Giorni per "smarrito / da rientrare"</label>
|
|
||||||
<input wire:model="giorni_per_smarrito" type="number" min="1" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
@error('giorni_per_smarrito') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Limite lista rapida (Home)</label>
|
|
||||||
<input wire:model="home_limit_list" type="number" min="1" max="100" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
@error('home_limit_list') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-3">
|
|
||||||
<button wire:click="previousStep" class="flex-1 py-2.5 px-4 rounded-lg text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 transition">Indietro</button>
|
|
||||||
<button wire:click="nextStep" class="flex-1 py-2.5 px-4 rounded-lg text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 transition">Avanti</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Step 3: Conferma --}}
|
|
||||||
@if($step === 3)
|
|
||||||
<div class="space-y-4">
|
|
||||||
<h3 class="text-lg font-semibold text-gray-800">Conferma e completa</h3>
|
|
||||||
|
|
||||||
<div class="bg-gray-50 rounded-lg p-4 text-sm space-y-2">
|
|
||||||
<p><span class="font-medium">Congregazione:</span> {{ $congregazione_nome }}</p>
|
|
||||||
<p><span class="font-medium">Giacenza da assegnare:</span> {{ $giorni_giacenza_da_assegnare }} gg</p>
|
|
||||||
<p><span class="font-medium">Giacenza prioritari:</span> {{ $giorni_giacenza_prioritari }} gg</p>
|
|
||||||
<p><span class="font-medium">Soglia smarrito:</span> {{ $giorni_per_smarrito }} gg</p>
|
|
||||||
<p><span class="font-medium">Limite liste Home:</span> {{ $home_limit_list }}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if($needsAdmin)
|
|
||||||
<div class="border-t pt-4 space-y-4">
|
|
||||||
<h4 class="text-md font-semibold text-gray-700">Crea account amministratore</h4>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Nome</label>
|
|
||||||
<input wire:model="admin_name" type="text" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
@error('admin_name') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Email</label>
|
|
||||||
<input wire:model="admin_email" type="email" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
@error('admin_email') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Password</label>
|
|
||||||
<input wire:model="admin_password" type="password" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
@error('admin_password') <p class="mt-1 text-sm text-red-600">{{ $message }}</p> @enderror
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="block text-sm font-medium text-gray-700">Conferma Password</label>
|
|
||||||
<input wire:model="admin_password_confirmation" type="password" class="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm px-4 py-2.5">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<div class="flex gap-3">
|
|
||||||
<button wire:click="previousStep" class="flex-1 py-2.5 px-4 rounded-lg text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 transition">Indietro</button>
|
|
||||||
<button wire:click="finish" class="flex-1 py-2.5 px-4 rounded-lg text-sm font-medium text-white bg-green-600 hover:bg-green-700 transition">Completa Setup</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use App\Http\Controllers\Auth\LoginController;
|
use App\Http\Controllers\Auth\LoginController;
|
||||||
use App\Livewire\Home;
|
use App\Livewire\Home;
|
||||||
use App\Livewire\Setup\Wizard;
|
|
||||||
use App\Livewire\Territori\TerritorioIndex;
|
use App\Livewire\Territori\TerritorioIndex;
|
||||||
use App\Livewire\Territori\TerritorioCreate;
|
use App\Livewire\Territori\TerritorioCreate;
|
||||||
use App\Livewire\Territori\TerritorioShow;
|
use App\Livewire\Territori\TerritorioShow;
|
||||||
@@ -45,15 +44,6 @@ Route::post('logout', function () {
|
|||||||
return redirect('/login');
|
return redirect('/login');
|
||||||
})->middleware('auth')->name('logout');
|
})->middleware('auth')->name('logout');
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Setup Wizard (bypasses setup.required middleware via exclusion)
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
Route::get('setup', Wizard::class)
|
|
||||||
->name('setup.index')
|
|
||||||
->withoutMiddleware(\App\Http\Middleware\SetupRequired::class);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Authenticated Routes
|
| Authenticated Routes
|
||||||
|
|||||||
Reference in New Issue
Block a user