From 6bc72e157a346e708cee17d7c51560a0fdd084ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Youn=C3=A8s=20EL=20BIACHE?= Date: Thu, 7 Jul 2016 20:53:43 +0200 Subject: [PATCH 01/24] edit summary --- app/PageRevision.php | 2 +- app/Repos/PageRepo.php | 5 +-- ...7_181521_add_summary_to_page_revisions.php | 31 +++++++++++++++++++ resources/assets/sass/_grid.scss | 3 ++ resources/assets/sass/_pages.scss | 3 ++ resources/views/pages/form.blade.php | 2 +- resources/views/pages/revisions.blade.php | 12 ++++--- 7 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 database/migrations/2016_07_07_181521_add_summary_to_page_revisions.php diff --git a/app/PageRevision.php b/app/PageRevision.php index dae74cd0f..1ffd63dbd 100644 --- a/app/PageRevision.php +++ b/app/PageRevision.php @@ -3,7 +3,7 @@ class PageRevision extends Model { - protected $fillable = ['name', 'html', 'text', 'markdown']; + protected $fillable = ['name', 'html', 'text', 'markdown', 'summary']; /** * Get the user that created the page revision diff --git a/app/Repos/PageRepo.php b/app/Repos/PageRepo.php index de050e1c7..515d18bd9 100644 --- a/app/Repos/PageRepo.php +++ b/app/Repos/PageRepo.php @@ -310,7 +310,7 @@ class PageRepo extends EntityRepo { // Save a revision before updating if ($page->html !== $input['html'] || $page->name !== $input['name']) { - $this->saveRevision($page); + $this->saveRevision($page, $input['summary']); } // Prevent slug being updated if no name change @@ -362,7 +362,7 @@ class PageRepo extends EntityRepo * @param Page $page * @return $this */ - public function saveRevision(Page $page) + public function saveRevision(Page $page, $summary = null) { $revision = $this->pageRevision->fill($page->toArray()); if (setting('app-editor') !== 'markdown') $revision->markdown = ''; @@ -372,6 +372,7 @@ class PageRepo extends EntityRepo $revision->created_by = auth()->user()->id; $revision->created_at = $page->updated_at; $revision->type = 'version'; + $revision->summary = $summary; $revision->save(); // Clear old revisions if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) { diff --git a/database/migrations/2016_07_07_181521_add_summary_to_page_revisions.php b/database/migrations/2016_07_07_181521_add_summary_to_page_revisions.php new file mode 100644 index 000000000..c618877ef --- /dev/null +++ b/database/migrations/2016_07_07_181521_add_summary_to_page_revisions.php @@ -0,0 +1,31 @@ +string('summary')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('page_revisions', function ($table) { + $table->dropColumn('summary'); + }); + } +} diff --git a/resources/assets/sass/_grid.scss b/resources/assets/sass/_grid.scss index 2fe1ad113..1a1321e58 100644 --- a/resources/assets/sass/_grid.scss +++ b/resources/assets/sass/_grid.scss @@ -39,6 +39,9 @@ div[class^="col-"] img { &.fluid { max-width: 100%; } + &.medium { + max-width: 992px; + } &.small { max-width: 840px; } diff --git a/resources/assets/sass/_pages.scss b/resources/assets/sass/_pages.scss index 49b701dda..1d203ef78 100644 --- a/resources/assets/sass/_pages.scss +++ b/resources/assets/sass/_pages.scss @@ -18,6 +18,9 @@ flex: 1; flex-direction: column; } + #summary-input { + width: 140px; + } } .page-style.editor { diff --git a/resources/views/pages/form.blade.php b/resources/views/pages/form.blade.php index 4196e946f..c2bdc6692 100644 --- a/resources/views/pages/form.blade.php +++ b/resources/views/pages/form.blade.php @@ -27,8 +27,8 @@
- +
diff --git a/resources/views/pages/revisions.blade.php b/resources/views/pages/revisions.blade.php index a73f16a4f..24e91b366 100644 --- a/resources/views/pages/revisions.blade.php +++ b/resources/views/pages/revisions.blade.php @@ -17,17 +17,18 @@ -
+

Page Revisions For "{{ $page->name }}"

@if(count($page->revisions) > 0) - - - - + + + + + @foreach($page->revisions as $revision) @@ -39,6 +40,7 @@ +
NameCreated ByRevision DateActionsNameCreated ByRevision DateSummaryActions
@if($revision->createdBy) {{$revision->createdBy->name}} @else Deleted User @endif {{$revision->created_at->format('jS F, Y H:i:s')}}
({{$revision->created_at->diffForHumans()}})
{{$revision->summary}} Preview  |  From ec30864ce5ecef84b5ffd284734b6362aac564c8 Mon Sep 17 00:00:00 2001 From: Younes El Biache Date: Sat, 9 Jul 2016 14:33:37 +0200 Subject: [PATCH 02/24] shorter amazon S3 url --- app/Services/ImageService.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index dd965c90f..331a407c3 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -259,7 +259,7 @@ class ImageService // Get the standard public s3 url if s3 is set as storage type if ($storageUrl == false && config('filesystems.default') === 's3') { $storageDetails = config('filesystems.disks.s3'); - $storageUrl = 'https://s3-' . $storageDetails['region'] . '.amazonaws.com/' . $storageDetails['bucket']; + $storageUrl = 'https://' . $storageDetails['bucket'] . '.s3.amazonaws.com'; } $this->storageUrl = $storageUrl; @@ -269,4 +269,4 @@ class ImageService } -} \ No newline at end of file +} From 32a06f119b1c620863acc588b7e90810286737ef Mon Sep 17 00:00:00 2001 From: Younes El Biache Date: Sat, 9 Jul 2016 15:26:53 +0200 Subject: [PATCH 03/24] set uploaded files public visibliity (relevant for S3 storage) --- app/Services/ImageService.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index dd965c90f..274172f0f 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -95,6 +95,7 @@ class ImageService try { $storage->put($fullPath, $imageData); + $storage->setVisibility($fullPath, 'public'); } catch (Exception $e) { throw new ImageUploadException('Image Path ' . $fullPath . ' is not writable by the server.'); } @@ -167,6 +168,7 @@ class ImageService $thumbData = (string)$thumb->encode(); $storage->put($thumbFilePath, $thumbData); + $storage->setVisibility($thumbFilePath, 'public'); $this->cache->put('images-' . $image->id . '-' . $thumbFilePath, $thumbFilePath, 60 * 72); return $this->getPublicUrl($thumbFilePath); @@ -269,4 +271,4 @@ class ImageService } -} \ No newline at end of file +} From c44314def3f84e449c92357d178599bb474706ae Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 10 Jul 2016 10:28:05 +0100 Subject: [PATCH 04/24] Added check for s3 bucket name to choose shortest url --- app/Services/ImageService.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index f645a06a5..c10e989f9 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -259,9 +259,15 @@ class ImageService $storageUrl = config('filesystems.url'); // Get the standard public s3 url if s3 is set as storage type + // Uses the nice, short URL if bucket name has no periods in otherwise the longer + // region-based url will be used to prevent http issues. if ($storageUrl == false && config('filesystems.default') === 's3') { $storageDetails = config('filesystems.disks.s3'); - $storageUrl = 'https://' . $storageDetails['bucket'] . '.s3.amazonaws.com'; + if (strpos($storageDetails['bucket'], '.') === false) { + $storageUrl = 'https://' . $storageDetails['bucket'] . '.s3.amazonaws.com'; + } else { + $storageUrl = 'https://s3-' . $storageDetails['region'] . '.amazonaws.com/' . $storageDetails['bucket']; + } } $this->storageUrl = $storageUrl; From 7215392784bcbb6eca45301ed89ea04965785d27 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 10 Jul 2016 12:12:52 +0100 Subject: [PATCH 05/24] Changed when revisions are saved and update changelog input Revisions are now saved when te page content is originally saved whereas before they were saved on the next update to the page. --- app/Repos/PageRepo.php | 19 ++++++---- resources/assets/js/directives.js | 15 +++++++- resources/assets/sass/_header.scss | 1 + resources/assets/sass/_lists.scss | 9 +++-- resources/assets/sass/_pages.scss | 3 -- resources/views/pages/form.blade.php | 17 +++++++-- resources/views/pages/restrictions.blade.php | 2 +- resources/views/pages/revisions.blade.php | 38 +++++++++++++------- 8 files changed, 73 insertions(+), 31 deletions(-) diff --git a/app/Repos/PageRepo.php b/app/Repos/PageRepo.php index 515d18bd9..d3a060363 100644 --- a/app/Repos/PageRepo.php +++ b/app/Repos/PageRepo.php @@ -147,7 +147,7 @@ class PageRepo extends EntityRepo $draftPage->fill($input); // Save page tags if present - if(isset($input['tags'])) { + if (isset($input['tags'])) { $this->tagRepo->saveTagsToEntity($draftPage, $input['tags']); } @@ -308,10 +308,9 @@ class PageRepo extends EntityRepo */ public function updatePage(Page $page, $book_id, $input) { - // Save a revision before updating - if ($page->html !== $input['html'] || $page->name !== $input['name']) { - $this->saveRevision($page, $input['summary']); - } + // Hold the old details to compare later + $oldHtml = $page->html; + $oldName = $page->name; // Prevent slug being updated if no name change if ($page->name !== $input['name']) { @@ -319,7 +318,7 @@ class PageRepo extends EntityRepo } // Save page tags if present - if(isset($input['tags'])) { + if (isset($input['tags'])) { $this->tagRepo->saveTagsToEntity($page, $input['tags']); } @@ -335,6 +334,11 @@ class PageRepo extends EntityRepo // Remove all update drafts for this user & page. $this->userUpdateDraftsQuery($page, $userId)->delete(); + // Save a revision after updating + if ($oldHtml !== $input['html'] || $oldName !== $input['name'] || $input['summary'] !== null) { + $this->saveRevision($page, $input['summary']); + } + return $page; } @@ -360,6 +364,7 @@ class PageRepo extends EntityRepo /** * Saves a page revision into the system. * @param Page $page + * @param null|string $summary * @return $this */ public function saveRevision(Page $page, $summary = null) @@ -406,7 +411,7 @@ class PageRepo extends EntityRepo $draft->fill($data); if (setting('app-editor') !== 'markdown') $draft->markdown = ''; - + $draft->save(); return $draft; } diff --git a/resources/assets/js/directives.js b/resources/assets/js/directives.js index 0119ded42..e50f5c6dd 100644 --- a/resources/assets/js/directives.js +++ b/resources/assets/js/directives.js @@ -157,9 +157,22 @@ module.exports = function (ngApp, events) { return { restrict: 'A', link: function (scope, element, attrs) { - var menu = element.find('ul'); + const menu = element.find('ul'); element.find('[dropdown-toggle]').on('click', function () { menu.show().addClass('anim menuIn'); + let inputs = menu.find('input'); + let hasInput = inputs.length > 0; + if (hasInput) { + inputs.first().focus(); + element.on('keypress', 'input', event => { + if (event.keyCode === 13) { + event.preventDefault(); + menu.hide(); + menu.removeClass('anim menuIn'); + return false; + } + }); + } element.mouseleave(function () { menu.hide(); menu.removeClass('anim menuIn'); diff --git a/resources/assets/sass/_header.scss b/resources/assets/sass/_header.scss index e0b1a99cb..12bd17076 100644 --- a/resources/assets/sass/_header.scss +++ b/resources/assets/sass/_header.scss @@ -155,6 +155,7 @@ form.search-box { text-decoration: none; } } + } .faded span.faded-text { diff --git a/resources/assets/sass/_lists.scss b/resources/assets/sass/_lists.scss index 08f00677e..2658c4689 100644 --- a/resources/assets/sass/_lists.scss +++ b/resources/assets/sass/_lists.scss @@ -375,6 +375,9 @@ ul.pagination { .text-muted { color: #999; } + li.padded { + padding: $-xs $-m; + } a { display: block; padding: $-xs $-m; @@ -384,10 +387,10 @@ ul.pagination { background-color: #EEE; } i { - margin-right: $-m; + margin-right: $-s; padding-right: 0; - display: inline; - width: 22px; + display: inline-block; + width: 16px; } } li.border-bottom { diff --git a/resources/assets/sass/_pages.scss b/resources/assets/sass/_pages.scss index 1d203ef78..49b701dda 100644 --- a/resources/assets/sass/_pages.scss +++ b/resources/assets/sass/_pages.scss @@ -18,9 +18,6 @@ flex: 1; flex-direction: column; } - #summary-input { - width: 140px; - } } .page-style.editor { diff --git a/resources/views/pages/form.blade.php b/resources/views/pages/form.blade.php index c2bdc6692..a5558f8e4 100644 --- a/resources/views/pages/form.blade.php +++ b/resources/views/pages/form.blade.php @@ -22,14 +22,25 @@
  • Delete Draft
  • +
  • + Discard Draft +
  • - - - + + +
    diff --git a/resources/views/pages/restrictions.blade.php b/resources/views/pages/restrictions.blade.php index 09eb8a65b..8dccc021e 100644 --- a/resources/views/pages/restrictions.blade.php +++ b/resources/views/pages/restrictions.blade.php @@ -16,7 +16,7 @@ @endif » - {{ $page->getShortName() }} + {{ $page->getShortName() }} diff --git a/resources/views/pages/revisions.blade.php b/resources/views/pages/revisions.blade.php index 24e91b366..d92b97d62 100644 --- a/resources/views/pages/revisions.blade.php +++ b/resources/views/pages/revisions.blade.php @@ -5,32 +5,40 @@
    -
    + +

    Page Revisions For "{{ $page->name }}"

    @if(count($page->revisions) > 0) - + - + - @foreach($page->revisions as $revision) + @foreach($page->revisions as $index => $revision) - + @if ($index !== 0) + + @else + + @endif @endforeach
    NameName Created By Revision DateSummaryChangelog Actions
    {{$revision->name}} @@ -41,11 +49,15 @@ @if($revision->createdBy) {{$revision->createdBy->name}} @else Deleted User @endif {{$revision->created_at->format('jS F, Y H:i:s')}}
    ({{$revision->created_at->diffForHumans()}})
    {{$revision->summary}} - Preview -  |  - Restore - + Preview +  |  + Restore + Current Version
    From 3fd82200ccf325b0052e3c6298d9db79ed45f090 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Tue, 12 Jul 2016 21:11:48 +0100 Subject: [PATCH 06/24] Added WYSIWYG editor shortcuts --- resources/assets/js/pages/page-form.js | 104 ++++++++++++++----------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/resources/assets/js/pages/page-form.js b/resources/assets/js/pages/page-form.js index 611d2e782..b2d5f0c5c 100644 --- a/resources/assets/js/pages/page-form.js +++ b/resources/assets/js/pages/page-form.js @@ -1,3 +1,60 @@ +"use strict"; + +function editorPaste(e) { + if (!e.clipboardData) return + var items = e.clipboardData.items; + if (!items) return; + for (var i = 0; i < items.length; i++) { + if (items[i].type.indexOf("image") !== -1) { + + var file = items[i].getAsFile(); + var formData = new FormData(); + var ext = 'png'; + var xhr = new XMLHttpRequest(); + + if (file.name) { + var fileNameMatches = file.name.match(/\.(.+)$/); + if (fileNameMatches) { + ext = fileNameMatches[1]; + } + } + + var id = "image-" + Math.random().toString(16).slice(2); + editor.execCommand('mceInsertContent', false, ''); + + var remoteFilename = "image-" + Date.now() + "." + ext; + formData.append('file', file, remoteFilename); + formData.append('_token', document.querySelector('meta[name="token"]').getAttribute('content')); + + xhr.open('POST', '/images/gallery/upload'); + xhr.onload = function () { + if (xhr.status === 200 || xhr.status === 201) { + var result = JSON.parse(xhr.responseText); + editor.dom.setAttrib(id, 'src', result.url); + } else { + console.log('An error occured uploading the image'); + console.log(xhr.responseText); + editor.dom.remove(id); + } + }; + xhr.send(formData); + } + } +} + +function registerEditorShortcuts(editor) { + // Headers + for (let i = 1; i < 5; i++) { + editor.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); + } + + // Other block shortcuts + editor.addShortcut('ctrl+q', '', ['FormatBlock', false, 'blockquote']); + editor.addShortcut('ctrl+d', '', ['FormatBlock', false, 'p']); + editor.addShortcut('ctrl+e', '', ['FormatBlock', false, 'pre']); + editor.addShortcut('ctrl+s', '', ['FormatBlock', false, 'code']); +} + var mceOptions = module.exports = { selector: '#html-editor', content_css: [ @@ -66,6 +123,8 @@ var mceOptions = module.exports = { mceOptions.extraSetups[i](editor); } + registerEditorShortcuts(editor); + (function () { var wrap; @@ -122,49 +181,6 @@ var mceOptions = module.exports = { }); // Paste image-uploads - editor.on('paste', function (e) { - if (e.clipboardData) { - var items = e.clipboardData.items; - if (items) { - for (var i = 0; i < items.length; i++) { - if (items[i].type.indexOf("image") !== -1) { - - var file = items[i].getAsFile(); - var formData = new FormData(); - var ext = 'png'; - var xhr = new XMLHttpRequest(); - - if (file.name) { - var fileNameMatches = file.name.match(/\.(.+)$/); - if (fileNameMatches) { - ext = fileNameMatches[1]; - } - } - - var id = "image-" + Math.random().toString(16).slice(2); - editor.execCommand('mceInsertContent', false, ''); - - var remoteFilename = "image-" + Date.now() + "." + ext; - formData.append('file', file, remoteFilename); - formData.append('_token', document.querySelector('meta[name="token"]').getAttribute('content')); - - xhr.open('POST', '/images/gallery/upload'); - xhr.onload = function () { - if (xhr.status === 200 || xhr.status === 201) { - var result = JSON.parse(xhr.responseText); - editor.dom.setAttrib(id, 'src', result.url); - } else { - console.log('An error occured uploading the image'); - console.log(xhr.responseText); - editor.dom.remove(id); - } - }; - xhr.send(formData); - } - } - } - - } - }); + editor.on('paste', editorPaste); } }; \ No newline at end of file From 50a5d3c546b3554bbe9caf0617b9f82440cba108 Mon Sep 17 00:00:00 2001 From: Nick Walke Date: Thu, 21 Jul 2016 10:04:06 -0500 Subject: [PATCH 07/24] Added issue template --- .github/ISSUE_TEMPLATE | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE new file mode 100644 index 000000000..4f9f4c480 --- /dev/null +++ b/.github/ISSUE_TEMPLATE @@ -0,0 +1,11 @@ +### For Feature Requests +Desired Feature: + +### For Bug Reports +PHP Version: + +MySQL Version: + +Expected Behavior: + +Actual Behavior: From 547e117760b3df5607d665f9609aa629018f3443 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Tue, 26 Jul 2016 17:46:09 +0100 Subject: [PATCH 08/24] Changed issue template to use md extension --- .github/{ISSUE_TEMPLATE => ISSUE_TEMPLATE.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{ISSUE_TEMPLATE => ISSUE_TEMPLATE.md} (100%) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from .github/ISSUE_TEMPLATE rename to .github/ISSUE_TEMPLATE.md From d05e85efa9e64019dd937c043fbd56b085efb988 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Tue, 26 Jul 2016 18:03:10 +0100 Subject: [PATCH 09/24] Fixed back-to-top button on firefox. Fixes #153. --- resources/assets/js/global.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/resources/assets/js/global.js b/resources/assets/js/global.js index 44562abd0..eeb1e4ea7 100644 --- a/resources/assets/js/global.js +++ b/resources/assets/js/global.js @@ -10,9 +10,12 @@ require('angular-ui-sortable'); var ngApp = angular.module('bookStack', ['ngResource', 'ngAnimate', 'ngSanitize', 'ui.sortable']); // Global Event System -var Events = { - listeners: {}, - emit: function (eventName, eventData) { +class Events { + constructor() { + this.listeners = {}; + } + + emit(eventName, eventData) { if (typeof this.listeners[eventName] === 'undefined') return this; var eventsToStart = this.listeners[eventName]; for (let i = 0; i < eventsToStart.length; i++) { @@ -20,14 +23,15 @@ var Events = { event(eventData); } return this; - }, - listen: function (eventName, callback) { + } + + listen(eventName, callback) { if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; this.listeners[eventName].push(callback); return this; } }; -window.Events = Events; +window.Events = new Events(); var services = require('./services')(ngApp, Events); var directives = require('./directives')(ngApp, Events); @@ -38,14 +42,15 @@ var controllers = require('./controllers')(ngApp, Events); // Smooth scrolling jQuery.fn.smoothScrollTo = function () { if (this.length === 0) return; - $('body').animate({ + let scrollElem = document.documentElement.scrollTop === 0 ? document.body : document.documentElement; + $(scrollElem).animate({ scrollTop: this.offset().top - 60 // Adjust to change final scroll position top margin }, 800); // Adjust to change animations speed (ms) return this; }; // Making contains text expression not worry about casing -$.expr[":"].contains = $.expr.createPseudo(function (arg) { +jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) { return function (elem) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; @@ -95,13 +100,14 @@ $(function () { var scrollTop = document.getElementById('back-to-top'); var scrollTopBreakpoint = 1200; window.addEventListener('scroll', function() { - if (!scrollTopShowing && document.body.scrollTop > scrollTopBreakpoint) { + let scrollTopPos = document.documentElement.scrollTop || document.body.scrollTop || 0; + if (!scrollTopShowing && scrollTopPos > scrollTopBreakpoint) { scrollTop.style.display = 'block'; scrollTopShowing = true; setTimeout(() => { scrollTop.style.opacity = 0.4; }, 1); - } else if (scrollTopShowing && document.body.scrollTop < scrollTopBreakpoint) { + } else if (scrollTopShowing && scrollTopPos < scrollTopBreakpoint) { scrollTop.style.opacity = 0; scrollTopShowing = false; setTimeout(() => { From 42976ca48c8de04726e62356f76f0bbb77b2ab15 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Tue, 26 Jul 2016 18:16:40 +0100 Subject: [PATCH 10/24] Fixed revision-based redirect on new pages --- app/Repos/PageRepo.php | 2 ++ tests/Entity/EntityTest.php | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/Repos/PageRepo.php b/app/Repos/PageRepo.php index d3a060363..d3b71cebd 100644 --- a/app/Repos/PageRepo.php +++ b/app/Repos/PageRepo.php @@ -157,6 +157,8 @@ class PageRepo extends EntityRepo $draftPage->draft = false; $draftPage->save(); + $this->saveRevision($draftPage, 'Initial Publish'); + return $draftPage; } diff --git a/tests/Entity/EntityTest.php b/tests/Entity/EntityTest.php index 3bf6a3f2a..8c0c286a6 100644 --- a/tests/Entity/EntityTest.php +++ b/tests/Entity/EntityTest.php @@ -216,13 +216,24 @@ class EntityTest extends TestCase public function test_old_page_slugs_redirect_to_new_pages() { - $page = \BookStack\Page::all()->first(); + $page = \BookStack\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. $this->asAdmin()->visit($pageUrl) + ->clickInElement('#content', 'Edit') + ->type('super test', '#name') + ->press('Save Page'); + + $page = \BookStack\Page::first(); + $pageUrl = $page->getUrl(); + + // Second Save + $this->visit($pageUrl) ->clickInElement('#content', 'Edit') ->type('super test page', '#name') ->press('Save Page') + // Check redirect ->seePageIs($newPageUrl) ->visit($pageUrl) ->seePageIs($newPageUrl); From 632ecc668ffe3e120a9bcc3d872dfd89be080629 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 15 Aug 2016 15:07:45 +0100 Subject: [PATCH 11/24] Applied baseUrl to login redirect --- app/Http/Middleware/Authenticate.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index ee5144e6c..372f30bf6 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -40,7 +40,7 @@ class Authenticate if ($request->ajax()) { return response('Unauthorized.', 401); } else { - return redirect()->guest('/login'); + return redirect()->guest(baseUrl('/login')); } } From f2ceba978a4e5da4fc33e5678d7675a842c71526 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Thu, 25 Aug 2016 16:47:25 +0100 Subject: [PATCH 12/24] Removed animation from page content. Prevents issues with browsers that do not support animaton-fill-direction. Fixes #173. --- resources/views/pages/show.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/pages/show.blade.php b/resources/views/pages/show.blade.php index 9d6b74a03..2e6e35476 100644 --- a/resources/views/pages/show.blade.php +++ b/resources/views/pages/show.blade.php @@ -58,7 +58,7 @@