]> BookStack Code Mirror - bookstack/commitdiff
Added bookshelf permission control UI and copy-down ability
authorDan Brown <redacted>
Thu, 20 Sep 2018 18:16:11 +0000 (19:16 +0100)
committerDan Brown <redacted>
Thu, 20 Sep 2018 18:16:11 +0000 (19:16 +0100)
app/Http/Controllers/BookshelfController.php
app/Repos/EntityRepo.php
resources/lang/en/entities.php
resources/views/shelves/restrictions.blade.php
routes/web.php

index 02b6299ce873d99abb4bf41556b42eca29e0db30..d1752d180690567241c9729fd536b83e3cf3b0f0 100644 (file)
@@ -189,37 +189,56 @@ class BookshelfController extends Controller
         $this->entityRepo->destroyBookshelf($bookshelf);
         return redirect('/shelves');
     }
-//
-//    /**
-//     * Show the Restrictions view.
-//     * @param $bookSlug
-//     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
-//     */
-//    public function showRestrict($bookSlug)
-//    {
-//        $book = $this->entityRepo->getBySlug('book', $bookSlug);
-//        $this->checkOwnablePermission('restrictions-manage', $book);
-//        $roles = $this->userRepo->getRestrictableRoles();
-//        return view('books/restrictions', [
-//            'book' => $book,
-//            'roles' => $roles
-//        ]);
-//    }
-//
-//    /**
-//     * Set the restrictions for this book.
-//     * @param $bookSlug
-//     * @param $bookSlug
-//     * @param Request $request
-//     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
-//     */
-//    public function restrict($bookSlug, Request $request)
-//    {
-//        $book = $this->entityRepo->getBySlug('book', $bookSlug);
-//        $this->checkOwnablePermission('restrictions-manage', $book);
-//        $this->entityRepo->updateEntityPermissionsFromRequest($request, $book);
-//        session()->flash('success', trans('entities.books_permissions_updated'));
-//        return redirect($book->getUrl());
-//    }
+
+    /**
+     * Show the Restrictions view.
+     * @param $slug
+     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     * @throws \BookStack\Exceptions\NotFoundException
+     */
+    public function showRestrict(string $slug)
+    {
+        $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug);
+        $this->checkOwnablePermission('restrictions-manage', $bookshelf);
+
+        $roles = $this->userRepo->getRestrictableRoles();
+        return view('shelves.restrictions', [
+            'shelf' => $bookshelf,
+            'roles' => $roles
+        ]);
+    }
+
+    /**
+     * Set the restrictions for this bookshelf.
+     * @param $slug
+     * @param Request $request
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     * @throws \BookStack\Exceptions\NotFoundException
+     */
+    public function restrict(string $slug, Request $request)
+    {
+        $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug);
+        $this->checkOwnablePermission('restrictions-manage', $bookshelf);
+
+        $this->entityRepo->updateEntityPermissionsFromRequest($request, $bookshelf);
+        session()->flash('success', trans('entities.shelves_permissions_updated'));
+        return redirect($bookshelf->getUrl());
+    }
+
+    /**
+     * Copy the permissions of a bookshelf to the child books.
+     * @param string $slug
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     * @throws \BookStack\Exceptions\NotFoundException
+     */
+    public function copyPermissions(string $slug)
+    {
+        $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug);
+        $this->checkOwnablePermission('restrictions-manage', $bookshelf);
+
+        $updateCount = $this->entityRepo->copyBookshelfPermissions($bookshelf);
+        session()->flash('success', trans('entities.shelves_copy_permission_success', ['count' => $updateCount]));
+        return redirect($bookshelf->getUrl());
+    }
 
 }
index db922641100256398c447df3fc3a626428f065f6..ccccd95f48786c3309b0edbd37e7324d9e7cc2a9 100644 (file)
@@ -1282,4 +1282,29 @@ class EntityRepo
         $this->permissionService->deleteJointPermissionsForEntity($entity);
         $this->searchService->deleteEntityTerms($entity);
     }
