feat: implement admin CRUD and toggle functionality for municipalities.

This commit is contained in:
jeremy bayse
2026-02-09 13:19:56 +01:00
parent 89a369964d
commit 7555e6ea8c
5 changed files with 151 additions and 9 deletions

View File

@@ -11,10 +11,56 @@ class MunicipalityController extends Controller
{
public function index()
{
$municipalities = Municipality::all();
$municipalities = Municipality::orderBy('name')->get();
return view('admin.municipalities.index', compact('municipalities'));
}
public function create()
{
return view('admin.municipalities.create');
}
public function store(Request $request)
{
$request->merge(['is_active' => $request->has('is_active')]);
$validated = $request->validate([
'name' => 'required|string|max:255|unique:municipalities',
'zip_code' => 'required|string|max:10',
'is_active' => 'boolean'
]);
Municipality::create($validated);
return redirect()->route('admin.municipalities.index')->with('success', 'Commune créée avec succès.');
}
public function edit(Municipality $municipality)
{
return view('admin.municipalities.edit', compact('municipality'));
}
public function update(Request $request, Municipality $municipality)
{
$request->merge(['is_active' => $request->has('is_active')]);
$validated = $request->validate([
'name' => 'required|string|max:255|unique:municipalities,name,' . $municipality->id,
'zip_code' => 'required|string|max:10',
'is_active' => 'boolean'
]);
$municipality->update($validated);
return redirect()->route('admin.municipalities.index')->with('success', 'Commune mise à jour avec succès.');
}
public function destroy(Municipality $municipality)
{
$municipality->delete();
return redirect()->route('admin.municipalities.index')->with('success', 'Commune supprimée avec succès.');
}
public function toggle(Municipality $municipality)
{
$municipality->update(['is_active' => !$municipality->is_active]);

View File

@@ -0,0 +1,41 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2>Ajouter une Commune</h2>
<a href="{{ route('admin.municipalities.index') }}" class="btn btn-secondary">Retour</a>
</div>
<div class="card shadow-sm">
<div class="card-body">
<form action="{{ route('admin.municipalities.store') }}" method="POST">
@csrf
<div class="mb-3">
<label for="name" class="form-label">Nom de la Commune</label>
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" name="name" value="{{ old('name') }}" required>
@error('name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="zip_code" class="form-label">Code Postal</label>
<input type="text" class="form-control @error('zip_code') is-invalid @enderror" id="zip_code" name="zip_code" value="{{ old('zip_code') }}" required>
@error('zip_code')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="is_active" name="is_active" {{ old('is_active', true) ? 'checked' : '' }}>
<label class="form-check-label" for="is_active">Actif</label>
</div>
<button type="submit" class="btn btn-primary">Enregistrer</button>
</form>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,42 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2>Modifier la Commune: {{ $municipality->name }}</h2>
<a href="{{ route('admin.municipalities.index') }}" class="btn btn-secondary">Retour</a>
</div>
<div class="card shadow-sm">
<div class="card-body">
<form action="{{ route('admin.municipalities.update', $municipality) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3">
<label for="name" class="form-label">Nom de la Commune</label>
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" name="name" value="{{ old('name', $municipality->name) }}" required>
@error('name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="zip_code" class="form-label">Code Postal</label>
<input type="text" class="form-control @error('zip_code') is-invalid @enderror" id="zip_code" name="zip_code" value="{{ old('zip_code', $municipality->zip_code) }}" required>
@error('zip_code')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="is_active" name="is_active" {{ old('is_active', $municipality->is_active) ? 'checked' : '' }}>
<label class="form-check-label" for="is_active">Actif</label>
</div>
<button type="submit" class="btn btn-primary">Mettre à jour</button>
</form>
</div>
</div>
</div>
@endsection

View File

@@ -2,7 +2,10 @@
@section('content')
<div class="container">
<h2 class="mb-4">Gestion des Communes</h2>
<div class="d-flex justify-content-between align-items-center mb-4">
<h2>Gestion des Communes</h2>
<a href="{{ route('admin.municipalities.create') }}" class="btn btn-primary">Ajouter une Commune</a>
</div>
<div class="card shadow-sm">
<div class="card-body">
@@ -29,12 +32,22 @@
@endif
</td>
<td>
<div class="d-flex gap-2">
<a href="{{ route('admin.municipalities.edit', $municipality) }}" class="btn btn-sm btn-outline-primary">Modifier</a>
<form action="{{ route('admin.municipalities.toggle', $municipality) }}" method="POST">
@csrf
<button type="submit" class="btn btn-sm {{ $municipality->is_active ? 'btn-outline-danger' : 'btn-outline-success' }}">
<button type="submit" class="btn btn-sm {{ $municipality->is_active ? 'btn-outline-secondary' : 'btn-outline-success' }}">
{{ $municipality->is_active ? 'Désactiver' : 'Activer' }}
</button>
</form>
<form action="{{ route('admin.municipalities.destroy', $municipality) }}" method="POST" onsubmit="return confirm('Êtes-vous sûr de vouloir supprimer cette commune ?');">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-sm btn-outline-danger">Supprimer</button>
</form>
</div>
</td>
</tr>
@endforeach

View File

@@ -57,8 +57,8 @@ Route::middleware(['auth', 'active', 'admin'])->prefix('admin')->name('admin.')-
})->name('users.index');
// Admin Municipalities
Route::get('/municipalities', [\App\Http\Controllers\Admin\MunicipalityController::class, 'index'])->name('municipalities.index');
Route::post('/municipalities/{municipality}/toggle', [\App\Http\Controllers\Admin\MunicipalityController::class, 'toggle'])->name('municipalities.toggle');
Route::resource('municipalities', \App\Http\Controllers\Admin\MunicipalityController::class);
// Admin License Levels
Route::get('/license-levels', [\App\Http\Controllers\Admin\LicenseLevelController::class, 'index'])->name('license_levels.index');