diff --git a/app/Http/Controllers/CMS/CMSSidebarController.php b/app/Http/Controllers/CMS/CMSSidebarController.php index aaa74b8..f6c40ec 100755 --- a/app/Http/Controllers/CMS/CMSSidebarController.php +++ b/app/Http/Controllers/CMS/CMSSidebarController.php @@ -70,7 +70,11 @@ class CMSSidebarController extends Controller $component = isset($data['component']) ? $data['component'] : null; - if (in_array($component, [SidebarWidget::HOMEPAGE_PLANNABLE_TRIPS, SidebarWidget::HOMEPAGE_POPULAR_TRIPS])) { + if (in_array($component, [ + SidebarWidget::HOMEPAGE_PLANNABLE_TRIPS, + SidebarWidget::HOMEPAGE_POPULAR_TRIPS, + SidebarWidget::HOMEPAGE_TRAVEL_CATEGORIES, + ])) { $pageIds = isset($data['homepage_page_ids']) ? array_values(array_filter($data['homepage_page_ids'])) : []; $newPageIds = isset($data['homepage_new_page_ids']) ? array_values(array_filter($data['homepage_new_page_ids'])) : []; diff --git a/app/Models/SidebarWidget.php b/app/Models/SidebarWidget.php index 39ea6a6..c58d85a 100644 --- a/app/Models/SidebarWidget.php +++ b/app/Models/SidebarWidget.php @@ -34,6 +34,7 @@ class SidebarWidget extends Model { const HOMEPAGE_PLANNABLE_TRIPS = 'homepagePlannableTrips'; const HOMEPAGE_POPULAR_TRIPS = 'homepagePopularTrips'; + const HOMEPAGE_TRAVEL_CATEGORIES = 'homepageTravelCategories'; const NEWS_SIDEBAR_WIDGET = 'newsSidebarWidget'; @@ -61,6 +62,7 @@ class SidebarWidget extends Model self::NEWS_SIDEBAR_WIDGET => 'News', self::HOMEPAGE_PLANNABLE_TRIPS => 'Startseite: Aktuell planbare Reisen', self::HOMEPAGE_POPULAR_TRIPS => 'Startseite: Beliebte Kulturreisen', + self::HOMEPAGE_TRAVEL_CATEGORIES => 'Startseite: Reisekategorien', ]; @@ -125,6 +127,16 @@ class SidebarWidget extends Model return in_array($this->component, [self::HOMEPAGE_PLANNABLE_TRIPS, self::HOMEPAGE_POPULAR_TRIPS]); } + public function isHomepageTravelCategoriesComponent() + { + return $this->component === self::HOMEPAGE_TRAVEL_CATEGORIES; + } + + public function isHomepagePagePickerComponent() + { + return $this->isHomepageTripsComponent() || $this->isHomepageTravelCategoriesComponent(); + } + public function isNewsComponent() { return $this->component === self::NEWS_SIDEBAR_WIDGET; @@ -132,7 +144,7 @@ class SidebarWidget extends Model public function isStructuredConfigComponent() { - return $this->isHomepageTripsComponent() || $this->isNewsComponent(); + return $this->isHomepagePagePickerComponent() || $this->isNewsComponent(); } public function getConfig() @@ -254,6 +266,99 @@ class SidebarWidget extends Model return $items; } + public static function getHomepageCountryPageOptions($selectedIds = []) + { + $selectedIds = array_map('intval', (array) $selectedIds); + $items = self::getHomepageCountryPageItems($selectedIds); + $ret = ''; + + foreach ($items as $item) { + $attr = $item['selected'] ? 'selected="selected"' : ''; + $label = e($item['label']); + $ret .= ''."\n"; + } + + return $ret; + } + + public static function getHomepageCountryPageItems($selectedIds = []) + { + $selectedIds = array_map('intval', (array) $selectedIds); + $pages = Page::with('travel_country') + ->where('status', '>', 0) + ->where('template', 'overview') + ->where('lvl', 0) + ->whereNotNull('country_id') + ->orderBy('lft') + ->orderBy('title') + ->get(); + + $items = []; + foreach ($pages as $page) { + $items[] = [ + 'id' => (int) $page->id, + 'label' => self::getHomepageCountryPageLabel($page), + 'selected' => in_array((int) $page->id, $selectedIds), + ]; + } + + return $items; + } + + public function getHomepageSelectedCountryPageItems() + { + $selectedIds = array_map('intval', $this->getHomepagePageIds()); + + if (empty($selectedIds)) { + return []; + } + + $pages = Page::with('travel_country') + ->whereIn('id', $selectedIds) + ->where('status', '>', 0) + ->where('template', 'overview') + ->where('lvl', 0) + ->whereNotNull('country_id') + ->get() + ->keyBy('id'); + + $items = []; + foreach ($selectedIds as $pageId) { + if (!$pages->has($pageId)) { + continue; + } + + $page = $pages->get($pageId); + $items[] = [ + 'id' => (int) $page->id, + 'label' => self::getHomepageCountryPageLabel($page), + 'is_new' => false, + ]; + } + + return $items; + } + + public function getHomepageSelectedPagePickerItems() + { + return $this->isHomepageTravelCategoriesComponent() + ? $this->getHomepageSelectedCountryPageItems() + : $this->getHomepageSelectedTravelPageItems(); + } + + protected static function getHomepageCountryPageLabel(Page $page) + { + $country = $page->travel_country && $page->travel_country->name + ? $page->travel_country->name + : null; + + if ($country) { + return $page->title.' | '.$country.' (#'.$page->id.')'; + } + + return $page->title.' (#'.$page->id.')'; + } + public function getHomepageSelectedTravelPageItems() { $selectedIds = array_map('intval', $this->getHomepagePageIds()); diff --git a/resources/views/cms/sidebar/detail.blade.php b/resources/views/cms/sidebar/detail.blade.php index 87a0a10..30211d7 100755 --- a/resources/views/cms/sidebar/detail.blade.php +++ b/resources/views/cms/sidebar/detail.blade.php @@ -52,33 +52,59 @@ -
-
- Diese Auswahl steuert die Startseiten-Bereiche „Aktuell planbare Reisen" und „Beliebte Kulturreisen". - Die Reihenfolge entspricht der Reihenfolge der ausgewählten Einträge. -
-
-
- -
- - - - +
+
+
+ Diese Auswahl steuert den Startseiten-Bereich „Alle Reisekategorien auf einen Blick". + Die Reihenfolge entspricht der Reihenfolge der ausgewählten Einträge. +
+
+
+ +
+ + + + +
+ + Es werden Länder-Übersichtsseiten angezeigt (wie zuvor automatisch auf der Startseite). + Wenn keine Kategorien ausgewählt sind, nutzt die Startseite die automatische Länderliste. + +
+
+
+
+
+ Diese Auswahl steuert die Startseiten-Bereiche „Aktuell planbare Reisen" und „Beliebte Kulturreisen". + Die Reihenfolge entspricht der Reihenfolge der ausgewählten Einträge. +
+
+
+ +
+ + + + +
+ + Wenn keine Reisen hinzugefügt sind, nutzt die Startseite die automatische Prioritätslogik. +
- - Wenn keine Reisen hinzugefügt sind, nutzt die DEV-Startseite die automatische Prioritätslogik. -
- +
- @foreach($widget->getHomepageSelectedTravelPageItems() as $selectedPage) + @foreach($widget->getHomepageSelectedPagePickerItems() as $selectedPage)
@@ -86,12 +112,14 @@ {{ $selectedPage['label'] }} + @if($widget->isHomepageTripsComponent()) + @endif @@ -138,17 +166,28 @@ $(function () { var componentSelect = $('#component'); var panels = $('[data-config-panel]'); - var homepageTripComponents = ['homepagePlannableTrips', 'homepagePopularTrips']; - var pagePicker = $('#homepage_page_picker'); + var homepagePagePickerComponents = ['homepagePlannableTrips', 'homepagePopularTrips', 'homepageTravelCategories']; var selectedPages = $('#homepage_selected_pages'); + function updateHomepagePickerType(component) { + var isCategories = component === 'homepageTravelCategories'; + var isTrips = ['homepagePlannableTrips', 'homepagePopularTrips'].indexOf(component) !== -1; + + $('[data-homepage-picker-type="categories"]').toggle(isCategories); + $('[data-homepage-picker-type="trips"]').toggle(isTrips); + $('#homepage_selected_pages_label').text( + isCategories ? '{{ __('Ausgewählte Reisekategorien') }}' : '{{ __('Ausgewählte Reisen') }}' + ); + } + function updateConfigPanels() { var component = componentSelect.val(); panels.hide(); - if (homepageTripComponents.indexOf(component) !== -1) { - $('[data-config-panel="homepage-trips"]').show(); + if (homepagePagePickerComponents.indexOf(component) !== -1) { + $('[data-config-panel="homepage-page-picker"]').show(); + updateHomepagePickerType(component); } else if (component === 'newsSidebarWidget') { $('[data-config-panel="news"]').show(); } else { @@ -163,6 +202,8 @@ return; } + var showNewBadge = homepagePagePickerComponents.indexOf(componentSelect.val()) !== -1 + && ['homepagePlannableTrips', 'homepagePopularTrips'].indexOf(componentSelect.val()) !== -1; var item = $('
'); var title = $(''); var controls = $(''); @@ -182,9 +223,11 @@ item.append($('').val(pageId)); title.append($('')); title.append(document.createTextNode(label)); - newLabel.append(newCheckbox); - newLabel.append($('{{ __('Neu') }}')); - controls.append(newLabel); + if (showNewBadge) { + newLabel.append(newCheckbox); + newLabel.append($('{{ __('Neu') }}')); + controls.append(newLabel); + } moveButtons.append($('')); moveButtons.append($('')); controls.append(moveButtons); @@ -201,9 +244,34 @@ }); } - componentSelect.on('changed.bs.select change', updateConfigPanels); - $('#homepage_add_page').on('click', function () { - var selectedOption = pagePicker.find('option:selected'); + componentSelect.on('changed.bs.select change', function () { + var previousComponent = componentSelect.data('previous-component') || ''; + var component = componentSelect.val(); + var switchedPickerType = ( + (previousComponent === 'homepageTravelCategories' && component !== 'homepageTravelCategories') || + (previousComponent !== 'homepageTravelCategories' && component === 'homepageTravelCategories') + ); + + if (switchedPickerType && selectedPages.find('[data-page-id]').length) { + if (window.confirm('Beim Wechsel der Komponente werden die aktuell ausgewählten Einträge geleert. Fortfahren?')) { + selectedPages.empty(); + } else { + componentSelect.selectpicker('val', previousComponent); + $('.selectpicker').selectpicker('refresh'); + return; + } + } + + componentSelect.data('previous-component', component); + updateConfigPanels(); + }); + componentSelect.data('previous-component', componentSelect.val()); + $('#homepage_add_country_page').on('click', function () { + var selectedOption = $('#homepage_country_page_picker').find('option:selected'); + addSelectedPage(selectedOption.val(), selectedOption.data('label') || selectedOption.text(), false); + }); + $('#homepage_add_travel_page').on('click', function () { + var selectedOption = $('#homepage_page_picker').find('option:selected'); addSelectedPage(selectedOption.val(), selectedOption.data('label') || selectedOption.text(), false); }); selectedPages.on('click', '[data-remove-page]', function () {