mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-04-30 22:50:05 +00:00
Initial Draft
This commit is contained in:
parent
1c922be4c7
commit
88e148ba00
3 changed files with 112 additions and 43 deletions
|
@ -18,41 +18,41 @@ use Illuminate\Http\Request;
|
||||||
class HomeController extends Controller
|
class HomeController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Display the homepage.
|
* Display the homepage.
|
||||||
*/
|
*/
|
||||||
public function index(Request $request, ActivityQueries $activities)
|
public function index(Request $request, ActivityQueries $activities)
|
||||||
{
|
{
|
||||||
$activity = $activities->latest(10);
|
$activity = $activities->latest(10);
|
||||||
$draftPages = [];
|
$draftPages = [];
|
||||||
|
|
||||||
if ($this->isSignedIn()) {
|
if ($this->isSignedIn()) {
|
||||||
$draftPages = Page::visible()
|
$draftPages = Page::visible()
|
||||||
->where('draft', '=', true)
|
->where('draft', '=', true)
|
||||||
->where('created_by', '=', user()->id)
|
->where('created_by', '=', user()->id)
|
||||||
->orderBy('updated_at', 'desc')
|
->orderBy('updated_at', 'desc')
|
||||||
->with('book')
|
->with('book')
|
||||||
->take(6)
|
->take(6)
|
||||||
->get();
|
->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
|
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
|
||||||
$recents = $this->isSignedIn() ?
|
$recents = $this->isSignedIn() ?
|
||||||
(new RecentlyViewed())->run(12 * $recentFactor, 1)
|
(new RecentlyViewed())->run(12 * $recentFactor, 1)
|
||||||
: Book::visible()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get();
|
: Book::visible()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get();
|
||||||
$favourites = (new TopFavourites())->run(6);
|
$favourites = (new TopFavourites())->run(6);
|
||||||
$recentlyUpdatedPages = Page::visible()->with('book')
|
$recentlyUpdatedPages = Page::visible()->with('book')
|
||||||
->where('draft', false)
|
->where('draft', false)
|
||||||
->orderBy('updated_at', 'desc')
|
->orderBy('updated_at', 'desc')
|
||||||
->take($favourites->count() > 0 ? 5 : 10)
|
->take($favourites->count() > 0 ? 5 : 10)
|
||||||
->select(Page::$listAttributes)
|
->select(Page::$listAttributes)
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
$homepageOptions = ['default', 'books', 'bookshelves', 'page'];
|
$homepageOptions = ['default', 'books', 'bookshelves', 'page'];
|
||||||
$homepageOption = setting('app-homepage-type', 'default');
|
$homepageOption = setting('app-homepage-type', 'default');
|
||||||
if (!in_array($homepageOption, $homepageOptions)) {
|
if (!in_array($homepageOption, $homepageOptions)) {
|
||||||
$homepageOption = 'default';
|
$homepageOption = 'default';
|
||||||
}
|
}
|
||||||
|
|
||||||
$commonData = [
|
$commonData = [
|
||||||
'activity' => $activity,
|
'activity' => $activity,
|
||||||
'recents' => $recents,
|
'recents' => $recents,
|
||||||
|
@ -60,7 +60,7 @@ class HomeController extends Controller
|
||||||
'draftPages' => $draftPages,
|
'draftPages' => $draftPages,
|
||||||
'favourites' => $favourites,
|
'favourites' => $favourites,
|
||||||
];
|
];
|
||||||
|
|
||||||
// Add required list ordering & sorting for books & shelves views.
|
// Add required list ordering & sorting for books & shelves views.
|
||||||
if ($homepageOption === 'bookshelves' || $homepageOption === 'books') {
|
if ($homepageOption === 'bookshelves' || $homepageOption === 'books') {
|
||||||
$key = $homepageOption;
|
$key = $homepageOption;
|
||||||
|
@ -70,27 +70,27 @@ class HomeController extends Controller
|
||||||
'created_at' => trans('common.sort_created_at'),
|
'created_at' => trans('common.sort_created_at'),
|
||||||
'updated_at' => trans('common.sort_updated_at'),
|
'updated_at' => trans('common.sort_updated_at'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$commonData = array_merge($commonData, [
|
$commonData = array_merge($commonData, [
|
||||||
'view' => $view,
|
'view' => $view,
|
||||||
'listOptions' => $listOptions,
|
'listOptions' => $listOptions,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($homepageOption === 'bookshelves') {
|
if ($homepageOption === 'bookshelves') {
|
||||||
$shelves = app(BookshelfRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
|
$shelves = app(BookshelfRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
|
||||||
$data = array_merge($commonData, ['shelves' => $shelves]);
|
$data = array_merge($commonData, ['shelves' => $shelves]);
|
||||||
|
|
||||||
return view('home.shelves', $data);
|
return view('home.shelves', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($homepageOption === 'books') {
|
if ($homepageOption === 'books') {
|
||||||
$books = app(BookRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
|
$books = app(BookRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
|
||||||
$data = array_merge($commonData, ['books' => $books]);
|
$data = array_merge($commonData, ['books' => $books]);
|
||||||
|
|
||||||
return view('home.books', $data);
|
return view('home.books', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($homepageOption === 'page') {
|
if ($homepageOption === 'page') {
|
||||||
$homepageSetting = setting('app-homepage', '0:');
|
$homepageSetting = setting('app-homepage', '0:');
|
||||||
$id = intval(explode(':', $homepageSetting)[0]);
|
$id = intval(explode(':', $homepageSetting)[0]);
|
||||||
|
@ -98,46 +98,110 @@ class HomeController extends Controller
|
||||||
$customHomepage = Page::query()->where('draft', '=', false)->findOrFail($id);
|
$customHomepage = Page::query()->where('draft', '=', false)->findOrFail($id);
|
||||||
$pageContent = new PageContent($customHomepage);
|
$pageContent = new PageContent($customHomepage);
|
||||||
$customHomepage->html = $pageContent->render(false);
|
$customHomepage->html = $pageContent->render(false);
|
||||||
|
|
||||||
return view('home.specific-page', array_merge($commonData, ['customHomepage' => $customHomepage]));
|
return view('home.specific-page', array_merge($commonData, ['customHomepage' => $customHomepage]));
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('home.default', $commonData);
|
return view('home.default', $commonData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the view for /robots.txt.
|
* Show the view for /robots.txt.
|
||||||
*/
|
*/
|
||||||
public function robots()
|
public function robots()
|
||||||
{
|
{
|
||||||
$sitePublic = setting('app-public', false);
|
$sitePublic = setting('app-public', false);
|
||||||
$allowRobots = config('app.allow_robots');
|
$allowRobots = config('app.allow_robots');
|
||||||
|
|
||||||
if ($allowRobots === null) {
|
if ($allowRobots === null) {
|
||||||
$allowRobots = $sitePublic;
|
$allowRobots = $sitePublic;
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()
|
return response()
|
||||||
->view('misc.robots', ['allowRobots' => $allowRobots])
|
->view('misc.robots', ['allowRobots' => $allowRobots])
|
||||||
->header('Content-Type', 'text/plain');
|
->header('Content-Type', 'text/plain');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the route for 404 responses.
|
* Show the route for 404 responses.
|
||||||
*/
|
*/
|
||||||
public function notFound()
|
public function notFound()
|
||||||
{
|
{
|
||||||
return response()->view('errors.404', [], 404);
|
return response()->view('errors.404', [], 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serve the application favicon.
|
* Serve the application favicon.
|
||||||
* Ensures a 'favicon.ico' file exists at the web root location (if writable) to be served
|
* Ensures a 'favicon.ico' file exists at the web root location (if writable) to be served
|
||||||
* directly by the webserver in the future.
|
* directly by the webserver in the future.
|
||||||
*/
|
*/
|
||||||
public function favicon(FaviconHandler $favicons)
|
public function favicon(FaviconHandler $favicons)
|
||||||
{
|
{
|
||||||
$exists = $favicons->restoreOriginalIfNotExists();
|
$exists = $favicons->restoreOriginalIfNotExists();
|
||||||
return response()->file($exists ? $favicons->getPath() : $favicons->getOriginalPath());
|
return response()->file($exists ? $favicons->getPath() : $favicons->getOriginalPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serve the application manifest.
|
||||||
|
* Ensures a 'manifest.json'
|
||||||
|
*/
|
||||||
|
public function manifest()
|
||||||
|
{
|
||||||
|
$manifest = [
|
||||||
|
"name" => config('app.name' | 'BookStack'),
|
||||||
|
"short_name" => "bookstack",
|
||||||
|
"start_url" => "/",
|
||||||
|
"scope" => "/",
|
||||||
|
"display" => "standalone",
|
||||||
|
"background_color" => "#fff",
|
||||||
|
"description" => config('app.name' | 'BookStack'),
|
||||||
|
"categories" => [
|
||||||
|
"productivity",
|
||||||
|
"lifestyle"
|
||||||
|
],
|
||||||
|
"launch_handler" => [
|
||||||
|
"client_mode" => "focus-existing"
|
||||||
|
],
|
||||||
|
"orientation" => "portrait",
|
||||||
|
"icons" => [
|
||||||
|
[
|
||||||
|
"src" => "/icon-64.png",
|
||||||
|
"sizes" => "64x64",
|
||||||
|
"type" => "image/png"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"src" => "/icon-32.png",
|
||||||
|
"sizes" => "32x32",
|
||||||
|
"type" => "image/png"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"src" => "/icon-128.png",
|
||||||
|
"sizes" => "128x128",
|
||||||
|
"type" => "image/png"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"src" => "icon-180.png",
|
||||||
|
"sizes" => "180x180",
|
||||||
|
"type" => "image/png"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"src" => "icon.png",
|
||||||
|
"sizes" => "256x256",
|
||||||
|
"type" => "image/png"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"src" => "icon.ico",
|
||||||
|
"sizes" => "48x48",
|
||||||
|
"type" => "image/vnd.microsoft.icon"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"src" => "favicon.ico",
|
||||||
|
"sizes" => "48x48",
|
||||||
|
"type" => "image/vnd.microsoft.icon"
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
return response()->json($manifest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,10 @@
|
||||||
<link rel="icon" type="image/png" sizes="64x64" href="{{ setting('app-icon-64') ?: url('/icon-64.png') }}">
|
<link rel="icon" type="image/png" sizes="64x64" href="{{ setting('app-icon-64') ?: url('/icon-64.png') }}">
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="{{ setting('app-icon-32') ?: url('/icon-32.png') }}">
|
<link rel="icon" type="image/png" sizes="32x32" href="{{ setting('app-icon-32') ?: url('/icon-32.png') }}">
|
||||||
|
|
||||||
|
<!-- PWA -->
|
||||||
|
<link rel="manifest" href="{{ url('/manifest.json') }}" />
|
||||||
|
<meta name="mobile-web-app-capable" content="yes" />
|
||||||
|
|
||||||
@yield('head')
|
@yield('head')
|
||||||
|
|
||||||
<!-- Custom Styles & Head Content -->
|
<!-- Custom Styles & Head Content -->
|
||||||
|
|
|
@ -20,6 +20,7 @@ use Illuminate\View\Middleware\ShareErrorsFromSession;
|
||||||
Route::get('/status', [SettingControllers\StatusController::class, 'show']);
|
Route::get('/status', [SettingControllers\StatusController::class, 'show']);
|
||||||
Route::get('/robots.txt', [HomeController::class, 'robots']);
|
Route::get('/robots.txt', [HomeController::class, 'robots']);
|
||||||
Route::get('/favicon.ico', [HomeController::class, 'favicon']);
|
Route::get('/favicon.ico', [HomeController::class, 'favicon']);
|
||||||
|
Route::get('/manifest.json', [HomeController::class, 'manifest']);
|
||||||
|
|
||||||
// Authenticated routes...
|
// Authenticated routes...
|
||||||
Route::middleware('auth')->group(function () {
|
Route::middleware('auth')->group(function () {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue