chore: finalize project updates

This commit is contained in:
2026-08-22 11:42:16 +03:30
parent 7719d750e9
commit 691290c340
55 changed files with 1923 additions and 6498 deletions
+124 -718
View File
@@ -1,740 +1,146 @@
@extends('layouts.app')
@section('title', $tour->title)
@section('content')
<div class="container py-5">
<style>
.travel-favorite-btn {
display: inline-flex;
align-items: center;
gap: 8px;
background: transparent;
border: 1px solid #e0245e;
color: #e0245e;
border-radius: 25px;
padding: 8px 20px;
font-size: .9rem;
cursor: pointer;
transition: all .2s ease;
}
{{-- پیام موفقیت--}}
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show d-flex align-items-center shadow-sm"
role="alert">
<i class="bi bi-check-circle-fill me-2"></i>
{{ session('success') }}
<button type="button" class="btn-close ms-auto" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
.travel-favorite-btn:hover,
.travel-favorite-btn.active {
background: #e0245e;
color: #fff;
}
</style>
<div class="tour-details-page">
<div class="container">
<div class="tour-details-card">
{{-- تصویر تور --}}
<div class="tour-details-image">
@if($tour->image)
<img
src="{{ asset('storage/' . $tour->image) }}"
alt="{{ $tour->title }}"
>
@else
<div class="tour-no-image">
تصویر برای این تور ثبت نشده است
</div>
@endif
</div>
{{-- محتوای تور --}}
<div class="tour-details-content">
{{-- عنوان --}}
<h1 class="tour-details-title">
{{-- کارت اطلاعات تور --}}
<div class="card shadow-lg border-0 rounded-4 mb-4">
<div class="card-body p-4 p-md-5">
{{-- ردیف عنوان و دکمه علاقه‌مندی --}}
<div class="d-flex justify-content-between align-items-center mb-3">
<h1 class="card-title h3 fw-bold mb-0 d-flex align-items-center">
<span class="badge bg-info bg-opacity-10 text-info p-2 me-2 rounded">
<i class="bi bi-airplane"></i>
</span>
{{ $tour->title }}
</h1>
{{-- دکمه علاقهمندی --}}
{{-- دکمه علاقه‌مندی --}}
@auth
<form action="{{ route('favorites.toggle') }}" method="POST" class="mb-3">
<form action="{{ route('favorites.toggle') }}" method="POST" class="m-0">
@csrf
<input type="hidden" name="favoritable_type" value="{{ \App\Models\Tour::class }}">
<input type="hidden" name="favoritable_type" value="App\Models\Tour">
<input type="hidden" name="favoritable_id" value="{{ $tour->id }}">
<button type="submit" class="travel-favorite-btn {{ $isFav ? 'active' : '' }}">
<i class="fa {{ $isFav ? 'fa-heart' : 'far fa-heart' }}"></i>
<span>{{ $isFav ? 'در علاقهمندیها' : 'افزودن به علاقهمندی' }}</span>
<button type="submit"
class="btn {{ $tour->isFavoritedBy(auth()->user()) ? 'btn-outline-danger' : 'btn-outline-primary' }} rounded-pill px-4">
<i class="bi {{ $tour->isFavoritedBy(auth()->user()) ? 'bi-heart-fill' : 'bi-heart' }} me-1"></i>
{{ $tour->isFavoritedBy(auth()->user()) ? 'پسندیدم' : 'افزودن به علاقه‌مندی' }}
</button>
</form>
@else
<a href="{{ route('login') }}" class="travel-favorite-btn">
<i class="far fa-heart"></i>
<span>افزودن به علاقهمندی</span>
</a>
@endauth
{{-- اطلاعات اصلی --}}
<div class="tour-details-info">
{{-- نوع سفر --}}
<div class="tour-info-box">
<span class="tour-info-label">
نوع سفر
</span>
<strong>
{{ $tour->travelType->title ?? 'نامشخص' }}
</strong>
</div>
{{-- تاریخ شروع --}}
<div class="tour-info-box">
<span class="tour-info-label">
تاریخ حرکت
</span>
<strong>
{{ $tour->start_date
? \Carbon\Carbon::parse($tour->start_date)->format('Y/m/d')
: 'نامشخص'
}}
</strong>
</div>
{{-- تاریخ پایان --}}
<div class="tour-info-box">
<span class="tour-info-label">
تاریخ پایان
</span>
<strong>
{{ $tour->end_date
? \Carbon\Carbon::parse($tour->end_date)->format('Y/m/d')
: 'نامشخص'
}}
</strong>
</div>
{{-- مدت سفر --}}
<div class="tour-info-box">
<span class="tour-info-label">
مدت سفر
</span>
<strong>
{{ $tour->duration ?? 'نامشخص' }}
</strong>
</div>
{{-- قیمت --}}
<div class="tour-info-box">
<span class="tour-info-label">
قیمت
</span>
<strong>
{{ number_format($tour->price) }}
تومان
</strong>
</div>
{{-- ظرفیت --}}
<div class="tour-info-box">
<span class="tour-info-label">
ظرفیت
</span>
<strong>
{{ $tour->capacity ?? 'نامحدود' }}
</strong>
</div>
{{-- تعداد بازدید --}}
<div class="tour-info-box">
<span class="tour-info-label">
تعداد بازدید
</span>
<strong>
{{ number_format($tour->views_count) }}
</strong>
</div>
</div>
{{-- توضیحات --}}
<div class="tour-description">
<h2>
توضیحات سفر
</h2>
@if($tour->description)
<p>
{{ $tour->description }}
</p>
@else
<p>
توضیحی برای این تور ثبت نشده است.
</p>
@endif
</div>
{{-- پروازهای تور --}}
@if($tour->flights && $tour->flights->count())
<div class="tour-flights">
<h2>
پروازهای این تور
</h2>
@foreach($tour->flights as $flight)
<div class="flight-item">
<div>
<span>
مبدأ
</span>
<strong>
{{ $flight->origin ?? '-' }}
</strong>
</div>
<div>
<span>
مقصد
</span>
<strong>
{{ $flight->destination ?? '-' }}
</strong>
</div>
</div>
@endforeach
</div>
@endif
{{-- تورهای مرتبط --}}
@if($relatedTours->count())
<div class="related-tours">
<h2>
تورهای مرتبط
</h2>
<div class="related-tours-grid">
@foreach($relatedTours as $relatedTour)
<a
href="{{ route('tours.show', $relatedTour) }}"
class="related-tour-card"
>
@if($relatedTour->image)
<img
src="{{ asset('storage/' . $relatedTour->image) }}"
alt="{{ $relatedTour->title }}"
>
@endif
<div>
<h3>
{{ $relatedTour->title }}
</h3>
<span>
@if($relatedTour->start_date)
{{ \Carbon\Carbon::parse($relatedTour->start_date)->format('Y/m/d') }}
@endif
</span>
</div>
</a>
@endforeach
</div>
</div>
@endif
{{-- دکمه بازگشت --}}
<div class="tour-back">
<a
href="{{ route('tours.index') }}"
class="tour-back-button"
>
بازگشت به لیست تورها
</a>
</div>
</div>
<p class="card-text text-muted fs-5 mb-4 line-h-8">{{ $tour->description }}</p>
<div
class="d-inline-flex align-items-center gap-2 bg-primary bg-opacity-10 text-primary fw-bold px-4 py-2 rounded-3">
<i class="bi bi-tag-fill"></i>
<span>{{ number_format($tour->price) }} تومان</span>
</div>
</div>
</div>
{{-- نظرات کاربران --}}
<div class="card shadow-lg border-0 rounded-4 mb-4">
<div class="card-body p-4 p-md-5">
<div class="d-flex justify-content-between align-items-center border-bottom pb-3 mb-4">
<h3 class="h5 fw-bold mb-0 d-flex align-items-center">
<span class="bg-purple bg-opacity-10 text-purple p-2 me-2 rounded-3">
<i class="bi bi-people-fill"></i>
</span>
نظرات کاربران
</h3>
<span class="badge bg-purple bg-opacity-10 text-purple rounded-pill">
{{ $tour->comments_count ?? $tour->comments->count() }} نظر
</span>
</div>
<div class="d-flex flex-column gap-3">
@forelse($tour->comments as $comment)
<div class="p-3 rounded-4 bg-light border">
<div class="d-flex justify-content-between align-items-center mb-2 flex-wrap gap-2">
<div class="d-flex align-items-center gap-2">
<div
class="rounded-circle bg-gradient-primary d-flex align-items-center justify-content-center text-white fw-bold"
style="width:40px;height:40px;">
{{ mb_strtoupper(mb_substr($comment->user?->first_name ?? 'م', 0, 1)) }}
</div>
<strong
class="text-dark">{{ $comment->user?->first_name }} {{ $comment->user?->last_name }}</strong>
</div>
<small class="text-muted">
<i class="bi bi-clock me-1"></i>{{ $comment->created_at->diffForHumans() }}
</small>
</div>
<p class="mb-0 text-muted">{{ $comment->body }}</p>
</div>
@empty
<div class="text-center py-5">
<div
class="bg-light rounded-circle d-flex align-items-center justify-content-center mx-auto mb-3"
style="width:60px;height:60px;">
<i class="bi bi-chat-dots fs-2 text-muted"></i>
</div>
<p class="text-muted mb-0">هنوز نظری ثبت نشده است — اولین نفر باش! 🎉</p>
</div>
@endforelse
</div>
</div>
</div>
{{-- فرم ثبت نظر --}}
@auth
<div class="card shadow-lg border-0 rounded-4 mb-4">
<div class="card-body p-4 p-md-5">
<h2 class="card-title h4 fw-bold mb-4 d-flex align-items-center">
<span class="bg-primary bg-opacity-10 text-primary p-2 me-2 rounded-3">
<i class="bi bi-chat-left-text-fill"></i>
</span>
ثبت نظر شما
</h2>
@if($errors->any())
<div class="alert alert-danger">
<ul class="mb-0">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('comments.tour.store', $tour->id) }}" method="POST">
@csrf
<div class="mb-3">
<textarea name="body" class="form-control" rows="4"
placeholder="نظر خود را درباره این تور بنویسید..." required></textarea>
@error('body')
<span class="text-danger small mt-1 d-block">{{ $message }}</span>
@enderror
</div>
<div class="d-flex justify-content-end">
<button type="submit" class="btn btn-primary px-4 rounded-pill">
<i class="bi bi-send-fill me-1"></i> ثبت نظر
</button>
</div>
</form>
</div>
</div>
@else
<div class="alert alert-warning text-center">
برای ثبت نظر لطفاً <a href="{{ route('auth.login.index') }}" class="alert-link">وارد شوید</a>.
</div>
@endauth
</div>
@endsection
{{--@extends('layouts.app')--}}
{{--@section('content')--}}
{{-- <div class="tour-details-page">--}}
{{-- <div class="container">--}}
{{-- <div class="tour-details-card">--}}
{{-- --}}{{-- تصویر تور --}}
{{-- <div class="tour-details-image">--}}
{{-- @if($tour->image)--}}
{{-- <img--}}
{{-- src="{{ asset('storage/' . $tour->image) }}"--}}
{{-- alt="{{ $tour->title }}"--}}
{{-- >--}}
{{-- @else--}}
{{-- <div class="tour-no-image">--}}
{{-- تصویر برای این تور ثبت نشده است--}}
{{-- </div>--}}
{{-- @endif--}}
{{-- </div>--}}
{{-- --}}{{-- محتوای تور --}}
{{-- <div class="tour-details-content">--}}
{{-- --}}{{-- عنوان --}}
{{-- <h1 class="tour-details-title">--}}
{{-- {{ $tour->title }}--}}
{{-- </h1>--}}
{{-- --}}{{-- اطلاعات اصلی --}}
{{-- <div class="tour-details-info">--}}
{{-- --}}{{-- نوع سفر --}}
{{-- <div class="tour-info-box">--}}
{{-- <span class="tour-info-label">--}}
{{-- نوع سفر--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ $tour->travelType->title ?? 'نامشخص' }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- --}}{{-- تاریخ شروع --}}
{{-- <div class="tour-info-box">--}}
{{-- <span class="tour-info-label">--}}
{{-- تاریخ حرکت--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ $tour->start_date--}}
{{-- ? \Carbon\Carbon::parse($tour->start_date)->format('Y/m/d')--}}
{{-- : 'نامشخص'--}}
{{-- }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- --}}{{-- تاریخ پایان --}}
{{-- <div class="tour-info-box">--}}
{{-- <span class="tour-info-label">--}}
{{-- تاریخ پایان--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ $tour->end_date--}}
{{-- ? \Carbon\Carbon::parse($tour->end_date)->format('Y/m/d')--}}
{{-- : 'نامشخص'--}}
{{-- }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- --}}{{-- مدت سفر --}}
{{-- <div class="tour-info-box">--}}
{{-- <span class="tour-info-label">--}}
{{-- مدت سفر--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ $tour->duration ?? 'نامشخص' }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- --}}{{-- قیمت --}}
{{-- <div class="tour-info-box">--}}
{{-- <span class="tour-info-label">--}}
{{-- قیمت--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ number_format($tour->price) }}--}}
{{-- تومان--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- --}}{{-- ظرفیت --}}
{{-- <div class="tour-info-box">--}}
{{-- <span class="tour-info-label">--}}
{{-- ظرفیت--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ $tour->capacity ?? 'نامحدود' }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- --}}{{-- تعداد بازدید --}}
{{-- <div class="tour-info-box">--}}
{{-- <span class="tour-info-label">--}}
{{-- تعداد بازدید--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ number_format($tour->views_count) }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- --}}{{-- توضیحات --}}
{{-- <div class="tour-description">--}}
{{-- <h2>--}}
{{-- توضیحات سفر--}}
{{-- </h2>--}}
{{-- @if($tour->description)--}}
{{-- <p>--}}
{{-- {{ $tour->description }}--}}
{{-- </p>--}}
{{-- @else--}}
{{-- <p>--}}
{{-- توضیحی برای این تور ثبت نشده است.--}}
{{-- </p>--}}
{{-- @endif--}}
{{-- </div>--}}
{{-- --}}{{-- پروازهای تور --}}
{{-- @if($tour->flights && $tour->flights->count())--}}
{{-- <div class="tour-flights">--}}
{{-- <h2>--}}
{{-- پروازهای این تور--}}
{{-- </h2>--}}
{{-- @foreach($tour->flights as $flight)--}}
{{-- <div class="flight-item">--}}
{{-- <div>--}}
{{-- <span>--}}
{{-- مبدأ--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ $flight->origin ?? '-' }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- <div>--}}
{{-- <span>--}}
{{-- مقصد--}}
{{-- </span>--}}
{{-- <strong>--}}
{{-- {{ $flight->destination ?? '-' }}--}}
{{-- </strong>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- @endforeach--}}
{{-- </div>--}}
{{-- @endif--}}
{{-- --}}{{-- تورهای مرتبط --}}
{{-- @if($relatedTours->count())--}}
{{-- <div class="related-tours">--}}
{{-- <h2>--}}
{{-- تورهای مرتبط--}}
{{-- </h2>--}}
{{-- <div class="related-tours-grid">--}}
{{-- @foreach($relatedTours as $relatedTour)--}}
{{-- <a--}}
{{-- href="{{ route('tours.show', $relatedTour) }}"--}}
{{-- class="related-tour-card"--}}
{{-- >--}}
{{-- @if($relatedTour->image)--}}
{{-- <img--}}
{{-- src="{{ asset('storage/' . $relatedTour->image) }}"--}}
{{-- alt="{{ $relatedTour->title }}"--}}
{{-- >--}}
{{-- @endif--}}
{{-- <div>--}}
{{-- <h3>--}}
{{-- {{ $relatedTour->title }}--}}
{{-- </h3>--}}
{{-- <span>--}}
{{-- @if($relatedTour->start_date)--}}
{{-- {{ \Carbon\Carbon::parse($relatedTour->start_date)->format('Y/m/d') }}--}}
{{-- @endif--}}
{{-- </span>--}}
{{-- </div>--}}
{{-- </a>--}}
{{-- @endforeach--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- @endif--}}
{{-- --}}{{-- دکمه بازگشت --}}
{{-- <div class="tour-back">--}}
{{-- <a--}}
{{-- href="{{ route('tours.index') }}"--}}
{{-- class="tour-back-button"--}}
{{-- >--}}
{{-- بازگشت به لیست تورها--}}
{{-- </a>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
{{--@endsection--}}
{{-- resources/views/tours/show.blade.php --}}
{{--@extends('layouts.app')--}}
{{--@section('title', $tour->name)--}}
{{--@section('content')--}}
{{-- <div class="container py-5 mt-4">--}}
{{-- --}}{{----}}{{-- اطلاعات تور --}}
{{-- <div class="card mb-4 shadow-sm">--}}
{{-- <div class="card-body">--}}
{{-- <h2 class="card-title">{{ $tour->name }}</h2>--}}
{{-- <p class="text-muted">{{ $tour->description }}</p>--}}
{{-- <hr>--}}
{{-- <div class="row">--}}
{{-- <div class="col-md-3"><strong>مبدأ:</strong> {{ $tour->origin->name ?? '—' }}</div>--}}
{{-- <div class="col-md-3"><strong>مقصد:</strong> {{ $tour->destination->name ?? '—' }}</div>--}}
{{-- <div class="col-md-3"><strong>تاریخ رفت:</strong> {{ $tour->start_date }}</div>--}}
{{-- <div class="col-md-3"><strong>بازگشت:</strong> {{ $tour->end_date }}</div>--}}
{{-- </div>--}}
{{-- <div class="row mt-3">--}}
{{-- <div class="col-md-4"><strong>قیمت:</strong> {{ number_format($tour->price) }} تومان</div>--}}
{{-- <div class="col-md-4"><strong>ظرفیت:</strong> {{ $tour->capacity }} نفر</div>--}}
{{-- <div class="col-md-4"><strong>موجودی:</strong> {{ $tour->available_seats ?? $tour->capacity }} نفر--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- <hr>--}}
{{-- <p>{{ $tour->description }}</p>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </section>--}}
{{-- --}}{{----}}{{-- ===== فرم رزرو تور ===== --}}
{{-- @auth--}}
{{-- <section class="pb-5">--}}
{{-- <div class="container">--}}
{{-- <div class="card shadow-sm">--}}
{{-- <div class="card-header bg-success text-white">--}}
{{-- رزرو تور {{ $tour->name }}--}}
{{-- </div>--}}
{{-- <div class="card-body">--}}
{{-- <form action="{{ route('booking.store', $tour) }}" method="POST">--}}
{{-- @csrf--}}
{{-- <div class="mb-3">--}}
{{-- <label class="form-label">تعداد نفرات</label>--}}
{{-- <input type="number" name="seats" min="1" max="{{ $tour->capacity }}" value="1"--}}
{{-- class="form-control @error('seats') is-invalid @enderror" required>--}}
{{-- @error('seats')--}}
{{-- <span class="invalid-feedback">{{ $message }}</span>--}}
{{-- @enderror--}}
{{-- </div>--}}
{{-- <button type="submit" class="btn btn-success w-100">رزرو تور</button>--}}
{{-- </form>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- </section>--}}
{{-- @else--}}
{{-- --}}{{----}}{{-- کاربر لاگین نیست => دکمه ورود به روت login --}}
{{-- <div class="alert alert-warning text-center">--}}
{{-- برای رزرو تور ابتدا <a href="{{ route('login') }}">وارد شوید</a>.--}}
{{-- </div>--}}
{{-- </div>--}}
{{-- @endauth--}}
{{--@endsection--}}
{{--@extends('layouts.app')--}}
{{--@section('content')--}}
{{-- <h1>{{ $tour->title }}</h1>--}}
{{-- --}}{{----}}{{----}}{{----}}{{-- گالری تصاویر (اسلایدر) --}}
{{-- <div id="tourGallery" class="carousel slide" data-bs-ride="carousel">--}}
{{-- @foreach ($tour->images as $image)--}}
{{-- <div class="carousel-item @if($loop->first) active @endif">--}}
{{-- <img src="{{ $image->path }}" class="d-block w-100" alt="">--}}
{{-- </div>--}}
{{-- @endforeach--}}
{{-- </div>--}}
{{-- <p>{{ $tour->description }}</p>--}}
{{-- <p>تاریخ شروع: {{ $tour->start_date?->format('Y/m/d') }}</p>--}}
{{-- --}}{{----}}{{----}}{{----}}{{-- پروازهای این تور --}}
{{-- <h3>پروازهای همراه</h3>--}}
{{-- @foreach ($tour->flights as $flight)--}}
{{-- <x-flight :flight="$flight"/>--}}
{{-- @endforeach--}}
{{-- --}}{{----}}{{----}}{{----}}{{-- نظرات --}}
{{-- <h3>نظرات ({{ $tour->comments->count() }})</h3>--}}
{{-- @foreach ($tour->comments as $comment)--}}
{{-- <x-comment :comment="$comment"/>--}}
{{-- @endforeach--}}
{{-- @auth--}}
{{-- <form method="POST" action="{{ route('comments.store', $tour) }}">--}}
{{-- @csrf--}}
{{-- <textarea name="body" required></textarea>--}}
{{-- <button type="submit">ثبت نظر</button>--}}
{{-- </form>--}}
{{-- @endauth--}}
{{--@endsection--}}