]> BookStack Code Mirror - bookstack/commitdiff
Default Templates: Started review and updates from PR code
authorDan Brown <redacted>
Mon, 11 Dec 2023 12:33:20 +0000 (12:33 +0000)
committerDan Brown <redacted>
Mon, 11 Dec 2023 12:33:20 +0000 (12:33 +0000)
app/Entities/Controllers/BookController.php
app/Entities/Controllers/PageController.php
app/Entities/Models/Book.php
app/Entities/Repos/PageRepo.php
database/migrations/2023_12_02_104541_add_default_template_to_books.php [moved from database/migrations/2022_12_02_104541_add_default_template_to_books.php with 100% similarity]
lang/en/entities.php
resources/views/books/create.blade.php
resources/views/books/edit.blade.php
resources/views/books/parts/form.blade.php
resources/views/books/parts/template-selector.blade.php [moved from resources/views/entities/template-manager.blade.php with 58% similarity]
resources/views/pages/delete.blade.php

index 9b938d89a41c7f23fb311d5eedd86c2a0770a36a..12df935b0a649a258e1c080fc907bb317c11a12e 100644 (file)
@@ -7,7 +7,6 @@ use BookStack\Activity\ActivityType;
 use BookStack\Activity\Models\View;
 use BookStack\Activity\Tools\UserEntityWatchOptions;
 use BookStack\Entities\Models\Bookshelf;
-use BookStack\Entities\Models\Page;
 use BookStack\Entities\Repos\BookRepo;
 use BookStack\Entities\Tools\BookContents;
 use BookStack\Entities\Tools\Cloner;
