validate([ 'title' => ['required', 'string', 'max:255'], 'content' => ['required', 'string', 'max:12000'], 'note' => ['nullable', 'string', 'max:12000'], 'allowedActions' => ['array'], 'allowedActions.*' => ['string', 'in:domain_inf'], ]); $service->create($this->title, $this->content, $this->note, $this->allowedActions); $this->reset(['title', 'content', 'note', 'allowedActions']); $this->dispatch('article-saved'); session()->flash('success', 'Article opgeslagen en embedding wordt automatisch verwerkt.'); } public function deleteArticle(int $articleId, AdminArticleService $service): void { $deleted = $service->deleteById($articleId); if ($deleted) { session()->flash('success', "Artikel #{$articleId} is verwijderd."); } else { session()->flash('success', "Artikel #{$articleId} bestond niet meer."); } $this->resetPage(); } public function saveMetadata(int $articleId, AdminArticleService $service): void { $this->validate([ "articleNotes.{$articleId}" => ['nullable', 'string', 'max:12000'], "articleAllowedActions.{$articleId}" => ['array'], "articleAllowedActions.{$articleId}.*" => ['string', 'in:domain_inf'], "articleQuickReplies.{$articleId}" => ['array'], "articleQuickReplies.{$articleId}.*" => ['integer', 'exists:quick_replies,id'], ]); $updated = $service->updateMetadata( $articleId, $this->articleNotes[$articleId] ?? null, $this->articleAllowedActions[$articleId] ?? [], $this->articleQuickReplies[$articleId] ?? [] ); session()->flash('success', $updated ? "Metadata voor artikel #{$articleId} is opgeslagen." : "Artikel #{$articleId} bestaat niet meer."); } public function approveDraft(int $articleId, AdminArticleService $service): void { $approved = $service->approveDraft($articleId); if ($approved) { session()->flash('success', "Conceptartikel #{$articleId} is gevalideerd en gepubliceerd."); } else { session()->flash('success', "Conceptartikel #{$articleId} bestaat niet meer."); } } public function render(AdminArticleService $service, AdminQuickReplyService $quickReplyService) { $articles = $service->paginate(10); $this->hydrateArticleMetadataState($articles->items()); return view('livewire.admin.article-manager', [ 'articles' => $articles, 'quickReplyOptions' => $quickReplyService->activeOptions(), ]); } private function hydrateArticleMetadataState(array $articles): void { foreach ($articles as $article) { if (! array_key_exists($article->id, $this->articleNotes)) { $this->articleNotes[$article->id] = $article->note ?? ''; } if (! array_key_exists($article->id, $this->articleAllowedActions)) { $this->articleAllowedActions[$article->id] = $article->allowed_actions ?? []; } if (! array_key_exists($article->id, $this->articleQuickReplies)) { $this->articleQuickReplies[$article->id] = $article->quickReplies->pluck('id')->map(fn ($id) => (int) $id)->all(); } } } }