| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  | use BookStack\Entities\Queries\ChapterQueries; | 
					
						
							|  |  |  | use BookStack\Entities\Queries\EntityQueries; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2023-12-10 20:37:21 +08:00
										 |  |  | use BookStack\Exceptions\NotifyException; | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected ChapterRepo $chapterRepo, | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |         protected ChapterQueries $queries, | 
					
						
							|  |  |  |         protected EntityQueries $entityQueries, | 
					
						
							|  |  |  |         protected ReferenceFetcher $referenceFetcher, | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |     ) { | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $book = $this->entityQueries->books->findVisibleBySlugOrFail($bookSlug); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |         $validated = $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2024-01-02 04:58:49 +08:00
										 |  |  |             'name'                => ['required', 'string', 'max:255'], | 
					
						
							|  |  |  |             'description_html'    => ['string', 'max:2000'], | 
					
						
							|  |  |  |             'tags'                => ['array'], | 
					
						
							|  |  |  |             'default_template_id' => ['nullable', 'integer'], | 
					
						
							| 
									
										
										
										
											2015-07-28 03:17:08 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $book = $this->entityQueries->books->findVisibleBySlugOrFail($bookSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-create', $book); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |         $chapter = $this->chapterRepo->create($validated, $book); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($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(); | 
					
						
							| 
									
										
										
										
											2024-02-11 23:42:37 +08:00
										 |  |  |         $pages = $this->entityQueries->pages->visibleForChapterList($chapter->id)->get(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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(), | 
					
						
							| 
									
										
										
										
											2023-12-19 00:23:40 +08:00
										 |  |  |             'referenceCount' => $this->referenceFetcher->getReferenceCountToEntity($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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |         $validated = $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2024-01-02 04:58:49 +08:00
										 |  |  |             'name'                => ['required', 'string', 'max:255'], | 
					
						
							|  |  |  |             'description_html'    => ['string', 'max:2000'], | 
					
						
							|  |  |  |             'tags'                => ['array'], | 
					
						
							|  |  |  |             'default_template_id' => ['nullable', 'integer'], | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-update', $chapter); | 
					
						
							| 
									
										
										
										
											2018-03-30 21:09:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-17 23:02:15 +08:00
										 |  |  |         $this->chapterRepo->update($chapter, $validated); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($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
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2023-12-10 20:37:21 +08:00
										 |  |  |      * @throws NotFoundException|NotifyException | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($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 { | 
					
						
							| 
									
										
										
										
											2023-12-10 20:37:21 +08:00
										 |  |  |             $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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-10 20:37:21 +08:00
										 |  |  |             return redirect($chapter->getUrl('/move')); | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |         $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) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |         $this->checkOwnablePermission('chapter-view', $chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $entitySelection = $request->get('entity_selection') ?: null; | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |         $newParentBook = $entitySelection ? $this->entityQueries->findVisibleByStringIdentifier($entitySelection) : $chapter->getParent(); | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |         if (!$newParentBook instanceof Book) { | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |             $this->showErrorNotification(trans('errors.selected_book_not_found')); | 
					
						
							| 
									
										
										
										
											2021-12-21 01:40:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-10 20:37:21 +08:00
										 |  |  |             return redirect($chapter->getUrl('/copy')); | 
					
						
							| 
									
										
										
										
											2021-12-19 23:40:52 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $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) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         $chapter = $this->queries->findVisibleBySlugsOrFail($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2022-06-14 23:42:29 +08:00
										 |  |  |         $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
										 |  |  | } |