diff --git a/app/Auth/User.php b/app/Auth/User.php index 32179a1fb..fdfd9e616 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -15,6 +15,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Collection; /** * Class User @@ -56,7 +57,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon /** * This holds the user's permissions when loaded. - * @var array + * @var ?Collection */ protected $permissions; @@ -130,35 +131,44 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon } } - /** - * Get all permissions belonging to a the current user. - * @param bool $cache - * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough - */ - public function permissions($cache = true) - { - if (isset($this->permissions) && $cache) { - return $this->permissions; - } - $this->load('roles.permissions'); - $permissions = $this->roles->map(function ($role) { - return $role->permissions; - })->flatten()->unique(); - $this->permissions = $permissions; - return $permissions; - } - /** * Check if the user has a particular permission. - * @param $permissionName - * @return bool */ - public function can($permissionName) + public function can(string $permissionName): bool { if ($this->email === 'guest') { return false; } - return $this->permissions()->pluck('name')->contains($permissionName); + + return $this->permissions()->contains($permissionName); + } + + /** + * Get all permissions belonging to a the current user. + */ + protected function permissions(): Collection + { + if (isset($this->permissions)) { + return $this->permissions; + } + + $this->permissions = $this->newQuery()->getConnection()->table('role_user', 'ru') + ->select('role_permissions.name as name')->distinct() + ->leftJoin('permission_role', 'ru.role_id', '=', 'permission_role.role_id') + ->leftJoin('role_permissions', 'permission_role.permission_id', '=', 'role_permissions.id') + ->where('ru.user_id', '=', $this->id) + ->get() + ->pluck('name'); + + return $this->permissions; + } + + /** + * Clear any cached permissions on this instance. + */ + public function clearPermissionCache() + { + $this->permissions = null; } /** diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index c6856d339..d97740d27 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -25,6 +25,7 @@ class HomeController extends Controller ->where('draft', '=', true) ->where('created_by', '=', user()->id) ->orderBy('updated_at', 'desc') + ->with('book') ->take(6) ->get(); } @@ -33,8 +34,11 @@ class HomeController extends Controller $recents = $this->isSignedIn() ? Views::getUserRecentlyViewed(12*$recentFactor, 1) : Book::visible()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get(); - $recentlyUpdatedPages = Page::visible()->where('draft', false) - ->orderBy('updated_at', 'desc')->take(12)->get(); + $recentlyUpdatedPages = Page::visible()->with('book') + ->where('draft', false) + ->orderBy('updated_at', 'desc') + ->take(12) + ->get(); $homepageOptions = ['default', 'books', 'bookshelves', 'page']; $homepageOption = setting('app-homepage-type', 'default'); diff --git a/resources/sass/_layout.scss b/resources/sass/_layout.scss index e5ed608eb..a6a74afed 100644 --- a/resources/sass/_layout.scss +++ b/resources/sass/_layout.scss @@ -178,6 +178,10 @@ body.flexbox { display: none !important; } +.fill-height { + height: 100%; +} + .float { float: left; &.right { diff --git a/resources/views/pages/edit.blade.php b/resources/views/pages/edit.blade.php index 5acd11af4..f580b06cf 100644 --- a/resources/views/pages/edit.blade.php +++ b/resources/views/pages/edit.blade.php @@ -8,7 +8,7 @@ @section('content') - <div class="flex-fill flex"> + <div class="flex-fill flex fill-height"> <form action="{{ $page->getUrl() }}" autocomplete="off" data-page-id="{{ $page->id }}" method="POST" class="flex flex-fill"> {{ csrf_field() }} diff --git a/tests/SharedTestHelpers.php b/tests/SharedTestHelpers.php index ffcc6f40c..02f7caae1 100644 --- a/tests/SharedTestHelpers.php +++ b/tests/SharedTestHelpers.php @@ -179,15 +179,13 @@ trait SharedTestHelpers /** * Give the given user some permissions. - * @param User $user - * @param array $permissions */ - protected function giveUserPermissions(User $user, $permissions = []) + protected function giveUserPermissions(User $user, array $permissions = []) { $newRole = $this->createNewRole($permissions); $user->attachRole($newRole); $user->load('roles'); - $user->permissions(false); + $user->clearPermissionCache(); } /**