Showing
30 changed files
with
194 additions
and
62 deletions
| ... | @@ -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; | ... | ... |
app/Services/EntityService.php
0 → 100644
| 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 | } | ... | ... |
This diff is collapsed.
Click to expand it.
| ... | @@ -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) | ... | ... |
resources/views/users/profile.blade.php
0 → 100644
| 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 | ... | ... |
-
Please register or sign in to post a comment