namespace BookStack\Entities\Models;
use BookStack\Entities\Tools\PageContent;
+use BookStack\Entities\Tools\PageEditorType;
+use BookStack\Permissions\PermissionApplicator;
use BookStack\Uploads\Attachment;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
-use Permissions;
+use Illuminate\Database\Eloquent\Relations\HasOne;
/**
* Class Page.
*
- * @property int $chapter_id
- * @property string $html
- * @property string $markdown
- * @property string $text
- * @property bool $template
- * @property bool $draft
- * @property int $revision_count
- * @property Chapter $chapter
- * @property Collection $attachments
+ * @property int $chapter_id
+ * @property string $html
+ * @property string $markdown
+ * @property string $text
+ * @property bool $template
+ * @property bool $draft
+ * @property int $revision_count
+ * @property string $editor
+ * @property Chapter $chapter
+ * @property Collection $attachments
+ * @property Collection $revisions
+ * @property PageRevision $currentRevision
*/
class Page extends BookChild
{
- public static $listAttributes = ['name', 'id', 'slug', 'book_id', 'text', 'created_at', 'updated_at'];
- public static $contentAttributes = ['name', 'id', 'slug', 'book_id', 'html', 'text', 'created_at', 'updated_at'];
+ use HasFactory;
- protected $fillable = ['name', 'priority', 'markdown'];
+ protected $fillable = ['name', 'priority'];
- public $textField = 'text';
+ public string $textField = 'text';
+ public string $htmlField = 'html';
- protected $hidden = ['html', 'markdown', 'text', 'restricted', 'pivot', 'deleted_at'];
+ protected $hidden = ['html', 'markdown', 'text', 'pivot', 'deleted_at'];
protected $casts = [
'draft' => 'boolean',
*/
public function scopeVisible(Builder $query): Builder
{
- $query = Permissions::enforceDraftVisibilityOnQuery($query);
+ $query = app()->make(PermissionApplicator::class)->restrictDraftsOnPageQuery($query);
return parent::scopeVisible($query);
}
/**
* Check if this page has a chapter.
- *
- * @return bool
*/
- public function hasChapter()
+ public function hasChapter(): bool
{
return $this->chapter()->count() > 0;
}
->orderBy('id', 'desc');
}
+ /**
+ * Get the current revision for the page if existing.
+ */
+ public function currentRevision(): HasOne
+ {
+ return $this->hasOne(PageRevision::class)
+ ->where('type', '=', 'version')
+ ->orderBy('created_at', 'desc')
+ ->orderBy('id', 'desc');
+ }
+
/**
* Get all revision instances assigned to this page.
* Includes all types of revisions.
/**
* Get the url of this page.
*/
- public function getUrl($path = ''): string
+ public function getUrl(string $path = ''): string
{
$parts = [
'books',
return url('/' . implode('/', $parts));
}
- /**
- * Get the current revision for the page if existing.
- *
- * @return PageRevision|null
- */
- public function getCurrentRevision()
- {
- return $this->revisions()->first();
- }
-
/**
* Get this page for JSON display.
*/
- public function forJsonDisplay(): Page
+ public function forJsonDisplay(): self
{
$refreshed = $this->refresh()->unsetRelations()->load(['tags', 'createdBy', 'updatedBy', 'ownedBy']);
$refreshed->setHidden(array_diff($refreshed->getHidden(), ['html', 'markdown']));
+ $refreshed->setAttribute('raw_html', $refreshed->html);
$refreshed->html = (new PageContent($refreshed))->render();
return $refreshed;