diff --git a/app/Auth/User.php b/app/Auth/User.php index 6bf656be3..5feb269e2 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -1,5 +1,6 @@ hasMany(ApiToken::class); } + /** + * Get the latest activity instance for this user. + */ + public function latestActivity(): HasOne + { + return $this->hasOne(Activity::class)->latest(); + } + /** * Get the url for editing this user. */ diff --git a/app/Auth/UserRepo.php b/app/Auth/UserRepo.php index fdb8c0923..5ae2ed2a2 100644 --- a/app/Auth/UserRepo.php +++ b/app/Auth/UserRepo.php @@ -10,6 +10,7 @@ use BookStack\Exceptions\UserUpdateException; use BookStack\Uploads\Image; use Exception; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Pagination\LengthAwarePaginator; use Images; use Log; @@ -56,13 +57,19 @@ class UserRepo /** * Get all the users with their permissions in a paginated format. - * @param int $count - * @param $sortData - * @return Builder|static */ - public function getAllUsersPaginatedAndSorted($count, $sortData) + public function getAllUsersPaginatedAndSorted(int $count, array $sortData): LengthAwarePaginator { - $query = $this->user->with('roles', 'avatar')->orderBy($sortData['sort'], $sortData['order']); + $sort = $sortData['sort']; + if ($sort === 'latest_activity') { + $sort = \BookStack\Actions\Activity::query()->select('created_at') + ->whereColumn('activities.user_id', 'users.id') + ->latest() + ->take(1); + } + + $query = $this->user->with(['roles', 'avatar', 'latestActivity']) + ->orderBy($sort, $sortData['order']); if ($sortData['search']) { $term = '%' . $sortData['search'] . '%'; diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php index 52919d44d..dce345426 100755 --- a/resources/lang/en/settings.php +++ b/resources/lang/en/settings.php @@ -157,6 +157,7 @@ return [ 'user_profile' => 'User Profile', 'users_add_new' => 'Add New User', 'users_search' => 'Search Users', + 'users_latest_activity' => 'Latest Activity', 'users_details' => 'User Details', 'users_details_desc' => 'Set a display name and an email address for this user. The email address will be used for logging into the application.', 'users_details_desc_no_email' => 'Set a display name for this user so others can recognise them.', diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index da373c161..4b5bad0fd 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -27,7 +27,6 @@ - {{--TODO - Add last login--}} @@ -37,6 +36,9 @@ {{ trans('auth.email') }} + @foreach($users as $user) @@ -55,6 +57,11 @@ id}") }}">{{$role->display_name}}@if($index !== count($user->roles) -1),@endif @endforeach + @endforeach
{{ trans('settings.role_user_roles') }} + {{ trans('settings.users_latest_activity') }} +
+ @if($user->latestActivity) + {{ $user->latestActivity->created_at->diffForHumans() }} + @endif +