| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Entities\Controllers; | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\Models\View; | 
					
						
							| 
									
										
										
										
											2023-08-09 21:53:31 +08:00
										 |  |  | use BookStack\Activity\Tools\UserEntityWatchOptions; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use BookStack\Entities\Repos\ChapterRepo; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | use BookStack\Entities\Tools\BookContents; | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  | use BookStack\Entities\Tools\Cloner; | 
					
						
							| 
									
										
										
										
											2022-06-14 23:42:29 +08:00
										 |  |  | use BookStack\Entities\Tools\HierarchyTransformer; | 
					
						
							| 
									
										
										
										
											2021-05-29 19:39:41 +08:00
										 |  |  | use BookStack\Entities\Tools\NextPreviousContentLocator; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use BookStack\Exceptions\MoveOperationException; | 
					
						
							|  |  |  | use BookStack\Exceptions\NotFoundException; | 
					
						
							| 
									
										
										
										
											2022-01-06 00:11:11 +08:00
										 |  |  | use BookStack\Exceptions\PermissionsException; | 
					
						
							| 
									
										
										
										
											2023-05-19 03:53:39 +08:00
										 |  |  | use BookStack\Http\Controller; | 
					
						
							| 
									
										
										
										
											2022-08-20 19:07:38 +08:00
										 |  |  | use BookStack\References\ReferenceFetcher; | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  | use Illuminate\Http\Request; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use Illuminate\Validation\ValidationException; | 
					
						
							|  |  |  | use Throwable; | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ChapterController extends Controller | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-08-20 19:07:38 +08:00
										 |  |  |     protected ChapterRepo $chapterRepo; | 
					
						
							|  |  |  |     protected ReferenceFetcher $referenceFetcher; | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-20 19:07:38 +08:00
										 |  |  |     public function __construct(ChapterRepo $chapterRepo, ReferenceFetcher $referenceFetcher) | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $this->chapterRepo = $chapterRepo; | 
					
						
							| 
									
										
										
										
											2022-08-20 19:07:38 +08:00
										 |  |  |         $this->referenceFetcher = $referenceFetcher; | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-29 22:03:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |      * Show the form for creating a new chapter. | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function create(string $bookSlug) | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $book = Book::visible()->where('slug', '=', $bookSlug)->firstOrFail(); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-create', $book); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.chapters_create')); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 19:00:09 +08:00
										 |  |  |         return view('chapters.create', ['book' => $book, 'current' => $book]); | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |      * Store a newly created chapter in storage. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws ValidationException | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-09-16 01:53:30 +08:00
										 |  |  |     public function store(Request $request, string $bookSlug) | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2021-11-05 08:26:55 +08:00
										 |  |  |             'name' => ['required', 'string', 'max:255'], | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $book = Book::visible()->where('slug', '=', $bookSlug)->firstOrFail(); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-create', $book); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->create($request->all(), $book); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 01:26:33 +08:00
										 |  |  |         return redirect($chapter->getUrl()); | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |      * Display the specified chapter. | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function show(string $bookSlug, string $chapterSlug) | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-04-09 19:40:07 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-view', $chapter); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $sidebarTree = (new BookContents($chapter->book))->getTree(); | 
					
						
							|  |  |  |         $pages = $chapter->getVisiblePages(); | 
					
						
							| 
									
										
										
										
											2021-05-29 19:39:41 +08:00
										 |  |  |         $nextPreviousLocator = new NextPreviousContentLocator($chapter, $sidebarTree); | 
					
						
							| 
									
										
										
										
											2021-05-16 17:49:37 +08:00
										 |  |  |         View::incrementFor($chapter); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:41:51 +08:00
										 |  |  |         $this->setPageTitle($chapter->getShortName()); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 19:00:09 +08:00
										 |  |  |         return view('chapters.show', [ | 
					
						
							| 
									
										
										
										
											2022-08-20 19:07:38 +08:00
										 |  |  |             'book'           => $chapter->book, | 
					
						
							|  |  |  |             'chapter'        => $chapter, | 
					
						
							|  |  |  |             'current'        => $chapter, | 
					
						
							|  |  |  |             'sidebarTree'    => $sidebarTree, | 
					
						
							| 
									
										
										
										
											2023-08-09 21:53:31 +08:00
										 |  |  |             'watchOptions'   => new UserEntityWatchOptions(user(), $chapter), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:07:38 +08:00
										 |  |  |             'pages'          => $pages, | 
					
						
							|  |  |  |             'next'           => $nextPreviousLocator->getNext(), | 
					
						
							|  |  |  |             'previous'       => $nextPreviousLocator->getPrevious(), | 
					
						
							|  |  |  |             'referenceCount' => $this->referenceFetcher->getPageReferenceCountToEntity($chapter), | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |      * Show the form for editing the specified chapter. | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function edit(string $bookSlug, string $chapterSlug) | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-update', $chapter); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.chapters_edit_named', ['chapterName' => $chapter->getShortName()])); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 19:00:09 +08:00
										 |  |  |         return view('chapters.edit', ['book' => $chapter->book, 'chapter' => $chapter, 'current' => $chapter]); | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |      * Update the specified chapter in storage. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-09-16 01:53:30 +08:00
										 |  |  |     public function update(Request $request, string $bookSlug, string $chapterSlug) | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-update', $chapter); | 
					
						
							| 
									
										
										
										
											2018-03-30 21:09:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $this->chapterRepo->update($chapter, $request->all()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |         return redirect($chapter->getUrl()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Shows the page to confirm deletion of this chapter. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function showDelete(string $bookSlug, string $chapterSlug) | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-delete', $chapter); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.chapters_delete_named', ['chapterName' => $chapter->getShortName()])); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 19:00:09 +08:00
										 |  |  |         return view('chapters.delete', ['book' => $chapter->book, 'chapter' => $chapter, 'current' => $chapter]); | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |      * Remove the specified chapter from storage. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      * @throws Throwable | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function destroy(string $bookSlug, string $chapterSlug) | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-delete', $chapter); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->chapterRepo->destroy($chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return redirect($chapter->book->getUrl()); | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-02-28 18:49:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show the page for moving a chapter. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function showMove(string $bookSlug, string $chapterSlug) | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.chapters_move_named', ['chapterName' => $chapter->getShortName()])); | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-update', $chapter); | 
					
						
							| 
									
										
										
										
											2019-01-05 22:39:40 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-delete', $chapter); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 19:00:09 +08:00
										 |  |  |         return view('chapters.move', [ | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |             'chapter' => $chapter, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'book'    => $chapter->book, | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-03 17:31:20 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Perform the move action for a chapter. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2016-07-03 17:31:20 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-09-16 01:53:30 +08:00
										 |  |  |     public function move(Request $request, string $bookSlug, string $chapterSlug) | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-update', $chapter); | 
					
						
							| 
									
										
										
										
											2019-01-05 22:39:40 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-delete', $chapter); | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $entitySelection = $request->get('entity_selection', null); | 
					
						
							|  |  |  |         if ($entitySelection === null || $entitySelection === '') { | 
					
						
							|  |  |  |             return redirect($chapter->getUrl()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $newBook = $this->chapterRepo->move($chapter, $entitySelection); | 
					
						
							| 
									
										
										
										
											2022-01-06 00:11:11 +08:00
										 |  |  |         } catch (PermissionsException $exception) { | 
					
						
							|  |  |  |             $this->showPermissionError(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         } catch (MoveOperationException $exception) { | 
					
						
							|  |  |  |             $this->showErrorNotification(trans('errors.selected_book_not_found')); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |             return redirect()->back(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return redirect($chapter->getUrl()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 18:49:41 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |      * Show the view to copy a chapter. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function showCopy(string $bookSlug, string $chapterSlug) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-view', $chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         session()->flashInput(['name' => $chapter->name]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return view('chapters.copy', [ | 
					
						
							| 
									
										
										
										
											2021-12-21 01:40:27 +08:00
										 |  |  |             'book'    => $chapter->book, | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |             'chapter' => $chapter, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-12-20 03:20:31 +08:00
										 |  |  |      * Create a copy of a chapter within the requested target destination. | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      * @throws Throwable | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function copy(Request $request, Cloner $cloner, string $bookSlug, string $chapterSlug) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-view', $chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $entitySelection = $request->get('entity_selection') ?: null; | 
					
						
							|  |  |  |         $newParentBook = $entitySelection ? $this->chapterRepo->findParentByIdentifier($entitySelection) : $chapter->getParent(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (is_null($newParentBook)) { | 
					
						
							|  |  |  |             $this->showErrorNotification(trans('errors.selected_book_not_found')); | 
					
						
							| 
									
										
										
										
											2021-12-21 01:40:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |             return redirect()->back(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-create', $newParentBook); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $newName = $request->get('name') ?: $chapter->name; | 
					
						
							|  |  |  |         $chapterCopy = $cloner->cloneChapter($chapter, $newParentBook, $newName); | 
					
						
							|  |  |  |         $this->showSuccessNotification(trans('entities.chapters_copy_success')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return redirect($chapterCopy->getUrl()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 23:42:29 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Convert the chapter to a book. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function convertToBook(HierarchyTransformer $transformer, string $bookSlug, string $chapterSlug) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-update', $chapter); | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-delete', $chapter); | 
					
						
							|  |  |  |         $this->checkPermission('book-create-all'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $book = $transformer->transformChapterToBook($chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return redirect($book->getUrl()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  | } |