@@ -25,15 +24,11 @@ use Throwable;
 
 class BookController extends Controller
 {
-    protected BookRepo $bookRepo;
-    protected ShelfContext $shelfContext;
-    protected ReferenceFetcher $referenceFetcher;
-
-    public function __construct(ShelfContext $entityContextManager, BookRepo $bookRepo, ReferenceFetcher $referenceFetcher)
-    {
-        $this->bookRepo = $bookRepo;
-        $this->shelfContext = $entityContextManager;
-        $this->referenceFetcher = $referenceFetcher;
+    public function __construct(
+        protected ShelfContext $shelfContext,
+        protected BookRepo $bookRepo,
+        protected ReferenceFetcher $referenceFetcher
+    ) {
     }
 
     /**
@@ -82,14 +77,8 @@ class BookController extends Controller
 
         $this->setPageTitle(trans('entities.books_create'));
 
-        $templates = Page::visible()
-            ->where('template', '=', true)
-            ->orderBy('name', 'asc')
-            ->get();
-
         return view('books.create', [
             'bookshelf' => $bookshelf,
-            'templates' => $templates,
         ]);
     }
 
@@ -103,11 +92,11 @@ class BookController extends Controller
     {
         $this->checkPermission('book-create-all');
         $validated = $this->validate($request, [
-            'name'        => ['required', 'string', 'max:255'],
-            'description' => ['string', 'max:1000'],
-            'image'       => array_merge(['nullable'], $this->getImageValidationRules()),
-            'tags'        => ['array'],
-            'default_template'  => ['nullable', 'exists:pages,id'], 
+            'name'              => ['required', 'string', 'max:255'],
+            'description'       => ['string', 'max:1000'],
+            'image'             => array_merge(['nullable'], $this->getImageValidationRules()),
+            'tags'              => ['array'],
+            'default_template'  => ['nullable', 'integer'],
         ]);
 
         $bookshelf = null;
@@ -162,12 +151,7 @@ class BookController extends Controller
         $this->checkOwnablePermission('book-update', $book);
         $this->setPageTitle(trans('entities.books_edit_named', ['bookName' => $book->getShortName()]));
 
-        $templates = Page::visible()
-            ->where('template', '=', true)
-            ->orderBy('name', 'asc')
-            ->get();
-
-        return view('books.edit', ['book' => $book, 'current' => $book, 'templates' => $templates]);
+        return view('books.edit', ['book' => $book, 'current' => $book]);
     }
 
     /**
@@ -183,11 +167,11 @@ class BookController extends Controller
         $this->checkOwnablePermission('book-update', $book);
 
         $validated = $this->validate($request, [
-            'name'        => ['required', 'string', 'max:255'],
-            'description' => ['string', 'max:1000'],
-            'image'       => array_merge(['nullable'], $this->getImageValidationRules()),
-            'tags'        => ['array'],
-            'default_template'  => ['nullable', 'exists:pages,id'], 
+            'name'              => ['required', 'string', 'max:255'],
+            'description'       => ['string', 'max:1000'],
+            'image'             => array_merge(['nullable'], $this->getImageValidationRules()),
+            'tags'              => ['array'],
+            'default_template'  => ['nullable', 'integer'],
         ]);
 
         if ($request->has('image_reset')) {
index ad75448b34a30fb3fc04a10e435d3607644432e7..11f19f72f111e06ade95a8505546a23f186c46b0 100644 (file)
@@ -259,13 +259,13 @@ class PageController extends Controller
         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
         $this->checkOwnablePermission('page-delete', $page);
         $this->setPageTitle(trans('entities.pages_delete_named', ['pageName' => $page->getShortName()]));
-        $times_used_as_template = Book::where('default_template', '=', $page->id)->count();
+        $usedAsTemplate = Book::query()->where('default_template', '=', $page->id)->count() > 0;
 
         return view('pages.delete', [
             'book'    => $page->book,
             'page'    => $page,
             'current' => $page,
-            'times_used_as_template' => $times_used_as_template,
+            'usedAsTemplate' => $usedAsTemplate,
         ]);
     }
 
index 8584e755e60c38fe5d250235096e339935d2ceb2..19aba0525573007e1f8f6f399d93147b79a30966 100644 (file)
@@ -20,6 +20,7 @@ use Illuminate\Support\Collection;
  * @property \Illuminate\Database\Eloquent\Collection $pages
  * @property \Illuminate\Database\Eloquent\Collection $directPages
  * @property \Illuminate\Database\Eloquent\Collection $shelves
+ * @property ?Page                                    $defaultTemplate
  */
 class Book extends Entity implements HasCoverImage
 {
@@ -27,7 +28,7 @@ class Book extends Entity implements HasCoverImage
 
     public $searchFactor = 1.2;
 
-    protected $fillable = ['name', 'description', 'default_template'];
+    protected $fillable = ['name', 'description'];
     protected $hidden = ['pivot', 'image_id', 'deleted_at'];
 
     /**
index 5269a0bccb613ed43e90128f6c286c277d066959..9a183469b4a9bdf8d4b7a9f0d2a674f51a4a8b59 100644 (file)
@@ -136,9 +136,11 @@ class PageRepo
             $page->book_id = $parent->id;
         }
 
-        if ($page->book->defaultTemplate) {
+        $defaultTemplate = $page->book->defaultTemplate;
+        if ($defaultTemplate && userCan('view', $defaultTemplate)) {
             $page->forceFill([
-                'html'  => $page->book->defaultTemplate->html,
+                'html'  => $defaultTemplate->html,
+                'markdown' => $defaultTemplate->markdown,
             ]);
         }
 
index e4c67f5ca8114b539712cfd42945ceac88276c60..ee612b7ba4f1e6bd5234999b9828466297b5db81 100644 (file)
@@ -132,6 +132,8 @@ return [
     'books_edit_named' => 'Edit Book :bookName',
     'books_form_book_name' => 'Book Name',
     'books_save' => 'Save Book',
+    'books_default_template' => 'Default Page Template',
+    'books_default_template_explain' => 'Assign a default template that will be used for all new pages in this book. Keep in mind this will only be used if the page creator has view access to those chosen template.',
     'books_permissions' => 'Book Permissions',
     'books_permissions_updated' => 'Book Permissions Updated',
     'books_empty_contents' => 'No pages or chapters have been created for this book.',
@@ -204,7 +206,7 @@ return [
     'pages_delete_draft' => 'Delete Draft Page',
     'pages_delete_success' => 'Page deleted',
     'pages_delete_draft_success' => 'Draft page deleted',
-    'pages_delete_warning_template' => '{0}|{1}Be careful: this page is used as a template for :count book.|[2,*]Be careful: this page is used as a template for :count books.',
+    'pages_delete_warning_template' => 'This page is in active use as a book default page template. These books will no longer have a page default template assigned after this page is deleted.',
     'pages_delete_confirm' => 'Are you sure you want to delete this page?',
     'pages_delete_draft_confirm' => 'Are you sure you want to delete this draft page?',
     'pages_editing_named' => 'Editing Page :pageName',
@@ -351,8 +353,6 @@ return [
     'templates_replace_content' => 'Replace page content',
     'templates_append_content' => 'Append to page content',
     'templates_prepend_content' => 'Prepend to page content',
-    'default_template' => 'Default Page Template',
-    'default_template_explain' => "Assign a default template that will be used for all new pages in this book.",
 
     // Profile View
     'profile_user_for_x' => 'User for :time',
index 6253a49bbb92bf136142707bc6ffe1525a60d048..318abfcf1373982d8322acbbdce82e7894313609 100644 (file)
 
         <main class="content-wrap card">
             <h1 class="list-heading">{{ trans('entities.books_create') }}</h1>
-            <form action="{{ isset($bookshelf) ? $bookshelf->getUrl('/create-book') : url('/books') }}" method="POST" enctype="multipart/form-data">
+            <form action="{{ $bookshelf?->getUrl('/create-book') ?? url('/books') }}" method="POST" enctype="multipart/form-data">
                 @include('books.parts.form', [
-                    'templates' => $templates, 
-                    'returnLocation' => isset($bookshelf) ? $bookshelf->getUrl() : url('/books')
+                    'returnLocation' => $bookshelf?->getUrl() ?? url('/books')
                 ])
             </form>
         </main>
index 9ec47293509f881bb8b29bae16e616209b7e9b8c..6efd1caea9249447152c59d2062c54ea5adb1e36 100644 (file)
@@ -19,8 +19,7 @@
             <form action="{{ $book->getUrl() }}" method="POST" enctype="multipart/form-data">
                 <input type="hidden" name="_method" value="PUT">
                 @include('books.parts.form', [
-                    'model' => $book, 
-                    'templates' => $templates,
+                    'model' => $book,
                     'returnLocation' => $book->getUrl()
                 ])
             </form>
index 9b66b8ac87a73b4d1a2e1d3f240665bd1bbfdb03..a6b0eade27b6b70b530f27049531ac5a3ded2122 100644 (file)
 
 <div class="form-group collapsible" component="collapsible" id="template-control">
     <button refs="collapsible@trigger" type="button" class="collapse-title text-primary" aria-expanded="false">
-        <label for="template-manager">{{ trans('entities.default_template') }}</label>
+        <label for="template-manager">{{ trans('entities.books_default_template') }}</label>
     </button>
     <div refs="collapsible@content" class="collapse-content">
-        @include('entities.template-manager', ['entity' => $book ?? null, 'templates' => $templates])
+        @include('books.parts.template-selector', ['entity' => $book ?? null, 'templates' => []])
     </div>
 </div>
 
similarity index 58%
rename from resources/views/entities/template-manager.blade.php
rename to resources/views/books/parts/template-selector.blade.php
index fe04d9389efc3030614a1674e1f821ef8f2c7ec1..90c5e421b7e0d57d757f5a4884d3644da878999a 100644 (file)
@@ -1,5 +1,5 @@
 <p class="text-muted small">
-    {!! nl2br(e(trans('entities.default_template_explain'))) !!}
+    {{ trans('entities.books_default_template_explain') }}
 </p>
 
 <select name="default_template" id="default_template">
@@ -7,4 +7,7 @@
     @foreach ($templates as $template)
         <option @if(isset($entity) && $entity->default_template === $template->id) selected @endif value="{{ $template->id }}">{{ $template->name }}</option>
     @endforeach
-</select>
\ No newline at end of file
+</select>
+
+
+@include('settings.parts.page-picker', ['name' => 'setting-app-homepage', 'placeholder' => trans('settings.app_homepage_select'), 'value' => setting('app-homepage')])
\ No newline at end of file
index 9ce50d48b13fda72bb0cf1a95504e187d8c56e18..40125dfe2f473da00d1413b8a6a2ba415897dd8a 100644 (file)
@@ -19,8 +19,8 @@
         <div class="card content-wrap auto-height">
             <h1 class="list-heading">{{ $page->draft ? trans('entities.pages_delete_draft') : trans('entities.pages_delete') }}</h1>
 
-            @if ($times_used_as_template > 0)
-                <p>{{ trans_choice('entities.pages_delete_warning_template', $times_used_as_template) }}</p>
+            @if($usedAsTemplate)
+                <p>{{ trans('entities.pages_delete_warning_template') }}</p>
             @endif
 
             <div class="grid half v-center">