| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Entities\Controllers; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\Models\View; | 
					
						
							| 
									
										
										
										
											2023-06-07 20:24:49 +08:00
										 |  |  | use BookStack\Activity\Tools\CommentTree; | 
					
						
							| 
									
										
										
										
											2023-08-09 21:53:31 +08:00
										 |  |  | use BookStack\Activity\Tools\UserEntityWatchOptions; | 
					
						
							| 
									
										
										
										
											2022-12-03 01:43:51 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | use BookStack\Entities\Models\Page; | 
					
						
							|  |  |  | use BookStack\Entities\Repos\PageRepo; | 
					
						
							| 
									
										
										
										
											2020-11-22 07:20:54 +08:00
										 |  |  | use BookStack\Entities\Tools\BookContents; | 
					
						
							| 
									
										
										
										
											2021-12-19 20:56:27 +08:00
										 |  |  | use BookStack\Entities\Tools\Cloner; | 
					
						
							| 
									
										
										
										
											2021-05-29 19:39:41 +08:00
										 |  |  | use BookStack\Entities\Tools\NextPreviousContentLocator; | 
					
						
							| 
									
										
										
										
											2020-11-22 07:20:54 +08:00
										 |  |  | use BookStack\Entities\Tools\PageContent; | 
					
						
							|  |  |  | use BookStack\Entities\Tools\PageEditActivity; | 
					
						
							| 
									
										
										
										
											2022-04-18 06:01:14 +08:00
										 |  |  | use BookStack\Entities\Tools\PageEditorData; | 
					
						
							| 
									
										
										
										
											2018-09-25 23:58:03 +08:00
										 |  |  | use BookStack\Exceptions\NotFoundException; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +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; | 
					
						
							| 
									
										
										
										
											2019-09-16 05:33:27 +08:00
										 |  |  | use Exception; | 
					
						
							| 
									
										
										
										
											2022-01-25 05:21:30 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Relations\BelongsTo; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | use Illuminate\Http\Request; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use Illuminate\Validation\ValidationException; | 
					
						
							| 
									
										
										
										
											2019-09-16 05:33:27 +08:00
										 |  |  | use Throwable; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class PageController extends Controller | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-06-16 20:08:04 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected PageRepo $pageRepo, | 
					
						
							|  |  |  |         protected ReferenceFetcher $referenceFetcher | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * Show the form for creating a new page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws Throwable | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function create(string $bookSlug, string $chapterSlug = null) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $parent = $this->pageRepo->getParentFromSlugs($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('page-create', $parent); | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Redirect to draft edit screen if signed in
 | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |         if ($this->isSignedIn()) { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $draft = $this->pageRepo->getNewDraftPage($parent); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |             return redirect($draft->getUrl()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-14 21:12:29 +08:00
										 |  |  |         // Otherwise show the edit view if they're a guest
 | 
					
						
							| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.pages_new')); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-02 19:41:41 +08:00
										 |  |  |         return view('pages.guest-create', ['parent' => $parent]); | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Create a new page as a guest user. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws ValidationException | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function createAsGuest(Request $request, string $bookSlug, string $chapterSlug = null) | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2021-11-05 08:26:55 +08:00
										 |  |  |             'name' => ['required', 'string', 'max:255'], | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $parent = $this->pageRepo->getParentFromSlugs($bookSlug, $chapterSlug); | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |         $this->checkOwnablePermission('page-create', $parent); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getNewDraftPage($parent); | 
					
						
							|  |  |  |         $this->pageRepo->publishDraft($page, [ | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |             'name' => $request->get('name'), | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |         return redirect($page->getUrl('/edit')); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show form to continue editing a draft page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-04-19 00:39:28 +08:00
										 |  |  |     public function editDraft(Request $request, string $bookSlug, int $pageId) | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $draft = $this->pageRepo->getById($pageId); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         $this->checkOwnablePermission('page-create', $draft->getParent()); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-19 00:39:28 +08:00
										 |  |  |         $editorData = new PageEditorData($draft, $this->pageRepo, $request->query('editor', '')); | 
					
						
							| 
									
										
										
										
											2022-04-18 06:01:14 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.pages_edit_draft')); | 
					
						
							| 
									
										
										
										
											2019-08-12 03:04:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-18 06:01:14 +08:00
										 |  |  |         return view('pages.edit', $editorData->getViewData()); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      * Store a new page by changing a draft into a page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      * @throws ValidationException | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function store(Request $request, string $bookSlug, int $pageId) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2021-11-05 08:26:55 +08:00
										 |  |  |             'name' => ['required', 'string', 'max:255'], | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $draftPage = $this->pageRepo->getById($pageId); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         $this->checkOwnablePermission('page-create', $draftPage->getParent()); | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->publishDraft($draftPage, $request->all()); | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         return redirect($page->getUrl()); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * Display the specified page. | 
					
						
							| 
									
										
										
										
											2017-01-02 00:05:44 +08:00
										 |  |  |      * If the page is not found via the slug the revisions are searched for a match. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-12-28 21:19:02 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function show(string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-26 04:01:59 +08:00
										 |  |  |         try { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         } catch (NotFoundException $e) { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $page = $this->pageRepo->getByOldSlug($bookSlug, $pageSlug); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |             if ($page === null) { | 
					
						
							|  |  |  |                 throw $e; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 04:01:59 +08:00
										 |  |  |             return redirect($page->getUrl()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-09 19:40:07 +08:00
										 |  |  |         $this->checkOwnablePermission('page-view', $page); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $pageContent = (new PageContent($page)); | 
					
						
							|  |  |  |         $page->html = $pageContent->render(); | 
					
						
							|  |  |  |         $pageNav = $pageContent->getNavigation($page->html); | 
					
						
							| 
									
										
										
										
											2017-11-16 02:35:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-07 20:24:49 +08:00
										 |  |  |         $sidebarTree = (new BookContents($page->book))->getTree(); | 
					
						
							|  |  |  |         $commentTree = (new CommentTree($page)); | 
					
						
							| 
									
										
										
										
											2021-05-29 19:39:41 +08:00
										 |  |  |         $nextPreviousLocator = new NextPreviousContentLocator($page, $sidebarTree); | 
					
						
							| 
									
										
										
										
											2021-01-27 12:35:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-16 17:49:37 +08:00
										 |  |  |         View::incrementFor($page); | 
					
						
							| 
									
										
										
										
											2015-12-05 22:41:51 +08:00
										 |  |  |         $this->setPageTitle($page->getShortName()); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-02 19:41:41 +08:00
										 |  |  |         return view('pages.show', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'page'            => $page, | 
					
						
							|  |  |  |             'book'            => $page->book, | 
					
						
							|  |  |  |             'current'         => $page, | 
					
						
							|  |  |  |             'sidebarTree'     => $sidebarTree, | 
					
						
							| 
									
										
										
										
											2023-06-07 20:24:49 +08:00
										 |  |  |             'commentTree'     => $commentTree, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'pageNav'         => $pageNav, | 
					
						
							| 
									
										
										
										
											2023-08-09 21:53:31 +08:00
										 |  |  |             'watchOptions'    => new UserEntityWatchOptions(user(), $page), | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'next'            => $nextPreviousLocator->getNext(), | 
					
						
							|  |  |  |             'previous'        => $nextPreviousLocator->getPrevious(), | 
					
						
							| 
									
										
										
										
											2022-08-20 19:07:38 +08:00
										 |  |  |             'referenceCount'  => $this->referenceFetcher->getPageReferenceCountToEntity($page), | 
					
						
							| 
									
										
										
										
											2017-12-08 03:19:25 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get page from an ajax request. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function getPageAjax(int $pageId) | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getById($pageId); | 
					
						
							| 
									
										
										
										
											2020-07-06 04:18:17 +08:00
										 |  |  |         $page->setHidden(array_diff($page->getHidden(), ['html', 'markdown'])); | 
					
						
							| 
									
										
										
										
											2021-10-27 05:04:18 +08:00
										 |  |  |         $page->makeHidden(['book']); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         return response()->json($page); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * Show the form for editing the specified page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-04-19 00:39:28 +08:00
										 |  |  |     public function edit(Request $request, string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('page-update', $page); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-19 00:39:28 +08:00
										 |  |  |         $editorData = new PageEditorData($page, $this->pageRepo, $request->query('editor', '')); | 
					
						
							| 
									
										
										
										
											2022-04-18 06:01:14 +08:00
										 |  |  |         if ($editorData->getWarnings()) { | 
					
						
							|  |  |  |             $this->showWarningNotification(implode("\n", $editorData->getWarnings())); | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.pages_editing_named', ['pageName' => $page->getShortName()])); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-18 06:01:14 +08:00
										 |  |  |         return view('pages.edit', $editorData->getViewData()); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * Update the specified page in storage. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws ValidationException | 
					
						
							|  |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function update(Request $request, string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-12-28 23:58:13 +08:00
										 |  |  |         $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2021-11-05 08:26:55 +08:00
										 |  |  |             'name' => ['required', 'string', 'max:255'], | 
					
						
							| 
									
										
										
										
											2015-12-28 23:58:13 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('page-update', $page); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->pageRepo->update($page, $request->all()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         return redirect($page->getUrl()); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Save a draft update as a revision. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function saveDraft(Request $request, int $pageId) | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getById($pageId); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         $this->checkOwnablePermission('page-update', $page); | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 07:18:28 +08:00
										 |  |  |         if (!$this->isSignedIn()) { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             return $this->jsonError(trans('errors.guests_cannot_save_drafts'), 500); | 
					
						
							| 
									
										
										
										
											2016-09-29 22:56:57 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 18:27:55 +08:00
										 |  |  |         $draft = $this->pageRepo->updatePageDraft($page, $request->only(['name', 'html', 'markdown'])); | 
					
						
							| 
									
										
										
										
											2021-10-05 03:26:55 +08:00
										 |  |  |         $warnings = (new PageEditActivity($page))->getWarningMessagesForDraft($draft); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-09 20:36:32 +08:00
										 |  |  |         return response()->json([ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'status'    => 'success', | 
					
						
							|  |  |  |             'message'   => trans('entities.pages_edit_draft_save_at'), | 
					
						
							| 
									
										
										
										
											2021-10-05 03:26:55 +08:00
										 |  |  |             'warning'   => implode("\n", $warnings), | 
					
						
							|  |  |  |             'timestamp' => $draft->updated_at->timestamp, | 
					
						
							| 
									
										
										
										
											2016-04-09 20:36:32 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-22 03:13:29 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * Redirect from a special link url which uses the page id rather than the name. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-07-22 03:13:29 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function redirectFromLink(int $pageId) | 
					
						
							| 
									
										
										
										
											2015-07-17 02:15:22 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getById($pageId); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-17 02:15:22 +08:00
										 |  |  |         return redirect($page->getUrl()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show the deletion page for the specified page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function showDelete(string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('page-delete', $page); | 
					
						
							| 
									
										
										
										
											2021-05-29 19:39:41 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.pages_delete_named', ['pageName' => $page->getShortName()])); | 
					
						
							| 
									
										
										
										
											2023-12-12 20:14:00 +08:00
										 |  |  |         $usedAsTemplate = Book::query()->where('default_template_id', '=', $page->id)->count() > 0; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         return view('pages.delete', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'book'    => $page->book, | 
					
						
							|  |  |  |             'page'    => $page, | 
					
						
							|  |  |  |             'current' => $page, | 
					
						
							| 
									
										
										
										
											2023-12-11 20:33:20 +08:00
										 |  |  |             'usedAsTemplate' => $usedAsTemplate, | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show the deletion page for the specified page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function showDeleteDraft(string $bookSlug, int $pageId) | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getById($pageId); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         $this->checkOwnablePermission('page-update', $page); | 
					
						
							| 
									
										
										
										
											2021-05-29 19:39:41 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.pages_delete_draft_named', ['pageName' => $page->getShortName()])); | 
					
						
							| 
									
										
										
										
											2023-12-12 20:14:00 +08:00
										 |  |  |         $usedAsTemplate = Book::query()->where('default_template_id', '=', $page->id)->count() > 0; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         return view('pages.delete', [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'book'    => $page->book, | 
					
						
							|  |  |  |             'page'    => $page, | 
					
						
							|  |  |  |             'current' => $page, | 
					
						
							| 
									
										
										
										
											2023-12-11 23:55:43 +08:00
										 |  |  |             'usedAsTemplate' => $usedAsTemplate, | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * Remove the specified page from storage. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      * @throws Throwable | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function destroy(string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2016-02-28 03:24:42 +08:00
										 |  |  |         $this->checkOwnablePermission('page-delete', $page); | 
					
						
							| 
									
										
										
										
											2020-11-08 06:37:27 +08:00
										 |  |  |         $parent = $page->getParent(); | 
					
						
							| 
									
										
										
										
											2017-10-16 02:14:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $this->pageRepo->destroy($page); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-16 19:54:53 +08:00
										 |  |  |         return redirect($parent->getUrl()); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Remove the specified draft page from storage. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * @throws Throwable | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function destroyDraft(string $bookSlug, int $pageId) | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getById($pageId); | 
					
						
							| 
									
										
										
										
											2017-01-02 00:05:44 +08:00
										 |  |  |         $book = $page->book; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $chapter = $page->chapter; | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         $this->checkOwnablePermission('page-update', $page); | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $this->pageRepo->destroy($page); | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $this->showSuccessNotification(trans('entities.pages_delete_draft_success')); | 
					
						
							| 
									
										
										
										
											2016-07-08 01:42:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         if ($chapter && userCan('view', $chapter)) { | 
					
						
							|  |  |  |             return redirect($chapter->getUrl()); | 
					
						
							| 
									
										
										
										
											2018-09-15 17:45:42 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         return redirect($book->getUrl()); | 
					
						
							| 
									
										
										
										
											2018-09-15 17:45:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 02:51:01 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * Show a listing of recently created pages. | 
					
						
							| 
									
										
										
										
											2016-02-21 02:51:01 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function showRecentlyUpdated() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-01-25 05:21:30 +08:00
										 |  |  |         $visibleBelongsScope = function (BelongsTo $query) { | 
					
						
							|  |  |  |             $query->scopes('visible'); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $pages = Page::visible()->with(['updatedBy', 'book' => $visibleBelongsScope, 'chapter' => $visibleBelongsScope]) | 
					
						
							| 
									
										
										
										
											2022-01-19 05:08:01 +08:00
										 |  |  |             ->orderBy('updated_at', 'desc') | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             ->paginate(20) | 
					
						
							|  |  |  |             ->setPath(url('/pages/recently-updated')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 21:33:24 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.recently_updated_pages')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-23 20:34:08 +08:00
										 |  |  |         return view('common.detailed-listing-paginated', [ | 
					
						
							| 
									
										
										
										
											2022-01-19 05:08:01 +08:00
										 |  |  |             'title'         => trans('entities.recently_updated_pages'), | 
					
						
							|  |  |  |             'entities'      => $pages, | 
					
						
							|  |  |  |             'showUpdatedBy' => true, | 
					
						
							| 
									
										
										
										
											2022-01-25 05:21:30 +08:00
										 |  |  |             'showPath'      => true, | 
					
						
							| 
									
										
										
										
											2016-02-21 02:51:01 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 04:04:18 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show the view to choose a new parent to move a page into. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-06-12 04:04:18 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function showMove(string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2016-06-12 04:04:18 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2016-06-12 04:04:18 +08:00
										 |  |  |         $this->checkOwnablePermission('page-update', $page); | 
					
						
							| 
									
										
										
										
											2019-01-05 22:39:40 +08:00
										 |  |  |         $this->checkOwnablePermission('page-delete', $page); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-02 19:41:41 +08:00
										 |  |  |         return view('pages.move', [ | 
					
						
							| 
									
										
										
										
											2017-01-02 00:05:44 +08:00
										 |  |  |             'book' => $page->book, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'page' => $page, | 
					
						
							| 
									
										
										
										
											2016-06-12 04:04:18 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |      * Does the action of moving the location of a page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2019-09-16 05:33:27 +08:00
										 |  |  |      * @throws Throwable | 
					
						
							| 
									
										
										
										
											2016-06-25 22:31:38 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-09-16 01:53:30 +08:00
										 |  |  |     public function move(Request $request, string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |         $this->checkOwnablePermission('page-update', $page); | 
					
						
							| 
									
										
										
										
											2019-01-05 22:39:40 +08:00
										 |  |  |         $this->checkOwnablePermission('page-delete', $page); | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $entitySelection = $request->get('entity_selection', null); | 
					
						
							|  |  |  |         if ($entitySelection === null || $entitySelection === '') { | 
					
						
							|  |  |  |             return redirect($page->getUrl()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 00:05:44 +08:00
										 |  |  |         try { | 
					
						
							| 
									
										
										
										
											2023-06-12 23:45:30 +08:00
										 |  |  |             $this->pageRepo->move($page, $entitySelection); | 
					
						
							| 
									
										
										
										
											2022-01-06 00:11:11 +08:00
										 |  |  |         } catch (PermissionsException $exception) { | 
					
						
							|  |  |  |             $this->showPermissionError(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         } catch (Exception $exception) { | 
					
						
							|  |  |  |             $this->showErrorNotification(trans('errors.selected_book_chapter_not_found')); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-10 20:37:21 +08:00
										 |  |  |             return redirect($page->getUrl('/move')); | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return redirect($page->getUrl()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show the view to copy a page. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |     public function showCopy(string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2018-12-31 14:01:49 +08:00
										 |  |  |         $this->checkOwnablePermission('page-view', $page); | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |         session()->flashInput(['name' => $page->name]); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-02 19:41:41 +08:00
										 |  |  |         return view('pages.copy', [ | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |             'book' => $page->book, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'page' => $page, | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Create a copy of a page within the requested target destination. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2019-09-16 05:33:27 +08:00
										 |  |  |      * @throws Throwable | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-12-19 20:56:27 +08:00
										 |  |  |     public function copy(Request $request, Cloner $cloner, string $bookSlug, string $pageSlug) | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); | 
					
						
							| 
									
										
										
										
											2018-12-31 14:01:49 +08:00
										 |  |  |         $this->checkOwnablePermission('page-view', $page); | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 20:56:27 +08:00
										 |  |  |         $entitySelection = $request->get('entity_selection') ?: null; | 
					
						
							|  |  |  |         $newParent = $entitySelection ? $this->pageRepo->findParentByIdentifier($entitySelection) : $page->getParent(); | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 20:56:27 +08:00
										 |  |  |         if (is_null($newParent)) { | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $this->showErrorNotification(trans('errors.selected_book_chapter_not_found')); | 
					
						
							| 
									
										
										
										
											2021-12-21 01:40:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-10 20:37:21 +08:00
										 |  |  |             return redirect($page->getUrl('/copy')); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 20:56:27 +08:00
										 |  |  |         $this->checkOwnablePermission('page-create', $newParent); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $newName = $request->get('name') ?: $page->name; | 
					
						
							|  |  |  |         $pageCopy = $cloner->clonePage($page, $newParent, $newName); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $this->showSuccessNotification(trans('entities.pages_copy_success')); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |         return redirect($pageCopy->getUrl()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | } |