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;
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
+ ) {
}
/**
$this->setPageTitle(trans('entities.books_create'));
- $templates = Page::visible()
- ->where('template', '=', true)
- ->orderBy('name', 'asc')
- ->get();
-
return view('books.create', [
'bookshelf' => $bookshelf,
- 'templates' => $templates,
]);
}
{
$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;
$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]);
}
/**
$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')) {
$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,
]);
}
* @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
{
public $searchFactor = 1.2;
- protected $fillable = ['name', 'description', 'default_template'];
+ protected $fillable = ['name', 'description'];
protected $hidden = ['pivot', 'image_id', 'deleted_at'];
/**
$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,
]);
}
'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.',
'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',
'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',
<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>
<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>
<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>
<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">
@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
<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">