%PDF- %PDF-
Direktori : /www/loslex/test/app/Livewire/ |
Current File : /www/loslex/test/app/Livewire/ContestList.php |
<?php namespace App\Livewire; use Livewire\Component; use Livewire\Attributes\Session; use App\Enums\ContestPublicationStatusEnum; use App\Enums\RangeRegionEnum; use App\Models\Contest; use App\Models\ContestCategory; use App\Models\ContestLevel; use App\Models\Range; use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Auth; class ContestList extends Component { public $contests; #filters #[Session] public $fcHideHistory = true; #[Session] public $fcRegistration = false; #[Session] public $fcLevel; #[Session] public $fcRegion; #[Session] public $fcCategory; #[Session] public $fcRange; #[Session] public $fcName; #[Session] public $openFilters = false; public $filterCount; private function countFilters() { $cnt = 0; if (is_array($this->fcLevel)) { $cnt += count($this->fcLevel); } if (is_array($this->fcRegion)) { $cnt += count($this->fcRegion); } if (is_array($this->fcCategory)) { $cnt += count($this->fcCategory); } if (is_array($this->fcRange)) { $cnt += count($this->fcRange); } if (!empty($this->fcName)) { $cnt += 1; } $this->filterCount = $cnt; } private function decodeValue($val) { if (is_array($val)) { return $val; } if (is_array($json = json_decode($val))) { return $json; } if (is_array($arr = explode(',', $val))) { return $arr; } } public function mount() { global $request; $keys = ['rng','reg','lvl']; if (count(array_intersect($keys, $request->keys())) > 0) { $this->reset(); foreach ($request->query() as $key => $val) { $decoded = $this->decodeValue($val); if (is_array($decoded)) { switch ($key) { case 'rng': $this->fcRange = $decoded; $this->openFilters = true; break; case 'reg': $this->fcRegion = $decoded; $this->openFilters = true; break; case 'lvl': $this->fcLevel = $decoded; $this->openFilters = true; break; default: break; } } } redirect($request->url()); } } public function clearFilter() { $this->reset(); $this->dispatch('resetSelects'); } public function render() { $this->countFilters(); $this->contests = Contest::orderBy('date')->with(['range','organizer_group','contest_level','contest_category','registrations']) //liveWire filters ->when($this->fcHideHistory, function (Builder $query) { $dayshift = Carbon::today()->addDays(-3); $query->where('date', '>=', $dayshift); }) ->when($this->fcRegistration, function (Builder $query) { $now = Carbon::now(); $query->where([['registration_start', '<', $now],['registration_end', '>', $now]]); }) ->when($this->fcLevel, function (Builder $query, array $ids) { $query->whereIn('contest_level_id', $ids); }) ->when($this->fcRegion, function (Builder $query, array $ids) { $rangeids = Range::select('id')->whereIn('region', $ids)->get(); $query->whereIn('range_id', $rangeids); }) ->when($this->fcCategory, function (Builder $query, array $categories) { $query->whereIn('contest_category_id', $categories); }) ->when($this->fcRange, function (Builder $query, array $ranges) { $query->whereIn('range_id', $ranges); }) ->when($this->fcName, function (Builder $query, string $title) { $query->where('contestname', 'LIKE', "%{$title}%"); }) ->get(); if (!Auth::user()?->is_admin){ $this->contests = $this->contests->reject(function ($value) { if ($value->published == ContestPublicationStatusEnum::PUBLISHED) { return false; } // not removing from list if user is admin if (Auth::user()?->is_organizer_member($value->organizer_group_id)) { return false; } // not removing if user is organizer of the contest if ($value->published == ContestPublicationStatusEnum::HIDDEN // not removing if contest is hidden but user is registered (by admin/organizer) && $value->registrations->where('user_id', Auth::user()?->id)->count() > 0) { return false; } return true; }); } return view('livewire.contest-list', [ 'contests' => $this->contests, 'contestlevels' => ContestLevel::where('is_active', 1)->get(), 'regions' => RangeRegionEnum::cases(), 'categories' => ContestCategory::where('is_active', 1)->get(), 'ranges' => Range::where('is_active', 1)->get(), ]); } }