From 89f84c9a95babfa5bf8b3d38809375e59cab80ce Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 29 Sep 2024 14:36:41 +0100 Subject: [PATCH] Pages: Updated editor field to always be set - Migration for setting on existing pages - Added test to cover simple new page scenario For #5117 --- app/Entities/Repos/PageRepo.php | 6 ++- ...4_09_29_140340_ensure_editor_value_set.php | 48 +++++++++++++++++++ tests/Entity/PageEditorTest.php | 15 ++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 database/migrations/2024_09_29_140340_ensure_editor_value_set.php diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index ce7e34ae1..1bc15392c 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -11,7 +11,6 @@ use BookStack\Entities\Models\PageRevision; use BookStack\Entities\Queries\EntityQueries; use BookStack\Entities\Tools\BookContents; use BookStack\Entities\Tools\PageContent; -use BookStack\Entities\Tools\PageEditorData; use BookStack\Entities\Tools\PageEditorType; use BookStack\Entities\Tools\TrashCan; use BookStack\Exceptions\MoveOperationException; @@ -44,6 +43,7 @@ class PageRepo 'owned_by' => user()->id, 'updated_by' => user()->id, 'draft' => true, + 'editor' => PageEditorType::getSystemDefault()->value, ]); if ($parent instanceof Chapter) { @@ -146,8 +146,10 @@ class PageRepo $pageContent->setNewHTML($input['html'], user()); } - if ($newEditor !== $currentEditor && userCan('editor-change')) { + if (($newEditor !== $currentEditor || empty($page->editor)) && userCan('editor-change')) { $page->editor = $newEditor->value; + } elseif (empty($page->editor)) { + $page->editor = $defaultEditor->value; } } diff --git a/database/migrations/2024_09_29_140340_ensure_editor_value_set.php b/database/migrations/2024_09_29_140340_ensure_editor_value_set.php new file mode 100644 index 000000000..786322b3c --- /dev/null +++ b/database/migrations/2024_09_29_140340_ensure_editor_value_set.php @@ -0,0 +1,48 @@ +where('setting_key', '=', 'app-editor') + ->first() + ->value ?? 'wysiwyg'; + $default = ($default === 'markdown') ? 'markdown' : 'wysiwyg'; + + // We set it to 'markdown' for pages currently with markdown content + DB::table('pages') + ->where('editor', '=', '') + ->where('markdown', '!=', '') + ->update(['editor' => 'markdown']); + + // We set it to 'wysiwyg' where we have HTML but no markdown + DB::table('pages') + ->where('editor', '=', '') + ->where('markdown', '=', '') + ->where('html', '!=', '') + ->update(['editor' => 'wysiwyg']); + + // Otherwise, where still empty, set to the current default + DB::table('pages') + ->where('editor', '=', '') + ->update(['editor' => $default]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Can't reverse due to not knowing what would have been empty before + } +}; diff --git a/tests/Entity/PageEditorTest.php b/tests/Entity/PageEditorTest.php index 934024956..21abd4ba1 100644 --- a/tests/Entity/PageEditorTest.php +++ b/tests/Entity/PageEditorTest.php @@ -24,6 +24,21 @@ class PageEditorTest extends TestCase $this->withHtml($this->followRedirects($resp))->assertElementExists('#html-editor'); } + public function test_editor_set_for_new_pages() + { + $book = $this->page->book; + + $this->asEditor()->get($book->getUrl('/create-page')); + $newPage = $book->pages()->orderBy('id', 'desc')->first(); + $this->assertEquals('wysiwyg', $newPage->editor); + + $this->setSettings(['app-editor' => PageEditorType::Markdown->value]); + + $this->asEditor()->get($book->getUrl('/create-page')); + $newPage = $book->pages()->orderBy('id', 'desc')->first(); + $this->assertEquals('markdown', $newPage->editor); + } + public function test_markdown_setting_shows_markdown_editor_for_new_pages() { $this->setSettings(['app-editor' => PageEditorType::Markdown->value]);