diff --git a/app/Livewire/Pages/Articles/Index.php b/app/Livewire/Pages/Articles/Index.php index a78454c4..34c9c0ef 100644 --- a/app/Livewire/Pages/Articles/Index.php +++ b/app/Livewire/Pages/Articles/Index.php @@ -33,7 +33,8 @@ public function render(): View ->published() ->notPinned() ->forLocale($this->locale) - ->simplePaginate(20), + ->simplePaginate(21), + 'tags' => Tag::query()->whereHas('articles', function ($query): void { $query->published(); })->orderBy('name')->get(), diff --git a/app/Livewire/Pages/Forum/Index.php b/app/Livewire/Pages/Forum/Index.php index 8a8d64f7..7992b61d 100644 --- a/app/Livewire/Pages/Forum/Index.php +++ b/app/Livewire/Pages/Forum/Index.php @@ -39,6 +39,9 @@ final class Index extends Component #[Url(as: 'follow')] public ?string $subscribe = null; + #[Url] + public ?string $popular = null; + public ?Channel $currentChannel = null; public string $search = ''; @@ -54,6 +57,18 @@ public function mount(): void $this->locale = config('app.locale'); } + protected function applyPopular(Builder $query): Builder + { + if ($this->popular) { + return $query // @phpstan-ignore-line + ->withCount('replies') + ->orderByDesc('replies_count') + ->OrderByViews(); + } + + return $query; + } + #[On('channelUpdated')] public function reloadThreads(?int $channelId): void { @@ -140,13 +155,23 @@ protected function applySubscribe(Builder $query): Builder protected function applyUnAnswer(Builder $query): Builder { + if ($this->unAnswered) { + return $query->whereDoesntHave('replies'); + } + return $query; } + protected function applySorting(Builder $query): Builder + { + return $this->popular + ? $this->applyPopular($query) + : $query->orderByDesc('created_at'); + } + public function render(): View { - $query = Thread::with(['channels', 'user']) - ->orderByDesc('created_at'); + $query = Thread::with(['channels', 'user']); $query = $this->applyChannel($query); $query = $this->applySearch($query); @@ -155,6 +180,7 @@ public function render(): View $query = $this->applyAuthor($query); $query = $this->applySubscribe($query); $query = $this->applyUnAnswer($query); + $query = $this->applySorting($query); $threads = $query ->scopes('withViewsCount') diff --git a/resources/views/layouts/forum.blade.php b/resources/views/layouts/forum.blade.php index 76d33e85..d2d07c38 100644 --- a/resources/views/layouts/forum.blade.php +++ b/resources/views/layouts/forum.blade.php @@ -42,7 +42,6 @@ :href="route('forum.index', ['popular' => true])" :active="request()->getUri() === route('forum.index', ['popular' => true])" icon="untitledui-heart" - class="hidden" > {{ __('pages/forum.navigation.popular') }} @@ -64,7 +63,6 @@ class="hidden" :href="route('forum.index', ['no-replies' => true])" :active="request()->getUri() === route('forum.index', ['no-replies' => true])" icon="untitledui-message-x-square" - class="hidden" > {{ __('pages/forum.navigation.no_reply') }} diff --git a/resources/views/livewire/pages/articles/index.blade.php b/resources/views/livewire/pages/articles/index.blade.php index 4c96002a..7609f2c2 100644 --- a/resources/views/livewire/pages/articles/index.blade.php +++ b/resources/views/livewire/pages/articles/index.blade.php @@ -119,7 +119,7 @@ class="flex size-8 items-center justify-center rounded-full text-gray-400 transi @endforeach -