class PageEditActivity
{
- protected $page;
+ protected Page $page;
/**
* PageEditActivity constructor.
--- /dev/null
+<?php
+
+namespace BookStack\Entities\Tools;
+
+use BookStack\Entities\Models\Page;
+use BookStack\Entities\Repos\PageRepo;
+
+class PageEditorData
+{
+ protected Page $page;
+ protected PageRepo $pageRepo;
+
+ protected array $viewData;
+ protected array $warnings;
+
+ public function __construct(Page $page, PageRepo $pageRepo)
+ {
+ $this->page = $page;
+ $this->pageRepo = $pageRepo;
+ $this->viewData = $this->build();
+ }
+
+ public function getViewData(): array
+ {
+ return $this->viewData;
+ }
+
+ public function getWarnings(): array
+ {
+ return $this->warnings;
+ }
+
+ protected function build(): array
+ {
+ $page = clone $this->page;
+ $isDraft = boolval($this->page->draft);
+ $templates = $this->pageRepo->getTemplates(10);
+ $draftsEnabled = auth()->check();
+
+ $isDraftRevision = false;
+ $this->warnings = [];
+ $editActivity = new PageEditActivity($page);
+
+ if ($editActivity->hasActiveEditing()) {
+ $this->warnings[] = $editActivity->activeEditingMessage();
+ }
+
+ // Check for a current draft version for this user
+ $userDraft = $this->pageRepo->getUserDraft($page);
+ if ($userDraft !== null) {
+ $page->forceFill($userDraft->only(['name', 'html', 'markdown']));
+ $isDraftRevision = true;
+ $this->warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft);
+ }
+
+ return [
+ 'page' => $page,
+ 'book' => $page->book,
+ 'isDraft' => $isDraft,
+ 'isDraftRevision' => $isDraftRevision,
+ 'draftsEnabled' => $draftsEnabled,
+ 'templates' => $templates,
+ 'editor' => setting('app-editor') === 'wysiwyg' ? 'wysiwyg' : 'markdown',
+ ];
+ }
+
+}
\ No newline at end of file
use BookStack\Entities\Tools\NextPreviousContentLocator;
use BookStack\Entities\Tools\PageContent;
use BookStack\Entities\Tools\PageEditActivity;
+use BookStack\Entities\Tools\PageEditorData;
use BookStack\Entities\Tools\PermissionsUpdater;
use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\PermissionsException;
class PageController extends Controller
{
- protected $pageRepo;
+ protected PageRepo $pageRepo;
/**
* PageController constructor.
{
$draft = $this->pageRepo->getById($pageId);
$this->checkOwnablePermission('page-create', $draft->getParent());
- $this->setPageTitle(trans('entities.pages_edit_draft'));
- $draftsEnabled = $this->isSignedIn();
- $templates = $this->pageRepo->getTemplates(10);
+ $editorData = new PageEditorData($draft, $this->pageRepo);
+ $this->setPageTitle(trans('entities.pages_edit_draft'));
- return view('pages.edit', [
- 'page' => $draft,
- 'book' => $draft->book,
- 'isDraft' => true,
- 'draftsEnabled' => $draftsEnabled,
- 'templates' => $templates,
- 'editor' => setting('app-editor') === 'wysiwyg' ? 'wysiwyg' : 'markdown',
- ]);
+ return view('pages.edit', $editorData->getViewData());
}
/**
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
$this->checkOwnablePermission('page-update', $page);
- $page->isDraft = false;
- $editActivity = new PageEditActivity($page);
-
- // Check for active editing
- $warnings = [];
- if ($editActivity->hasActiveEditing()) {
- $warnings[] = $editActivity->activeEditingMessage();
+ $editorData = new PageEditorData($page, $this->pageRepo);
+ if ($editorData->getWarnings()) {
+ $this->showWarningNotification(implode("\n", $editorData->getWarnings()));
}
- // Check for a current draft version for this user
- $userDraft = $this->pageRepo->getUserDraft($page);
- if ($userDraft !== null) {
- $page->forceFill($userDraft->only(['name', 'html', 'markdown']));
- $page->isDraft = true;
- $warnings[] = $editActivity->getEditingActiveDraftMessage($userDraft);
- }
-
- if (count($warnings) > 0) {
- $this->showWarningNotification(implode("\n", $warnings));
- }
-
- $templates = $this->pageRepo->getTemplates(10);
- $draftsEnabled = $this->isSignedIn();
$this->setPageTitle(trans('entities.pages_editing_named', ['pageName' => $page->getShortName()]));
- return view('pages.edit', [
- 'page' => $page,
- 'book' => $page->book,
- 'current' => $page,
- 'draftsEnabled' => $draftsEnabled,
- 'templates' => $templates,
- 'editor' => setting('app-editor') === 'wysiwyg' ? 'wysiwyg' : 'markdown',
- ]);
+ return view('pages.edit', $editorData->getViewData());
}
/**
@extends('layouts.base')
-@section('head')
- <script src="{{ url('/libs/tinymce/tinymce.min.js?ver=5.10.2') }}" nonce="{{ $cspNonce }}"></script>
-@stop
-
@section('body-class', 'flexbox')
@section('content')
<form action="{{ $page->getUrl() }}" autocomplete="off" data-page-id="{{ $page->id }}" method="POST" class="flex flex-fill">
{{ csrf_field() }}
- @if(!isset($isDraft))
- <input type="hidden" name="_method" value="PUT">
- @endif
+ @if($isDraft) {{ method_field('PUT') }} @endif
@include('pages.parts.form', ['model' => $page])
@include('pages.parts.editor-toolbox')
</form>
@endif
option:page-editor:editor-type="{{ setting('app-editor') }}"
option:page-editor:page-id="{{ $model->id ?? '0' }}"
- option:page-editor:page-new-draft="{{ ($model->draft ?? false) ? 'true' : 'false' }}"
- option:page-editor:draft-text="{{ ($model->draft || $model->isDraft) ? trans('entities.pages_editing_draft') : trans('entities.pages_editing_page') }}"
+ option:page-editor:page-new-draft="{{ $isDraft ? 'true' : 'false' }}"
+ option:page-editor:draft-text="{{ ($isDraft || $isDraftRevision) ? trans('entities.pages_editing_draft') : trans('entities.pages_editing_page') }}"
option:page-editor:autosave-fail-text="{{ trans('errors.page_draft_autosave_fail') }}"
option:page-editor:editing-page-text="{{ trans('entities.pages_editing_page') }}"
option:page-editor:draft-discarded-text="{{ trans('entities.pages_draft_discarded') }}"
<div class="grid third no-break v-center">
<div class="action-buttons text-left px-m py-xs">
- <a href="{{ $page->draft ? $page->getParent()->getUrl() : $page->getUrl() }}"
+ <a href="{{ $isDraft ? $page->getParent()->getUrl() : $page->getUrl() }}"
class="text-button text-primary">@icon('back')<span class="hide-under-l">{{ trans('common.back') }}</span></a>
</div>
<li>
<button refs="page-editor@saveDraft" type="button" class="text-pos">@icon('save'){{ trans('entities.pages_edit_save_draft') }}</button>
</li>
- @if ($model->draft)
+ @if($isDraft)
<li>
<a href="{{ $model->getUrl('/delete') }}" class="text-neg">@icon('delete'){{ trans('entities.pages_edit_delete_draft') }}</a>
</li>
@endif
- <li refs="page-editor@discardDraftWrap" class="{{ ($model->isDraft ?? false) ? '' : 'hidden' }}">
+ <li refs="page-editor@discardDraftWrap" class="{{ $isDraft ? '' : 'hidden' }}">
<button refs="page-editor@discardDraft" type="button" class="text-neg">@icon('cancel'){{ trans('entities.pages_edit_discard_draft') }}</button>
</li>
@if(userCan('editor-change'))
<li>
- <button refs="page-editor@swapEditor" type="button">
- @icon('swap-horizontal')
- {{ $editor === 'wysiwyg' ? trans('entities.pages_edit_switch_to_markdown') : trans('entities.pages_edit_switch_to_wysiwyg') }}
- </button>
+ <a href="{{ $model->getUrl($isDraft ? '' : '/edit') }}?editor={{ $editor === 'wysiwyg' ? 'markdown' : 'wysiwyg' }}">
+ @icon('swap-horizontal'){{ $editor === 'wysiwyg' ? trans('entities.pages_edit_switch_to_markdown') : trans('entities.pages_edit_switch_to_wysiwyg') }}
+ </a>
</li>
@endif
</ul>
+@push('head')
+ <script src="{{ url('/libs/tinymce/tinymce.min.js?ver=5.10.2') }}" nonce="{{ $cspNonce }}"></script>
+@endpush
+
<div component="wysiwyg-editor"
option:wysiwyg-editor:language="{{ config('app.lang') }}"
option:wysiwyg-editor:page-id="{{ $model->id ?? 0 }}"