diff --git a/app/Http/Controllers/MovieController.php b/app/Http/Controllers/MovieController.php index 2c440bb..4ed706f 100644 --- a/app/Http/Controllers/MovieController.php +++ b/app/Http/Controllers/MovieController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Http\Requests\Movie\CommentRequest; use App\Models\Comment; +use App\Models\Genre; use App\Models\MediaList; use App\Models\Movie; use Illuminate\Http\Request; @@ -11,11 +12,67 @@ use Illuminate\Support\Facades\Auth; class MovieController extends Controller { - public function index() + public function index(Request $request) { - $movies = Movie::orderBy('release_date', 'ASC')->paginate(60); + $query = Movie::query(); - return view('movie.index', compact('movies')); + // Search by title + if ($request->filled('title')) { + $query->where('title', 'LIKE', '%' . $request->title . '%'); + } + + // Filter by genre + if ($request->filled('genre')) { + $query->whereHas('genres', function ($q) use ($request) { + $q->where('genre_id', $request->genre); + }); + } + + // Filter by actor + if ($request->filled('actor')) { + $query->whereHas('castList', function ($q) use ($request) { + $q->where('person_id', $request->actor); + }); + } + + // Filter by director + if ($request->filled('director')) { + $query->whereHas('director', function ($q) use ($request) { + $q->where('person_id', $request->director); + }); + } + + // Filter by rating + if ($request->filled('rating_min')) { + $query->where('vote_average', '>=', $request->rating_min); + } + if ($request->filled('rating_max')) { + $query->where('vote_average', '<=', $request->rating_max); + } + + // Filter by release year + if ($request->filled('year_min')) { + $query->whereYear('release_date', '>=', $request->year_min); + } + if ($request->filled('year_max')) { + $query->whereYear('release_date', '<=', $request->year_max); + } + + // Sorting + $sortBy = $request->get('sort_by', 'release_date'); + $sortOrder = $request->get('sort_order', 'DESC'); + + $allowedSorts = ['title', 'release_date', 'vote_average', 'vote_count']; + if (in_array($sortBy, $allowedSorts)) { + $query->orderBy($sortBy, $sortOrder); + } + + $movies = $query->paginate(60)->appends($request->except('page')); + + // Get all genres for filter dropdowns + $genres = Genre::orderBy('name')->get(); + + return view('movie.index', compact('movies', 'genres')); } public function show(string $slug) diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 097e6e3..540622e 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -330,6 +330,7 @@ $fa-font-path: "/fonts"; border-radius: 8px; overflow: hidden; transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + margin-bottom: 15px; &:hover { transform: translateY(-5px); @@ -1165,6 +1166,7 @@ body.light-mode{ border-radius: 8px; overflow: hidden; transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + margin-bottom: 15px; &:hover { transform: translateY(-5px); diff --git a/resources/views/livewire/movie-page/tabs/details.blade.php b/resources/views/livewire/movie-page/tabs/details.blade.php index 99a7378..77a24c5 100644 --- a/resources/views/livewire/movie-page/tabs/details.blade.php +++ b/resources/views/livewire/movie-page/tabs/details.blade.php @@ -5,7 +5,7 @@