]> BookStack Code Mirror - bookstack/commitdiff
Merge branch 'v0.30.x'
authorDan Brown <redacted>
Thu, 17 Dec 2020 21:47:59 +0000 (21:47 +0000)
committerDan Brown <redacted>
Thu, 17 Dec 2020 21:47:59 +0000 (21:47 +0000)
1  2 
app/Entities/Models/Chapter.php
app/Entities/Tools/BookContents.php
resources/views/books/sort-box.blade.php
resources/views/partials/book-tree.blade.php
tests/Permissions/RestrictionsTest.php

index d736e2108d405194d7f0c93f92056a0a2abf2172,0000000000000000000000000000000000000000..257b19e37e45afe981ffeb7cf6ccfcd82cdefec3
mode 100644,000000..100644
--- /dev/null
@@@ -1,61 -1,0 +1,52 @@@
-     /**
-      * Check if this chapter has any child pages.
-      * @return bool
-      */
-     public function hasChildren()
-     {
-         return count($this->pages) > 0;
-     }
 +<?php namespace BookStack\Entities\Models;
 +
 +use Illuminate\Support\Collection;
 +
 +/**
 + * Class Chapter
 + * @property Collection<Page> $pages
 + */
 +class Chapter extends BookChild
 +{
 +    public $searchFactor = 1.3;
 +
 +    protected $fillable = ['name', 'description', 'priority', 'book_id'];
 +    protected $hidden = ['restricted', 'pivot', 'deleted_at'];
 +
 +    /**
 +     * Get the pages that this chapter contains.
 +     * @param string $dir
 +     * @return mixed
 +     */
 +    public function pages($dir = 'ASC')
 +    {
 +        return $this->hasMany(Page::class)->orderBy('priority', $dir);
 +    }
 +
 +    /**
 +     * Get the url of this chapter.
 +     */
 +    public function getUrl($path = ''): string
 +    {
 +        $parts = [
 +            'books',
 +            urlencode($this->getAttribute('bookSlug') ?? $this->book->slug),
 +            'chapter',
 +            urlencode($this->slug),
 +            trim($path, '/'),
 +        ];
 +
 +        return url('/' . implode('/', $parts));
 +    }
 +
 +    /**
 +     * Get the visible pages in this chapter.
 +     */
 +    public function getVisiblePages(): Collection
 +    {
 +        return $this->pages()->visible()
 +        ->orderBy('draft', 'desc')
 +        ->orderBy('priority', 'asc')
 +        ->get();
 +    }
 +}
index cee4e79953d95af37e76e7f9f5e8dc52a9b0c15f,b9844da5774baacccaf74b8543ec8b2054ca4ff5..71c8f8393a22dff67f95a4ec931ce236d4641b49
@@@ -1,10 -1,10 +1,10 @@@
 -<?php namespace BookStack\Entities\Managers;
 +<?php namespace BookStack\Entities\Tools;
  
 -use BookStack\Entities\Book;
 -use BookStack\Entities\BookChild;
 -use BookStack\Entities\Chapter;
 -use BookStack\Entities\Entity;
 -use BookStack\Entities\Page;
 +use BookStack\Entities\Models\Book;
 +use BookStack\Entities\Models\BookChild;
 +use BookStack\Entities\Models\Chapter;
 +use BookStack\Entities\Models\Entity;
 +use BookStack\Entities\Models\Page;
  use BookStack\Exceptions\SortOperationException;
  use Illuminate\Support\Collection;
  
