Files

350 lines
19 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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">
<input type="text"
name="search"
class="form-control bg-dark text-white border-0"
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>
<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;">
<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>
</ul>
</div>
</div>
</div>
@if(request()->hasAny(['platform', 'genre', 'year', 'rating_range']))
<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">
@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
</div>
</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>
@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