From 0bc5ccba3206dd8a70dd89183acbbe8b592ab879 Mon Sep 17 00:00:00 2001 From: Dan Brown <ssddanbrown@googlemail.com> Date: Sat, 20 Apr 2019 13:25:16 +0100 Subject: [PATCH] Add revision restore confirm and changed http method Closes #1321 --- resources/lang/en/entities.php | 1 + resources/views/pages/revisions.blade.php | 15 +++++++- routes/web.php | 2 +- tests/Entity/PageContentTest.php | 45 ---------------------- tests/Entity/PageRevisionTest.php | 46 ++++++++++++++++++++++- 5 files changed, 61 insertions(+), 48 deletions(-) diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index 8a3aeb022..abcd2cf23 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -299,6 +299,7 @@ return [ // Revision 'revision_delete_confirm' => 'Are you sure you want to delete this revision?', + 'revision_restore_confirm' => 'Are you sure you want to restore this revision? The current page contents will be replaced.', 'revision_delete_success' => 'Revision deleted', 'revision_cannot_delete_latest' => 'Cannot delete the latest revision.' ]; \ No newline at end of file diff --git a/resources/views/pages/revisions.blade.php b/resources/views/pages/revisions.blade.php index 9d968c016..e5515a7c9 100644 --- a/resources/views/pages/revisions.blade.php +++ b/resources/views/pages/revisions.blade.php @@ -50,7 +50,20 @@ @else <a href="{{ $revision->getUrl() }}" target="_blank">{{ trans('entities.pages_revisions_preview') }}</a> <span class="text-muted"> | </span> - <a href="{{ $revision->getUrl('restore') }}">{{ trans('entities.pages_revisions_restore') }}</a> + <a href="{{ $revision->getUrl('restore') }}"></a> + <div dropdown class="dropdown-container"> + <a dropdown-toggle>{{ trans('entities.pages_revisions_restore') }}</a> + <ul> + <li class="px-m py-s"><small class="text-muted">{{trans('entities.revision_restore_confirm')}}</small></li> + <li> + <form action="{{ $revision->getUrl('/restore') }}" method="POST"> + {!! csrf_field() !!} + <input type="hidden" name="_method" value="PUT"> + <button type="submit" class="text-button text-primary">@icon('history'){{ trans('entities.pages_revisions_restore') }}</button> + </form> + </li> + </ul> + </div> <span class="text-muted"> | </span> <div dropdown class="dropdown-container"> <a dropdown-toggle>{{ trans('common.delete') }}</a> diff --git a/routes/web.php b/routes/web.php index d1a8b7969..695f61654 100644 --- a/routes/web.php +++ b/routes/web.php @@ -77,7 +77,7 @@ Route::group(['middleware' => 'auth'], function () { Route::get('/{bookSlug}/page/{pageSlug}/revisions', 'PageController@showRevisions'); Route::get('/{bookSlug}/page/{pageSlug}/revisions/{revId}', 'PageController@showRevision'); Route::get('/{bookSlug}/page/{pageSlug}/revisions/{revId}/changes', 'PageController@showRevisionChanges'); - Route::get('/{bookSlug}/page/{pageSlug}/revisions/{revId}/restore', 'PageController@restoreRevision'); + Route::put('/{bookSlug}/page/{pageSlug}/revisions/{revId}/restore', 'PageController@restoreRevision'); Route::delete('/{bookSlug}/page/{pageSlug}/revisions/{revId}/delete', 'PageController@destroyRevision'); // Chapters diff --git a/tests/Entity/PageContentTest.php b/tests/Entity/PageContentTest.php index 124866e76..03cf03956 100644 --- a/tests/Entity/PageContentTest.php +++ b/tests/Entity/PageContentTest.php @@ -71,51 +71,6 @@ class PageContentTest extends TestCase $pageResp->assertSee($content); } - public function test_page_revision_views_viewable() - { - $this->asEditor(); - - $pageRepo = app(PageRepo::class); - $page = Page::first(); - $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']); - $pageRevision = $page->revisions->last(); - - $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id); - $revisionView->assertStatus(200); - $revisionView->assertSee('new content'); - - $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id . '/changes'); - $revisionView->assertStatus(200); - $revisionView->assertSee('new content'); - } - - public function test_page_revision_restore_updates_content() - { - $this->asEditor(); - - $pageRepo = app(PageRepo::class); - $page = Page::first(); - $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>', 'summary' => 'initial page revision testing']); - $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page again', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']); - $page = Page::find($page->id); - - - $pageView = $this->get($page->getUrl()); - $pageView->assertDontSee('abc123'); - $pageView->assertDontSee('def456'); - - $revToRestore = $page->revisions()->where('name', 'like', '%abc123')->first(); - $restoreReq = $this->get($page->getUrl() . '/revisions/' . $revToRestore->id . '/restore'); - $page = Page::find($page->id); - - $restoreReq->assertStatus(302); - $restoreReq->assertRedirect($page->getUrl()); - - $pageView = $this->get($page->getUrl()); - $pageView->assertSee('abc123'); - $pageView->assertSee('def456'); - } - public function test_page_content_scripts_escaped_by_default() { $this->asEditor(); diff --git a/tests/Entity/PageRevisionTest.php b/tests/Entity/PageRevisionTest.php index 015320dd7..521ea79a4 100644 --- a/tests/Entity/PageRevisionTest.php +++ b/tests/Entity/PageRevisionTest.php @@ -1,11 +1,55 @@ <?php namespace Entity; - use BookStack\Entities\Page; +use BookStack\Entities\Repos\PageRepo; use Tests\TestCase; class PageRevisionTest extends TestCase { + public function test_page_revision_views_viewable() + { + $this->asEditor(); + + $pageRepo = app(PageRepo::class); + $page = Page::first(); + $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']); + $pageRevision = $page->revisions->last(); + + $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id); + $revisionView->assertStatus(200); + $revisionView->assertSee('new content'); + + $revisionView = $this->get($page->getUrl() . '/revisions/' . $pageRevision->id . '/changes'); + $revisionView->assertStatus(200); + $revisionView->assertSee('new content'); + } + + public function test_page_revision_restore_updates_content() + { + $this->asEditor(); + + $pageRepo = app(PageRepo::class); + $page = Page::first(); + $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page abc123', 'html' => '<p>new contente def456</p>', 'summary' => 'initial page revision testing']); + $pageRepo->updatePage($page, $page->book_id, ['name' => 'updated page again', 'html' => '<p>new content</p>', 'summary' => 'page revision testing']); + $page = Page::find($page->id); + + + $pageView = $this->get($page->getUrl()); + $pageView->assertDontSee('abc123'); + $pageView->assertDontSee('def456'); + + $revToRestore = $page->revisions()->where('name', 'like', '%abc123')->first(); + $restoreReq = $this->put($page->getUrl() . '/revisions/' . $revToRestore->id . '/restore'); + $page = Page::find($page->id); + + $restoreReq->assertStatus(302); + $restoreReq->assertRedirect($page->getUrl()); + + $pageView = $this->get($page->getUrl()); + $pageView->assertSee('abc123'); + $pageView->assertSee('def456'); + } public function test_page_revision_count_increments_on_update() {