Startseiten-Reisen im CMS steuerbar machen

This commit is contained in:
Kevin Adametz 2026-05-28 15:06:22 +00:00
parent ba48745809
commit 313f0dbf4e
5 changed files with 446 additions and 22 deletions

View file

@ -38,15 +38,82 @@
<div class="form-row">
<div class="form-group col-sm-12">
<label class="form-label" for="component">{{ __('Komponente') }}</label>
<select class="selectpicker" data-style="btn-default" name="component">
<select class="selectpicker" data-style="btn-default" name="component" id="component">
{!! \App\Models\SidebarWidget::getComponentsOptions($widget->component) !!}
</select>
</div>
</div>
<div class="form-row">
<div class="form-row" data-config-panel="html" style="{{ $widget->isStructuredConfigComponent() ? 'display:none;' : '' }}">
<div class="form-group col-sm-12">
<label class="form-label" for="html">{{ __('HTML') }}</label>
{{ Form::textarea('html', $widget->html, ['class' => 'form-control']) }}
<small class="form-text text-muted">
Wird nur genutzt, wenn keine feste Komponente ausgewählt ist oder die Komponente eigene HTML-Inhalte erwartet.
</small>
</div>
</div>
<div data-config-panel="homepage-trips" style="{{ $widget->isHomepageTripsComponent() ? '' : 'display:none;' }}">
<div class="alert alert-info">
Diese Auswahl steuert die Startseiten-Bereiche „Aktuell planbare Reisen" und „Beliebte Kulturreisen".
Die Reihenfolge entspricht der Reihenfolge der ausgewählten Einträge.
</div>
<div class="form-row">
<div class="form-group col-sm-12">
<label class="form-label" for="homepage_page_picker">{{ __('Reise hinzufügen') }}</label>
<div class="input-group">
<select class="selectpicker form-control" data-style="btn-default" name="homepage_page_picker" id="homepage_page_picker" data-live-search="true">
<option value="">{{ __('Bitte Reise wählen') }}</option>
{!! \App\Models\SidebarWidget::getHomepageTravelPageOptions($widget->getHomepagePageIds()) !!}
</select>
<span class="input-group-append">
<button class="btn btn-primary" type="button" id="homepage_add_page">{{ __('hinzufügen') }}</button>
</span>
</div>
<small class="form-text text-muted">
Wenn keine Reisen hinzugefügt sind, nutzt die DEV-Startseite die automatische Prioritätslogik.
</small>
</div>
</div>
<div class="form-row">
<div class="form-group col-sm-12">
<label class="form-label">{{ __('Ausgewählte Reisen') }}</label>
<div class="list-group" id="homepage_selected_pages">
@foreach($widget->getHomepageSelectedTravelPageItems() as $selectedPage)
<div class="list-group-item d-flex align-items-center justify-content-between" data-page-id="{{ $selectedPage['id'] }}">
<input type="hidden" name="homepage_page_ids[]" value="{{ $selectedPage['id'] }}">
<span class="mr-3">
<span class="badge badge-secondary mr-2" data-page-number>{{ $loop->iteration }}</span>
{{ $selectedPage['label'] }}
</span>
<span class="d-flex align-items-center">
<label class="custom-control custom-checkbox mb-0 mr-3">
<input type="checkbox" class="custom-control-input" name="homepage_new_page_ids[]" value="{{ $selectedPage['id'] }}" {{ $selectedPage['is_new'] ? 'checked' : '' }}>
<span class="custom-control-label">
<span class="badge badge-warning">{{ __('Neu') }}</span>
</span>
</label>
<span class="btn-group btn-group-sm mr-2" role="group" aria-label="{{ __('Reihenfolge ändern') }}">
<button class="btn btn-outline-secondary" type="button" data-move-page="up">{{ __('hoch') }}</button>
<button class="btn btn-outline-secondary" type="button" data-move-page="down">{{ __('runter') }}</button>
</span>
<button class="btn btn-sm btn-outline-danger" type="button" data-remove-page>{{ __('entfernen') }}</button>
</span>
</div>
@endforeach
</div>
</div>
</div>
</div>
<div data-config-panel="news" style="{{ $widget->isNewsComponent() ? '' : 'display:none;' }}">
<div class="alert alert-info">
Die Reisenews werden weiterhin automatisch aus dem News-Bereich geladen. Hier wird nur gesteuert,
wie viele Einträge in der Sidebar erscheinen.
</div>
<div class="form-row">
<div class="form-group col-sm-3">
<label class="form-label" for="homepage_news_limit">{{ __('Anzahl Reisenews') }}</label>
<input type="number" min="1" max="12" class="form-control" name="homepage_news_limit" id="homepage_news_limit" value="{{ $widget->getHomepageNewsLimit() }}">
</div>
</div>
</div>
<div class="form-row">
@ -67,6 +134,97 @@
{!! Form::close() !!}
<script>
$(function () {
var componentSelect = $('#component');
var panels = $('[data-config-panel]');
var homepageTripComponents = ['homepagePlannableTrips', 'homepagePopularTrips'];
var pagePicker = $('#homepage_page_picker');
var selectedPages = $('#homepage_selected_pages');
function updateConfigPanels() {
var component = componentSelect.val();
panels.hide();
if (homepageTripComponents.indexOf(component) !== -1) {
$('[data-config-panel="homepage-trips"]').show();
} else if (component === 'newsSidebarWidget') {
$('[data-config-panel="news"]').show();
} else {
$('[data-config-panel="html"]').show();
}
$('.selectpicker').selectpicker('refresh');
}
function addSelectedPage(pageId, label, isNew) {
if (!pageId || selectedPages.find('[data-page-id="' + pageId + '"]').length) {
return;
}
var item = $('<div class="list-group-item d-flex align-items-center justify-content-between"></div>');
var title = $('<span class="mr-3"></span>');
var controls = $('<span class="d-flex align-items-center"></span>');
var checkboxId = 'homepage_new_page_' + pageId;
var newLabel = $('<label class="custom-control custom-checkbox mb-0 mr-3"></label>');
var newCheckbox = $('<input type="checkbox" class="custom-control-input" name="homepage_new_page_ids[]">')
.attr('id', checkboxId)
.val(pageId);
var moveButtons = $('<span class="btn-group btn-group-sm mr-2" role="group" aria-label="{{ __('Reihenfolge ändern') }}"></span>');
var removeButton = $('<button class="btn btn-sm btn-outline-danger" type="button" data-remove-page>{{ __('entfernen') }}</button>');
if (isNew) {
newCheckbox.prop('checked', true);
}
item.attr('data-page-id', pageId);
item.append($('<input type="hidden" name="homepage_page_ids[]">').val(pageId));
title.append($('<span class="badge badge-secondary mr-2" data-page-number></span>'));
title.append(document.createTextNode(label));
newLabel.append(newCheckbox);
newLabel.append($('<span class="custom-control-label"><span class="badge badge-warning">{{ __('Neu') }}</span></span>'));
controls.append(newLabel);
moveButtons.append($('<button class="btn btn-outline-secondary" type="button" data-move-page="up">{{ __('hoch') }}</button>'));
moveButtons.append($('<button class="btn btn-outline-secondary" type="button" data-move-page="down">{{ __('runter') }}</button>'));
controls.append(moveButtons);
controls.append(removeButton);
item.append(title);
item.append(controls);
selectedPages.append(item);
updateSelectedPageNumbers();
}
function updateSelectedPageNumbers() {
selectedPages.find('[data-page-id]').each(function (index) {
$(this).find('[data-page-number]').text(index + 1);
});
}
componentSelect.on('changed.bs.select change', updateConfigPanels);
$('#homepage_add_page').on('click', function () {
var selectedOption = pagePicker.find('option:selected');
addSelectedPage(selectedOption.val(), selectedOption.data('label') || selectedOption.text(), false);
});
selectedPages.on('click', '[data-remove-page]', function () {
$(this).closest('[data-page-id]').remove();
updateSelectedPageNumbers();
});
selectedPages.on('click', '[data-move-page]', function () {
var item = $(this).closest('[data-page-id]');
if ($(this).data('move-page') === 'up') {
item.prev('[data-page-id]').before(item);
} else {
item.next('[data-page-id]').after(item);
}
updateSelectedPageNumbers();
});
updateSelectedPageNumbers();
updateConfigPanels();
});
</script>
{{--
<!-- Modal template -->
<div class="modal fade" id="modals-class">

View file

@ -9,14 +9,15 @@
<div class="card">
<div class="card-datatable table-responsive py-2">
<div class="mr-4 mb-2 text-right">
<a href="{{ route('cms_sidebar_detail', ['new']) }}" class="btn btn-sm btn-primary">Neues Sidbar Widget anlegen</a>
<a href="{{ route('cms_sidebar_detail', ['new']) }}" class="btn btn-sm btn-primary">Neues Sidebar-Widget anlegen</a>
</div>
<table class="datatables-feedbacks table table-striped table-bordered">
<thead>
<tr>
<th style="max-width: 60px;">&nbsp;</th>
<th>{{__('Name')}}</th>
<th>{{__('Sichbar')}}</th>
<th>{{__('Sichtbar auf')}}</th>
<th>{{__('Komponente')}}</th>
<th>{{__('Pos.')}}</th>
<th>{{__('sichtbar')}}</th>
<th></th>
@ -34,10 +35,11 @@
<a href="{{ route('cms_sidebar_detail', [$value->id]) }}">{{ $value->name }}</a>
</td>
<td>{{ $value->getShowsAtString() }}</td>
<td>{{ $value->getComponentLabel() }}</td>
<td>
{{ $value->pos }}
</td>
<td data-sort="{{ $value->status }}">
<td data-sort="{{ $value->active }}">
@if($value->active)
<span class="badge badge-pill badge-success"><i class="fa fa-check"></i></span>
@else
@ -52,7 +54,7 @@
</tbody>
</table>
<div class="mt-4 col">
<a href="{{ route('cms_sidebar_detail', ['new']) }}" class="btn btn-sm btn-primary">Neues Sidbar Widget anlegen</a>
<a href="{{ route('cms_sidebar_detail', ['new']) }}" class="btn btn-sm btn-primary">Neues Sidebar-Widget anlegen</a>
</div>
</div>
<script>