mein-sterntours/resources/views/cms/sidebar/detail.blade.php
Kevin Adametz 43a3748f5b CMS-Widget für Reisekategorien auf der Startseite hinzufügen.
Ermöglicht die gezielte Auswahl von Länder-Übersichtsseiten im Sidebar-Widget,
statt die Kategorien fest im Code der Startseite zu pflegen.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 10:46:24 +00:00

396 lines
No EOL
22 KiB
PHP
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@extends('layouts.layout-2')
@section('content')
{!! Form::open(['url' => route('cms_sidebar_detail', [$id]), 'class' => 'form-horizontal']) !!}
<h4 class="font-weight-bold py-3 mb-1">
Sidebar Widget @if($id == "new") <span class="text-primary">anlegen</span> @else {{"(ID: ".$id.")"}} verwalten @endif
<div class="float-right">
<button type="submit" name="action" value="saveAll" class="btn btn-submit btn-sm">{{ __('save changes') }}</button>&nbsp;
<a href="{{route('cms_sidebar')}}" class="btn btn-default btn-sm">{{ __('back') }}</a>
</div>
</h4>
<div class="clearfix"></div>
<input type="hidden" name="id" id="id" value="{{$id}}">
<!-- draft -->
<div class="card mb-2">
<div class="card-body">
<div class="form-row">
<div class="form-group col-sm-8">
<label class="form-label" for="widget_title">{{ __('Name') }}*</label>
{{ Form::text('name', $widget->name, array('placeholder'=>__('Name'), 'class'=>'form-control', 'id'=>'widget_name', 'required'=>true)) }}
</div>
<div class="form-group col-sm-4">
<label class="custom-control custom-checkbox float-right">
{!! Form::checkbox('active', 1, $widget->active, ['class'=>'custom-control-input']) !!}
<span class="custom-control-label">{{__('aktiv')}}</span>
</label>
<label for="widget_pos" class="form-label">{{__('Position')}}</label>
{{ Form::text('pos', $widget->pos, array('placeholder'=>__('pos'), 'class'=>'form-control', 'id'=>'widget_pos')) }}
</div>
</div>
<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" id="component">
{!! \App\Models\SidebarWidget::getComponentsOptions($widget->component) !!}
</select>
</div>
</div>
<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-page-picker" style="{{ $widget->isHomepagePagePickerComponent() ? '' : 'display:none;' }}">
<div data-homepage-picker-type="categories" style="{{ $widget->isHomepageTravelCategoriesComponent() ? '' : 'display:none;' }}">
<div class="alert alert-info">
Diese Auswahl steuert den Startseiten-Bereich „Alle Reisekategorien auf einen Blick".
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_country_page_picker">{{ __('Reisekategorie hinzufügen') }}</label>
<div class="input-group">
<select class="selectpicker form-control" data-style="btn-default" name="homepage_country_page_picker" id="homepage_country_page_picker" data-live-search="true">
<option value="">{{ __('Bitte Reisekategorie wählen') }}</option>
{!! \App\Models\SidebarWidget::getHomepageCountryPageOptions($widget->isHomepageTravelCategoriesComponent() ? $widget->getHomepagePageIds() : []) !!}
</select>
<span class="input-group-append">
<button class="btn btn-primary" type="button" id="homepage_add_country_page">{{ __('hinzufügen') }}</button>
</span>
</div>
<small class="form-text text-muted">
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.
</small>
</div>
</div>
</div>
<div data-homepage-picker-type="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->isHomepageTripsComponent() ? $widget->getHomepagePageIds() : []) !!}
</select>
<span class="input-group-append">
<button class="btn btn-primary" type="button" id="homepage_add_travel_page">{{ __('hinzufügen') }}</button>
</span>
</div>
<small class="form-text text-muted">
Wenn keine Reisen hinzugefügt sind, nutzt die Startseite die automatische Prioritätslogik.
</small>
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-sm-12">
<label class="form-label" id="homepage_selected_pages_label">{{ $widget->isHomepageTravelCategoriesComponent() ? __('Ausgewählte Reisekategorien') : __('Ausgewählte Reisen') }}</label>
<div class="list-group" id="homepage_selected_pages">
@foreach($widget->getHomepageSelectedPagePickerItems() 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">
@if($widget->isHomepageTripsComponent())
<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>
@endif
<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">
<div class="form-group col-sm-12">
<label class="form-label" for="show_at">{{ __('Sichtbar') }}</label>
<select class="selectpicker" data-style="btn-default" name="show_at[]" multiple>
{!! \App\Models\SidebarWidget::getShowsOptions($widget->show_at) !!}
</select>
</div>
</div>
</div>
</div>
<div class="text-left mt-3">
<button type="submit" name="action" value="saveAll" class="btn btn-submit">{{ __('save changes') }}</button>&nbsp;
<a href="{{route('cms_sidebar')}}" class="btn btn-default">{{ __('back') }}</a>
</div>
{!! Form::close() !!}
<script>
$(function () {
var componentSelect = $('#component');
var panels = $('[data-config-panel]');
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 (homepagePagePickerComponents.indexOf(component) !== -1) {
$('[data-config-panel="homepage-page-picker"]').show();
updateHomepagePickerType(component);
} 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 showNewBadge = homepagePagePickerComponents.indexOf(componentSelect.val()) !== -1
&& ['homepagePlannableTrips', 'homepagePopularTrips'].indexOf(componentSelect.val()) !== -1;
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));
if (showNewBadge) {
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', 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 () {
$(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">
<div class="modal-dialog">
<form class="modal-content" action="{{ route('travel_program_class_update') }}" method="post">
@csrf
<input type="hidden" class="form-control" name="id">
<input type="hidden" class="form-control" name="program_id" value="{{$widget->id}}">
<div class="modal-header">
<h5 class="modal-title">Programm Katagorie/Klassen <span class="font-weight-light">anlegen/bearbeiten</span></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
</div>
<div class="modal-body">
<div class="form-row">
<div class="form-group col">
<label class="custom-control custom-checkbox float-right">
<input type="checkbox" class="custom-control-input" name="standard" checked>
<span class="custom-control-label">{{__('Standard')}}</span>
</label>
<label for="name" class="form-label">Name*</label>
<input type="text" class="form-control" name="name" placeholder="{{__('Description')}}" required>
</div>
</div>
<div class="form-row">
<div class="form-group col">
<label for="description" class="form-label">Beschreibung</label>
<input type="text" class="form-control" name="description" placeholder="{{__('Description')}}">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{__('close')}}</button>
<button type="submit" class="btn btn-primary">{{__('save')}}</button>
</div>
</form>
</div>
</div>
<!-- Modal template -->
<div class="modal fade" id="modals-draft">
<div class="modal-dialog">
<form class="modal-content" action="{{ route('travel_program_draft_update') }}" method="post">
@csrf
<input type="hidden" class="form-control" name="id">
<input type="hidden" class="form-control" name="travel_program_id" value="{{$widget->id}}">
<div class="modal-header">
<h5 class="modal-title">Vorlage Reiseprogramm <span class="font-weight-light">zuordnen</span></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
</div>
<div class="modal-body">
<div class="form-row">
<div class="form-group col">
<label for="draft_id" class="form-label">{{__('Vorlage')}}</label>
<select class="selectpicker" data-style="btn-default" name="draft_id" data-live-search="true" required>
{!! HTMLHelper::getDraftOptions() !!}
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{__('close')}}</button>
<button type="submit" class="btn btn-primary">{{__('save')}}</button>
</div>
</form>
</div>
</div>
<script>
$( document ).ready(function() {
$('#modals-class').on('show.bs.modal', function (event) {
var button = $(event.relatedTarget);
$(this).find(".modal-content input[name='id']").val(button.data('id'));
$(this).find(".modal-body input[name='name']").val(button.data('name'));
$(this).find(".modal-body input[name='description']").val(button.data('description'));
$(this).find(".modal-body input[name='standard']").prop( "checked", button.data('standard'));
});
$('#modals-draft').on('show.bs.modal', function (event) {
var button = $(event.relatedTarget);
$(this).find(".modal-content input[name='id']").val(button.data('id'));
$(this).find(".modal-body select[name='draft_id']").val(button.data('draft_id'));
$(this).find(".modal-body select[name='travel_class_id']").val(button.data('travel_class_id'));
$(this).find(".modal-body select[name='weekdays[]']").val(button.data('weekdays'));
$('.selectpicker').selectpicker('refresh');
});
});
</script>
--}}
@endsection