diff --git a/app/Repos/EntityRepo.php b/app/Repos/EntityRepo.php index 449e3aa7d..f1041f126 100644 --- a/app/Repos/EntityRepo.php +++ b/app/Repos/EntityRepo.php @@ -569,6 +569,7 @@ class EntityRepo $draftPage->html = $this->formatHtml($input['html']); $draftPage->text = strip_tags($draftPage->html); $draftPage->draft = false; + $draftPage->revision_count = 1; $draftPage->save(); $this->savePageRevision($draftPage, trans('entities.pages_initial_revision')); @@ -593,6 +594,7 @@ class EntityRepo $revision->created_at = $page->updated_at; $revision->type = 'version'; $revision->summary = $summary; + $revision->revision_number = $page->revision_count; $revision->save(); // Clear old revisions @@ -812,6 +814,7 @@ class EntityRepo $page->text = strip_tags($page->html); if (setting('app-editor') !== 'markdown') $page->markdown = ''; $page->updated_by = $userId; + $page->revision_count++; $page->save(); // Remove all update drafts for this user & page. @@ -920,6 +923,7 @@ class EntityRepo */ public function restorePageRevision(Page $page, Book $book, $revisionId) { + $page->revision_count++; $this->savePageRevision($page); $revision = $page->revisions()->where('id', '=', $revisionId)->first(); $page->fill($revision->toArray()); diff --git a/database/migrations/2017_04_20_185112_add_revision_counts.php b/database/migrations/2017_04_20_185112_add_revision_counts.php new file mode 100644 index 000000000..3583f36f3 --- /dev/null +++ b/database/migrations/2017_04_20_185112_add_revision_counts.php @@ -0,0 +1,44 @@ +integer('revision_count'); + }); + Schema::table('page_revisions', function (Blueprint $table) { + $table->integer('revision_number'); + $table->index('revision_number'); + }); + + // Update revision count + $pTable = DB::getTablePrefix() . 'pages'; + $rTable = DB::getTablePrefix() . 'page_revisions'; + DB::statement("UPDATE ${pTable} SET ${pTable}.revision_count=(SELECT count(*) FROM ${rTable} WHERE ${rTable}.page_id=${pTable}.id)"); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('pages', function (Blueprint $table) { + $table->dropColumn('revision_count'); + }); + Schema::table('page_revisions', function (Blueprint $table) { + $table->dropColumn('revision_number'); + }); + } +} diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index 8644f7a4a..450f4ce48 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -14,6 +14,7 @@ return [ 'recent_activity' => 'Recent Activity', 'create_now' => 'Create one now', 'revisions' => 'Revisions', + 'meta_revision' => 'Revision #:revisionCount', 'meta_created' => 'Created :timeLength', 'meta_created_name' => 'Created :timeLength by :user', 'meta_updated' => 'Updated :timeLength', @@ -168,6 +169,7 @@ return [ 'pages_revision_named' => 'Page Revision for :pageName', 'pages_revisions_created_by' => 'Created By', 'pages_revisions_date' => 'Revision Date', + 'pages_revisions_number' => '#', 'pages_revisions_changelog' => 'Changelog', 'pages_revisions_changes' => 'Changes', 'pages_revisions_current' => 'Current Version', diff --git a/resources/views/pages/revisions.blade.php b/resources/views/pages/revisions.blade.php index 3b9812abd..bdc8460ef 100644 --- a/resources/views/pages/revisions.blade.php +++ b/resources/views/pages/revisions.blade.php @@ -19,6 +19,7 @@ + @@ -27,6 +28,7 @@ @foreach($page->revisions as $index => $revision) +
{{ trans('entities.pages_revisions_number') }} {{ trans('entities.pages_name') }} {{ trans('entities.pages_revisions_created_by') }} {{ trans('entities.pages_revisions_date') }}
{{ $revision->revision_number == 0 ? '' : $revision->revision_number }} {{ $revision->name }} @if($revision->createdBy) diff --git a/resources/views/partials/entity-meta.blade.php b/resources/views/partials/entity-meta.blade.php index 2a7427422..0442ce50c 100644 --- a/resources/views/partials/entity-meta.blade.php +++ b/resources/views/partials/entity-meta.blade.php @@ -1,13 +1,20 @@

