feat: update edit for flights and add create flights in admin panel
This commit is contained in:
@@ -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
|
||||||
@@ -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,29 +242,34 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@endsection
|
|
||||||
|
|
||||||
@section('scripts')
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
|
||||||
$('#start_time').persianDatepicker({
|
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',
|
format: 'YYYY/MM/DD HH:mm',
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
|
initialValue: false,
|
||||||
timePicker: {
|
timePicker: {
|
||||||
enabled: true
|
enabled: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#end_time').persianDatepicker({
|
$(endTime).persianDatepicker({
|
||||||
format: 'YYYY/MM/DD HH:mm',
|
format: 'YYYY/MM/DD HH:mm',
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
|
initialValue: false,
|
||||||
timePicker: {
|
timePicker: {
|
||||||
enabled: true
|
enabled: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -167,30 +167,34 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
|
||||||
const startDate = document.getElementById('start_date');
|
const startTime = document.getElementById('start_time');
|
||||||
const endDate = document.getElementById('end_date');
|
const endTime = document.getElementById('end_time');
|
||||||
|
|
||||||
if (typeof $ !== 'undefined' && typeof $.fn.persianDatepicker !== 'undefined') {
|
if (typeof $ !== 'undefined' && typeof $.fn.persianDatepicker !== 'undefined') {
|
||||||
|
|
||||||
$(startDate).persianDatepicker({
|
$(startTime).persianDatepicker({
|
||||||
format: 'YYYY/MM/DD',
|
format: 'YYYY/MM/DD HH:mm',
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
initialValue: false
|
initialValue: false,
|
||||||
|
timePicker: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$(endDate).persianDatepicker({
|
$(endTime).persianDatepicker({
|
||||||
format: 'YYYY/MM/DD',
|
format: 'YYYY/MM/DD HH:mm',
|
||||||
autoClose: true,
|
autoClose: true,
|
||||||
initialValue: false
|
initialValue: false,
|
||||||
|
timePicker: {
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
+4
-4
@@ -54,14 +54,14 @@ Route::prefix('admin')->name('admin.')->group(function () {
|
|||||||
|
|
||||||
Route::get('/', [FlightController::class, 'index'])->name('index');
|
Route::get('/', [FlightController::class, 'index'])->name('index');
|
||||||
|
|
||||||
|
Route::get('/create', [FlightController::class, 'create'])->name('create');
|
||||||
|
|
||||||
|
Route::post('/', [FlightController::class, 'store'])->name('store');
|
||||||
|
|
||||||
Route::get('/{flight}/edit', [FlightController::class, 'edit'])->name('edit');
|
Route::get('/{flight}/edit', [FlightController::class, 'edit'])->name('edit');
|
||||||
|
|
||||||
Route::put('/{flight}', [FlightController::class, 'update'])->name('update');
|
Route::put('/{flight}', [FlightController::class, 'update'])->name('update');
|
||||||
|
|
||||||
Route::get('/flights/create', [FlightController::class, 'create'])->name('create');
|
|
||||||
|
|
||||||
Route::post('/flights', [FlightController::class, 'store'])->name('store');
|
|
||||||
|
|
||||||
Route::delete('/{flight}', [FlightController::class, 'destroy'])->name('destroy');
|
Route::delete('/{flight}', [FlightController::class, 'destroy'])->name('destroy');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user