resetPage(); } public function updatingFilterSubjectType(): void { $this->resetPage(); } public function updatingFilterEvent(): void { $this->resetPage(); } public function mount(): void { $this->checkHadesAccess(); } #[Computed] public function activities() { $query = Activity::query() ->with('causer') ->latest(); if ($this->searchTerm) { $query->where(function ($q) { $q->where('description', 'like', '%'.$this->searchTerm.'%') ->orWhere('subject_type', 'like', '%'.$this->searchTerm.'%'); }); } if ($this->filterSubjectType) { $query->where('subject_type', $this->filterSubjectType); } if ($this->filterEvent) { $query->where('event', $this->filterEvent); } return $query->paginate(50); } #[Computed] public function subjectTypes(): array { return Activity::query() ->select('subject_type') ->distinct() ->whereNotNull('subject_type') ->pluck('subject_type') ->map(fn ($type) => class_basename($type)) ->sort() ->values() ->toArray(); } #[Computed] public function events(): array { return Activity::query() ->select('event') ->distinct() ->whereNotNull('event') ->pluck('event') ->sort() ->values() ->toArray(); } public function clearFilters(): void { $this->searchTerm = ''; $this->filterSubjectType = ''; $this->filterEvent = ''; $this->resetPage(); } private function checkHadesAccess(): void { if (! auth()->user()?->isHades()) { abort(403, 'Hades access required'); } } public function render(): View { return view('developer::admin.activity-log'); } }