]> BookStack Code Mirror - bookstack/commitdiff
Aligned page edit controller method data usage
authorDan Brown <redacted>
Sun, 17 Apr 2022 22:01:14 +0000 (23:01 +0100)
committerDan Brown <redacted>
Sun, 17 Apr 2022 22:01:14 +0000 (23:01 +0100)
Extracted page editor view data gathering to its own class for
alignment. Updated the data used in views as part of the process to use
view-specific variables instead of custom attributes added to models.
Also moved tinymce library loading so it's not loaded when not using the
wysiwyg editor.

app/Entities/Tools/PageEditActivity.php
app/Entities/Tools/PageEditorData.php [new file with mode: 0644]
app/Http/Controllers/PageController.php
resources/views/pages/edit.blade.php
resources/views/pages/parts/form.blade.php
resources/views/pages/parts/wysiwyg-editor.blade.php

index 9981a6ed7ae2f6fa7742729f9d01ed34ddb0af68..2672de94145d7c57a1543eb4271602ed7fb80972 100644 (file)
@@ -9,7 +9,7 @@ use Illuminate\Database\Eloquent\Builder;
 
 class PageEditActivity
 {
-    protected $page;
+    protected Page $page;
 
     /**
      * PageEditActivity constructor.
diff --git a/app/Entities/Tools/PageEditorData.php b/app/Entities/Tools/PageEditorData.php
new file mode 100644 (file)
index 0000000..a681883
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+namespace BookStack\Entities\Tools;
+
+use BookStack\Entities\Models\Page;
+use BookStack\Entities\Repos\PageRepo;
+
+class PageEditorData
+{
+    protected Page $page;
+    protected PageRepo $pageRepo;
+
+    protected array $viewData;
+    protected array $warnings;
+
+    public function __construct(Page $page, PageRepo $pageRepo)
+    {
+        $this->page = $page;
+        $this->pageRepo = $pageRepo;
+        $this->viewData = $this->build();
+    }
+
+    public function getViewData(): array
+    {
+        return $this->viewData;
+    }
+
+    public function getWarnings(): array
+    {
+        return $this->warnings;
+    }
+
+    protected function build(): array
+    {
+        $page = clone $this->page;
+        $isDraft = boolval($this->page->draft);
+        $templates = $this->pageRepo->getTemplates(10);
+        $draftsEnabled = auth()->check();
+
+        $isDraftRevision = false;
+        $this->warnings = [];
+        $editActivity = new PageEditActivity($page);
+
+        if ($editActivity->hasActiveEditing()) {
+            $this->warnings[] = $editActivity->activeEditingMessage();
+        }
+
+        // Check for a current draft version for this user
+        $userDraft = $this->pageRepo->getUserDraft($page);
+        if ($userDraft !== null) {
+            $page->forceFill($userDraft->only(['name', 'html', 'markdown']));
+            $isDraftRevision = true;
+            $this->warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft);
+        }
+
+        return [
+            'page'            => $page,
+            'book'            => $page->book,
+            'isDraft'         => $isDraft,
+            'isDraftRevision' => $isDraftRevision,
+            'draftsEnabled'   => $draftsEnabled,
+            'templates'       => $templates,
+            'editor'          =>  setting('app-editor') === 'wysiwyg' ? 'wysiwyg' : 'markdown',
+        ];
+    }
+
+}
\ No newline at end of file
index ec48e63f5a9a2fb6ea34f27530742596a5b205df..232c6b034e3c7a3ddcc8dc88185ecfddb1632811 100644 (file)
@@ -10,6 +10,7 @@ use BookStack\Entities\Tools\Cloner;
 use BookStack\Entities\Tools\NextPreviousContentLocator;
 use BookStack\Entities\Tools\PageContent;
 use BookStack\Entities\Tools\PageEditActivity;
+use BookStack\Entities\Tools\PageEditorData;
 use BookStack\Entities\Tools\PermissionsUpdater;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Exceptions\PermissionsException;
@@ -21,7 +22,7 @@ use Throwable;
 
 class PageController extends Controller
 {
-    protected $pageRepo;
+    protected PageRepo $pageRepo;
 
     /**
      * PageController constructor.
@@ -86,19 +87,11 @@ class PageController extends Controller
     {
         $draft = $this->pageRepo->getById($pageId);
         $this->checkOwnablePermission('page-create', $draft->getParent());
-        $this->setPageTitle(trans('entities.pages_edit_draft'));
 
-        $draftsEnabled = $this->isSignedIn();
-        $templates = $this->pageRepo->getTemplates(10);
+        $editorData = new PageEditorData($draft, $this->pageRepo);
+        $this->setPageTitle(trans('entities.pages_edit_draft'));
 
-        return view('pages.edit', [
-            'page'          => $draft,
-            'book'          => $draft->book,
-            'isDraft'       => true,
-            'draftsEnabled' => $draftsEnabled,
-            'templates'     => $templates,
-            'editor'        =>  setting('app-editor') === 'wysiwyg' ? 'wysiwyg' : 'markdown',
-        ]);
+        return view('pages.edit', $editorData->getViewData());
     }
 
     /**
@@ -194,39 +187,14 @@ class PageController extends Controller
         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
         $this->checkOwnablePermission('page-update', $page);
 
-        $page->isDraft = false;
-        $editActivity = new PageEditActivity($page);
-
-        // Check for active editing
-        $warnings = [];
-        if ($editActivity->hasActiveEditing()) {
-            $warnings[] = $editActivity->activeEditingMessage();
+        $editorData = new PageEditorData($page, $this->pageRepo);
+        if ($editorData->getWarnings()) {
+            $this->showWarningNotification(implode("\n", $editorData->getWarnings()));
         }
 
-        // Check for a current draft version for this user
-        $userDraft = $this->pageRepo->getUserDraft($page);
-        if ($userDraft !== null) {
-            $page->forceFill($userDraft->only(['name', 'html', 'markdown']));
-            $page->isDraft = true;
-            $warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft);
-        }
-
-        if (count($warnings) > 0) {
-            $this->showWarningNotification(implode("\n", $warnings));
-        }
-
-        $templates = $this->pageRepo->getTemplates(10);
-        $draftsEnabled = $this->isSignedIn();
         $this->setPageTitle(trans('entities.pages_editing_named', ['pageName' => $page->getShortName()]));
 
-        return view('pages.edit', [
-            'page'          => $page,
-            'book'          => $page->book,
-            'current'       => $page,
-            'draftsEnabled' => $draftsEnabled,
-            'templates'     => $templates,
-            'editor'        =>  setting('app-editor') === 'wysiwyg' ? 'wysiwyg' : 'markdown',
-        ]);
+        return view('pages.edit', $editorData->getViewData());
     }
 
     /**
index 30158e852afdb3f368ce9202991c06c64eedb7e5..de7c82d2102f5b3f3c62f2b84ab329c95eaa5f66 100644 (file)
@@ -1,9 +1,5 @@
 @extends('layouts.base')
 
-@section('head')
-    <script src="{{ url('/libs/tinymce/tinymce.min.js?ver=5.10.2') }}" nonce="{{ $cspNonce }}"></script>
-@stop
-
 @section('body-class', 'flexbox')
 
 @section('content')
@@ -12,9 +8,7 @@
         <form action="{{ $page->getUrl() }}" autocomplete="off" data-page-id="{{ $page->id }}" method="POST" class="flex flex-fill">
             {{ csrf_field() }}
 
-            @if(!isset($isDraft))
-                <input type="hidden" name="_method" value="PUT">
-            @endif
+            @if($isDraft) {{ method_field('PUT') }} @endif
             @include('pages.parts.form', ['model' => $page])
             @include('pages.parts.editor-toolbox')
         </form>
index 6646d508f20e180b338ff4e57800b70127b14283..3507705aa31ba5b581d7a12b29e604997c94f24c 100644 (file)
@@ -8,8 +8,8 @@
      @endif
      option:page-editor:editor-type="{{ setting('app-editor') }}"
      option:page-editor:page-id="{{ $model->id ?? '0' }}"
-     option:page-editor:page-new-draft="{{ ($model->draft ?? false) ? 'true' : 'false' }}"
-     option:page-editor:draft-text="{{ ($model->draft || $model->isDraft) ? trans('entities.pages_editing_draft') : trans('entities.pages_editing_page') }}"
+     option:page-editor:page-new-draft="{{ $isDraft ? 'true' : 'false' }}"
+     option:page-editor:draft-text="{{ ($isDraft || $isDraftRevision) ? trans('entities.pages_editing_draft') : trans('entities.pages_editing_page') }}"
      option:page-editor:autosave-fail-text="{{ trans('errors.page_draft_autosave_fail') }}"
      option:page-editor:editing-page-text="{{ trans('entities.pages_editing_page') }}"
      option:page-editor:draft-discarded-text="{{ trans('entities.pages_draft_discarded') }}"
@@ -20,7 +20,7 @@
         <div class="grid third no-break v-center">
 
             <div class="action-buttons text-left px-m py-xs">
-                <a href="{{ $page->draft ? $page->getParent()->getUrl() : $page->getUrl() }}"
+                <a href="{{ $isDraft ? $page->getParent()->getUrl() : $page->getUrl() }}"
                    class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a>
             </div>
 
                         <li>
                             <button refs="page-editor@saveDraft" type="button" class="text-pos">@icon('save'){{ trans('entities.pages_edit_save_draft') }}</button>
                         </li>
-                        @if ($model->draft)
+                        @if($isDraft)
                         <li>
                             <a href="{{ $model->getUrl('/delete') }}" class="text-neg">@icon('delete'){{ trans('entities.pages_edit_delete_draft') }}</a>
                         </li>
                         @endif
-                        <li refs="page-editor@discardDraftWrap" class="{{ ($model->isDraft ?? false) ? '' : 'hidden' }}">
+                        <li refs="page-editor@discardDraftWrap" class="{{ $isDraft ? '' : 'hidden' }}">
                             <button refs="page-editor@discardDraft" type="button" class="text-neg">@icon('cancel'){{ trans('entities.pages_edit_discard_draft') }}</button>
                         </li>
                         @if(userCan('editor-change'))
                             <li>
-                                <button refs="page-editor@swapEditor" type="button">
-                                    @icon('swap-horizontal')
-                                    {{ $editor === 'wysiwyg' ? trans('entities.pages_edit_switch_to_markdown') : trans('entities.pages_edit_switch_to_wysiwyg') }}
-                                </button>
+                                <a href="{{ $model->getUrl($isDraft ? '' : '/edit') }}?editor={{ $editor === 'wysiwyg' ? 'markdown' : 'wysiwyg' }}">
+                                    @icon('swap-horizontal'){{ $editor === 'wysiwyg' ? trans('entities.pages_edit_switch_to_markdown') : trans('entities.pages_edit_switch_to_wysiwyg') }}
+                                </a>
                             </li>
                         @endif
                     </ul>
index 29a4b6532b596f32e3e44606d934bd4ec49e377a..d8ca7493980ec1438839effd8981d7d08fdd6173 100644 (file)
@@ -1,3 +1,7 @@
+@push('head')
+    <script src="{{ url('/libs/tinymce/tinymce.min.js?ver=5.10.2') }}" nonce="{{ $cspNonce }}"></script>
+@endpush
+
 <div component="wysiwyg-editor"
      option:wysiwyg-editor:language="{{ config('app.lang') }}"
      option:wysiwyg-editor:page-id="{{ $model->id ?? 0 }}"