From b546098b365b611b34c004e120c543efb9311d2e Mon Sep 17 00:00:00 2001
From: Dan Brown <ssddanbrown@googlemail.com>
Date: Mon, 15 Nov 2021 11:17:27 +0000
Subject: [PATCH] Fixed page editor back button sometimes going nowhere

Updated the back button to be a proper link instead of a reference to
the last viewed URL since it could break if the last page was the
current one (On validation for example).

Includes test to cover.
Also applied some styleCI changes.

Fixes #2834
---
 .../Controllers/Api/SearchApiController.php   |  8 ++----
 app/Http/Controllers/AttachmentController.php |  1 -
 resources/views/pages/parts/form.blade.php    |  3 +-
 tests/Entity/PageEditorTest.php               | 28 +++++++++++++++++++
 4 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/app/Http/Controllers/Api/SearchApiController.php b/app/Http/Controllers/Api/SearchApiController.php
index 8fb249665..ba960b9d2 100644
--- a/app/Http/Controllers/Api/SearchApiController.php
+++ b/app/Http/Controllers/Api/SearchApiController.php
@@ -13,8 +13,8 @@ class SearchApiController extends ApiController
 
     protected $rules = [
         'all' => [
-            'query' => ['required'],
-            'page'  => ['integer', 'min:1'],
+            'query'  => ['required'],
+            'page'   => ['integer', 'min:1'],
             'count'  => ['integer', 'min:1', 'max:100'],
         ],
     ];
@@ -58,10 +58,8 @@ class SearchApiController extends ApiController
         }
 
         return response()->json([
-            'data' => $results['results'],
+            'data'  => $results['results'],
             'total' => $results['total'],
         ]);
     }
-
-
 }
diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php
index 445611fcb..084f6f96a 100644
--- a/app/Http/Controllers/AttachmentController.php
+++ b/app/Http/Controllers/AttachmentController.php
@@ -9,7 +9,6 @@ use BookStack\Uploads\Attachment;
 use BookStack\Uploads\AttachmentService;
 use Exception;
 use Illuminate\Contracts\Filesystem\FileNotFoundException;
-use Illuminate\Foundation\Http\Middleware\ValidatePostSize;
 use Illuminate\Http\Request;
 use Illuminate\Support\MessageBag;
 use Illuminate\Validation\ValidationException;
diff --git a/resources/views/pages/parts/form.blade.php b/resources/views/pages/parts/form.blade.php
index f6f0143da..01f68a6c5 100644
--- a/resources/views/pages/parts/form.blade.php
+++ b/resources/views/pages/parts/form.blade.php
@@ -20,7 +20,8 @@
         <div class="grid third no-break v-center">
 
             <div class="action-buttons text-left px-m py-xs">
-                <a href="{{ back()->getTargetUrl() }}" class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a>
+                <a href="{{ $page->draft ? $page->getParent()->getUrl() : $page->getUrl() }}"
+                   class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a>
             </div>
 
             <div class="text-center px-m py-xs">
diff --git a/tests/Entity/PageEditorTest.php b/tests/Entity/PageEditorTest.php
index 652bc1336..c06aa5bf1 100644
--- a/tests/Entity/PageEditorTest.php
+++ b/tests/Entity/PageEditorTest.php
@@ -3,6 +3,7 @@
 namespace Tests\Entity;
 
 use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Models\Page;
 use Tests\TestCase;
 
@@ -74,4 +75,31 @@ class PageEditorTest extends TestCase
             'draft'    => false,
         ]);
     }
+
+    public function test_back_link_in_editor_has_correct_url()
+    {
+        /** @var Book $book */
+        $book = Book::query()->whereHas('pages')->whereHas('chapters')->firstOrFail();
+        $this->asEditor()->get($book->getUrl('/create-page'));
+        /** @var Chapter $chapter */
+        $chapter = $book->chapters()->firstOrFail();
+        /** @var Page $draft */
+        $draft = $book->pages()->where('draft', '=', true)->firstOrFail();
+
+        // Book draft goes back to book
+        $resp = $this->get($book->getUrl("/draft/{$draft->id}"));
+        $resp->assertElementContains('a[href="' . $book->getUrl() . '"]', 'Back');
+
+        // Chapter draft goes back to chapter
+        $draft->chapter_id = $chapter->id;
+        $draft->save();
+        $resp = $this->get($book->getUrl("/draft/{$draft->id}"));
+        $resp->assertElementContains('a[href="' . $chapter->getUrl() . '"]', 'Back');
+
+        // Saved page goes back to page
+        $this->post($book->getUrl("/draft/{$draft->id}"), ['name' => 'Updated', 'html' => 'Updated']);
+        $draft->refresh();
+        $resp = $this->get($draft->getUrl('/edit'));
+        $resp->assertElementContains('a[href="' . $draft->getUrl() . '"]', 'Back');
+    }
 }