feat: update edit for flights and add create flights in admin panel

This commit is contained in:
2026-08-20 14:18:28 +03:30
parent 6cde2328c1
commit 87e0fc16f8
6 changed files with 428 additions and 52 deletions
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admins\FlightPostRequest;
use App\Http\Requests\Admins\FlightUpdatePostRequest; use App\Http\Requests\Admins\FlightUpdatePostRequest;
use App\Models\Airline; use App\Models\Airline;
use App\Models\Airport; use App\Models\Airport;
@@ -75,11 +76,36 @@ class FlightController extends Controller
public function create() public function create()
{ {
$airports = Airport::all(); $airlines = Airline::query()
->orderBy('name')
->get();
return view('admin.flights.create', compact('airports')); $airports = Airport::query()
->orderBy('name')
->get();
return view('admin.flights.create', compact('airlines', 'airports'));
} }
public function store(FlightPostRequest $request)
{
$data = $request->validated();
Flight::create([
'flight_number' => $data['flight_number'],
'airline_id' => $data['airline_id'],
'origin_airports_id' => $data['origin_airports_id'],
'destination_airports_id' => $data['destination_airports_id'],
'start_time' => Verta::parse($data['start_time'])->datetime(),
'end_time' => Verta::parse($data['end_time'])->datetime(),
'price' => $data['price'],
'capacity' => $data['capacity'],
'status' => $data['status'] ?? 1,
]);
return redirect()
->route('admin.flights.index')
->with('success', 'پرواز جدید با موفقیت ثبت شد.');
}
public function destroy(Flight $flight) public function destroy(Flight $flight)
{ {
$flight->delete(); $flight->delete();
@@ -89,9 +115,6 @@ class FlightController extends Controller
->with('success', 'پرواز با موفقیت حذف شد.'); ->with('success', 'پرواز با موفقیت حذف شد.');
} }
public function store()
{
}
} }
@@ -0,0 +1,67 @@
<?php
namespace App\Http\Requests\Admins;
use Illuminate\Foundation\Http\FormRequest;
class FlightPostRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'flight_number' => [
'required',
'string',
'max:255'
],
'airline_id' => [
'required',
'integer',
'exists:airlines,id'
],
'origin_airports_id' => [
'required',
'integer',
'exists:airports,id'
],
'destination_airports_id' => [
'required',
'integer',
'exists:airports,id',
'different:origin_airports_id'
],
'start_time' => [
'required',
],
'end_time' => [
'required',
],
'price' => [
'required',
'integer',
'min:0'
],
'capacity' => [
'required',
'integer',
'min:1'
],
'status' => [
'nullable',
'integer'
],
];
}
public function messages(): array
{
return [
//
];
}
}
@@ -0,0 +1,275 @@
@extends('dashboard.layouts.app')
@section('title', 'ثبت پرواز جدید')
@section('account-content')
<div class="user-profile-wrapper">
@if(session('success'))
<div class="col-lg-12 mb-3">
<div class="alert alert-success">
{{ session('success') }}
</div>
</div>
@endif
<div class="col-lg-12">
<div class="user-profile-card">
<h4 class="user-profile-card-title">
ثبت پرواز جدید
</h4>
<div class="user-profile-form">
<form action="{{ route('admin.flights.store') }}" method="POST">
@csrf
<div class="row">
<div class="col-md-6 mb-3">
<div class="form-group">
<label>شماره پرواز</label>
<input
type="text"
name="flight_number"
class="form-control"
value="{{ old('flight_number') }}"
placeholder="شماره پرواز"
>
@error('flight_number')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6 mb-3">
<div class="form-group">
<label>ایرلاین</label>
<select name="airline_id" class="form-control">
<option value="">
انتخاب ایرلاین
</option>
@foreach($airlines as $airline)
<option
value="{{ $airline->id }}"
{{ old('airline_id') == $airline->id ? 'selected' : '' }}
>
{{ $airline->name }}
</option>
@endforeach
</select>
@error('airline_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6 mb-3">
<div class="form-group">
<label>مبدأ</label>
<select name="origin_airports_id" class="form-control">
<option value="">
انتخاب مبدأ
</option>
@foreach($airports as $airport)
<option
value="{{ $airport->id }}"
{{ old('origin_airports_id') == $airport->id ? 'selected' : '' }}
>
{{ $airport->city }}
</option>
@endforeach
</select>
@error('origin_airports_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6 mb-3">
<div class="form-group">
<label>مقصد</label>
<select name="destination_airports_id" class="form-control">
<option value="">
انتخاب مقصد
</option>
@foreach($airports as $airport)
<option
value="{{ $airport->id }}"
{{ old('destination_airports_id') == $airport->id ? 'selected' : '' }}
>
{{ $airport->city }}
</option>
@endforeach
</select>
@error('destination_airports_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6 mb-3">
<div class="form-group">
<label>تاریخ و ساعت حرکت</label>
<input
type="text"
name="start_time"
id="start_time"
class="form-control"
value="{{ old('start_time') }}"
placeholder="تاریخ و ساعت حرکت"
autocomplete="off"
>
@error('start_time')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6 mb-3">
<div class="form-group">
<label>تاریخ و ساعت رسیدن</label>
<input
type="text"
name="end_time"
id="end_time"
class="form-control"
value="{{ old('end_time') }}"
placeholder="تاریخ و ساعت رسیدن"
autocomplete="off"
>
@error('end_time')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6 mb-3">
<div class="form-group">
<label>قیمت</label>
<input
type="number"
name="price"
class="form-control"
value="{{ old('price') }}"
placeholder="قیمت"
>
@error('price')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6 mb-3">
<div class="form-group">
<label>ظرفیت</label>
<input
type="number"
name="capacity"
class="form-control"
value="{{ old('capacity') }}"
placeholder="ظرفیت"
>
@error('capacity')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<button type="submit" class="theme-btn mt-4">
ثبت پرواز
<i class="far fa-plus"></i>
</button>
</form>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const startTime = document.getElementById('start_time');
const endTime = document.getElementById('end_time');
if (typeof $ !== 'undefined' && typeof $.fn.persianDatepicker !== 'undefined') {
$(startTime).persianDatepicker({
format: 'YYYY/MM/DD HH:mm',
autoClose: true,
initialValue: false,
timePicker: {
enabled: true
}
});
$(endTime).persianDatepicker({
format: 'YYYY/MM/DD HH:mm',
autoClose: true,
initialValue: false,
timePicker: {
enabled: true
}
});
}
});
</script>
@endsection
+26 -19
View File
@@ -155,6 +155,7 @@
class="form-control" class="form-control"
value="{{ old('start_time', verta($flight->start_time)->format('Y/m/d H:i')) }}" value="{{ old('start_time', verta($flight->start_time)->format('Y/m/d H:i')) }}"
placeholder="تاریخ و ساعت حرکت" placeholder="تاریخ و ساعت حرکت"
autocomplete="off"
> >
@error('start_time') @error('start_time')
@@ -176,6 +177,7 @@
class="form-control" class="form-control"
value="{{ old('end_time', verta($flight->end_time)->format('Y/m/d H:i')) }}" value="{{ old('end_time', verta($flight->end_time)->format('Y/m/d H:i')) }}"
placeholder="تاریخ و ساعت رسیدن" placeholder="تاریخ و ساعت رسیدن"
autocomplete="off"
> >
@error('end_time') @error('end_time')
@@ -240,28 +242,33 @@
</div> </div>
@endsection
@section('scripts')
<script> <script>
$(document).ready(function () { document.addEventListener('DOMContentLoaded', function () {
$('#start_time').persianDatepicker({ const startTime = document.getElementById('start_time');
format: 'YYYY/MM/DD HH:mm', const endTime = document.getElementById('end_time');
autoClose: true,
timePicker: {
enabled: true
}
});
$('#end_time').persianDatepicker({ if (typeof $ !== 'undefined' && typeof $.fn.persianDatepicker !== 'undefined') {
format: 'YYYY/MM/DD HH:mm',
autoClose: true, $(startTime).persianDatepicker({
timePicker: { format: 'YYYY/MM/DD HH:mm',
enabled: true autoClose: true,
} initialValue: false,
}); timePicker: {
enabled: true
}
});
$(endTime).persianDatepicker({
format: 'YYYY/MM/DD HH:mm',
autoClose: true,
initialValue: false,
timePicker: {
enabled: true
}
});
}
}); });
</script> </script>
+24 -20
View File
@@ -167,30 +167,34 @@
</div> </div>
</div> </div>
</div> </div>
<script>
document.addEventListener('DOMContentLoaded', function () {
<script> const startTime = document.getElementById('start_time');
document.addEventListener('DOMContentLoaded', function () { const endTime = document.getElementById('end_time');
const startDate = document.getElementById('start_date'); if (typeof $ !== 'undefined' && typeof $.fn.persianDatepicker !== 'undefined') {
const endDate = document.getElementById('end_date');
if (typeof $ !== 'undefined' && typeof $.fn.persianDatepicker !== 'undefined') { $(startTime).persianDatepicker({
format: 'YYYY/MM/DD HH:mm',
autoClose: true,
initialValue: false,
timePicker: {
enabled: true
}
});
$(startDate).persianDatepicker({ $(endTime).persianDatepicker({
format: 'YYYY/MM/DD', format: 'YYYY/MM/DD HH:mm',
autoClose: true, autoClose: true,
initialValue: false initialValue: false,
}); timePicker: {
enabled: true
}
});
$(endDate).persianDatepicker({ }
format: 'YYYY/MM/DD',
autoClose: true,
initialValue: false
});
}
});
</script>
});
</script>
@endsection @endsection
+8 -8
View File
@@ -50,20 +50,20 @@ Route::prefix('admin')->name('admin.')->group(function () {
Route::delete('{tour}', 'destroy')->name('destroy'); Route::delete('{tour}', 'destroy')->name('destroy');
}); });
Route::prefix('flights')->name('flights.')->group(function () { Route::prefix('flights')->name('flights.')->group(function () {
Route::get('/', [FlightController::class, 'index'])->name('index'); Route::get('/', [FlightController::class, 'index'])->name('index');
Route::get('/{flight}/edit', [FlightController::class, 'edit'])->name('edit'); Route::get('/create', [FlightController::class, 'create'])->name('create');
Route::put('/{flight}', [FlightController::class, 'update'])->name('update'); Route::post('/', [FlightController::class, 'store'])->name('store');
Route::get('/flights/create', [FlightController::class, 'create'])->name('create'); Route::get('/{flight}/edit', [FlightController::class, 'edit'])->name('edit');
Route::post('/flights', [FlightController::class, 'store'])->name('store'); Route::put('/{flight}', [FlightController::class, 'update'])->name('update');
Route::delete('/{flight}', [FlightController::class, 'destroy'])->name('destroy'); Route::delete('/{flight}', [FlightController::class, 'destroy'])->name('destroy');
}); });
}); });