@@@ -18,6 -18,7 +18,6 @@@ class BookContent
  
      /**
       * BookContents constructor.
 -     * @param $book
       */
      public function __construct(Book $book)
      {
          $pages->groupBy('chapter_id')->each(function ($pages, $chapter_id) use ($chapterMap, &$lonePages) {
              $chapter = $chapterMap->get($chapter_id);
              if ($chapter) {
-                 $chapter->setAttribute('pages', collect($pages)->sortBy($this->bookChildSortFunc()));
+                 $chapter->setAttribute('visible_pages', collect($pages)->sortBy($this->bookChildSortFunc()));
              } else {
                  $lonePages = $lonePages->concat($pages);
              }
          });
  
+         $chapters->whereNull('visible_pages')->each(function (Chapter $chapter) {
+             $chapter->setAttribute('visible_pages', collect([]));
+         });
          $all->each(function (Entity $entity) use ($renderPages) {
              $entity->setRelation('book', $this->book);
  
index 5d14e3598788c4fc40efe9bd846a6b667cb9ed99,c5d461629826221145ccffd5769088233be01ab9..f043735bbf4c9c0df001d5f40fc565756b467550
@@@ -13,8 -13,8 +13,8 @@@
      <ul class="sortable-page-list sort-list">
  
          @foreach($bookChildren as $bookChild)
 -            <li class="text-{{ $bookChild->getClassName() }}"
 -                data-id="{{$bookChild->id}}" data-type="{{ $bookChild->getClassName() }}"
 +            <li class="text-{{ $bookChild->getType() }}"
 +                data-id="{{$bookChild->id}}" data-type="{{ $bookChild->getType() }}"
                  data-name="{{ $bookChild->name }}" data-created="{{ $bookChild->created_at->timestamp }}"
                  data-updated="{{ $bookChild->updated_at->timestamp }}">
                  <div class="entity-list-item">
@@@ -28,7 -28,7 +28,7 @@@
                  </div>
                  @if($bookChild->isA('chapter'))
                      <ul>
-                         @foreach($bookChild->pages as $page)
+                         @foreach($bookChild->visible_pages as $page)
                              <li class="text-page"
                                  data-id="{{$page->id}}" data-type="page"
                                  data-name="{{ $page->name }}" data-created="{{ $page->created_at->timestamp }}"
index dcc76cd83f333fc464a293d3f0a05722cd02abda,6e308bb09f06447f588b62e512edd5d3d588dc99..15b5832897d01756c7fc59b22a89805bdf7a8bbe
          @endif
  
          @foreach($sidebarTree as $bookChild)
 -            <li class="list-item-{{ $bookChild->getClassName() }} {{ $bookChild->getClassName() }} {{ $bookChild->isA('page') && $bookChild->draft ? 'draft' : '' }}">
 +            <li class="list-item-{{ $bookChild->getType() }} {{ $bookChild->getType() }} {{ $bookChild->isA('page') && $bookChild->draft ? 'draft' : '' }}">
                  @include('partials.entity-list-item-basic', ['entity' => $bookChild, 'classes' => $current->matches($bookChild)? 'selected' : ''])
  
-                 @if($bookChild->isA('chapter') && count($bookChild->pages) > 0)
+                 @if($bookChild->isA('chapter') && count($bookChild->visible_pages) > 0)
                      <div class="entity-list-item no-hover">
                          <span role="presentation" class="icon text-chapter"></span>
                          <div class="content">
index 7da00e26e74e08fdc9ea94d5dfcea003335304dc,2dcc0ea695e207887692525fcf3bd460fd8ef23c..c3c6aa44fa6e4631203ec1af7c3417a406365edb
@@@ -1,11 -1,11 +1,11 @@@
  <?php namespace Tests\Permissions;
  
 -use BookStack\Entities\Book;
 -use BookStack\Entities\Bookshelf;
 -use BookStack\Entities\Chapter;
 -use BookStack\Entities\Entity;
 +use BookStack\Entities\Models\Book;
 +use BookStack\Entities\Models\Bookshelf;
 +use BookStack\Entities\Models\Chapter;
 +use BookStack\Entities\Models\Entity;
  use BookStack\Auth\User;
 -use BookStack\Entities\Page;
 +use BookStack\Entities\Models\Page;
  use Tests\BrowserKitTest;
  
  class RestrictionsTest extends BrowserKitTest
@@@ -58,7 -58,7 +58,7 @@@
  
      public function test_bookshelf_update_restriction()
      {
 -        $shelf = BookShelf::first();
 +        $shelf = Bookshelf::first();
  
          $this->actingAs($this->user)
              ->visit($shelf->getUrl('/edit'))
              ->dontSee($page->name);
      }
  
+     public function test_restricted_chapter_pages_not_visible_on_book_page()
+     {
+         $chapter = Chapter::query()->first();
+         $this->actingAs($this->user)
+             ->visit($chapter->book->getUrl())
+             ->see($chapter->pages->first()->name);
+         foreach ($chapter->pages as $page) {
+             $this->setEntityRestrictions($page, []);
+         }
+         $this->actingAs($this->user)
+             ->visit($chapter->book->getUrl())
+             ->dontSee($chapter->pages->first()->name);
+     }
      public function test_bookshelf_update_restriction_override()
      {
          $shelf = Bookshelf::first();