Dan Brown

Started work on user profile pages

...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
2 2
3 namespace BookStack\Http\Controllers; 3 namespace BookStack\Http\Controllers;
4 4
5 +use BookStack\Activity;
5 use Illuminate\Http\Request; 6 use Illuminate\Http\Request;
6 7
7 use Illuminate\Http\Response; 8 use Illuminate\Http\Response;
...@@ -92,10 +93,9 @@ class UserController extends Controller ...@@ -92,10 +93,9 @@ class UserController extends Controller
92 $user->save(); 93 $user->save();
93 } 94 }
94 95
95 - return redirect('/users'); 96 + return redirect('/settings/users');
96 } 97 }
97 98
98 -
99 /** 99 /**
100 * Show the form for editing the specified user. 100 * Show the form for editing the specified user.
101 * @param int $id 101 * @param int $id
...@@ -159,7 +159,7 @@ class UserController extends Controller ...@@ -159,7 +159,7 @@ class UserController extends Controller
159 } 159 }
160 160
161 $user->save(); 161 $user->save();
162 - return redirect('/users'); 162 + return redirect('/settings/users');
163 } 163 }
164 164
165 /** 165 /**
...@@ -197,6 +197,19 @@ class UserController extends Controller ...@@ -197,6 +197,19 @@ class UserController extends Controller
197 } 197 }
198 $this->userRepo->destroy($user); 198 $this->userRepo->destroy($user);
199 199
200 - return redirect('/users'); 200 + return redirect('/settings/users');
201 + }
202 +
203 + /**
204 + * Show the user profile page
205 + * @param $id
206 + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
207 + */
208 + public function showProfilePage($id)
209 + {
210 + $user = $this->userRepo->getById($id);
211 + $userActivity = $this->userRepo->getActivity($user);
212 + $recentPages = $this->userRepo->getCreatedPages($user, 5, 0);
213 + return view('users/profile', ['user' => $user, 'activity' => $userActivity, 'recentPages' => $recentPages]);
201 } 214 }
202 } 215 }
......
...@@ -47,14 +47,8 @@ Route::group(['middleware' => 'auth'], function () { ...@@ -47,14 +47,8 @@ Route::group(['middleware' => 'auth'], function () {
47 47
48 }); 48 });
49 49
50 - // Users 50 + // User Profile routes
51 - Route::get('/users', 'UserController@index'); 51 + Route::get('/user/{userId}', 'UserController@showProfilePage');
52 - Route::get('/users/create', 'UserController@create');
53 - Route::get('/users/{id}/delete', 'UserController@delete');
54 - Route::post('/users/create', 'UserController@store');
55 - Route::get('/users/{id}', 'UserController@edit');
56 - Route::put('/users/{id}', 'UserController@update');
57 - Route::delete('/users/{id}', 'UserController@destroy');
58 52
59 // Image routes 53 // Image routes
60 Route::group(['prefix' => 'images'], function() { 54 Route::group(['prefix' => 'images'], function() {
...@@ -82,8 +76,18 @@ Route::group(['middleware' => 'auth'], function () { ...@@ -82,8 +76,18 @@ Route::group(['middleware' => 'auth'], function () {
82 Route::get('/home', 'HomeController@index'); 76 Route::get('/home', 'HomeController@index');
83 77
84 // Settings 78 // Settings
85 - Route::get('/settings', 'SettingController@index'); 79 + Route::group(['prefix' => 'settings'], function() {
86 - Route::post('/settings', 'SettingController@update'); 80 + Route::get('/', 'SettingController@index');
81 + Route::post('/', 'SettingController@update');
82 + // Users
83 + Route::get('/users', 'UserController@index');
84 + Route::get('/users/create', 'UserController@create');
85 + Route::get('/users/{id}/delete', 'UserController@delete');
86 + Route::post('/users/create', 'UserController@store');
87 + Route::get('/users/{id}', 'UserController@edit');
88 + Route::put('/users/{id}', 'UserController@update');
89 + Route::delete('/users/{id}', 'UserController@destroy');
90 + });
87 91
88 }); 92 });
89 93
......
1 <?php namespace BookStack\Repos; 1 <?php namespace BookStack\Repos;
2 2
3 3
4 +use BookStack\Page;
4 use BookStack\Role; 5 use BookStack\Role;
6 +use BookStack\Services\EntityService;
5 use BookStack\User; 7 use BookStack\User;
6 use Setting; 8 use Setting;
7 9
...@@ -10,15 +12,19 @@ class UserRepo ...@@ -10,15 +12,19 @@ class UserRepo
10 12
11 protected $user; 13 protected $user;
12 protected $role; 14 protected $role;
15 + protected $entityService;
13 16
14 /** 17 /**
15 * UserRepo constructor. 18 * UserRepo constructor.
16 - * @param $user 19 + * @param User $user
20 + * @param Role $role
21 + * @param EntityService $entityService
17 */ 22 */
18 - public function __construct(User $user, Role $role) 23 + public function __construct(User $user, Role $role, EntityService $entityService)
19 { 24 {
20 $this->user = $user; 25 $this->user = $user;
21 $this->role = $role; 26 $this->role = $role;
27 + $this->entityService = $entityService;
22 } 28 }
23 29
24 /** 30 /**
...@@ -112,4 +118,42 @@ class UserRepo ...@@ -112,4 +118,42 @@ class UserRepo
112 $user->socialAccounts()->delete(); 118 $user->socialAccounts()->delete();
113 $user->delete(); 119 $user->delete();
114 } 120 }
121 +
122 + /**
123 + * Get the latest activity for a user.
124 + * @param User $user
125 + * @param int $count
126 + * @param int $page
127 + * @return array
128 + */
129 + public function getActivity(User $user, $count = 20, $page = 0)
130 + {
131 + return \Activity::userActivity($user, $count, $page);
132 + }
133 +
134 + /**
135 + * Get the pages the the given user has created.
136 + * @param User $user
137 + * @param int $count
138 + * @param int $page
139 + * @return mixed
140 + */
141 + public function getCreatedPages(User $user, $count = 20, $page = 0)
142 + {
143 + return $this->entityService->page->where('created_by', '=', $user->id)->orderBy('created_at', 'desc')
144 + ->skip($page * $count)->take($count)->get();
145 + }
146 +
147 + /**
148 + * Get asset created counts for the give user.
149 + * @return array
150 + */
151 + public function getAssetCounts(User $user)
152 + {
153 + return [
154 + 'pages' => $this->entityService->page->where('created_by', '=', $user->id)->count(),
155 + 'chapters' => $this->entityService->chapter->where('created_by', '=', $user->id)->count(),
156 + 'books' => $this->entityService->book->where('created_by', '=', $user->id)->count(),
157 + ];
158 + }
115 } 159 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -91,14 +91,14 @@ class ActivityService ...@@ -91,14 +91,14 @@ class ActivityService
91 } 91 }
92 92
93 /** 93 /**
94 - * Gets the latest activity for an entitiy, Filtering out similar 94 + * Gets the latest activity for an entity, Filtering out similar
95 * items to prevent a message activity list. 95 * items to prevent a message activity list.
96 * @param Entity $entity 96 * @param Entity $entity
97 * @param int $count 97 * @param int $count
98 * @param int $page 98 * @param int $page
99 * @return array 99 * @return array
100 */ 100 */
101 - function entityActivity($entity, $count = 20, $page = 0) 101 + public function entityActivity($entity, $count = 20, $page = 0)
102 { 102 {
103 $activity = $entity->hasMany('BookStack\Activity')->orderBy('created_at', 'desc') 103 $activity = $entity->hasMany('BookStack\Activity')->orderBy('created_at', 'desc')
104 ->skip($count * $page)->take($count)->get(); 104 ->skip($count * $page)->take($count)->get();
...@@ -107,15 +107,30 @@ class ActivityService ...@@ -107,15 +107,30 @@ class ActivityService
107 } 107 }
108 108
109 /** 109 /**
110 + * Get latest activity for a user, Filtering out similar
111 + * items.
112 + * @param $user
113 + * @param int $count
114 + * @param int $page
115 + * @return array
116 + */
117 + public function userActivity($user, $count = 20, $page = 0)
118 + {
119 + $activity = $this->activity->where('user_id', '=', $user->id)
120 + ->orderBy('created_at', 'desc')->skip($count * $page)->take($count)->get();
121 + return $this->filterSimilar($activity);
122 + }
123 +
124 + /**
110 * Filters out similar activity. 125 * Filters out similar activity.
111 - * @param Activity[] $activity 126 + * @param Activity[] $activities
112 * @return array 127 * @return array
113 */ 128 */
114 - protected function filterSimilar($activity) 129 + protected function filterSimilar($activities)
115 { 130 {
116 $newActivity = []; 131 $newActivity = [];
117 $previousItem = false; 132 $previousItem = false;
118 - foreach ($activity as $activityItem) { 133 + foreach ($activities as $activityItem) {
119 if ($previousItem === false) { 134 if ($previousItem === false) {
120 $previousItem = $activityItem; 135 $previousItem = $activityItem;
121 $newActivity[] = $activityItem; 136 $newActivity[] = $activityItem;
......
1 +<?php namespace BookStack\Services;
2 +
3 +
4 +use BookStack\Book;
5 +use BookStack\Chapter;
6 +use BookStack\Page;
7 +
8 +class EntityService
9 +{
10 +
11 + public $book;
12 + public $chapter;
13 + public $page;
14 +
15 + /**
16 + * EntityService constructor.
17 + * @param $book
18 + * @param $chapter
19 + * @param $page
20 + */
21 + public function __construct(Book $book, Chapter $chapter, Page $page)
22 + {
23 + $this->book = $book;
24 + $this->chapter = $chapter;
25 + $this->page = $page;
26 + }
27 +
28 +
29 +}
...\ No newline at end of file ...\ No newline at end of file
...@@ -164,6 +164,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon ...@@ -164,6 +164,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
164 */ 164 */
165 public function getEditUrl() 165 public function getEditUrl()
166 { 166 {
167 - return '/users/' . $this->id; 167 + return '/settings/users/' . $this->id;
168 } 168 }
169 } 169 }
......
...@@ -18,7 +18,7 @@ class CreateUsersTable extends Migration ...@@ -18,7 +18,7 @@ class CreateUsersTable extends Migration
18 $table->string('email')->unique(); 18 $table->string('email')->unique();
19 $table->string('password', 60); 19 $table->string('password', 60);
20 $table->rememberToken(); 20 $table->rememberToken();
21 - $table->timestamps(); 21 + $table->nullableTimestamps();
22 }); 22 });
23 23
24 \BookStack\User::forceCreate([ 24 \BookStack\User::forceCreate([
......
...@@ -17,7 +17,7 @@ class CreateBooksTable extends Migration ...@@ -17,7 +17,7 @@ class CreateBooksTable extends Migration
17 $table->string('name'); 17 $table->string('name');
18 $table->string('slug')->indexed(); 18 $table->string('slug')->indexed();
19 $table->text('description'); 19 $table->text('description');
20 - $table->timestamps(); 20 + $table->nullableTimestamps();
21 }); 21 });
22 } 22 }
23 23
......
...@@ -21,7 +21,7 @@ class CreatePagesTable extends Migration ...@@ -21,7 +21,7 @@ class CreatePagesTable extends Migration
21 $table->longText('html'); 21 $table->longText('html');
22 $table->longText('text'); 22 $table->longText('text');
23 $table->integer('priority'); 23 $table->integer('priority');
24 - $table->timestamps(); 24 + $table->nullableTimestamps();
25 }); 25 });
26 } 26 }
27 27
......
...@@ -16,7 +16,7 @@ class CreateImagesTable extends Migration ...@@ -16,7 +16,7 @@ class CreateImagesTable extends Migration
16 $table->increments('id'); 16 $table->increments('id');
17 $table->string('name'); 17 $table->string('name');
18 $table->string('url'); 18 $table->string('url');
19 - $table->timestamps(); 19 + $table->nullableTimestamps();
20 }); 20 });
21 } 21 }
22 22
......
...@@ -19,7 +19,7 @@ class CreateChaptersTable extends Migration ...@@ -19,7 +19,7 @@ class CreateChaptersTable extends Migration
19 $table->text('name'); 19 $table->text('name');
20 $table->text('description'); 20 $table->text('description');
21 $table->integer('priority'); 21 $table->integer('priority');
22 - $table->timestamps(); 22 + $table->nullableTimestamps();
23 }); 23 });
24 } 24 }
25 25
......
...@@ -19,7 +19,7 @@ class CreatePageRevisionsTable extends Migration ...@@ -19,7 +19,7 @@ class CreatePageRevisionsTable extends Migration
19 $table->longText('html'); 19 $table->longText('html');
20 $table->longText('text'); 20 $table->longText('text');
21 $table->integer('created_by'); 21 $table->integer('created_by');
22 - $table->timestamps(); 22 + $table->nullableTimestamps();
23 }); 23 });
24 } 24 }
25 25
......
...@@ -20,7 +20,7 @@ class CreateActivitiesTable extends Migration ...@@ -20,7 +20,7 @@ class CreateActivitiesTable extends Migration
20 $table->integer('user_id'); 20 $table->integer('user_id');
21 $table->integer('entity_id'); 21 $table->integer('entity_id');
22 $table->string('entity_type'); 22 $table->string('entity_type');
23 - $table->timestamps(); 23 + $table->nullableTimestamps();
24 }); 24 });
25 } 25 }
26 26
......
...@@ -28,7 +28,7 @@ class AddRolesAndPermissions extends Migration ...@@ -28,7 +28,7 @@ class AddRolesAndPermissions extends Migration
28 $table->string('name')->unique(); 28 $table->string('name')->unique();
29 $table->string('display_name')->nullable(); 29 $table->string('display_name')->nullable();
30 $table->string('description')->nullable(); 30 $table->string('description')->nullable();
31 - $table->timestamps(); 31 + $table->nullableTimestamps();
32 }); 32 });
33 33
34 // Create table for associating roles to users (Many-to-Many) 34 // Create table for associating roles to users (Many-to-Many)
...@@ -50,7 +50,7 @@ class AddRolesAndPermissions extends Migration ...@@ -50,7 +50,7 @@ class AddRolesAndPermissions extends Migration
50 $table->string('name')->unique(); 50 $table->string('name')->unique();
51 $table->string('display_name')->nullable(); 51 $table->string('display_name')->nullable();
52 $table->string('description')->nullable(); 52 $table->string('description')->nullable();
53 - $table->timestamps(); 53 + $table->nullableTimestamps();
54 }); 54 });
55 55
56 // Create table for associating permissions to roles (Many-to-Many) 56 // Create table for associating permissions to roles (Many-to-Many)
......
...@@ -15,7 +15,7 @@ class CreateSettingsTable extends Migration ...@@ -15,7 +15,7 @@ class CreateSettingsTable extends Migration
15 Schema::create('settings', function (Blueprint $table) { 15 Schema::create('settings', function (Blueprint $table) {
16 $table->string('setting_key')->primary()->indexed(); 16 $table->string('setting_key')->primary()->indexed();
17 $table->text('value'); 17 $table->text('value');
18 - $table->timestamps(); 18 + $table->nullableTimestamps();
19 }); 19 });
20 } 20 }
21 21
......
...@@ -18,7 +18,7 @@ class CreateSocialAccountsTable extends Migration ...@@ -18,7 +18,7 @@ class CreateSocialAccountsTable extends Migration
18 $table->string('driver')->index(); 18 $table->string('driver')->index();
19 $table->string('driver_id'); 19 $table->string('driver_id');
20 $table->string('avatar'); 20 $table->string('avatar');
21 - $table->timestamps(); 21 + $table->nullableTimestamps();
22 }); 22 });
23 } 23 }
24 24
......
...@@ -20,7 +20,7 @@ class AddEmailConfirmationTable extends Migration ...@@ -20,7 +20,7 @@ class AddEmailConfirmationTable extends Migration
20 $table->increments('id'); 20 $table->increments('id');
21 $table->integer('user_id')->index(); 21 $table->integer('user_id')->index();
22 $table->string('token')->index(); 22 $table->string('token')->index();
23 - $table->timestamps(); 23 + $table->nullableTimestamps();
24 }); 24 });
25 } 25 }
26 26
......
...@@ -18,7 +18,7 @@ class CreateViewsTable extends Migration ...@@ -18,7 +18,7 @@ class CreateViewsTable extends Migration
18 $table->integer('viewable_id'); 18 $table->integer('viewable_id');
19 $table->string('viewable_type'); 19 $table->string('viewable_type');
20 $table->integer('views'); 20 $table->integer('views');
21 - $table->timestamps(); 21 + $table->nullableTimestamps();
22 }); 22 });
23 } 23 }
24 24
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
58 </span> 58 </span>
59 <ul> 59 <ul>
60 <li> 60 <li>
61 - <a href="/users/{{$currentUser->id}}" class="text-primary"><i class="zmdi zmdi-edit zmdi-hc-lg"></i>Edit Profile</a> 61 + <a href="/settings/users/{{$currentUser->id}}" class="text-primary"><i class="zmdi zmdi-edit zmdi-hc-lg"></i>Edit Profile</a>
62 </li> 62 </li>
63 <li> 63 <li>
64 <a href="/logout" class="text-neg"><i class="zmdi zmdi-run zmdi-hc-lg"></i>Logout</a> 64 <a href="/logout" class="text-neg"><i class="zmdi zmdi-run zmdi-hc-lg"></i>Logout</a>
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
4 <div class="row"> 4 <div class="row">
5 <div class="col-md-12 setting-nav"> 5 <div class="col-md-12 setting-nav">
6 <a href="/settings" @if($selected == 'settings') class="selected text-button" @endif><i class="zmdi zmdi-settings"></i>Settings</a> 6 <a href="/settings" @if($selected == 'settings') class="selected text-button" @endif><i class="zmdi zmdi-settings"></i>Settings</a>
7 - <a href="/users" @if($selected == 'users') class="selected text-button" @endif><i class="zmdi zmdi-accounts"></i>Users</a> 7 + <a href="/settings/users" @if($selected == 'users') class="selected text-button" @endif><i class="zmdi zmdi-accounts"></i>Users</a>
8 </div> 8 </div>
9 </div> 9 </div>
10 </div> 10 </div>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
6 <div class="container small" ng-non-bindable> 6 <div class="container small" ng-non-bindable>
7 <h1>Create User</h1> 7 <h1>Create User</h1>
8 8
9 - <form action="/users/create" method="post"> 9 + <form action="/settings/users/create" method="post">
10 {!! csrf_field() !!} 10 {!! csrf_field() !!}
11 @include('users.forms.' . $authMethod) 11 @include('users.forms.' . $authMethod)
12 </form> 12 </form>
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
7 <p>This will fully delete this user with the name '<span class="text-neg">{{$user->name}}</span>' from the system.</p> 7 <p>This will fully delete this user with the name '<span class="text-neg">{{$user->name}}</span>' from the system.</p>
8 <p class="text-neg">Are you sure you want to delete this user?</p> 8 <p class="text-neg">Are you sure you want to delete this user?</p>
9 9
10 - <form action="/users/{{$user->id}}" method="POST"> 10 + <form action="/settings/users/{{$user->id}}" method="POST">
11 {!! csrf_field() !!} 11 {!! csrf_field() !!}
12 <input type="hidden" name="_method" value="DELETE"> 12 <input type="hidden" name="_method" value="DELETE">
13 <a href="/users/{{$user->id}}" class="button muted">Cancel</a> 13 <a href="/users/{{$user->id}}" class="button muted">Cancel</a>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
9 <div class="col-sm-6"></div> 9 <div class="col-sm-6"></div>
10 <div class="col-sm-6 faded"> 10 <div class="col-sm-6 faded">
11 <div class="action-buttons"> 11 <div class="action-buttons">
12 - <a href="/users/{{$user->id}}/delete" class="text-neg text-button"><i class="zmdi zmdi-delete"></i>Delete User</a> 12 + <a href="/settings/users/{{$user->id}}/delete" class="text-neg text-button"><i class="zmdi zmdi-delete"></i>Delete User</a>
13 </div> 13 </div>
14 </div> 14 </div>
15 </div> 15 </div>
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
19 19
20 20
21 <div class="container small"> 21 <div class="container small">
22 - <form action="/users/{{$user->id}}" method="post"> 22 + <form action="/settings/users/{{$user->id}}" method="post">
23 <div class="row"> 23 <div class="row">
24 <div class="col-md-6" ng-non-bindable> 24 <div class="col-md-6" ng-non-bindable>
25 <h1>Edit {{ $user->id === $currentUser->id ? 'Profile' : 'User' }}</h1> 25 <h1>Edit {{ $user->id === $currentUser->id ? 'Profile' : 'User' }}</h1>
......
...@@ -25,6 +25,6 @@ ...@@ -25,6 +25,6 @@
25 @endif 25 @endif
26 26
27 <div class="form-group"> 27 <div class="form-group">
28 - <a href="/users" class="button muted">Cancel</a> 28 + <a href="/settings/users" class="button muted">Cancel</a>
29 <button class="button pos" type="submit">Save</button> 29 <button class="button pos" type="submit">Save</button>
30 </div> 30 </div>
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
34 </div> 34 </div>
35 35
36 <div class="form-group"> 36 <div class="form-group">
37 - <a href="/users" class="button muted">Cancel</a> 37 + <a href="/settings/users" class="button muted">Cancel</a>
38 <button class="button pos" type="submit">Save</button> 38 <button class="button pos" type="submit">Save</button>
39 </div> 39 </div>
40 40
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
10 <h1>Users</h1> 10 <h1>Users</h1>
11 @if($currentUser->can('user-create')) 11 @if($currentUser->can('user-create'))
12 <p> 12 <p>
13 - <a href="/users/create" class="text-pos"><i class="zmdi zmdi-account-add"></i>Add new user</a> 13 + <a href="/settings/users/create" class="text-pos"><i class="zmdi zmdi-account-add"></i>Add new user</a>
14 </p> 14 </p>
15 @endif 15 @endif
16 <table class="table"> 16 <table class="table">
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
25 <td style="line-height: 0;"><img class="avatar med" src="{{$user->getAvatar(40)}}" alt="{{$user->name}}"></td> 25 <td style="line-height: 0;"><img class="avatar med" src="{{$user->getAvatar(40)}}" alt="{{$user->name}}"></td>
26 <td> 26 <td>
27 @if($currentUser->can('user-update') || $currentUser->id == $user->id) 27 @if($currentUser->can('user-update') || $currentUser->id == $user->id)
28 - <a href="/users/{{$user->id}}"> 28 + <a href="/settings/users/{{$user->id}}">
29 @endif 29 @endif
30 {{ $user->name }} 30 {{ $user->name }}
31 @if($currentUser->can('user-update') || $currentUser->id == $user->id) 31 @if($currentUser->can('user-update') || $currentUser->id == $user->id)
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
34 </td> 34 </td>
35 <td> 35 <td>
36 @if($currentUser->can('user-update') || $currentUser->id == $user->id) 36 @if($currentUser->can('user-update') || $currentUser->id == $user->id)
37 - <a href="/users/{{$user->id}}"> 37 + <a href="/settings/users/{{$user->id}}">
38 @endif 38 @endif
39 {{ $user->email }} 39 {{ $user->email }}
40 @if($currentUser->can('user-update') || $currentUser->id == $user->id) 40 @if($currentUser->can('user-update') || $currentUser->id == $user->id)
......
1 +@extends('base')
2 +
3 +@section('content')
4 +
5 + <div class="container" ng-non-bindable>
6 + <div class="row">
7 + <div class="col-sm-8">
8 +
9 + <div class="padded-top large"></div>
10 + <img class="" src="{{$user->getAvatar(120)}}" alt="{{ $user->name }}">
11 + <h3>{{ $user->name }}</h3>
12 + <p class="text-muted">
13 + User for {{ $user->created_at->diffForHumans(null, true) }}
14 + </p>
15 +
16 + </div>
17 +
18 + <div class="col-sm-4">
19 + <h3>Recent Activity</h3>
20 + @include('partials/activity-list', ['activity' => $activity])
21 + </div>
22 +
23 + </div>
24 + </div>
25 +
26 +
27 +@stop
...\ No newline at end of file ...\ No newline at end of file
...@@ -129,7 +129,7 @@ class AuthTest extends TestCase ...@@ -129,7 +129,7 @@ class AuthTest extends TestCase
129 $user = factory(\BookStack\User::class)->make(); 129 $user = factory(\BookStack\User::class)->make();
130 130
131 $this->asAdmin() 131 $this->asAdmin()
132 - ->visit('/users') 132 + ->visit('/settings/users')
133 ->click('Add new user') 133 ->click('Add new user')
134 ->type($user->name, '#name') 134 ->type($user->name, '#name')
135 ->type($user->email, '#email') 135 ->type($user->email, '#email')
...@@ -138,7 +138,7 @@ class AuthTest extends TestCase ...@@ -138,7 +138,7 @@ class AuthTest extends TestCase
138 ->type($user->password, '#password-confirm') 138 ->type($user->password, '#password-confirm')
139 ->press('Save') 139 ->press('Save')
140 ->seeInDatabase('users', $user->toArray()) 140 ->seeInDatabase('users', $user->toArray())
141 - ->seePageIs('/users') 141 + ->seePageIs('/settings/users')
142 ->see($user->name); 142 ->see($user->name);
143 } 143 }
144 144
...@@ -147,13 +147,13 @@ class AuthTest extends TestCase ...@@ -147,13 +147,13 @@ class AuthTest extends TestCase
147 $user = \BookStack\User::all()->last(); 147 $user = \BookStack\User::all()->last();
148 $password = $user->password; 148 $password = $user->password;
149 $this->asAdmin() 149 $this->asAdmin()
150 - ->visit('/users') 150 + ->visit('/settings/users')
151 ->click($user->name) 151 ->click($user->name)
152 - ->seePageIs('/users/' . $user->id) 152 + ->seePageIs('/settings/users/' . $user->id)
153 ->see($user->email) 153 ->see($user->email)
154 ->type('Barry Scott', '#name') 154 ->type('Barry Scott', '#name')
155 ->press('Save') 155 ->press('Save')
156 - ->seePageIs('/users') 156 + ->seePageIs('/settings/users')
157 ->seeInDatabase('users', ['id' => $user->id, 'name' => 'Barry Scott', 'password' => $password]) 157 ->seeInDatabase('users', ['id' => $user->id, 'name' => 'Barry Scott', 'password' => $password])
158 ->notSeeInDatabase('users', ['name' => $user->name]); 158 ->notSeeInDatabase('users', ['name' => $user->name]);
159 } 159 }
...@@ -161,7 +161,7 @@ class AuthTest extends TestCase ...@@ -161,7 +161,7 @@ class AuthTest extends TestCase
161 public function test_user_password_update() 161 public function test_user_password_update()
162 { 162 {
163 $user = \BookStack\User::all()->last(); 163 $user = \BookStack\User::all()->last();
164 - $userProfilePage = '/users/' . $user->id; 164 + $userProfilePage = '/settings/users/' . $user->id;
165 $this->asAdmin() 165 $this->asAdmin()
166 ->visit($userProfilePage) 166 ->visit($userProfilePage)
167 ->type('newpassword', '#password') 167 ->type('newpassword', '#password')
...@@ -172,7 +172,7 @@ class AuthTest extends TestCase ...@@ -172,7 +172,7 @@ class AuthTest extends TestCase
172 ->type('newpassword', '#password') 172 ->type('newpassword', '#password')
173 ->type('newpassword', '#password-confirm') 173 ->type('newpassword', '#password-confirm')
174 ->press('Save') 174 ->press('Save')
175 - ->seePageIs('/users'); 175 + ->seePageIs('/settings/users');
176 176
177 $userPassword = \BookStack\User::find($user->id)->password; 177 $userPassword = \BookStack\User::find($user->id)->password;
178 $this->assertTrue(Hash::check('newpassword', $userPassword)); 178 $this->assertTrue(Hash::check('newpassword', $userPassword));
...@@ -184,11 +184,11 @@ class AuthTest extends TestCase ...@@ -184,11 +184,11 @@ class AuthTest extends TestCase
184 $user = $this->getNewUser($userDetails->toArray()); 184 $user = $this->getNewUser($userDetails->toArray());
185 185
186 $this->asAdmin() 186 $this->asAdmin()
187 - ->visit('/users/' . $user->id) 187 + ->visit('/settings/users/' . $user->id)
188 ->click('Delete User') 188 ->click('Delete User')
189 ->see($user->name) 189 ->see($user->name)
190 ->press('Confirm') 190 ->press('Confirm')
191 - ->seePageIs('/users') 191 + ->seePageIs('/settings/users')
192 ->notSeeInDatabase('users', ['name' => $user->name]); 192 ->notSeeInDatabase('users', ['name' => $user->name]);
193 } 193 }
194 194
...@@ -199,10 +199,10 @@ class AuthTest extends TestCase ...@@ -199,10 +199,10 @@ class AuthTest extends TestCase
199 $this->assertEquals(1, $adminRole->users()->count()); 199 $this->assertEquals(1, $adminRole->users()->count());
200 $user = $adminRole->users->first(); 200 $user = $adminRole->users->first();
201 201
202 - $this->asAdmin()->visit('/users/' . $user->id) 202 + $this->asAdmin()->visit('/settings/users/' . $user->id)
203 ->click('Delete User') 203 ->click('Delete User')
204 ->press('Confirm') 204 ->press('Confirm')
205 - ->seePageIs('/users/' . $user->id) 205 + ->seePageIs('/settings/users/' . $user->id)
206 ->see('You cannot delete the only admin'); 206 ->see('You cannot delete the only admin');
207 } 207 }
208 208
......
...@@ -94,7 +94,7 @@ class LdapTest extends \TestCase ...@@ -94,7 +94,7 @@ class LdapTest extends \TestCase
94 94
95 public function test_create_user_form() 95 public function test_create_user_form()
96 { 96 {
97 - $this->asAdmin()->visit('/users/create') 97 + $this->asAdmin()->visit('/settings/users/create')
98 ->dontSee('Password') 98 ->dontSee('Password')
99 ->type($this->mockUser->name, '#name') 99 ->type($this->mockUser->name, '#name')
100 ->type($this->mockUser->email, '#email') 100 ->type($this->mockUser->email, '#email')
...@@ -102,19 +102,19 @@ class LdapTest extends \TestCase ...@@ -102,19 +102,19 @@ class LdapTest extends \TestCase
102 ->see('The external auth id field is required.') 102 ->see('The external auth id field is required.')
103 ->type($this->mockUser->name, '#external_auth_id') 103 ->type($this->mockUser->name, '#external_auth_id')
104 ->press('Save') 104 ->press('Save')
105 - ->seePageIs('/users') 105 + ->seePageIs('/settings/users')
106 ->seeInDatabase('users', ['email' => $this->mockUser->email, 'external_auth_id' => $this->mockUser->name, 'email_confirmed' => true]); 106 ->seeInDatabase('users', ['email' => $this->mockUser->email, 'external_auth_id' => $this->mockUser->name, 'email_confirmed' => true]);
107 } 107 }
108 108
109 public function test_user_edit_form() 109 public function test_user_edit_form()
110 { 110 {
111 $editUser = User::all()->last(); 111 $editUser = User::all()->last();
112 - $this->asAdmin()->visit('/users/' . $editUser->id) 112 + $this->asAdmin()->visit('/settings/users/' . $editUser->id)
113 ->see('Edit User') 113 ->see('Edit User')
114 ->dontSee('Password') 114 ->dontSee('Password')
115 ->type('test_auth_id', '#external_auth_id') 115 ->type('test_auth_id', '#external_auth_id')
116 ->press('Save') 116 ->press('Save')
117 - ->seePageIs('/users') 117 + ->seePageIs('/settings/users')
118 ->seeInDatabase('users', ['email' => $editUser->email, 'external_auth_id' => 'test_auth_id']); 118 ->seeInDatabase('users', ['email' => $editUser->email, 'external_auth_id' => 'test_auth_id']);
119 } 119 }
120 120
...@@ -127,7 +127,7 @@ class LdapTest extends \TestCase ...@@ -127,7 +127,7 @@ class LdapTest extends \TestCase
127 public function test_non_admins_cannot_change_auth_id() 127 public function test_non_admins_cannot_change_auth_id()
128 { 128 {
129 $testUser = User::all()->last(); 129 $testUser = User::all()->last();
130 - $this->actingAs($testUser)->visit('/users/' . $testUser->id) 130 + $this->actingAs($testUser)->visit('/settings/users/' . $testUser->id)
131 ->dontSee('External Authentication'); 131 ->dontSee('External Authentication');
132 } 132 }
133 133
......