From be517de7dc49dcf0524588f6b971e9ea9d5cd118 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 22 May 2016 10:44:31 +0100 Subject: [PATCH] Added pagination, sorting & searching to users list As requested on #113 --- app/Http/Controllers/UserController.php | 13 +++-- app/Repos/UserRepo.php | 21 ++++++++ app/helpers.php | 32 ++++++++++++ resources/assets/sass/_lists.scss | 5 ++ resources/assets/sass/_text.scss | 6 +++ .../views/settings/roles/index.blade.php | 14 ++++-- resources/views/users/index.blade.php | 49 +++++++++++++++---- 7 files changed, 123 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index d1c8865a9..053d9ebd5 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -31,14 +31,21 @@ class UserController extends Controller /** * Display a listing of the users. + * @param Request $request * @return Response */ - public function index() + public function index(Request $request) { $this->checkPermission('users-manage'); - $users = $this->userRepo->getAllUsers(); + $listDetails = [ + 'order' => $request->has('order') ? $request->get('order') : 'asc', + 'search' => $request->has('search') ? $request->get('search') : '', + 'sort' => $request->has('sort') ? $request->get('sort') : 'name', + ]; + $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails); $this->setPageTitle('Users'); - return view('users/index', ['users' => $users]); + $users->appends($listDetails); + return view('users/index', ['users' => $users, 'listDetails' => $listDetails]); } /** diff --git a/app/Repos/UserRepo.php b/app/Repos/UserRepo.php index b4931bdff..0926f6304 100644 --- a/app/Repos/UserRepo.php +++ b/app/Repos/UserRepo.php @@ -51,6 +51,27 @@ class UserRepo return $this->user->with('roles', 'avatar')->orderBy('name', 'asc')->get(); } + /** + * Get all the users with their permissions in a paginated format. + * @param int $count + * @param $sortData + * @return \Illuminate\Database\Eloquent\Builder|static + */ + public function getAllUsersPaginatedAndSorted($count = 20, $sortData) + { + $query = $this->user->with('roles', 'avatar')->orderBy($sortData['sort'], $sortData['order']); + + if ($sortData['search']) { + $term = '%' . $sortData['search'] . '%'; + $query->where(function($query) use ($term) { + $query->where('name', 'like', $term) + ->orWhere('email', 'like', $term); + }); + } + + return $query->paginate($count); + } + /** * Creates a new user and attaches a role to them. * @param array $data diff --git a/app/helpers.php b/app/helpers.php index fea67a09a..b8f61d94e 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -59,3 +59,35 @@ function setting($key, $default = false) $settingService = app('BookStack\Services\SettingService'); return $settingService->get($key, $default); } + +/** + * Generate a url with multiple parameters for sorting purposes. + * Works out the logic to set the correct sorting direction + * Discards empty parameters and allows overriding. + * @param $path + * @param array $data + * @param array $overrideData + * @return string + */ +function sortUrl($path, $data, $overrideData = []) +{ + $queryStringSections = []; + $queryData = array_merge($data, $overrideData); + + // Change sorting direction is already sorted on current attribute + if (isset($overrideData['sort']) && $overrideData['sort'] === $data['sort']) { + $queryData['order'] = ($data['order'] === 'asc') ? 'desc' : 'asc'; + } else { + $queryData['order'] = 'asc'; + } + + foreach ($queryData as $name => $value) { + $trimmedVal = trim($value); + if ($trimmedVal === '') continue; + $queryStringSections[] = urlencode($name) . '=' . urlencode($trimmedVal); + } + + if (count($queryStringSections) === 0) return $path; + + return $path . '?' . implode('&', $queryStringSections); +} \ No newline at end of file diff --git a/resources/assets/sass/_lists.scss b/resources/assets/sass/_lists.scss index 679443313..388d5753d 100644 --- a/resources/assets/sass/_lists.scss +++ b/resources/assets/sass/_lists.scss @@ -266,6 +266,7 @@ ul.pagination { display: inline-block; list-style: none; margin: $-m 0; + padding-left: 1px; li { float: left; } @@ -300,6 +301,10 @@ ul.pagination { } } +.compact ul.pagination { + margin: 0; +} + .entity-list { >div { padding: $-m 0; diff --git a/resources/assets/sass/_text.scss b/resources/assets/sass/_text.scss index 1a55cf868..0095b91cb 100644 --- a/resources/assets/sass/_text.scss +++ b/resources/assets/sass/_text.scss @@ -297,6 +297,12 @@ span.sep { display: block; } +.action-header { + h1 { + margin-top: $-m; + } +} + /** * Icons */ diff --git a/resources/views/settings/roles/index.blade.php b/resources/views/settings/roles/index.blade.php index 8f92a5eba..358c24945 100644 --- a/resources/views/settings/roles/index.blade.php +++ b/resources/views/settings/roles/index.blade.php @@ -6,11 +6,15 @@
-

User Roles

- -

- Add new role -

+
+
+

User Roles

+
+
+

+ Add new role +
+
diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index f06630714..d539f314e 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -7,17 +7,42 @@
-

Users

- @if(userCan('users-manage')) -

- Add new user -

- @endif +
+
+

Users

+
+
+

+ @if(userCan('users-manage')) + Add new user + @endif +
+
+ +
+
+
+ {!! $users->links() !!} +
+
+
+
+ @foreach(collect($listDetails)->except('search') as $name => $val) + + @endforeach + + +
+
+
+ +
+
- - + + @foreach($users as $user) @@ -42,11 +67,17 @@ @endif @endforeach
NameEmailNameEmail User Roles
- {{ $user->roles->implode('display_name', ', ') }} + @foreach($user->roles as $index => $role) + {{$role->display_name}}@if($index !== count($user->roles) -1),@endif + @endforeach
+ +
+ {!! $users->links() !!} +
@stop