+ @if ($entity->isA('page')) {{ trans('entities.meta_revision', ['revisionCount' => $entity->revision_count]) }}
@endif @if ($entity->createdBy) - {!! trans('entities.meta_created_name', ['timeLength' => $entity->created_at->diffForHumans(), 'user' => "".htmlentities($entity->createdBy->name). ""]) !!} + {!! trans('entities.meta_created_name', [ + 'timeLength' => ''.$entity->created_at->diffForHumans() . '', + 'user' => "".htmlentities($entity->createdBy->name). "" + ]) !!} @else - {{ trans('entities.meta_created', ['timeLength' => $entity->created_at->diffForHumans()]) }} + {{ trans('entities.meta_created', ['timeLength' => $entity->created_at->diffForHumans()]) }} @endif
@if ($entity->updatedBy) - {!! trans('entities.meta_updated_name', ['timeLength' => $entity->updated_at->diffForHumans(), 'user' => "".htmlentities($entity->updatedBy->name). ""]) !!} + {!! trans('entities.meta_updated_name', [ + 'timeLength' => '' . $entity->updated_at->diffForHumans() .'', + 'user' => "".htmlentities($entity->updatedBy->name). "" + ]) !!} @else - {{ trans('entities.meta_updated', ['timeLength' => $entity->updated_at->diffForHumans()]) }} + {{ trans('entities.meta_updated', ['timeLength' => $entity->updated_at->diffForHumans()]) }} @endif

