Show bookshelves that a book belongs to on a book view

Closes #1598
This commit is contained in:
Christopher Wilkinson 2019-09-27 00:45:10 +01:00
parent 7cd956b24b
commit 4ad4dfa55a
No known key found for this signature in database
GPG Key ID: 93F334C3ECE61346
5 changed files with 52 additions and 3 deletions

View File

@ -413,6 +413,17 @@ class EntityRepo
return collect($tree); return collect($tree);
} }
/**
* Get the bookshelves that a book is contained in.
* @param Book $book
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
public function getBookParentShelves(Book $book)
{
return $this->permissionService->enforceEntityRestrictions('shelf', $book->shelves())->get();
}
/** /**
* Get the child items for a chapter sorted by priority but * Get the child items for a chapter sorted by priority but
* with draft items floated to the top. * with draft items floated to the top.

View File

@ -150,6 +150,7 @@ class BookController extends Controller
$this->checkOwnablePermission('book-view', $book); $this->checkOwnablePermission('book-view', $book);
$bookChildren = $this->bookRepo->getBookChildren($book); $bookChildren = $this->bookRepo->getBookChildren($book);
$bookParentShelves = $this->bookRepo->getBookParentShelves($book);
Views::add($book); Views::add($book);
if ($request->has('shelf')) { if ($request->has('shelf')) {
@ -161,6 +162,7 @@ class BookController extends Controller
'book' => $book, 'book' => $book,
'current' => $book, 'current' => $book,
'bookChildren' => $bookChildren, 'bookChildren' => $bookChildren,
'bookParentShelves' => $bookParentShelves,
'activity' => Activity::entityActivity($book, 20, 1) 'activity' => Activity::entityActivity($book, 20, 1)
]); ]);
} }

View File

@ -135,6 +135,7 @@ return [
'books_sort_chapters_last' => 'Chapters Last', 'books_sort_chapters_last' => 'Chapters Last',
'books_sort_show_other' => 'Show Other Books', 'books_sort_show_other' => 'Show Other Books',
'books_sort_save' => 'Save New Order', 'books_sort_save' => 'Save New Order',
'book_parent_shelves_empty' => 'Shelves that this book is on will appear here.',
// Chapters // Chapters
'chapter' => 'Chapter', 'chapter' => 'Chapter',

View File

@ -57,9 +57,7 @@
@stop @stop
@section('right') @section('right')
<div class="mb-xl"> <div class="mb-xl">
<h5>{{ trans('common.details') }}</h5> <h5>{{ trans('common.details') }}</h5>
<div class="text-small text-muted blended-links"> <div class="text-small text-muted blended-links">
@ -76,7 +74,6 @@
</div> </div>
</div> </div>
<div class="actions mb-xl"> <div class="actions mb-xl">
<h5>{{ trans('common.actions') }}</h5> <h5>{{ trans('common.actions') }}</h5>
<div class="icon-list text-primary"> <div class="icon-list text-primary">
@ -125,6 +122,16 @@
</div> </div>
</div> </div>
<div class="actions mb-xl">
<h5>{{ trans('entities.shelves_long') }}</h5>
@if(count($bookParentShelves) > 0)
@include('partials.entity-list', ['entities' => $bookParentShelves, 'style' => 'compact'])
@else
<div class="body text-muted">{{ trans('entities.book_parent_shelves_empty') }}</div>
@endif
</div>
@stop @stop
@section('left') @section('left')

View File

@ -240,4 +240,32 @@ class BookShelfTest extends TestCase
$pageVisit->assertElementNotContains('.breadcrumbs', $shelf->getShortName()); $pageVisit->assertElementNotContains('.breadcrumbs', $shelf->getShortName());
} }
public function test_bookshelves_show_on_book()
{
// Create shelf
$shelfInfo = [
'name' => 'My test shelf' . Str::random(4),
'description' => 'Test shelf description ' . Str::random(10)
];
$this->asEditor()->post('/shelves', $shelfInfo);
$shelf = Bookshelf::where('name', '=', $shelfInfo['name'])->first();
// Create book and add to shelf
$this->asEditor()->post($shelf->getUrl('/create-book'), [
'name' => 'Test book name',
'description' => 'Book in shelf description'
]);
$newBook = Book::query()->orderBy('id', 'desc')->first();
$resp = $this->asEditor()->get($newBook->getUrl());
$resp->assertSee($shelfInfo['name']);
// Remove shelf
$this->delete($shelf->getUrl());
$resp = $this->asEditor()->get($newBook->getUrl());
$resp->assertDontSee($shelfInfo['name']);
}
} }