fn($q) => $q->where('is_active', true), 'knowledgeItems as total_knowledge_items', ]) ->ordered() ->withTrashed() ->paginate(20); return view('admin.categories.index', compact('categories')); } public function create(): View { return view('admin.categories.create'); } public function store(StoreCategoryRequest $request): RedirectResponse { $data = $request->validated(); if (empty($data['slug'])) { $data['slug'] = Str::slug($data['name']); } $data['created_by'] = auth()->id(); $category = Category::create($data); $this->auditService->categoryCreated($category); return redirect() ->route('admin.categories.index') ->with('success', "Kategori '{$category->name}' berjaya dicipta."); } public function edit(Category $category): View { return view('admin.categories.edit', compact('category')); } public function update(StoreCategoryRequest $request, Category $category): RedirectResponse { $data = $request->validated(); if (empty($data['slug'])) { $data['slug'] = Str::slug($data['name']); } $category->update($data); return redirect() ->route('admin.categories.index') ->with('success', "Kategori '{$category->name}' berjaya dikemaskini."); } public function toggleStatus(Category $category): RedirectResponse { $category->update(['is_active' => !$category->is_active]); $status = $category->is_active ? 'diaktifkan' : 'dinyahaktifkan'; return back()->with('success', "Kategori '{$category->name}' telah {$status}."); } public function destroy(Category $category): RedirectResponse { // Semak sama ada ada dokumen aktif dalam kategori ini if ($category->documents()->where('is_active', true)->exists()) { return back()->with('error', 'Kategori tidak boleh dipadam kerana masih ada dokumen aktif di dalamnya.' ); } $category->delete(); // SoftDelete return redirect() ->route('admin.categories.index') ->with('success', "Kategori '{$category->name}' telah dipadam."); } }