X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/a6633642232efd164d4708967ab59e498fbff896..refs/pull/3139/head:/app/Entities/Tools/BookContents.php diff --git a/app/Entities/Tools/BookContents.php b/app/Entities/Tools/BookContents.php index 71c8f8393..9b2190ca2 100644 --- a/app/Entities/Tools/BookContents.php +++ b/app/Entities/Tools/BookContents.php @@ -1,4 +1,6 @@ -where('chapter_id', '=', 0)->max('priority'); $maxChapter = Chapter::visible()->where('book_id', '=', $this->book->id) ->max('priority'); + return max($maxChapter, $maxPage, 1); } @@ -43,7 +45,7 @@ class BookContents */ public function getTree(bool $showDrafts = false, bool $renderPages = false): Collection { - $pages = $this->getPages($showDrafts); + $pages = $this->getPages($showDrafts, $renderPages); $chapters = Chapter::visible()->where('book_id', '=', $this->book->id)->get(); $all = collect()->concat($pages)->concat($chapters); $chapterMap = $chapters->keyBy('id'); @@ -65,7 +67,7 @@ class BookContents $all->each(function (Entity $entity) use ($renderPages) { $entity->setRelation('book', $this->book); - if ($renderPages && $entity->isA('page')) { + if ($renderPages && $entity instanceof Page) { $entity->html = (new PageContent($entity))->render(); } }); @@ -83,6 +85,7 @@ class BookContents if (isset($entity['draft']) && $entity['draft']) { return -100; } + return $entity['priority'] ?? 0; }; } @@ -90,9 +93,11 @@ class BookContents /** * Get the visible pages within this book. */ - protected function getPages(bool $showDrafts = false): Collection + protected function getPages(bool $showDrafts = false, bool $getPageContent = false): Collection { - $query = Page::visible()->where('book_id', '=', $this->book->id); + $query = Page::visible() + ->select($getPageContent ? Page::$contentAttributes : Page::$listAttributes) + ->where('book_id', '=', $this->book->id); if (!$showDrafts) { $query->where('draft', '=', false); @@ -110,9 +115,10 @@ class BookContents * +"parentChapter": false (ID of parent chapter, as string, or false) * +"type": "page" (Entity type of item) * +"book": "1" (Id of book to place item in) - * } + * }. * * Returns a list of books that were involved in the operation. + * * @throws SortOperationException */ public function sortUsingMap(Collection $sortMap): Collection @@ -145,7 +151,7 @@ class BookContents $priorityChanged = intval($model->priority) !== intval($sortMapItem->sort); $bookChanged = intval($model->book_id) !== intval($sortMapItem->book); - $chapterChanged = ($sortMapItem->type === 'page') && intval($model->chapter_id) !== $sortMapItem->parentChapter; + $chapterChanged = ($model instanceof Page) && intval($model->chapter_id) !== $sortMapItem->parentChapter; if ($bookChanged) { $model->changeBook($sortMapItem->book); @@ -190,6 +196,7 @@ class BookContents /** * Get the books involved in a sort. * The given sort map should have its models loaded first. + * * @throws SortOperationException */ protected function getBooksInvolvedInSort(Collection $sortMap): Collection @@ -202,7 +209,7 @@ class BookContents $books = Book::hasPermission('update')->whereIn('id', $bookIdsInvolved)->get(); if (count($books) !== count($bookIdsInvolved)) { - throw new SortOperationException("Could not find all books requested in sort operation"); + throw new SortOperationException('Could not find all books requested in sort operation'); } return $books;