diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
index ad3b41655..e9cd72fe2 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/Http/Controllers/HomeController.php
@@ -31,11 +31,23 @@ class HomeController extends Controller
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
$recents = $this->signedIn ? Views::getUserRecentlyViewed(12*$recentFactor, 0) : $this->entityRepo->getRecentlyCreated('book', 12*$recentFactor);
$recentlyUpdatedPages = $this->entityRepo->getRecentlyUpdated('page', 12);
- return view('home', [
+
+ // Custom homepage
+ $customHomepage = false;
+ $homepageSetting = setting('app-homepage');
+ if ($homepageSetting) {
+ $id = intval(explode(':', $homepageSetting)[0]);
+ $customHomepage = $this->entityRepo->getById('page', $id);
+ $this->entityRepo->renderPage($customHomepage);
+ }
+
+ $view = $customHomepage ? 'home-custom' : 'home';
+ return view($view, [
'activity' => $activity,
'recents' => $recents,
'recentlyUpdatedPages' => $recentlyUpdatedPages,
- 'draftPages' => $draftPages
+ 'draftPages' => $draftPages,
+ 'customHomepage' => $customHomepage
]);
}
diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php
index 573907e56..21572db29 100644
--- a/app/Http/Controllers/PageController.php
+++ b/app/Http/Controllers/PageController.php
@@ -167,7 +167,7 @@ class PageController extends Controller
return view('pages/show', [
'page' => $page,'book' => $page->book,
'current' => $page, 'sidebarTree' => $sidebarTree,
- 'pageNav' => $pageNav, 'pageContent' => $pageContent]);
+ 'pageNav' => $pageNav]);
}
/**
diff --git a/app/Repos/EntityRepo.php b/app/Repos/EntityRepo.php
index d87c40f9b..b2067ad7b 100644
--- a/app/Repos/EntityRepo.php
+++ b/app/Repos/EntityRepo.php
@@ -710,6 +710,7 @@ class EntityRepo
$content = str_replace($matches[0][$index], trim($innerContent), $content);
}
+ $page->renderedHTML = $content;
return $content;
}
diff --git a/app/Services/ExportService.php b/app/Services/ExportService.php
index 78cef41a4..40402dbce 100644
--- a/app/Services/ExportService.php
+++ b/app/Services/ExportService.php
@@ -27,9 +27,9 @@ class ExportService
*/
public function pageToContainedHtml(Page $page)
{
+ $this->entityRepo->renderPage($page);
$pageHtml = view('pages/export', [
- 'page' => $page,
- 'pageContent' => $this->entityRepo->renderPage($page)
+ 'page' => $page
])->render();
return $this->containHtml($pageHtml);
}
@@ -74,9 +74,9 @@ class ExportService
*/
public function pageToPdf(Page $page)
{
+ $this->entityRepo->renderPage($page);
$html = view('pages/pdf', [
- 'page' => $page,
- 'pageContent' => $this->entityRepo->renderPage($page)
+ 'page' => $page
])->render();
return $this->htmlToPdf($html);
}
diff --git a/app/Services/ViewService.php b/app/Services/ViewService.php
index 3285745ce..770a9e39f 100644
--- a/app/Services/ViewService.php
+++ b/app/Services/ViewService.php
@@ -62,7 +62,7 @@ class ViewService
$query->whereIn('viewable_type', $filterModel);
} else if ($filterModel) {
$query->where('viewable_type', '=', get_class($filterModel));
- };
+ }
return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable');
}
diff --git a/resources/assets/js/components/entity-selector.js b/resources/assets/js/components/entity-selector.js
index 57b2499cc..53358378a 100644
--- a/resources/assets/js/components/entity-selector.js
+++ b/resources/assets/js/components/entity-selector.js
@@ -68,8 +68,9 @@ class EntitySelector {
onClick(event) {
let t = event.target;
+ console.log('click', t);
- if (t.matches('.entity-list a')) {
+ if (t.matches('.entity-list-item *')) {
event.preventDefault();
event.stopPropagation();
let item = t.closest('[data-entity-type]');
@@ -84,12 +85,16 @@ class EntitySelector {
let isDblClick = this.isDoubleClick();
let type = item.getAttribute('data-entity-type');
let id = item.getAttribute('data-entity-id');
- let isSelected = item.classList.contains('selected') || isDblClick;
+ let isSelected = !item.classList.contains('selected') || isDblClick;
this.unselectAll();
this.input.value = isSelected ? `${type}:${id}` : '';
if (!isSelected) window.$events.emit('entity-select-change', null);
+ if (isSelected) {
+ item.classList.add('selected');
+ item.classList.add('primary-background');
+ }
if (!isDblClick && !isSelected) return;
let link = item.querySelector('.entity-list-item-link').getAttribute('href');
diff --git a/resources/assets/js/components/index.js b/resources/assets/js/components/index.js
index f8025ac3d..988409fbc 100644
--- a/resources/assets/js/components/index.js
+++ b/resources/assets/js/components/index.js
@@ -9,6 +9,7 @@ let componentMapping = {
'entity-selector-popup': require('./entity-selector-popup'),
'entity-selector': require('./entity-selector'),
'sidebar': require('./sidebar'),
+ 'page-picker': require('./page-picker'),
};
window.components = {};
diff --git a/resources/assets/js/components/page-picker.js b/resources/assets/js/components/page-picker.js
new file mode 100644
index 000000000..e697d5f68
--- /dev/null
+++ b/resources/assets/js/components/page-picker.js
@@ -0,0 +1,60 @@
+
+class PagePicker {
+
+ constructor(elem) {
+ this.elem = elem;
+ this.input = elem.querySelector('input');
+ this.resetButton = elem.querySelector('[page-picker-reset]');
+ this.selectButton = elem.querySelector('[page-picker-select]');
+ this.display = elem.querySelector('[page-picker-display]');
+ this.defaultDisplay = elem.querySelector('[page-picker-default]');
+ this.buttonSep = elem.querySelector('span.sep');
+
+ this.value = this.input.value;
+ this.setupListeners();
+ }
+
+ setupListeners() {
+ // Select click
+ this.selectButton.addEventListener('click', event => {
+ window.EntitySelectorPopup.show(entity => {
+ this.setValue(entity.id, entity.name);
+ });
+ });
+
+ this.resetButton.addEventListener('click', event => {
+ this.setValue('', '');
+ });
+ }
+
+ setValue(value, name) {
+ this.value = value;
+ this.input.value = value;
+ this.controlView(name);
+ }
+
+ controlView(name) {
+ let hasValue = this.value && this.value !== 0;
+ toggleElem(this.resetButton, hasValue);
+ toggleElem(this.buttonSep, hasValue);
+ toggleElem(this.defaultDisplay, !hasValue);
+ toggleElem(this.display, hasValue);
+ if (hasValue) {
+ let id = this.getAssetIdFromVal();
+ this.display.textContent = `#${id}, ${name}`;
+ this.display.href = window.baseUrl(`/link/${id}`);
+ }
+ }
+
+ getAssetIdFromVal() {
+ return Number(this.value);
+ }
+
+}
+
+function toggleElem(elem, show) {
+ let display = (elem.tagName === 'BUTTON' || elem.tagName === 'SPAN') ? 'inline-block' : 'block';
+ elem.style.display = show ? display : 'none';
+}
+
+module.exports = PagePicker;
\ No newline at end of file
diff --git a/resources/assets/sass/_forms.scss b/resources/assets/sass/_forms.scss
index 657bbed17..700c15336 100644
--- a/resources/assets/sass/_forms.scss
+++ b/resources/assets/sass/_forms.scss
@@ -23,6 +23,11 @@
}
}
+.fake-input {
+ @extend .input-base;
+ overflow: auto;
+}
+
#html-editor {
display: none;
}
diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php
index 3eec7737f..c4c8bfc78 100644
--- a/resources/lang/en/settings.php
+++ b/resources/lang/en/settings.php
@@ -31,6 +31,9 @@ return [
'app_logo_desc' => 'This image should be 43px in height.
Large images will be scaled down.',
'app_primary_color' => 'Application primary color',
'app_primary_color_desc' => 'This should be a hex value.
Leave empty to reset to the default color.',
+ 'app_homepage' => 'Application Homepage',
+ 'app_homepage_desc' => 'Select a page to show on the homepage instead of the default view. Page permissions are ignored for selected pages.',
+ 'app_homepage_default' => 'Default homepage view chosen',
/**
* Registration settings
diff --git a/resources/views/components/page-picker.blade.php b/resources/views/components/page-picker.blade.php
new file mode 100644
index 000000000..91d8eb646
--- /dev/null
+++ b/resources/views/components/page-picker.blade.php
@@ -0,0 +1,13 @@
+
+{{--Depends on entity selector popup--}}
+
{{ trans('settings.app_homepage_desc') }}
+ @include('components.page-picker', ['name' => 'setting-app-homepage', 'placeholder' => trans('settings.app_homepage_default'), 'value' => setting('app-homepage')]) +