dataTable($request); } return view('pages.access_control.action-logs'); } protected function dataTable(Request $request) { try { $query = Activity::query()->with('causer'); // Fast count without eager loading or ordering $recordsTotal = Activity::count(); $globalSearch = DataTable::globalSearch($request); if ($event = $request->input('event')) { if ($event === 'auth') { $query->whereIn('description', ['login', 'logout', 'login_attempt', 'password_changed', 'failed login', 'password reset']); } elseif ($event === 'data') { $query->whereIn('description', ['created', 'updated', 'deleted', 'restored', 'force deleted', 'permanent_deleted']); } elseif ($event === 'system') { $query->whereIn('log_name', ['system', 'maintenance', 'backup']); } } if ($user = DataTable::columnSearch($request, 0)) { $query->whereHas('causer', function ($causerQuery) use ($user) { $causerQuery->where(function ($q) use ($user) { $q->where('name', 'like', "%{$user}%") ->orWhere('email', 'like', "%{$user}%"); }); }); } if ($action = DataTable::columnSearch($request, 1)) { $query->where('description', 'like', "%{$action}%"); } if ($details = DataTable::columnSearch($request, 2)) { $query->where('properties', 'like', "%{$details}%"); } if ($module = DataTable::columnSearch($request, 3)) { $query->where('log_name', 'like', "%{$module}%"); } if ($executedAt = DataTable::columnSearch($request, 4)) { $query->whereDate('created_at', $executedAt); } if ($ip = DataTable::columnSearch($request, 5)) { $query->where('properties->ip', 'like', "%{$ip}%"); } if ($agent = DataTable::columnSearch($request, 6)) { $query->where('properties->agent', 'like', "%{$agent}%"); } if ($properties = DataTable::columnSearch($request, 7)) { $query->where('properties', 'like', "%{$properties}%"); } if ($globalSearch) { $query->where(function ($searchQuery) use ($globalSearch) { $searchQuery ->where('description', 'like', "%{$globalSearch}%") ->orWhere('log_name', 'like', "%{$globalSearch}%") ->orWhere('properties', 'like', "%{$globalSearch}%") ->orWhereHas('causer', function ($causerQuery) use ($globalSearch) { $causerQuery->where('email', 'like', "%{$globalSearch}%"); }); }); } [$orderIndex, $orderDirection] = DataTable::order($request, 4, 'desc'); $sortColumn = match ($orderIndex) { 0 => 'causer_type', 1 => 'description', 3 => 'log_name', 4 => 'created_at', default => 'created_at', }; // Remove old global ordering and apply datatable specific ordering $query->orderBy($sortColumn, $orderDirection); // Perform filtered count WITHOUT eager loading or ordering $countQuery = clone $query; $countQuery->setEagerLoads([]); $countQuery->orders = null; $recordsFiltered = $countQuery->count(); $logs = $query ->skip(DataTable::start($request)) ->take(DataTable::length($request)) ->get(); $rows = $logs->map(function (Activity $log) { $properties = is_array($log->properties) ? $log->properties : $log->properties?->toArray(); $eventLabel = ucfirst($log->description); $eventBadge = ActivityFormatter::getEventBadgeClass($log->description); $eventIcon = ActivityFormatter::getEventIcon($log->description); $modelName = ActivityFormatter::getFriendlyModelName($log->subject_type); $changes = ActivityFormatter::formatChanges($properties ?? []); // User Column (Removed icon) $userHtml = '
'.e($ip).'',
''.e($agent).'',
'',
'