Skip to content

Commit ff21f6b

Browse files
author
Dan Brown
committed
Merge pull request 'Configurable block layouts' (#6179) from sidebar_management into development
Reviewed-on: https://codeberg.org/bookstack/bookstack/pulls/6179
2 parents a5261f1 + 63082b5 commit ff21f6b

106 files changed

Lines changed: 2668 additions & 305 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/App/HomeController.php

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22

33
namespace BookStack\App;
44

5-
use BookStack\Activity\ActivityQueries;
65
use BookStack\Entities\Models\Page;
76
use BookStack\Entities\Queries\EntityQueries;
8-
use BookStack\Entities\Queries\QueryRecentlyViewed;
9-
use BookStack\Entities\Queries\QueryTopFavourites;
107
use BookStack\Entities\Tools\PageContent;
118
use BookStack\Http\Controller;
129
use BookStack\Util\SimpleListOptions;
@@ -24,49 +21,19 @@ public function __construct(
2421
*/
2522
public function index(
2623
Request $request,
27-
ActivityQueries $activities,
28-
QueryRecentlyViewed $recentlyViewed,
29-
QueryTopFavourites $topFavourites,
3024
) {
31-
$activity = $activities->latest(10);
32-
$draftPages = [];
33-
34-
if ($this->isSignedIn()) {
35-
$draftPages = $this->queries->pages->currentUserDraftsForList()
36-
->orderBy('updated_at', 'desc')
37-
->with('book')
38-
->take(6)
39-
->get();
40-
}
41-
42-
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
43-
$recents = $this->isSignedIn() ?
44-
$recentlyViewed->run(12 * $recentFactor, 1)
45-
: $this->queries->books->visibleForList()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get();
46-
$favourites = $topFavourites->run(6);
47-
$recentlyUpdatedPages = $this->queries->pages->visibleForList()
48-
->where('draft', false)
49-
->orderBy('updated_at', 'desc')
50-
->take($favourites->count() > 0 ? 5 : 10)
51-
->get();
52-
53-
$homepageOptions = ['default', 'books', 'bookshelves', 'page'];
54-
$homepageOption = setting('app-homepage-type', 'default');
55-
if (!in_array($homepageOption, $homepageOptions)) {
56-
$homepageOption = 'default';
25+
$homepageType = setting('app-homepage-type');
26+
if (!in_array($homepageType, ['default', 'books', 'bookshelves', 'page'])) {
27+
$homepageType = 'default';
5728
}
5829

5930
$commonData = [
60-
'activity' => $activity,
61-
'recents' => $recents,
62-
'recentlyUpdatedPages' => $recentlyUpdatedPages,
63-
'draftPages' => $draftPages,
64-
'favourites' => $favourites,
31+
'homeView' => $homepageType,
6532
];
6633

6734
// Add required list ordering & sorting for books & shelves views.
68-
if ($homepageOption === 'bookshelves' || $homepageOption === 'books') {
69-
$key = $homepageOption;
35+
if ($homepageType === 'bookshelves' || $homepageType === 'books') {
36+
$key = $homepageType;
7037
$view = setting()->getForCurrentUser($key . '_view_type');
7138
$listOptions = SimpleListOptions::fromRequest($request, $key)->withSortOptions([
7239
'name' => trans('common.sort_name'),
@@ -80,7 +47,7 @@ public function index(
8047
]);
8148
}
8249

83-
if ($homepageOption === 'bookshelves') {
50+
if ($homepageType === 'bookshelves') {
8451
$shelves = $this->queries->shelves->visibleForListWithCover()
8552
->orderBy($commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder())
8653
->paginate(setting()->getInteger('lists-page-count-shelves', 18, 1, 1000));
@@ -89,7 +56,7 @@ public function index(
8956
return view('home.shelves', $data);
9057
}
9158

92-
if ($homepageOption === 'books') {
59+
if ($homepageType === 'books') {
9360
$books = $this->queries->books->visibleForListWithCover()
9461
->orderBy($commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder())
9562
->paginate(setting()->getInteger('lists-page-count-books', 18, 1, 1000));
@@ -98,7 +65,7 @@ public function index(
9865
return view('home.books', $data);
9966
}
10067

101-
if ($homepageOption === 'page') {
68+
if ($homepageType === 'page') {
10269
$homepageSetting = setting('app-homepage', '0:');
10370
$id = intval(explode(':', $homepageSetting)[0]);
10471
/** @var Page $customHomepage */

app/App/Providers/ViewTweaksServiceProvider.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
namespace BookStack\App\Providers;
44

55
use BookStack\Entities\BreadcrumbsViewComposer;
6+
use BookStack\Facades\Theme;
7+
use BookStack\Theming\ThemeEvents;
68
use BookStack\Util\DateFormatter;
9+
use BookStack\View\ViewBlockManager;
10+
use BookStack\View\ViewBlockPreferences;
711
use Illuminate\Pagination\Paginator;
812
use Illuminate\Support\Facades\Blade;
913
use Illuminate\Support\Facades\View;
@@ -18,6 +22,10 @@ public function register()
1822
$app['config']->get('app.display_timezone'),
1923
);
2024
});
25+
26+
$this->app->singleton(ViewBlockManager::class, function ($app) {
27+
return new ViewBlockManager(new ViewBlockPreferences());
28+
});
2129
}
2230

2331
/**
@@ -32,7 +40,10 @@ public function boot(): void
3240
View::composer('entities.breadcrumbs', BreadcrumbsViewComposer::class);
3341

3442
// View Globals
43+
$viewBlockManager = $this->app->make(ViewBlockManager::class);
3544
View::share('dates', $this->app->make(DateFormatter::class));
45+
View::share('viewBlocks', $viewBlockManager);
46+
Theme::dispatch(ThemeEvents::VIEW_BLOCKS_REGISTER, $viewBlockManager);
3647

3748
// Custom blade view directives
3849
Blade::directive('icon', function ($expression) {

app/Config/setting-defaults.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
'page-draft-color-dark' => '#a66ce8',
3333
'app-custom-head' => false,
3434
'registration-enabled' => false,
35+
'app-homepage-type' => 'default',
3536

3637
// User-level default settings
3738
'user' => [

app/Entities/Controllers/BookController.php

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
namespace BookStack\Entities\Controllers;
44

5-
use BookStack\Activity\ActivityQueries;
65
use BookStack\Activity\ActivityType;
76
use BookStack\Activity\Models\View;
8-
use BookStack\Activity\Tools\UserEntityWatchOptions;
97
use BookStack\Entities\Queries\BookQueries;
108
use BookStack\Entities\Queries\BookshelfQueries;
119
use BookStack\Entities\Queries\EntityQueries;
@@ -19,7 +17,6 @@
1917
use BookStack\Facades\Activity;
2018
use BookStack\Http\Controller;
2119
use BookStack\Permissions\Permission;
22-
use BookStack\References\ReferenceFetcher;
2320
use BookStack\Util\DatabaseTransaction;
2421
use BookStack\Util\SimpleListOptions;
2522
use Illuminate\Http\Request;
@@ -34,7 +31,6 @@ public function __construct(
3431
protected BookQueries $queries,
3532
protected EntityQueries $entityQueries,
3633
protected BookshelfQueries $shelfQueries,
37-
protected ReferenceFetcher $referenceFetcher,
3834
) {
3935
}
4036

@@ -53,19 +49,13 @@ public function index(Request $request)
5349
$books = $this->queries->visibleForListWithCover()
5450
->orderBy($listOptions->getSort(), $listOptions->getOrder())
5551
->paginate(setting()->getInteger('lists-page-count-books', 18, 1, 1000));
56-
$recents = $this->isSignedIn() ? $this->queries->recentlyViewedForCurrentUser()->take(4)->get() : false;
57-
$popular = $this->queries->popularForList()->take(4)->get();
58-
$new = $this->queries->visibleForList()->orderBy('created_at', 'desc')->take(4)->get();
5952

6053
$this->shelfContext->clearShelfContext();
6154

6255
$this->setPageTitle(trans('entities.books'));
6356

6457
return view('books.index', [
6558
'books' => $books,
66-
'recents' => $recents,
67-
'popular' => $popular,
68-
'new' => $new,
6959
'view' => $view,
7060
'listOptions' => $listOptions,
7161
]);
@@ -127,7 +117,7 @@ public function store(Request $request, ?string $shelfSlug = null)
127117
/**
128118
* Display the specified book.
129119
*/
130-
public function show(Request $request, ActivityQueries $activities, string $slug)
120+
public function show(Request $request, string $slug)
131121
{
132122
try {
133123
$book = $this->queries->findVisibleBySlugOrFail($slug);
@@ -140,7 +130,6 @@ public function show(Request $request, ActivityQueries $activities, string $slug
140130
}
141131

142132
$bookChildren = (new BookContents($book))->getTree(true);
143-
$bookParentShelves = $book->shelves()->scopes('visible')->get();
144133

145134
View::incrementFor($book);
146135
if ($request->has('shelf')) {
@@ -153,10 +142,6 @@ public function show(Request $request, ActivityQueries $activities, string $slug
153142
'book' => $book,
154143
'current' => $book,
155144
'bookChildren' => $bookChildren,
156-
'bookParentShelves' => $bookParentShelves,
157-
'watchOptions' => new UserEntityWatchOptions(user(), $book),
158-
'activity' => $activities->entityActivity($book, 20, 1),
159-
'referenceCount' => $this->referenceFetcher->getReferenceCountToEntity($book),
160145
]);
161146
}
162147

app/Entities/Controllers/BookshelfController.php

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace BookStack\Entities\Controllers;
44

5-
use BookStack\Activity\ActivityQueries;
65
use BookStack\Activity\Models\View;
76
use BookStack\Entities\Queries\BookQueries;
87
use BookStack\Entities\Queries\BookshelfQueries;
@@ -13,7 +12,6 @@
1312
use BookStack\Exceptions\NotFoundException;
1413
use BookStack\Http\Controller;
1514
use BookStack\Permissions\Permission;
16-
use BookStack\References\ReferenceFetcher;
1715
use BookStack\Util\SimpleListOptions;
1816
use Exception;
1917
use Illuminate\Http\Request;
@@ -27,7 +25,6 @@ public function __construct(
2725
protected EntityQueries $entityQueries,
2826
protected BookQueries $bookQueries,
2927
protected ShelfContext $shelfContext,
30-
protected ReferenceFetcher $referenceFetcher,
3128
) {
3229
}
3330

@@ -46,21 +43,12 @@ public function index(Request $request)
4643
$shelves = $this->queries->visibleForListWithCover()
4744
->orderBy($listOptions->getSort(), $listOptions->getOrder())
4845
->paginate(setting()->getInteger('lists-page-count-shelves', 18, 1, 1000));
49-
$recents = $this->isSignedIn() ? $this->queries->recentlyViewedForCurrentUser()->get() : false;
50-
$popular = $this->queries->popularForList()->get();
51-
$new = $this->queries->visibleForList()
52-
->orderBy('created_at', 'desc')
53-
->take(4)
54-
->get();
5546

5647
$this->shelfContext->clearShelfContext();
5748
$this->setPageTitle(trans('entities.shelves'));
5849

5950
return view('shelves.index', [
6051
'shelves' => $shelves,
61-
'recents' => $recents,
62-
'popular' => $popular,
63-
'new' => $new,
6452
'view' => $view,
6553
'listOptions' => $listOptions,
6654
]);
@@ -105,7 +93,7 @@ public function store(Request $request)
10593
*
10694
* @throws NotFoundException
10795
*/
108-
public function show(Request $request, ActivityQueries $activities, string $slug)
96+
public function show(Request $request, string $slug)
10997
{
11098
try {
11199
$shelf = $this->queries->findVisibleBySlugOrFail($slug);
@@ -144,9 +132,7 @@ public function show(Request $request, ActivityQueries $activities, string $slug
144132
'shelf' => $shelf,
145133
'sortedVisibleShelfBooks' => $sortedVisibleShelfBooks,
146134
'view' => $view,
147-
'activity' => $activities->entityActivity($shelf, 20, 1),
148135
'listOptions' => $listOptions,
149-
'referenceCount' => $this->referenceFetcher->getReferenceCountToEntity($shelf),
150136
]);
151137
}
152138

app/Entities/Controllers/ChapterController.php

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace BookStack\Entities\Controllers;
44

55
use BookStack\Activity\Models\View;
6-
use BookStack\Activity\Tools\UserEntityWatchOptions;
76
use BookStack\Entities\Models\Book;
87
use BookStack\Entities\Queries\ChapterQueries;
98
use BookStack\Entities\Queries\EntityQueries;
@@ -18,7 +17,6 @@
1817
use BookStack\Exceptions\PermissionsException;
1918
use BookStack\Http\Controller;
2019
use BookStack\Permissions\Permission;
21-
use BookStack\References\ReferenceFetcher;
2220
use BookStack\Util\DatabaseTransaction;
2321
use Illuminate\Http\Request;
2422
use Illuminate\Validation\ValidationException;
@@ -30,7 +28,6 @@ public function __construct(
3028
protected ChapterRepo $chapterRepo,
3129
protected ChapterQueries $queries,
3230
protected EntityQueries $entityQueries,
33-
protected ReferenceFetcher $referenceFetcher,
3431
) {
3532
}
3633

@@ -87,10 +84,10 @@ public function show(string $bookSlug, string $chapterSlug)
8784
return redirect($chapter->getUrl());
8885
}
8986

90-
$sidebarTree = (new BookContents($chapter->book))->getTree();
9187
$pages = $this->entityQueries->pages->visibleForChapterList($chapter->id)->get();
9288

93-
$nextPreviousLocator = new NextPreviousContentLocator($chapter, $sidebarTree);
89+
$bookTree = (new BookContents($chapter->book))->getTree();
90+
$nextPreviousLocator = new NextPreviousContentLocator($chapter, $bookTree);
9491
View::incrementFor($chapter);
9592

9693
$this->setPageTitle($chapter->getShortName());
@@ -99,12 +96,10 @@ public function show(string $bookSlug, string $chapterSlug)
9996
'book' => $chapter->book,
10097
'chapter' => $chapter,
10198
'current' => $chapter,
102-
'sidebarTree' => $sidebarTree,
103-
'watchOptions' => new UserEntityWatchOptions(user(), $chapter),
10499
'pages' => $pages,
105100
'next' => $nextPreviousLocator->getNext(),
106101
'previous' => $nextPreviousLocator->getPrevious(),
107-
'referenceCount' => $this->referenceFetcher->getReferenceCountToEntity($chapter),
102+
'bookTree' => $bookTree,
108103
]);
109104
}
110105

app/Entities/Controllers/PageController.php

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use BookStack\Activity\Models\View;
66
use BookStack\Activity\Tools\CommentTree;
7-
use BookStack\Activity\Tools\UserEntityWatchOptions;
87
use BookStack\Entities\Models\Book;
98
use BookStack\Entities\Models\Chapter;
109
use BookStack\Entities\Models\Page;
@@ -21,7 +20,6 @@
2120
use BookStack\Exceptions\PermissionsException;
2221
use BookStack\Http\Controller;
2322
use BookStack\Permissions\Permission;
24-
use BookStack\References\ReferenceFetcher;
2523
use BookStack\Util\HtmlContentFilter;
2624
use BookStack\Util\HtmlContentFilterConfig;
2725
use Exception;
@@ -36,7 +34,6 @@ public function __construct(
3634
protected PageRepo $pageRepo,
3735
protected PageQueries $queries,
3836
protected EntityQueries $entityQueries,
39-
protected ReferenceFetcher $referenceFetcher
4037
) {
4138
}
4239

@@ -154,11 +151,10 @@ public function show(string $bookSlug, string $pageSlug)
154151

155152
$pageContent = (new PageContent($page));
156153
$page->html = $pageContent->render();
157-
$pageNav = $pageContent->getNavigation($page->html);
158154

159-
$sidebarTree = (new BookContents($page->book))->getTree();
155+
$bookTree = (new BookContents($page->book))->getTree();
160156
$commentTree = (new CommentTree($page));
161-
$nextPreviousLocator = new NextPreviousContentLocator($page, $sidebarTree);
157+
$nextPreviousLocator = new NextPreviousContentLocator($page, $bookTree);
162158

163159
View::incrementFor($page);
164160
$this->setPageTitle($page->getShortName());
@@ -167,13 +163,10 @@ public function show(string $bookSlug, string $pageSlug)
167163
'page' => $page,
168164
'book' => $page->book,
169165
'current' => $page,
170-
'sidebarTree' => $sidebarTree,
166+
'bookTree' => $bookTree,
171167
'commentTree' => $commentTree,
172-
'pageNav' => $pageNav,
173-
'watchOptions' => new UserEntityWatchOptions(user(), $page),
174168
'next' => $nextPreviousLocator->getNext(),
175169
'previous' => $nextPreviousLocator->getPrevious(),
176-
'referenceCount' => $this->referenceFetcher->getReferenceCountToEntity($page),
177170
]);
178171
}
179172

app/Http/Kernel.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class Kernel extends HttpKernel
3636
\BookStack\Http\Middleware\CheckEmailConfirmed::class,
3737
\BookStack\Http\Middleware\RunThemeActions::class,
3838
\BookStack\Http\Middleware\Localization::class,
39+
\BookStack\Http\Middleware\ClearPerRequestCaches::class,
3940
],
4041
'api' => [
4142
\BookStack\Http\Middleware\ThrottleApiRequests::class,

0 commit comments

Comments
 (0)