fix: update flight management

This commit is contained in:
2026-08-17 19:50:38 +03:30
parent 931d67cdd8
commit 81d2aa1acb
7 changed files with 1888 additions and 130 deletions
+64 -61
View File
@@ -4,6 +4,12 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\FlightStoreRequest;
use App\Http\Requests\FlightUpdateRequest;
use App\Models\Flight;
use App\Models\TravelType;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class FlightController extends Controller class FlightController extends Controller
@@ -13,103 +19,100 @@ class FlightController extends Controller
*/ */
public function index() public function index()
{ {
return 'Flights index'; abort_unless(auth('admin')->user()?->canManageFlights('view'), 403);
}
$flights = Flight::query()
->with('travelType')
->latest()
->when(request('q'), function ($query, $q) {
$query->where(function ($query) use ($q) {
$query->where('flight_number', 'like', "%{$q}%")
->orWhere('airline_name', 'like', "%{$q}%")
->orWhere('origin', 'like', "%{$q}%")
->orWhere('destination', 'like', "%{$q}%");
});
})
->when(request('status') !== null, function ($query) {
$query->where('status', request('status'));
})
->paginate(10)
->withQueryString();
$travelTypes = TravelType::where('status', 1)->get();
return view('admin.flights.index', compact('flights', 'travelTypes'));
}
/** /**
* نمایش فرم ایجاد پرواز * نمایش فرم ایجاد پرواز
*/ */
public function create() public function create()
{ {
return 'Flights create'; abort_unless(auth('admin')->user()?->canManageFlights('create'), 403);
}
$travelTypes = TravelType::where('status', 1)->get();
return view('admin.flights.create', compact('travelTypes'));
}
/** /**
* ذخیره پرواز جدید * ذخیره پرواز جدید
*/ */
public function store(Request $request) public function store(FlightStoreRequest $request)
{ {
// abort_unless(auth('admin')->user()?->canManageFlights('create'), 403);
}
Flight::create($request->validated());
return redirect()->route('admin.flights.index')
->with('success', 'پرواز با موفقیت ثبت شد.');
}
/** /**
* نمایش جزئیات یک پرواز * نمایش جزئیات یک پرواز
*/ */
public function show($flight) public function show(Flight $flight)
{ {
return 'Flights show'; abort_unless(auth('admin')->user()?->canManageFlights('view'), 403);
}
return view('admin.flights.show', compact('flight'));
}
/** /**
* نمایش فرم ویرایش پرواز * نمایش فرم ویرایش پرواز
*/ */
public function edit($flight) public function edit(Flight $flight)
{ {
return 'Flights edit'; abort_unless(auth('admin')->user()?->canManageFlights('update'), 403);
}
$travelTypes = TravelType::where('status', 1)->get();
return view('admin.flights.edit', compact('flight', 'travelTypes'));
}
/** /**
* بروزرسانی پرواز * بروزرسانی پرواز
*/ */
public function update(Request $request, $flight) public function update(FlightUpdateRequest $request, Flight $flight)
{ {
// abort_unless(auth('admin')->user()?->canManageFlights('update'), 403);
}
$flight->update($request->validated());
return redirect()->route('admin.flights.index')
->with('success', 'پرواز با موفقیت به‌روزرسانی شد.');
}
/** /**
* حذف پرواز * حذف پرواز
*/ */
public function destroy($flight) public function destroy(Flight $flight)
{ {
// abort_unless(auth('admin')->user()?->canManageFlights('delete'), 403);
$flight->delete();
return redirect()->route('admin.flights.index')
->with('success', 'پرواز با موفقیت حذف شد.');
} }
} }
//
//namespace App\Http\Controllers\Admin;
//
//use App\Http\Controllers\Controller;
//use Illuminate\Http\Request;
//
//class FlightController extends Controller
//{
// public function index()
// {
// return 'Flights index';
// }
//
// public function create()
// {
// return 'Flights create';
// }
//
// public function store()
// {
// //
// }
//
// public function show($flight)
// {
// return 'Flights show';
// }
//
// public function edit($flight)
// {
// return 'Flights edit';
// }
//
// public function update($flight)
// {
// //
// }
//
// public function destroy($flight)
// {
// //
// }
//}
+119 -27
View File
@@ -1,5 +1,6 @@
<?php <?php
/** /**
* Created by Reliese Model. * Created by Reliese Model.
*/ */
@@ -12,42 +13,20 @@ use Illuminate\Database\Eloquent\Model;
/** /**
* Class Flight * Class Flight
*
* @property int $id
* @property int $travel_type_id
* @property string $flight_number
* @property string $airline_name
* @property string $origin
* @property string $destination
* @property Carbon $departure_date
* @property Carbon $departure_time
* @property Carbon $arrival_date
* @property Carbon $arrival_time
* @property string $duration
* @property float $price
* @property int $capacity
* @property int $status
* @property Carbon $created_at
* @property Carbon $updated_at
*
* @property Collection|Tour[] $tours
*
* @package App\Models
*/ */
class Flight extends Model class Flight extends Model
{ {
protected $table = 'flights'; protected $table = 'flights';
public static $snakeAttributes = false;
protected $casts = [ protected $casts = [
'travel_type_id' => 'int', 'travel_type_id' => 'int',
'departure_date' => 'datetime', 'departure_date' => 'date',
'arrival_date' => 'date',
'departure_time' => 'datetime', 'departure_time' => 'datetime',
'arrival_date' => 'datetime',
'arrival_time' => 'datetime', 'arrival_time' => 'datetime',
'price' => 'float', 'price' => 'decimal:2',
'capacity' => 'int', 'capacity' => 'int',
'status' => 'int' 'status' => 'int',
]; ];
protected $fillable = [ protected $fillable = [
@@ -63,13 +42,126 @@ class Flight extends Model
'duration', 'duration',
'price', 'price',
'capacity', 'capacity',
'status' 'status',
]; ];
/* ------------------------- روابط (Relations) ------------------------- */
/**
* نوع سفر (داخلی/خارجی/چارتر) مرتبط با این پرواز
*/
public function travelType()
{
return $this->belongsTo(TravelType::class);
}
/**
* تورهای مرتبط با این پرواز
*/
public function tours() public function tours()
{ {
return $this->belongsToMany(Tour::class, 'tour_flights') return $this->belongsToMany(Tour::class, 'tour_flights')
->withPivot('id') ->withPivot('id')
->withTimestamps(); ->withTimestamps();
} }
/* --------------------------- Helper ها ------------------------------ */
public function statusLabel(): string
{
return $this->status == 1 ? 'فعال' : 'غیرفعال';
} }
public function isActive(): bool
{
return (int)$this->status === 1;
}
/**
* اسکوپ برای پروازهای فعال
*/
public function scopeActive($query)
{
return $query->where('status', 1);
}
public function getRouteKeyName(): string
{
return 'id';
}
}
//
///**
// * Created by Reliese Model.
// */
//
//namespace App\Models;
//
//use Carbon\Carbon;
//use Illuminate\Database\Eloquent\Collection;
//use Illuminate\Database\Eloquent\Model;
//
///**
// * Class Flight
// *
// * @property int $id
// * @property int $travel_type_id
// * @property string $flight_number
// * @property string $airline_name
// * @property string $origin
// * @property string $destination
// * @property Carbon $departure_date
// * @property Carbon $departure_time
// * @property Carbon $arrival_date
// * @property Carbon $arrival_time
// * @property string $duration
// * @property float $price
// * @property int $capacity
// * @property int $status
// * @property Carbon $created_at
// * @property Carbon $updated_at
// *
// * @property Collection|Tour[] $tours
// *
// * @package App\Models
// */
//class Flight extends Model
//{
// protected $table = 'flights';
// public static $snakeAttributes = false;
//
// protected $casts = [
// 'travel_type_id' => 'int',
// 'departure_date' => 'datetime',
// 'departure_time' => 'datetime',
// 'arrival_date' => 'datetime',
// 'arrival_time' => 'datetime',
// 'price' => 'float',
// 'capacity' => 'int',
// 'status' => 'int'
// ];
//
// protected $fillable = [
// 'travel_type_id',
// 'flight_number',
// 'airline_name',
// 'origin',
// 'destination',
// 'departure_date',
// 'departure_time',
// 'arrival_date',
// 'arrival_time',
// 'duration',
// 'price',
// 'capacity',
// 'status'
// ];
//
// public function tours()
// {
// return $this->belongsToMany(Tour::class, 'tour_flights')
// ->withPivot('id')
// ->withTimestamps();
// }
//}
+534 -1
View File
@@ -1,3 +1,536 @@
@extends('admin.layouts.app')
@section('title', 'ثبت پرواز جدید')
@section('breadcrumb')
<div> <div>
<!-- Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less. - Maria Skłodowska-Curie -->
<h1 class="page-title fw-medium fs-18 mb-2">
ثبت پرواز جدید
</h1>
<nav>
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard.index') }}">
داشبورد
</a>
</li>
<li class="breadcrumb-item">
<a href="{{ route('admin.flights.index') }}">
مدیریت پروازها
</a>
</li>
<li class="breadcrumb-item active">
ثبت پرواز
</li>
</ol>
</nav>
</div> </div>
@endsection
@section('content')
<div class="container-fluid pt-4">
{{-- پیام خطاهای کلی --}}
@if($errors->any())
<div class="alert alert-danger">
<strong>
لطفاً خطاهای زیر را بررسی کنید:
</strong>
<ul class="mb-0 mt-2">
@foreach($errors->all() as $error)
<li>
{{ $error }}
</li>
@endforeach
</ul>
</div>
@endif
<div class="row">
<div class="col-xl-12">
<div class="card custom-card">
<div class="card-header">
<div>
<h5 class="mb-1">
اطلاعات پرواز
</h5>
<p class="text-muted fs-12 mb-0">
اطلاعات کامل پرواز را وارد کنید.
</p>
</div>
</div>
<div class="card-body">
<form
action="{{ route('admin.flights.store') }}"
method="POST"
>
@csrf
{{-- نوع سفر --}}
<div class="row">
<div class="col-md-4 mb-3">
<label class="form-label">
نوع سفر
<span class="text-danger">*</span>
</label>
<select
name="travel_type_id"
class="form-select @error('travel_type_id') is-invalid @enderror"
>
<option value="">
انتخاب نوع سفر
</option>
@foreach($travelTypes as $travelType)
<option
value="{{ $travelType->id }}"
{{ old('travel_type_id') == $travelType->id ? 'selected' : '' }}
>
{{ $travelType->title }}
</option>
@endforeach
</select>
@error('travel_type_id')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
{{-- شماره پرواز --}}
<div class="col-md-4 mb-3">
<label class="form-label">
شماره پرواز
<span class="text-danger">*</span>
</label>
<input
type="text"
name="flight_number"
class="form-control @error('flight_number') is-invalid @enderror"
value="{{ old('flight_number') }}"
placeholder="مثلاً IR721"
>
@error('flight_number')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
{{-- ایرلاین --}}
<div class="col-md-4 mb-3">
<label class="form-label">
نام ایرلاین
<span class="text-danger">*</span>
</label>
<input
type="text"
name="airline_name"
class="form-control @error('airline_name') is-invalid @enderror"
value="{{ old('airline_name') }}"
placeholder="مثلاً ایران ایر"
>
@error('airline_name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<hr class="my-4">
{{-- مسیر --}}
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">
مبدأ
<span class="text-danger">*</span>
</label>
<input
type="text"
name="origin"
class="form-control @error('origin') is-invalid @enderror"
value="{{ old('origin') }}"
placeholder="مثلاً تهران"
>
@error('origin')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-6 mb-3">
<label class="form-label">
مقصد
<span class="text-danger">*</span>
</label>
<input
type="text"
name="destination"
class="form-control @error('destination') is-invalid @enderror"
value="{{ old('destination') }}"
placeholder="مثلاً استانبول"
>
@error('destination')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<hr class="my-4">
{{-- زمان حرکت --}}
<h6 class="fw-semibold mb-3">
زمان حرکت
</h6>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">
تاریخ حرکت
<span class="text-danger">*</span>
</label>
<input
type="text"
name="departure_date"
class="form-control @error('departure_date') is-invalid @enderror"
value="{{ old('departure_date') }}"
placeholder="1405/05/30"
autocomplete="off"
>
<small class="text-muted">
تاریخ را به صورت شمسی وارد کنید.
</small>
@error('departure_date')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-6 mb-3">
<label class="form-label">
ساعت حرکت
<span class="text-danger">*</span>
</label>
<input
type="time"
name="departure_time"
class="form-control @error('departure_time') is-invalid @enderror"
value="{{ old('departure_time') }}"
>
@error('departure_time')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
{{-- زمان رسیدن --}}
<h6 class="fw-semibold mb-3 mt-3">
زمان رسیدن
</h6>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">
تاریخ رسیدن
<span class="text-danger">*</span>
</label>
<input
type="text"
name="arrival_date"
class="form-control @error('arrival_date') is-invalid @enderror"
value="{{ old('arrival_date') }}"
placeholder="1405/05/30"
autocomplete="off"
>
<small class="text-muted">
تاریخ را به صورت شمسی وارد کنید.
</small>
@error('arrival_date')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-6 mb-3">
<label class="form-label">
ساعت رسیدن
<span class="text-danger">*</span>
</label>
<input
type="time"
name="arrival_time"
class="form-control @error('arrival_time') is-invalid @enderror"
value="{{ old('arrival_time') }}"
>
@error('arrival_time')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<hr class="my-4">
{{-- اطلاعات تجاری --}}
<h6 class="fw-semibold mb-3">
اطلاعات تجاری و ظرفیت
</h6>
<div class="row">
<div class="col-md-4 mb-3">
<label class="form-label">
مدت پرواز
<span class="text-danger">*</span>
</label>
<input
type="text"
name="duration"
class="form-control @error('duration') is-invalid @enderror"
value="{{ old('duration') }}"
placeholder="مثلاً 2 ساعت و 30 دقیقه"
>
@error('duration')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-4 mb-3">
<label class="form-label">
قیمت
<span class="text-danger">*</span>
</label>
<input
type="number"
name="price"
min="0"
class="form-control @error('price') is-invalid @enderror"
value="{{ old('price') }}"
placeholder="مثلاً 8500000"
>
@error('price')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-4 mb-3">
<label class="form-label">
ظرفیت
<span class="text-danger">*</span>
</label>
<input
type="number"
name="capacity"
min="1"
class="form-control @error('capacity') is-invalid @enderror"
value="{{ old('capacity') }}"
placeholder="مثلاً 180"
>
@error('capacity')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
{{-- وضعیت --}}
<div class="row">
<div class="col-md-4 mb-3">
<label class="form-label">
وضعیت
</label>
<select
name="status"
class="form-select @error('status') is-invalid @enderror"
>
<option
value="1"
{{ old('status', 1) == 1 ? 'selected' : '' }}
>
فعال
</option>
<option
value="0"
{{ old('status') === '0' ? 'selected' : '' }}
>
غیرفعال
</option>
</select>
@error('status')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
{{-- دکمه ها --}}
<div class="d-flex justify-content-end gap-2 mt-4">
<a
href="{{ route('admin.flights.index') }}"
class="btn btn-light"
>
انصراف
</a>
<button
type="submit"
class="btn btn-primary"
>
<i class="ri-save-line me-1"></i>
ثبت پرواز
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
+536 -1
View File
@@ -1,3 +1,538 @@
@extends('admin.layouts.app')
@section('title', 'ویرایش پرواز')
@section('breadcrumb')
<div> <div>
<!-- He who is contented is rich. - Laozi -->
<h1 class="page-title fw-medium fs-18 mb-2">
ویرایش پرواز
</h1>
<nav>
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard.index') }}">
داشبورد
</a>
</li>
<li class="breadcrumb-item">
<a href="{{ route('admin.flights.index') }}">
مدیریت پروازها
</a>
</li>
<li class="breadcrumb-item active">
ویرایش پرواز
</li>
</ol>
</nav>
</div> </div>
@endsection
@section('content')
<div class="container-fluid pt-4">
@if($errors->any())
<div class="alert alert-danger">
<strong>
لطفاً خطاهای زیر را بررسی کنید:
</strong>
<ul class="mb-0 mt-2">
@foreach($errors->all() as $error)
<li>
{{ $error }}
</li>
@endforeach
</ul>
</div>
@endif
<div class="row">
<div class="col-xl-12">
<div class="card custom-card">
<div class="card-header">
<div>
<h5 class="mb-1">
ویرایش پرواز
</h5>
<p class="text-muted fs-12 mb-0">
پرواز
{{ $flight->flight_number }}
را ویرایش می‌کنید.
</p>
</div>
</div>
<div class="card-body">
<form
action="{{ route('admin.flights.update', $flight) }}"
method="POST"
>
@csrf
@method('PUT')
{{-- نوع سفر --}}
<div class="row">
<div class="col-md-4 mb-3">
<label class="form-label">
نوع سفر
<span class="text-danger">*</span>
</label>
<select
name="travel_type_id"
class="form-select @error('travel_type_id') is-invalid @enderror"
>
<option value="">
انتخاب نوع سفر
</option>
@foreach($travelTypes as $travelType)
<option
value="{{ $travelType->id }}"
{{ old('travel_type_id', $flight->travel_type_id) == $travelType->id ? 'selected' : '' }}
>
{{ $travelType->title }}
</option>
@endforeach
</select>
@error('travel_type_id')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
{{-- شماره پرواز --}}
<div class="col-md-4 mb-3">
<label class="form-label">
شماره پرواز
<span class="text-danger">*</span>
</label>
<input
type="text"
name="flight_number"
class="form-control @error('flight_number') is-invalid @enderror"
value="{{ old('flight_number', $flight->flight_number) }}"
>
@error('flight_number')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
{{-- ایرلاین --}}
<div class="col-md-4 mb-3">
<label class="form-label">
نام ایرلاین
<span class="text-danger">*</span>
</label>
<input
type="text"
name="airline_name"
class="form-control @error('airline_name') is-invalid @enderror"
value="{{ old('airline_name', $flight->airline_name) }}"
>
@error('airline_name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<hr class="my-4">
{{-- مسیر --}}
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">
مبدأ
<span class="text-danger">*</span>
</label>
<input
type="text"
name="origin"
class="form-control @error('origin') is-invalid @enderror"
value="{{ old('origin', $flight->origin) }}"
>
@error('origin')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-6 mb-3">
<label class="form-label">
مقصد
<span class="text-danger">*</span>
</label>
<input
type="text"
name="destination"
class="form-control @error('destination') is-invalid @enderror"
value="{{ old('destination', $flight->destination) }}"
>
@error('destination')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<hr class="my-4">
<h6 class="fw-semibold mb-3">
زمان حرکت
</h6>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">
تاریخ حرکت
<span class="text-danger">*</span>
</label>
<input
type="text"
name="departure_date"
class="form-control @error('departure_date') is-invalid @enderror"
value="{{ old('departure_date', $flight->departure_date?->toJalali()->format('Y/m/d')) }}"
autocomplete="off"
>
@error('departure_date')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-6 mb-3">
<label class="form-label">
ساعت حرکت
<span class="text-danger">*</span>
</label>
<input
type="time"
name="departure_time"
class="form-control @error('departure_time') is-invalid @enderror"
value="{{ old('departure_time', $flight->departure_time?->format('H:i')) }}"
>
@error('departure_time')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<h6 class="fw-semibold mb-3 mt-3">
زمان رسیدن
</h6>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">
تاریخ رسیدن
<span class="text-danger">*</span>
</label>
<input
type="text"
name="arrival_date"
class="form-control @error('arrival_date') is-invalid @enderror"
value="{{ old('arrival_date', $flight->arrival_date?->toJalali()->format('Y/m/d')) }}"
autocomplete="off"
>
@error('arrival_date')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-6 mb-3">
<label class="form-label">
ساعت رسیدن
<span class="text-danger">*</span>
</label>
<input
type="time"
name="arrival_time"
class="form-control @error('arrival_time') is-invalid @enderror"
value="{{ old('arrival_time', $flight->arrival_time?->format('H:i')) }}"
>
@error('arrival_time')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<hr class="my-4">
<h6 class="fw-semibold mb-3">
اطلاعات تجاری و ظرفیت
</h6>
<div class="row">
<div class="col-md-4 mb-3">
<label class="form-label">
مدت پرواز
<span class="text-danger">*</span>
</label>
<input
type="text"
name="duration"
class="form-control @error('duration') is-invalid @enderror"
value="{{ old('duration', $flight->duration) }}"
>
@error('duration')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-4 mb-3">
<label class="form-label">
قیمت
<span class="text-danger">*</span>
</label>
<input
type="number"
name="price"
min="0"
class="form-control @error('price') is-invalid @enderror"
value="{{ old('price', $flight->price) }}"
>
@error('price')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="col-md-4 mb-3">
<label class="form-label">
ظرفیت
<span class="text-danger">*</span>
</label>
<input
type="number"
name="capacity"
min="1"
class="form-control @error('capacity') is-invalid @enderror"
value="{{ old('capacity', $flight->capacity) }}"
>
@error('capacity')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
{{-- وضعیت --}}
<div class="row">
<div class="col-md-4 mb-3">
<label class="form-label">
وضعیت
</label>
<select
name="status"
class="form-select @error('status') is-invalid @enderror"
>
<option
value="1"
{{ old('status', $flight->status) == 1 ? 'selected' : '' }}
>
فعال
</option>
<option
value="0"
{{ old('status', $flight->status) == 0 ? 'selected' : '' }}
>
غیرفعال
</option>
</select>
@error('status')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
</div>
<div class="d-flex justify-content-between align-items-center mt-4">
<div>
<a
href="{{ route('admin.flights.show', $flight) }}"
class="btn btn-info-light"
>
مشاهده جزئیات
</a>
</div>
<div class="d-flex gap-2">
<a
href="{{ route('admin.flights.index') }}"
class="btn btn-light"
>
انصراف
</a>
<button
type="submit"
class="btn btn-primary"
>
<i class="ri-save-line me-1"></i>
ذخیره تغییرات
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
+532 -1
View File
@@ -1,3 +1,534 @@
@extends('admin.layouts.app')
@section('title', 'مدیریت پروازها')
@section('breadcrumb')
<div> <div>
<!-- He who is contented is rich. - Laozi -->
<h1 class="page-title fw-medium fs-18 mb-2">
مدیریت پروازها
</h1>
<nav>
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard.index') }}">
داشبورد
</a>
</li>
<li class="breadcrumb-item active">
مدیریت پروازها
</li>
</ol>
</nav>
</div> </div>
@endsection
@section('content')
<div class="container-fluid pt-4">
{{-- عنوان و عملیات --}}
<div class="row">
<div class="col-xl-12">
<div class="card custom-card">
<div class="card-body p-3">
<div class="d-flex align-items-center justify-content-between flex-wrap gap-3">
<div>
<h5 class="mb-1">
مدیریت پروازها
</h5>
<p class="text-muted mb-0 fs-12">
لیست پروازهای ثبت شده در سیستم
</p>
</div>
<div>
@if(auth('admin')->user()?->canManageFlights('create'))
<a href="{{ route('admin.flights.create') }}"
class="btn btn-primary">
<i class="fa fa-plus me-1"></i>
پرواز جدید
</a>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
{{-- جستجو و فیلتر --}}
<div class="row">
<div class="col-xl-12">
<div class="card custom-card">
<div class="card-body">
<form
method="GET"
action="{{ route('admin.flights.index') }}"
>
<div class="row g-3 align-items-end">
{{-- جستجو --}}
<div class="col-xl-6 col-lg-5 col-md-6">
<label class="form-label">
جستجوی پرواز
</label>
<input
type="text"
name="q"
class="form-control"
placeholder="شماره پرواز، ایرلاین، مبدأ یا مقصد..."
value="{{ request('q') }}"
>
</div>
{{-- وضعیت --}}
<div class="col-xl-2 col-lg-3 col-md-3">
<label class="form-label">
وضعیت
</label>
<select
name="status"
class="form-select"
>
<option value="">
همه وضعیت‌ها
</option>
<option
value="1"
{{ request('status') === '1' ? 'selected' : '' }}
>
فعال
</option>
<option
value="0"
{{ request('status') === '0' ? 'selected' : '' }}
>
غیرفعال
</option>
</select>
</div>
{{-- جستجو --}}
<div class="col-xl-2 col-lg-2 col-md-3">
<button
type="submit"
class="btn btn-primary w-100"
>
<i class="fa fa-search me-1"></i>
جستجو
</button>
</div>
{{-- پاک کردن --}}
<div class="col-xl-2 col-lg-2 col-md-3">
<a
href="{{ route('admin.flights.index') }}"
class="btn btn-light w-100"
>
<i class="fa fa-refresh me-1"></i>
پاک کردن
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
{{-- جدول پروازها --}}
<div class="row">
<div class="col-xl-12">
<div class="card custom-card">
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover align-middle text-nowrap mb-0">
<thead>
<tr>
<th>
#
</th>
<th>
شماره پرواز
</th>
<th>
نوع سفر
</th>
<th>
ایرلاین
</th>
<th>
مسیر
</th>
<th>
تاریخ حرکت
</th>
<th>
قیمت
</th>
<th>
وضعیت
</th>
<th>
عملیات
</th>
</tr>
</thead>
<tbody>
@forelse($flights as $flight)
<tr>
{{-- شناسه --}}
<td>
{{ $flight->id }}
</td>
{{-- شماره پرواز --}}
<td>
<span class="fw-semibold">
{{ $flight->flight_number }}
</span>
</td>
{{-- نوع سفر --}}
<td>
@if($flight->travelType)
<span class="badge bg-primary-transparent">
{{ $flight->travelType->title }}
</span>
@else
<span class="text-muted">
—
</span>
@endif
</td>
{{-- ایرلاین --}}
<td>
{{ $flight->airline_name }}
</td>
{{-- مسیر --}}
<td>
<span class="badge bg-primary-transparent">
{{ $flight->origin }}
</span>
<span class="mx-1 text-muted">
←
</span>
<span class="badge bg-info-transparent">
{{ $flight->destination }}
</span>
</td>
{{-- تاریخ حرکت --}}
<td>
@if($flight->departure_date)
<span class="fw-medium">
{{ $flight->departure_date
->toJalali()
->format('Y/m/d') }}
</span>
@else
<span class="text-muted">
—
</span>
@endif
@if($flight->departure_time)
<br>
<small class="text-muted">
{{ $flight->departure_time->format('H:i') }}
</small>
@endif
</td>
{{-- قیمت --}}
<td>
<span class="fw-medium">
{{ number_format($flight->price) }}
</span>
<small class="text-muted">
تومان
</small>
</td>
{{-- وضعیت --}}
<td>
@if((int) $flight->status === 1)
<span class="badge bg-success-transparent">
فعال
</span>
@else
<span class="badge bg-danger-transparent">
غیرفعال
</span>
@endif
</td>
{{-- عملیات --}}
<td>
<div class="d-flex align-items-center gap-2">
{{-- مشاهده --}}
@if(auth('admin')->user()?->canManageFlights('view'))
<a
href="{{ route('admin.flights.show', $flight) }}"
class="btn btn-info-light btn-sm"
>
<i class="fa fa-eye me-1"></i>
مشاهده
</a>
@endif
{{-- ویرایش --}}
@if(auth('admin')->user()?->canManageFlights('update'))
<a
href="{{ route('admin.flights.edit', $flight) }}"
class="btn btn-warning-light btn-sm"
>
<i class="fa fa-edit me-1"></i>
ویرایش
</a>
@endif
{{-- حذف --}}
@if(auth('admin')->user()?->canManageFlights('delete'))
<form
action="{{ route('admin.flights.destroy', $flight) }}"
method="POST"
class="d-inline"
onsubmit="return confirm('آیا از حذف این پرواز مطمئن هستید؟');"
>
@csrf
@method('DELETE')
<button
type="submit"
class="btn btn-danger-light btn-sm"
>
<i class="fa fa-trash me-1"></i>
حذف
</button>
</form>
@endif
</div>
</td>
</tr>
@empty
<tr>
<td
colspan="9"
class="text-center py-5"
>
<div class="text-muted">
<i class="fa fa-plane fs-2 mb-3 d-block"></i>
<div>
پروازی برای نمایش وجود ندارد.
</div>
</div>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
{{-- Pagination --}}
@if($flights->hasPages())
<div class="card-footer">
<div class="d-flex justify-content-center">
{{ $flights->links() }}
</div>
</div>
@endif
</div>
</div>
</div>
</div>
@endsection
+68 -1
View File
@@ -1,3 +1,70 @@
@extends('admin.layouts.app')
@section('title', 'جزئیات پرواز')
@section('content')
<div class="row">
<div class="col-lg-8 mx-auto">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">جزئیات پرواز {{ $flight->flight_number }}</h5>
<div> <div>
<!-- Well begun is half done. - Aristotle --> <a href="{{ route('admin.flights.edit', $flight) }}"
class="btn btn-sm btn-warning">ویرایش</a>
<a href="{{ route('admin.flights.index') }}"
class="btn btn-sm btn-secondary">بازگشت</a>
</div> </div>
</div>
<div class="card-body">
<dl class="row mb-0">
<dt class="col-sm-4">شماره پرواز</dt>
<dd class="col-sm-8">{{ $flight->flight_number }}</dd>
<dt class="col-sm-4">نوع سفر</dt>
<dd class="col-sm-8">{{ $flight->travelType?->title ?? '—' }}</dd>
<dt class="col-sm-4">ایرلاین</dt>
<dd class="col-sm-8">{{ $flight->airline_name }}</dd>
<dt class="col-sm-4">مبدأ</dt>
<dd class="col-sm-8">{{ $flight->origin }}</dd>
<dt class="col-sm-4">مقصد</dt>
<dd class="col-sm-8">{{ $flight->destination }}</dd>
<dt class="col-sm-4">تاریخ و ساعت حرکت</dt>
<dd class="col-sm-8">
{{ $flight->departure_date->toJalali()->format('Y/m/d') }} —
{{ $flight->departure_time->format('H:i') }}
</dd>
<dt class="col-sm-4">تاریخ و ساعت رسیدن</dt>
<dd class="col-sm-8">
{{ $flight->arrival_date->toJalali()->format('Y/m/d') }} —
{{ $flight->arrival_time->format('H:i') }}
</dd>
<dt class="col-sm-4">مدت پرواز</dt>
<dd class="col-sm-8">{{ $flight->duration }}</dd>
<dt class="col-sm-4">قیمت</dt>
<dd class="col-sm-8">{{ number_format($flight->price) }} تومان</dd>
<dt class="col-sm-4">ظرفیت</dt>
<dd class="col-sm-8">{{ $flight->capacity }} نفر</dd>
<dt class="col-sm-4">وضعیت</dt>
<dd class="col-sm-8">
@if($flight->status == 1)
<span class="badge bg-success">فعال</span>
@else
<span class="badge bg-secondary">غیرفعال</span>
@endif
</dd>
</dl>
</div>
</div>
</div>
</div>
@endsection
-3
View File
@@ -1,3 +0,0 @@
<div>
<!-- Very little is needed to make a happy life. - Marcus Aurelius -->
</div>