Files

350 lines
19 KiB
PHP
Raw Permalink Normal View History

2025-04-12 17:18:33 +03:00
@extends('layouts.app')
@section('title', 'Games - ClearGame')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h2 fw-bold gradient-text">All Games</h1>
<div class="d-flex gap-2">
<form action="{{ route('games.index') }}" method="GET" class="d-flex me-2">
2025-06-13 23:06:13 +03:00
<input type="text"
name="search"
class="form-control bg-dark text-white border-0"
2025-04-12 17:18:33 +03:00
placeholder="Search games..."
value="{{ request('search') }}"
style="min-width: 250px;">
<button type="submit" class="btn btn-gradient ms-2">
<i class="fas fa-search"></i>
</button>
</form>
<div class="btn-group me-2" role="group" aria-label="View mode">
<button type="button" class="btn btn-outline-gradient view-mode-btn active" data-view="grid" title="Grid View">
<i class="fas fa-th"></i>
</button>
<button type="button" class="btn btn-outline-gradient view-mode-btn" data-view="cards" title="Card View">
<i class="fas fa-th-large"></i>
</button>
<button type="button" class="btn btn-outline-gradient view-mode-btn" data-view="list" title="List View">
<i class="fas fa-list"></i>
</button>
</div>
2025-04-12 17:18:33 +03:00
<div class="dropdown">
<button class="btn btn-outline-gradient dropdown-toggle" type="button" data-bs-toggle="dropdown">
<i class="fas fa-sort me-1"></i> Sort by
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="{{ route('games.index', array_merge(request()->query(), ['sort' => 'first_release_date', 'direction' => 'desc'])) }}">
<i class="fas fa-calendar me-2"></i> Release Date
</a></li>
<li><a class="dropdown-item" href="{{ route('games.index', array_merge(request()->query(), ['sort' => 'rating', 'direction' => 'desc'])) }}">
<i class="fas fa-star me-2"></i> Rating
</a></li>
<li><a class="dropdown-item" href="{{ route('games.index', array_merge(request()->query(), ['sort' => 'rating_count', 'direction' => 'desc'])) }}">
<i class="fas fa-fire me-2"></i> Popularity
</a></li>
</ul>
</div>
<div class="dropdown">
<button class="btn btn-outline-gradient dropdown-toggle" type="button" data-bs-toggle="dropdown">
<i class="fas fa-filter me-1"></i> Filter
</button>
<ul class="dropdown-menu p-3" style="min-width: 300px;">
2026-02-22 20:02:34 +02:00
<form action="{{ route('games.index') }}" method="GET">
<!-- Preserve any existing query parameters -->
@if(request('search'))
<input type="hidden" name="search" value="{{ request('search') }}">
@endif
@if(request('sort'))
<input type="hidden" name="sort" value="{{ request('sort') }}">
@endif
@if(request('direction'))
<input type="hidden" name="direction" value="{{ request('direction') }}">
@endif
<li class="mb-2">
<label class="form-label text-white mb-1"><i class="fas fa-tv me-1"></i> Platform</label>
<select name="platform" class="form-select bg-dark text-white border-0" onchange="this.form.submit()">
<option value="">All Platforms</option>
@foreach($platforms as $platform)
<option value="{{ $platform->slug }}" {{ request('platform') == $platform->slug ? 'selected' : '' }}>
{{ $platform->name }}
</option>
@endforeach
</select>
</li>
<li class="mb-2">
<label class="form-label text-white mb-1"><i class="fas fa-tags me-1"></i> Genre</label>
<select name="genre" class="form-select bg-dark text-white border-0" onchange="this.form.submit()">
<option value="">All Genres</option>
@foreach($genres as $genre)
<option value="{{ $genre->slug }}" {{ request('genre') == $genre->slug ? 'selected' : '' }}>
{{ $genre->name }}
</option>
@endforeach
</select>
</li>
<li class="mb-2">
<label class="form-label text-white mb-1"><i class="fas fa-calendar-alt me-1"></i> Release Year</label>
<select name="year" class="form-select bg-dark text-white border-0" onchange="this.form.submit()">
<option value="">All Years</option>
@foreach($years as $year)
<option value="{{ $year }}" {{ request('year') == $year ? 'selected' : '' }}>
{{ $year }}
</option>
@endforeach
</select>
</li>
<li class="mb-2">
<label class="form-label text-white mb-1"><i class="fas fa-star me-1"></i> Rating Range</label>
<select name="rating_range" class="form-select bg-dark text-white border-0" onchange="this.form.submit()">
<option value="">All Ratings</option>
<option value="90-100" {{ request('rating_range') == '90-100' ? 'selected' : '' }}>90+</option>
<option value="80-89" {{ request('rating_range') == '80-89' ? 'selected' : '' }}>80-89</option>
<option value="70-79" {{ request('rating_range') == '70-79' ? 'selected' : '' }}>70-79</option>
<option value="60-69" {{ request('rating_range') == '60-69' ? 'selected' : '' }}>60-69</option>
<option value="0-59" {{ request('rating_range') == '0-59' ? 'selected' : '' }}>Below 60</option>
</select>
</li>
<li class="mt-3">
<a href="{{ route('games.index') }}" class="btn btn-outline-gradient btn-sm w-100">
<i class="fas fa-times me-1"></i> Clear Filters
</a>
</li>
</form>
2025-04-12 17:18:33 +03:00
</ul>
</div>
</div>
</div>
2026-02-22 20:02:34 +02:00
@if(request()->hasAny(['platform', 'genre', 'year', 'rating_range']))
2025-04-12 17:18:33 +03:00
<div class="mb-4">
<div class="d-flex flex-wrap gap-2">
@if(request('platform'))
<span class="badge bg-primary">
<i class="fas fa-tv me-1"></i> {{ $platforms->firstWhere('slug', request('platform'))->name }}
<a href="{{ route('games.index', array_merge(request()->except('platform'), ['page' => 1])) }}" class="text-white ms-2">×</a>
</span>
@endif
@if(request('genre'))
<span class="badge bg-primary">
<i class="fas fa-tags me-1"></i> {{ $genres->firstWhere('slug', request('genre'))->name }}
<a href="{{ route('games.index', array_merge(request()->except('genre'), ['page' => 1])) }}" class="text-white ms-2">×</a>
</span>
@endif
@if(request('year'))
<span class="badge bg-primary">
<i class="fas fa-calendar-alt me-1"></i> {{ request('year') }}
<a href="{{ route('games.index', array_merge(request()->except('year'), ['page' => 1])) }}" class="text-white ms-2">×</a>
</span>
@endif
@if(request('rating_range'))
<span class="badge bg-primary">
<i class="fas fa-star me-1"></i> {{ request('rating_range') }}
<a href="{{ route('games.index', array_merge(request()->except('rating_range'), ['page' => 1])) }}" class="text-white ms-2">×</a>
</span>
@endif
</div>
</div>
@endif
<!-- Grid View -->
<div id="grid-view" class="row g-4 view-container">
2025-04-12 17:18:33 +03:00
@foreach($games as $game)
<div class="col-6 col-sm-4 col-md-3 col-lg-2">
<div class="game-card-grid">
<a href="{{ route('games.show', $game->slug) }}" class="text-decoration-none">
<div class="game-cover-wrapper">
<img src="{{ $game->cover_url ?? 'https://via.placeholder.com/264x352?text=No+Image' }}"
class="game-cover"
alt="{{ $game->name }}">
<div class="game-cover-overlay">
<div class="overlay-content">
@if($game->rating)
<div class="rating-badge">
<i class="fas fa-star"></i> {{ number_format($game->rating, 1) }}
</div>
@endif
</div>
</div>
</div>
<div class="game-info-grid mt-2">
<h6 class="game-title text-white mb-1">{{ Str::limit($game->name, 30) }}</h6>
@if($game->first_release_date)
<small class="text-muted">
<i class="fas fa-calendar-alt me-1"></i>{{ \Carbon\Carbon::parse($game->first_release_date)->format('Y') }}
</small>
@endif
2025-06-13 23:06:13 +03:00
</div>
2025-04-12 17:18:33 +03:00
</a>
</div>
</div>
@endforeach
</div>
<!-- Card View -->
<div id="card-view" class="row g-4 view-container" style="display: none;">
@foreach($games as $game)
<div class="col-12 col-sm-6 col-md-4 col-lg-3">
<div class="card game-card-enhanced gradient-border h-100">
<a href="{{ route('games.show', $game->slug) }}" class="text-decoration-none">
<div class="position-relative">
<img src="{{ $game->cover_url ?? 'https://via.placeholder.com/300x400?text=No+Image' }}"
class="card-img-top"
alt="{{ $game->name }}"
style="height: 350px; object-fit: cover;">
@if($game->rating)
<div class="position-absolute top-0 end-0 m-2">
<span class="badge bg-primary" style="font-size: 1rem; padding: 0.5rem 0.75rem;">
<i class="fas fa-star me-1"></i>{{ number_format($game->rating, 1) }}
</span>
</div>
@endif
</div>
</a>
<div class="card-body d-flex flex-column">
<h5 class="card-title text-white mb-2">
<a href="{{ route('games.show', $game->slug) }}" class="text-white text-decoration-none">
{{ $game->name }}
</a>
</h5>
@if($game->summary)
<p class="card-text text-muted small flex-grow-1">
{{ Str::limit($game->summary, 120) }}
</p>
@endif
<div class="d-flex flex-wrap gap-2 mb-3">
@if($game->first_release_date)
<span class="badge bg-secondary">
<i class="fas fa-calendar-alt me-1"></i>{{ \Carbon\Carbon::parse($game->first_release_date)->format('M Y') }}
</span>
@endif
@if($game->rating_count)
<span class="badge bg-secondary">
<i class="fas fa-users me-1"></i>{{ number_format($game->rating_count) }} ratings
</span>
@endif
</div>
<a href="{{ route('games.show', $game->slug) }}" class="btn btn-gradient w-100 mt-auto">
<i class="fas fa-info-circle me-1"></i> View Details
</a>
</div>
</div>
</div>
@endforeach
</div>
<!-- List View -->
<div id="list-view" class="view-container" style="display: none;">
@foreach($games as $game)
<div class="card game-card-list gradient-border mb-3">
<div class="row g-0">
<div class="col-md-2 col-lg-1">
<a href="{{ route('games.show', $game->slug) }}">
<img src="{{ $game->cover_url ?? 'https://via.placeholder.com/90x120?text=No+Image' }}"
class="img-fluid rounded-start"
alt="{{ $game->name }}"
style="height: 100%; min-height: 120px; object-fit: cover;">
</a>
</div>
<div class="col-md-10 col-lg-11">
<div class="card-body">
<div class="row align-items-center">
<div class="col-lg-6">
<h5 class="card-title text-white mb-2">
<a href="{{ route('games.show', $game->slug) }}" class="text-white text-decoration-none">
{{ $game->name }}
</a>
</h5>
@if($game->summary)
<p class="card-text text-muted small mb-2">
{{ Str::limit($game->summary, 200) }}
</p>
@endif
</div>
<div class="col-lg-3">
<div class="d-flex flex-wrap gap-2 mb-2">
@if($game->rating)
<span class="badge bg-primary">
<i class="fas fa-star me-1"></i>{{ number_format($game->rating, 1) }}
</span>
@endif
@if($game->first_release_date)
<span class="badge bg-secondary">
<i class="fas fa-calendar-alt me-1"></i>{{ \Carbon\Carbon::parse($game->first_release_date)->format('M Y') }}
</span>
@endif
</div>
@if($game->rating_count)
<small class="text-muted">
<i class="fas fa-users me-1"></i>{{ number_format($game->rating_count) }} ratings
</small>
@endif
</div>
<div class="col-lg-3">
<a href="{{ route('games.show', $game->slug) }}" class="btn btn-gradient w-100">
<i class="fas fa-info-circle me-1"></i> View Details
</a>
</div>
</div>
</div>
</div>
</div>
</div>
2025-04-12 17:18:33 +03:00
@endforeach
</div>
<div class="d-flex justify-content-center mt-5">
{{ $games->links() }}
</div>
@endsection
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
const viewButtons = document.querySelectorAll('.view-mode-btn');
const viewContainers = {
grid: document.getElementById('grid-view'),
cards: document.getElementById('card-view'),
list: document.getElementById('list-view')
};
// Load saved view preference from localStorage or default to 'grid'
const savedView = localStorage.getItem('gamesViewMode') || 'grid';
switchView(savedView);
// Add click handlers to view buttons
viewButtons.forEach(button => {
button.addEventListener('click', function() {
const viewMode = this.getAttribute('data-view');
switchView(viewMode);
localStorage.setItem('gamesViewMode', viewMode);
});
});
function switchView(viewMode) {
// Hide all views
Object.values(viewContainers).forEach(container => {
container.style.display = 'none';
});
// Show selected view
if (viewContainers[viewMode]) {
if (viewMode === 'grid' || viewMode === 'cards') {
viewContainers[viewMode].style.display = 'flex';
} else {
viewContainers[viewMode].style.display = 'block';
}
}
// Update button states
viewButtons.forEach(btn => {
btn.classList.remove('active');
if (btn.getAttribute('data-view') === viewMode) {
btn.classList.add('active');
}
});
}
});
</script>
@endpush