\ No newline at end of file diff --git a/tests/Entity/EntityTest.php b/tests/Entity/EntityTest.php index 5fa331737..ef5ea3aee 100644 --- a/tests/Entity/EntityTest.php +++ b/tests/Entity/EntityTest.php @@ -1,5 +1,11 @@ bookDelete($book); } - public function bookDelete(\BookStack\Book $book) + public function bookDelete(Book $book) { $this->asAdmin() ->visit($book->getUrl()) @@ -32,7 +38,7 @@ class EntityTest extends BrowserKitTest ->notSeeInDatabase('books', ['id' => $book->id]); } - public function bookUpdate(\BookStack\Book $book) + public function bookUpdate(Book $book) { $newName = $book->name . ' Updated'; $this->asAdmin() @@ -46,12 +52,12 @@ class EntityTest extends BrowserKitTest ->seePageIs($book->getUrl() . '-updated') ->see($newName); - return \BookStack\Book::find($book->id); + return Book::find($book->id); } public function test_book_sort_page_shows() { - $books = \BookStack\Book::all(); + $books = Book::all(); $bookToSort = $books[0]; $this->asAdmin() ->visit($bookToSort->getUrl()) @@ -65,7 +71,7 @@ class EntityTest extends BrowserKitTest public function test_book_sort_item_returns_book_content() { - $books = \BookStack\Book::all(); + $books = Book::all(); $bookToSort = $books[0]; $firstPage = $bookToSort->pages[0]; $firstChapter = $bookToSort->chapters[0]; @@ -79,7 +85,7 @@ class EntityTest extends BrowserKitTest public function pageCreation($chapter) { - $page = factory(\BookStack\Page::class)->make([ + $page = factory(Page::class)->make([ 'name' => 'My First Page' ]); @@ -88,7 +94,7 @@ class EntityTest extends BrowserKitTest ->visit($chapter->getUrl()) ->click('New Page'); - $draftPage = \BookStack\Page::where('draft', '=', true)->orderBy('created_at', 'desc')->first(); + $draftPage = Page::where('draft', '=', true)->orderBy('created_at', 'desc')->first(); $this->seePageIs($draftPage->getUrl()) // Fill out form @@ -99,13 +105,13 @@ class EntityTest extends BrowserKitTest ->seePageIs($chapter->book->getUrl() . '/page/my-first-page') ->see($page->name); - $page = \BookStack\Page::where('slug', '=', 'my-first-page')->where('chapter_id', '=', $chapter->id)->first(); + $page = Page::where('slug', '=', 'my-first-page')->where('chapter_id', '=', $chapter->id)->first(); return $page; } - public function chapterCreation(\BookStack\Book $book) + public function chapterCreation(Book $book) { - $chapter = factory(\BookStack\Chapter::class)->make([ + $chapter = factory(Chapter::class)->make([ 'name' => 'My First Chapter' ]); @@ -122,13 +128,13 @@ class EntityTest extends BrowserKitTest ->seePageIs($book->getUrl() . '/chapter/my-first-chapter') ->see($chapter->name)->see($chapter->description); - $chapter = \BookStack\Chapter::where('slug', '=', 'my-first-chapter')->where('book_id', '=', $book->id)->first(); + $chapter = Chapter::where('slug', '=', 'my-first-chapter')->where('book_id', '=', $book->id)->first(); return $chapter; } public function bookCreation() { - $book = factory(\BookStack\Book::class)->make([ + $book = factory(Book::class)->make([ 'name' => 'My First Book' ]); $this->asAdmin() @@ -154,7 +160,7 @@ class EntityTest extends BrowserKitTest $expectedPattern = '/\/books\/my-first-book-[0-9a-zA-Z]{3}/'; $this->assertRegExp($expectedPattern, $this->currentUri, "Did not land on expected page [$expectedPattern].\n"); - $book = \BookStack\Book::where('slug', '=', 'my-first-book')->first(); + $book = Book::where('slug', '=', 'my-first-book')->first(); return $book; } @@ -165,8 +171,8 @@ class EntityTest extends BrowserKitTest $updater = $this->getEditor(); $entities = $this->createEntityChainBelongingToUser($creator, $updater); $this->actingAs($creator); - app('BookStack\Repos\UserRepo')->destroy($creator); - app('BookStack\Repos\EntityRepo')->savePageRevision($entities['page']); + app(UserRepo::class)->destroy($creator); + app(EntityRepo::class)->savePageRevision($entities['page']); $this->checkEntitiesViewable($entities); } @@ -178,8 +184,8 @@ class EntityTest extends BrowserKitTest $updater = $this->getEditor(); $entities = $this->createEntityChainBelongingToUser($creator, $updater); $this->actingAs($updater); - app('BookStack\Repos\UserRepo')->destroy($updater); - app('BookStack\Repos\EntityRepo')->savePageRevision($entities['page']); + app(UserRepo::class)->destroy($updater); + app(EntityRepo::class)->savePageRevision($entities['page']); $this->checkEntitiesViewable($entities); } @@ -216,7 +222,7 @@ class EntityTest extends BrowserKitTest public function test_old_page_slugs_redirect_to_new_pages() { - $page = \BookStack\Page::first(); + $page = Page::first(); $pageUrl = $page->getUrl(); $newPageUrl = '/books/' . $page->book->slug . '/page/super-test-page'; // Need to save twice since revisions are not generated in seeder. @@ -225,7 +231,7 @@ class EntityTest extends BrowserKitTest ->type('super test', '#name') ->press('Save Page'); - $page = \BookStack\Page::first(); + $page = Page::first(); $pageUrl = $page->getUrl(); // Second Save @@ -242,7 +248,7 @@ class EntityTest extends BrowserKitTest public function test_recently_updated_pages_on_home() { - $page = \BookStack\Page::orderBy('updated_at', 'asc')->first(); + $page = Page::orderBy('updated_at', 'asc')->first(); $this->asAdmin()->visit('/') ->dontSeeInElement('#recently-updated-pages', $page->name); $this->visit($page->getUrl() . '/edit') diff --git a/tests/Entity/PageRevisionTest.php b/tests/Entity/PageRevisionTest.php new file mode 100644 index 000000000..beebc7adf --- /dev/null +++ b/tests/Entity/PageRevisionTest.php @@ -0,0 +1,32 @@ +revision_count; + + $resp = $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']); + $resp->assertStatus(302); + + $this->assertTrue(Page::find($page->id)->revision_count === $startCount+1); + } + + public function test_revision_count_shown_in_page_meta() + { + $page = Page::first(); + $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']); + $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']); + $page = Page::find($page->id); + + $pageView = $this->get($page->getUrl()); + $pageView->assertSee('Revision #' . $page->revision_count); + } + +} \ No newline at end of file