feat: complete wishlist in user dashboard
This commit is contained in:
@@ -1,11 +1,40 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\Http\Controllers\Account;
|
namespace App\Http\Controllers\Account;
|
||||||
class WishlistController
|
|
||||||
{
|
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Wishlist;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class WishlistController extends Controller
|
||||||
|
{
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
|
$wishlists = Wishlist::with(['tour', 'flight'])
|
||||||
|
->where('user_id', auth()->id())
|
||||||
|
->latest()
|
||||||
|
->paginate();
|
||||||
|
|
||||||
|
return view('account.wishlist', compact('wishlists'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toggle($type, $id)
|
||||||
|
{
|
||||||
|
$wishlist = Wishlist::where('user_id', auth()->id())
|
||||||
|
->where($type . '_id', $id)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($wishlist) {
|
||||||
|
$wishlist->delete();
|
||||||
|
} else {
|
||||||
|
Wishlist::create([
|
||||||
|
'user_id' => auth()->id(),
|
||||||
|
$type . '_id' => $id,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return back();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Reliese Model.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Wishlist
|
||||||
|
*
|
||||||
|
* @property int $id
|
||||||
|
* @property int $user_id
|
||||||
|
* @property int|null $flight_id
|
||||||
|
* @property int|null $tour_id
|
||||||
|
* @property Carbon|null $created_at
|
||||||
|
* @property Carbon|null $updated_at
|
||||||
|
*
|
||||||
|
* @property User $user
|
||||||
|
* @property Flight|null $flight
|
||||||
|
* @property Tour|null $tour
|
||||||
|
*
|
||||||
|
* @package App\Models
|
||||||
|
*/
|
||||||
|
class Wishlist extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'wishlists';
|
||||||
|
public static $snakeAttributes = false;
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'user_id' => 'int',
|
||||||
|
'flight_id' => 'int',
|
||||||
|
'tour_id' => 'int'
|
||||||
|
];
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'user_id',
|
||||||
|
'flight_id',
|
||||||
|
'tour_id'
|
||||||
|
];
|
||||||
|
|
||||||
|
public function user()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function flight()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Flight::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tour()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Tour::class, 'tour_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2951,6 +2951,8 @@ tour css
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.tour-top{
|
.tour-top{
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -9648,3 +9650,5 @@ home-3
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<main class="main">
|
||||||
|
|
||||||
|
<div class="site-breadcrumb" style="background: url({{asset('assets/img/breadcrumb/02.jpg')}})">
|
||||||
|
<div class="container">
|
||||||
|
<h2 class="breadcrumb-title">@yield('title')</h2>
|
||||||
|
<ul class="breadcrumb-menu">
|
||||||
|
<li><a href="{{route('index')}}">صفحه اصلی</a></li>
|
||||||
|
<li class="active">@yield('title')</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="user-profile py-120">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3">
|
||||||
|
@include('account.layouts.sidebar')
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-9">
|
||||||
|
@yield('account-content')
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
@endsection
|
||||||
|
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
@extends('account.layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'علاقهمندیها')
|
||||||
|
|
||||||
|
@section('account-content')
|
||||||
|
|
||||||
|
```
|
||||||
|
<div class="col-lg-9">
|
||||||
|
<div class="user-profile-wrapper">
|
||||||
|
<div class="user-profile-card">
|
||||||
|
|
||||||
|
<h4 class="user-profile-card-title">فهرست علاقهمندیها</h4>
|
||||||
|
|
||||||
|
<div class="row mt-30">
|
||||||
|
|
||||||
|
@forelse($wishlists as $wishlist)
|
||||||
|
|
||||||
|
|
||||||
|
@if($wishlist->tour)
|
||||||
|
|
||||||
|
<div class="col-md-6 col-lg-4 mb-4">
|
||||||
|
<div class="tour-item h-100">
|
||||||
|
|
||||||
|
<div class="tour-img position-relative">
|
||||||
|
|
||||||
|
<span class="badge position-absolute top-0 start-0 m-3">
|
||||||
|
تور
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<img
|
||||||
|
src="{{ $wishlist->tour->file
|
||||||
|
? asset('storage/' . $wishlist->tour->file->path)
|
||||||
|
: asset('assets/img/tour/01.jpg') }}"
|
||||||
|
alt="{{ $wishlist->tour->title }}"
|
||||||
|
>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="{{ route('account.wishlist.toggle', [
|
||||||
|
'type' => 'tour',
|
||||||
|
'id' => $wishlist->tour->id
|
||||||
|
]) }}"
|
||||||
|
class="add-wishlist"
|
||||||
|
>
|
||||||
|
<i class="fas fa-heart"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tour-content d-flex flex-column">
|
||||||
|
|
||||||
|
<div class="tour-top">
|
||||||
|
<span class="tour-place">
|
||||||
|
<i class="far fa-earth-americas"></i>
|
||||||
|
{{ $wishlist->tour->origin }}
|
||||||
|
-
|
||||||
|
{{ $wishlist->tour->destination }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="tour-title">
|
||||||
|
<a href="{{ route('tours.show', $wishlist->tour->id) }}">
|
||||||
|
{{ $wishlist->tour->title }}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<i class="far fa-location-dot"></i>
|
||||||
|
{{ $wishlist->tour->summary }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="tour-duration">
|
||||||
|
<i class="far fa-clock"></i>
|
||||||
|
سفر {{ $wishlist->tour->duration }}
|
||||||
|
روز و
|
||||||
|
{{ $wishlist->tour->duration - 1 }}
|
||||||
|
شب
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tour-bottom mt-auto">
|
||||||
|
|
||||||
|
<div class="tour-price">
|
||||||
|
از
|
||||||
|
<span>
|
||||||
|
{{ number_format($wishlist->tour->price) }}
|
||||||
|
تومان
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tour-text-btn">
|
||||||
|
<a href="{{ route('tours.show', $wishlist->tour->id) }}">
|
||||||
|
بیشتر ببین
|
||||||
|
<i class="fas fa-arrow-left"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@elseif($wishlist->flight)
|
||||||
|
|
||||||
|
<div class="col-md-6 col-lg-4 mb-4">
|
||||||
|
<div class="tour-item h-100">
|
||||||
|
|
||||||
|
<div class="tour-img position-relative">
|
||||||
|
|
||||||
|
<span class="badge position-absolute top-0 start-0 m-3">
|
||||||
|
پرواز
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<img
|
||||||
|
src="{{ $wishlist->flight->file
|
||||||
|
? asset('storage/' . $wishlist->flight->file->path)
|
||||||
|
: asset('assets/img/flight/01.jpg') }}"
|
||||||
|
alt="{{ $wishlist->flight->title }}"
|
||||||
|
>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="{{ route('account.wishlist.toggle', [
|
||||||
|
'type' => 'flight',
|
||||||
|
'id' => $wishlist->flight->id
|
||||||
|
]) }}"
|
||||||
|
class="add-wishlist"
|
||||||
|
>
|
||||||
|
<i class="fas fa-heart"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tour-content d-flex flex-column">
|
||||||
|
|
||||||
|
<div class="tour-top">
|
||||||
|
<span class="tour-place">
|
||||||
|
<i class="far fa-plane"></i>
|
||||||
|
پرواز
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h4 class="tour-title">
|
||||||
|
{{ $wishlist->flight->title }}
|
||||||
|
</h4>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<i class="far fa-building"></i>
|
||||||
|
{{ $wishlist->flight->airline->name ?? 'شرکت هواپیمایی' }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<i class="far fa-route"></i>
|
||||||
|
|
||||||
|
{{ $wishlist->flight->departureAirport->city->name ?? 'مبدا' }}
|
||||||
|
-
|
||||||
|
{{ $wishlist->flight->arrivalAirport->city->name ?? 'مقصد' }}
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="tour-duration">
|
||||||
|
<i class="far fa-clock"></i>
|
||||||
|
|
||||||
|
@if($wishlist->flight->departure_time)
|
||||||
|
{{ $wishlist->flight->departure_time->format('Y/m/d H:i') }}
|
||||||
|
@else
|
||||||
|
زمان حرکت مشخص نشده
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tour-bottom mt-auto">
|
||||||
|
|
||||||
|
<div class="tour-price">
|
||||||
|
از
|
||||||
|
|
||||||
|
<span>
|
||||||
|
{{ number_format($wishlist->flight->price) }}
|
||||||
|
تومان
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tour-text-btn">
|
||||||
|
<a href="{{ route('flights.show', $wishlist->flight->id) }}">
|
||||||
|
بیشتر ببین
|
||||||
|
<i class="fas fa-arrow-left"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@empty
|
||||||
|
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div class="text-center py-5">
|
||||||
|
|
||||||
|
<i class="far fa-heart fa-3x mb-3"></i>
|
||||||
|
|
||||||
|
<h5>
|
||||||
|
هنوز چیزی به علاقهمندیهای شما اضافه نشده است.
|
||||||
|
</h5>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endforelse
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@if(method_exists($wishlists, 'hasPages') && $wishlists->hasPages())
|
||||||
|
|
||||||
|
<div class="pagination-area my-4">
|
||||||
|
|
||||||
|
<div aria-label="Page navigation example">
|
||||||
|
{{ $wishlists->links() }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
@endsection
|
||||||
@@ -3,15 +3,24 @@
|
|||||||
<div class="flight-item">
|
<div class="flight-item">
|
||||||
<div class="flight-img">
|
<div class="flight-img">
|
||||||
<img src="assets/img/flight/01.jpg" alt>
|
<img src="assets/img/flight/01.jpg" alt>
|
||||||
<a href="#" class="add-wishlist"><i class="far fa-heart"></i></a>
|
|
||||||
|
<a href="{{ route('account.wishlist.toggle', [
|
||||||
|
'type' => 'flight',
|
||||||
|
'id' => $flight->id
|
||||||
|
]) }}" class="add-wishlist">
|
||||||
|
<i class="far fa-heart"></i>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="flight-content">
|
<div class="flight-content">
|
||||||
<div class="flight-title">
|
<div class="flight-title">
|
||||||
<div class="flight-title-info">
|
<div class="flight-title-info">
|
||||||
<img src="assets/img/flight/airline-1.png" alt>
|
<img src="assets/img/flight/airline-1.png" alt>
|
||||||
<h4><a href="#">{{ $flight->departureAirport->city->name }}<i class="far fa-exchange"></i> {{ $flight->arrivalAirport->city->name }} </a></h4>
|
<h4><a href="#">{{ $flight->departureAirport->city->name }}<i
|
||||||
|
class="far fa-exchange"></i> {{ $flight->arrivalAirport->city->name }} </a></h4>
|
||||||
</div>
|
</div>
|
||||||
<p class="flight-date"><i class="far fa-calendar-days"></i>{{ $flight->departure_time->toJalali()->format('Y/m/d H:i') }}</p>
|
<p class="flight-date"><i
|
||||||
|
class="far fa-calendar-days"></i>{{ $flight->departure_time->toJalali()->format('Y/m/d H:i') }}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flight-bottom">
|
<div class="flight-bottom">
|
||||||
<div class="flight-price">
|
<div class="flight-price">
|
||||||
|
|||||||
@@ -9,7 +9,10 @@
|
|||||||
alt="{{ $tour->title }}"
|
alt="{{ $tour->title }}"
|
||||||
>
|
>
|
||||||
|
|
||||||
<a href="{{ route('tours.show', $tour->id) }}" class="add-wishlist">
|
<a href="{{ route('account.wishlist.toggle', [
|
||||||
|
'type' => 'tour',
|
||||||
|
'id' => $tour->id
|
||||||
|
]) }}" class="add-wishlist">
|
||||||
<i class="far fa-heart"></i>
|
<i class="far fa-heart"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{{-- Flight specific --}}
|
|
||||||
@if($type === 'flight')
|
@if($type === 'flight')
|
||||||
|
|
||||||
<div class="search-form">
|
<div class="search-form">
|
||||||
@@ -62,11 +62,19 @@
|
|||||||
اکنون رزرو کن
|
اکنون رزرو کن
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<a href="#" class="border-btn">
|
<a href="{{ route('account.wishlist.toggle', [
|
||||||
|
'type' => 'flight',
|
||||||
|
'id' => $item->id
|
||||||
|
]) }}" class="border-btn">
|
||||||
|
|
||||||
|
|
||||||
<i class="far fa-heart"></i>
|
<i class="far fa-heart"></i>
|
||||||
افزودن به علاقهمندیها
|
افزودن به علاقهمندیها
|
||||||
|
|
||||||
|
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -77,7 +85,7 @@
|
|||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|
||||||
{{-- Tour specific --}}
|
|
||||||
@if($type === 'tour')
|
@if($type === 'tour')
|
||||||
|
|
||||||
<div class="listing-item p-3 mt-3">
|
<div class="listing-item p-3 mt-3">
|
||||||
@@ -127,11 +135,19 @@
|
|||||||
اکنون رزرو کن
|
اکنون رزرو کن
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="#" class="border-btn">
|
<a href="{{ route('account.wishlist.toggle', [
|
||||||
|
'type' => 'tour',
|
||||||
|
'id' => $item->id
|
||||||
|
]) }}" class="border-btn">
|
||||||
|
|
||||||
|
|
||||||
<i class="far fa-heart"></i>
|
<i class="far fa-heart"></i>
|
||||||
افزودن به علاقهمندیها
|
افزودن به علاقهمندیها
|
||||||
|
|
||||||
|
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
|
|||||||
Reference in New Issue
Block a user