+
+    /**
+     * Copy the permissions of a bookshelf to all child books.
+     * Returns the number of books that had permissions updated.
+     * @param Bookshelf $bookshelf
+     * @return int
+     */
+    public function copyBookshelfPermissions(Bookshelf $bookshelf)
+    {
+        $shelfPermissions = $bookshelf->permissions()->get(['role_id', 'action'])->toArray();
+        $shelfBooks = $bookshelf->books()->get();
+        $updatedBookCount = 0;
+
+        foreach ($shelfBooks as $book) {
+            if (!userCan('restrictions-manage', $book)) continue;
+            $book->permissions()->delete();
+            $book->restricted = $bookshelf->restricted;
+            $book->permissions()->createMany($shelfPermissions);
+            $book->save();
+            $this->permissionService->buildJointPermissionsForEntity($book);
+            $updatedBookCount++;
+        }
+
+        return $updatedBookCount;
+    }
 }
index 2228da2cdf91250d63b9f703aa862550a44051bf..44ab2c9cc404fe3152c8c34d5b16cf4c109ea87d 100644 (file)
@@ -68,7 +68,7 @@ return [
      * Shelves
      */
     'shelves' => 'Shelves',
-    'shelves_long' => 'BookShelves',
+    'shelves_long' => 'Bookshelves',
     'shelves_empty' => 'No shelves have been created',
     'shelves_create' => 'Create New Shelf',
     'shelves_popular' => 'Popular Shelves',
@@ -87,6 +87,13 @@ return [
     'shelves_delete_named' => 'Delete Bookshelf :name',
     'shelves_delete_explain' => "This will delete the bookshelf with the name ':name'. Contained books will not be deleted.",
     'shelves_delete_confirmation' => 'Are you sure you want to delete this bookshelf?',
+    'shelves_permissions' => 'Bookshelf Permissions',
+    'shelves_permissions_updated' => 'Bookshelf Permissions Updated',
+    'shelves_permissions_active' => 'Bookshelf Permissions Active',
+    'shelves_copy_permissions_to_books' => 'Copy Permissions to Books',
+    'shelves_copy_permissions' => 'Copy Permissions',
+    'shelves_copy_permissions_explain' => 'This will apply the current permission settings of this bookshelf to all books contained within. Before activating, ensure any changes to the permissions of this bookshelf have been saved.',
+    'shelves_copy_permission_success' => 'Bookshelf permissions copied to :count books',
 
     /**
      * Books
index 2a6eb0bea2c0138ac6f829a13e206958a0ed868f..472078ad2444cc07b9ae8582fb10e05894f33876 100644 (file)
@@ -2,18 +2,31 @@
 
 @section('toolbar')
     <div class="col-sm-12 faded">
-        @include('books._breadcrumbs', ['book' => $book])
+        @include('shelves._breadcrumbs', ['shelf' => $shelf])
     </div>
 @stop
 
 @section('body')
 
-    <div class="container">
+    <div class="container small">
         <p>&nbsp;</p>
         <div class="card">
-            <h3>@icon('lock') {{ trans('entities.books_permissions') }}</h3>
+            <h3>@icon('lock') {{ trans('entities.shelves_permissions') }}</h3>
             <div class="body">
-                @include('form/restriction-form', ['model' => $book])
+                @include('form/restriction-form', ['model' => $shelf])
+            </div>
+        </div>
+
+        <p>&nbsp;</p>
+
+        <div class="card">
+            <h3>@icon('copy') {{ trans('entities.shelves_copy_permissions_to_books') }}</h3>
+            <div class="body">
+                <p>{{ trans('entities.shelves_copy_permissions_explain') }}</p>
+                <form action="{{ $shelf->getUrl('/copy-permissions') }}" method="post" class="text-right">
+                    {{ csrf_field() }}
+                    <button class="button">{{ trans('entities.shelves_copy_permissions') }}</button>
+                </form>
             </div>
         </div>
     </div>
index be0b2da6e4f0b906e2160b2c0c23028ff30d1a1a..4bdd5fc09b7a76b4be34a388df139da63ae99704 100644 (file)
@@ -24,6 +24,9 @@ Route::group(['middleware' => 'auth'], function () {
         Route::get('/{slug}', 'BookshelfController@show');
         Route::put('/{slug}', 'BookshelfController@update');
         Route::delete('/{slug}', 'BookshelfController@destroy');
+        Route::get('/{slug}/permissions', 'BookshelfController@showRestrict');
+        Route::put('/{slug}/permissions', 'BookshelfController@restrict');
+        Route::post('/{slug}/copy-permissions', 'BookshelfController@copyPermissions');
     });
 
     Route::get('/create-book', 'BookController@create');