*/ public array $expandedFeeds = []; public function setTab(string $tab): void { $this->tab = $tab; $this->search = ''; $this->expandedFeeds = []; $this->resetPage(); } public function toggleFeed(int $feedId): void { if (isset($this->expandedFeeds[$feedId])) { unset($this->expandedFeeds[$feedId]); return; } $this->expandedFeeds[$feedId] = true; } public function updatedSearch(): void { $this->resetPage(); } public function approve(int $routeArticleId): void { RouteArticle::findOrFail($routeArticleId)->approve(); } public function reject(int $routeArticleId): void { RouteArticle::findOrFail($routeArticleId)->reject(); } public function restore(int $routeArticleId): void { $routeArticle = RouteArticle::findOrFail($routeArticleId); $routeArticle->update(['approval_status' => ApprovalStatusEnum::PENDING]); } public function clear(): void { RouteArticle::where('approval_status', ApprovalStatusEnum::PENDING) ->update(['approval_status' => ApprovalStatusEnum::REJECTED]); } public function refresh(): void { $this->isRefreshing = true; ArticleDiscoveryJob::dispatch(); $this->dispatch('refresh-started'); } public function render(): View { $pendingCount = RouteArticle::where('approval_status', ApprovalStatusEnum::PENDING)->count(); if ($this->tab === 'pending') { return view('livewire.articles', [ 'routeArticles' => null, 'pendingFeeds' => $this->pendingFeeds(), 'pendingCount' => $pendingCount, ])->layout('layouts.app'); } $query = RouteArticle::with(['article.feed', 'feed', 'platformChannel']) ->orderBy('created_at', 'desc'); if ($this->search !== '') { $search = $this->search; $query->whereHas('article', function ($q) use ($search) { $q->where('title', 'like', "%{$search}%") ->orWhere('description', 'like', "%{$search}%"); }); } return view('livewire.articles', [ 'routeArticles' => $query->paginate(15), 'pendingFeeds' => null, 'pendingCount' => $pendingCount, ])->layout('layouts.app'); } /** * @return Collection */ private function pendingFeeds(): Collection { $counts = RouteArticle::query() ->selectRaw('feed_id, COUNT(*) as aggregate') ->where('approval_status', ApprovalStatusEnum::PENDING) ->groupBy('feed_id') ->pluck('aggregate', 'feed_id'); return Feed::whereIn('id', $counts->keys())->get() ->map(fn (Feed $feed): PendingFeedGroup => new PendingFeedGroup( $feed, (int) $counts->get($feed->id, 0), isset($this->expandedFeeds[$feed->id]) ? $this->routeArticlesForFeed($feed->id) : null, )) ->sortByDesc('count') ->values(); } /** * @return EloquentCollection */ private function routeArticlesForFeed(int $feedId): EloquentCollection { return RouteArticle::with(['article.feed', 'feed', 'platformChannel']) ->where('approval_status', ApprovalStatusEnum::PENDING) ->where('feed_id', $feedId) ->orderBy('created_at', 'desc') ->get(); } }