diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php index 9eb19ce65..325fd1ffa 100644 --- a/app/Http/Controllers/BookController.php +++ b/app/Http/Controllers/BookController.php @@ -77,21 +77,42 @@ class BookController extends Controller * Show the form for creating a new book. * @return Response */ - public function create() + public function create($shelfSlug = null) { + if ($shelfSlug !== null) { + $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug); + $this->checkOwnablePermission('bookshelf-update', $bookshelf); + } else { + $bookshelf = null; + } + $this->checkPermission('book-create-all'); $this->setPageTitle(trans('entities.books_create')); - return view('books.create'); + return view('books.create', [ + 'bookshelf' => $bookshelf + ]); } /** * Store a newly created book in storage. * - * @param Request $request + * @param Request $request + * @param $shelfSlug * @return Response */ - public function store(Request $request) + public function store(Request $request, $shelfSlug = null) { + if ($shelfSlug !== null) { + $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug); + $this->checkOwnablePermission('bookshelf-update', $bookshelf); + + $shelfBooks = $this->entityRepo->getBookshelfChildren($bookshelf); + $shelfBookIds = $shelfBooks->pluck('id'); + + } else { + $bookshelf = null; + } + $this->checkPermission('book-create-all'); $this->validate($request, [ 'name' => 'required|string|max:255', @@ -99,6 +120,19 @@ class BookController extends Controller ]); $book = $this->entityRepo->createFromInput('book', $request->all()); Activity::add($book, 'book_create', $book->id); + + if ($bookshelf) { + $shelfBookIds = $shelfBookIds->toArray(); + array_unshift($shelfBookIds, $book->id); + + $shelfBookIds = implode(',', $shelfBookIds); + + $this->entityRepo->updateShelfBooks($bookshelf, $shelfBookIds); + Activity::add($bookshelf, 'bookshelf_update'); + + return redirect($bookshelf->getUrl()); + } + return redirect($book->getUrl()); } diff --git a/resources/views/books/create.blade.php b/resources/views/books/create.blade.php index 9079a3bf9..e33ae2bae 100644 --- a/resources/views/books/create.blade.php +++ b/resources/views/books/create.blade.php @@ -17,7 +17,7 @@

{{ trans('entities.books_create') }}

-
+ @include('books.form')
diff --git a/resources/views/shelves/show.blade.php b/resources/views/shelves/show.blade.php index 0cfaebbd7..77423c144 100644 --- a/resources/views/shelves/show.blade.php +++ b/resources/views/shelves/show.blade.php @@ -23,6 +23,12 @@

{{ trans('entities.shelves_empty_contents') }}

+ @if($currentUser->can('book-create-all')) + + @icon('add') + {{ trans('entities.books_create') }} + + @endif @if(userCan('bookshelf-update', $shelf)) @icon('edit') diff --git a/routes/web.php b/routes/web.php index 7c2c5917e..831d54c85 100644 --- a/routes/web.php +++ b/routes/web.php @@ -26,6 +26,8 @@ Route::group(['middleware' => 'auth'], function () { Route::get('/{slug}/permissions', 'BookshelfController@showPermissions'); Route::put('/{slug}/permissions', 'BookshelfController@permissions'); Route::post('/{slug}/copy-permissions', 'BookshelfController@copyPermissions'); + Route::get('/{slug}/create-book', 'BookController@create'); + Route::post('/{slug}/create-book', 'BookController@store'); }); Route::get('/create-book', 'BookController@create'); diff --git a/tests/Entity/BookShelfTest.php b/tests/Entity/BookShelfTest.php index 0707fc5ff..a95f31b52 100644 --- a/tests/Entity/BookShelfTest.php +++ b/tests/Entity/BookShelfTest.php @@ -99,9 +99,11 @@ class BookShelfTest extends TestCase { $shelf = Bookshelf::first(); $resp = $this->asAdmin()->get($shelf->getUrl()); + $resp->assertSee($shelf->getUrl('/create-book')); $resp->assertSee($shelf->getUrl('/edit')); $resp->assertSee($shelf->getUrl('/permissions')); $resp->assertSee($shelf->getUrl('/delete')); + $resp->assertElementContains('a', 'Create New Book'); $resp->assertElementContains('a', 'Edit'); $resp->assertElementContains('a', 'Permissions'); $resp->assertElementContains('a', 'Delete'); @@ -148,6 +150,14 @@ class BookShelfTest extends TestCase $this->assertDatabaseHas('bookshelves_books', ['bookshelf_id' => $shelf->id, 'book_id' => $booksToInclude[1]->id]); } + public function test_shelf_create_new_book() + { + $shelf = Bookshelf::first(); + $resp = $this->asEditor()->get($shelf->getUrl('/create-book')); + + $resp->assertSeeText('Create New Book'); + } + public function test_shelf_delete() { $shelf = Bookshelf::first();