feature: add delete parking lot with active bookings guard and image cleanup
This commit is contained in:
parent
c6d2d98cc8
commit
bf82e331d1
@ -14,7 +14,8 @@
|
|||||||
"Bash(git checkout:*)",
|
"Bash(git checkout:*)",
|
||||||
"Bash(git reset:*)",
|
"Bash(git reset:*)",
|
||||||
"Bash(php -l app/Http/Controllers/Admin/ParkingLotController.php)",
|
"Bash(php -l app/Http/Controllers/Admin/ParkingLotController.php)",
|
||||||
"Bash(php -l app/Http/Requests/StoreParkingLotRequest.php)"
|
"Bash(php -l app/Http/Requests/StoreParkingLotRequest.php)",
|
||||||
|
"Bash(php -l app/Http/Controllers/Admin/BookingController.php)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -68,6 +68,29 @@ class ParkingLotController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function destroy(ParkingLot $parkingLot): JsonResponse
|
||||||
|
{
|
||||||
|
// Block deletion if there are active bookings
|
||||||
|
$activeCount = $parkingLot->bookings()->where('status', 'active')->count();
|
||||||
|
if ($activeCount > 0) {
|
||||||
|
return response()->json([
|
||||||
|
'success' => false,
|
||||||
|
'message' => "لا يمكن الحذف — يوجد {$activeCount} حجز نشط في هذا الموقف",
|
||||||
|
], 422);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($parkingLot->image) {
|
||||||
|
Storage::disk('public')->delete($parkingLot->image);
|
||||||
|
}
|
||||||
|
|
||||||
|
$parkingLot->delete();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'success' => true,
|
||||||
|
'message' => 'تم حذف الموقف بنجاح',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function toggleStatus(ParkingLot $parkingLot): JsonResponse
|
public function toggleStatus(ParkingLot $parkingLot): JsonResponse
|
||||||
{
|
{
|
||||||
$parkingLot->update(['is_active' => !$parkingLot->is_active]);
|
$parkingLot->update(['is_active' => !$parkingLot->is_active]);
|
||||||
|
|||||||
@ -143,6 +143,12 @@
|
|||||||
title="{{ $lot->is_active ? 'تعطيل' : 'تفعيل' }}">
|
title="{{ $lot->is_active ? 'تعطيل' : 'تفعيل' }}">
|
||||||
<i class="bi {{ $lot->is_active ? 'bi-slash-circle' : 'bi-check-circle' }}" style="font-size:.8rem;"></i>
|
<i class="bi {{ $lot->is_active ? 'bi-slash-circle' : 'bi-check-circle' }}" style="font-size:.8rem;"></i>
|
||||||
</button>
|
</button>
|
||||||
|
<button class="btn btn-sm"
|
||||||
|
style="background:rgba(239,68,68,.08);color:#dc2626;border:none;border-radius:.375rem;width:30px;height:30px;padding:0;"
|
||||||
|
onclick="deleteLot({{ $lot->id }}, '{{ addslashes($lot->name) }}')"
|
||||||
|
title="حذف">
|
||||||
|
<i class="bi bi-trash3" style="font-size:.8rem;"></i>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -490,6 +496,28 @@ function doSearch() {
|
|||||||
const t = document.getElementById('searchInput').value;
|
const t = document.getElementById('searchInput').value;
|
||||||
window.location.href = `/admin/parking-lots?search=${encodeURIComponent(t)}`;
|
window.location.href = `/admin/parking-lots?search=${encodeURIComponent(t)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function deleteLot(id, name) {
|
||||||
|
if (!confirm(`حذف الموقف "${name}"؟\nسيتم حذف جميع بيانات الموقف نهائياً.`)) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`/admin/parking-lots/${id}`, {
|
||||||
|
method: 'DELETE',
|
||||||
|
headers: {
|
||||||
|
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
|
||||||
|
'Accept': 'application/json',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const data = await res.json();
|
||||||
|
if (data.success) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
alert(data.message || 'تعذّر الحذف');
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
alert('خطأ في الاتصال');
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,7 @@ Route::prefix('admin')->middleware('admin')->name('admin.')->group(function () {
|
|||||||
Route::post('/parking-lots', [\App\Http\Controllers\Admin\ParkingLotController::class, 'store'])->name('parking-lots.store');
|
Route::post('/parking-lots', [\App\Http\Controllers\Admin\ParkingLotController::class, 'store'])->name('parking-lots.store');
|
||||||
Route::put('/parking-lots/{parkingLot}', [\App\Http\Controllers\Admin\ParkingLotController::class, 'update'])->name('parking-lots.update');
|
Route::put('/parking-lots/{parkingLot}', [\App\Http\Controllers\Admin\ParkingLotController::class, 'update'])->name('parking-lots.update');
|
||||||
Route::post('/parking-lots/{parkingLot}/toggle', [\App\Http\Controllers\Admin\ParkingLotController::class, 'toggleStatus'])->name('parking-lots.toggle');
|
Route::post('/parking-lots/{parkingLot}/toggle', [\App\Http\Controllers\Admin\ParkingLotController::class, 'toggleStatus'])->name('parking-lots.toggle');
|
||||||
|
Route::delete('/parking-lots/{parkingLot}', [\App\Http\Controllers\Admin\ParkingLotController::class, 'destroy'])->name('parking-lots.destroy');
|
||||||
|
|
||||||
// Active Bookings
|
// Active Bookings
|
||||||
Route::get('/bookings/active', [\App\Http\Controllers\Admin\BookingController::class, 'activeIndex'])->name('bookings.active');
|
Route::get('/bookings/active', [\App\Http\Controllers\Admin\BookingController::class, 'activeIndex'])->name('bookings.active');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user