diff --git a/.env b/.env index 70d80fd..da5f393 100644 --- a/.env +++ b/.env @@ -53,6 +53,7 @@ APP_TRAVEL_INFO_BASE_URL="https://www.ep-reisen.de/reiseinformationen/" APP_TERMS_AND_CONDITIONS_URL="https://www.ep-reisen.de/skireisen/infos/allgemeine-infos/agb/" APP_CMS_API_BASE_URL="https://www.ep-reisen.de/" APP_WEBSITE_BASE_URL="https://www.ep-reisen.de/" +APP_CUSTOMER_SERVICE_EMAIL="kundenservice@ep-reisen.de" # Travel Data Service Configuration APP_TRAVEL_PREFER_REMOTE=false diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index d6dbd77..9b4a589 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -4,6 +4,7 @@ twig: globals: htmx_change_trigger: 'change delay:100ms' website_base_url: '%env(APP_WEBSITE_BASE_URL)%' + customer_service_email: '%env(APP_CUSTOMER_SERVICE_EMAIL)%' when@test: twig: diff --git a/src/Form/Service/ParticipantFieldOptionsProvider.php b/src/Form/Service/ParticipantFieldOptionsProvider.php index 18b4f12..7ab420b 100644 --- a/src/Form/Service/ParticipantFieldOptionsProvider.php +++ b/src/Form/Service/ParticipantFieldOptionsProvider.php @@ -258,7 +258,7 @@ class ParticipantFieldOptionsProvider extends AbstractFieldOptionsProvider ]; }; - // Veg (vegetarian/vegan) field provider - provides dietary preference options as radio buttons (mutually exclusive) + // Veg (vegetarian/vegan) field provider - provides dietary preference options as dropdown // Returns empty array when no dietary options available $this->fieldOptionProviders['veg'] = function (BookingDto $bookingDto, int $participantIndex, array $options = []): array { $choices = $this->filterServicesByAgeConstraints( @@ -274,11 +274,21 @@ class ParticipantFieldOptionsProvider extends AbstractFieldOptionsProvider return [ 'label' => 'Verpflegungswunsch', 'multiple' => false, - 'expanded' => true, + 'expanded' => false, 'required' => false, + 'placeholder' => 'Verpflegungswunsch...', 'choices' => $choices, 'choice_value' => 'id', - 'choice_label' => fn (?Service $service) => $service?->label, + 'choice_label' => function (?Service $service): ?string { + if (null === $service) { + return null; + } + $priceLabel = (null === $service->price || 0.0 === $service->price) + ? 'inkl.' + : number_format($service->price, 2, ',', '.') . ' €'; + + return $service->label . ' (' . $priceLabel . ')'; + }, 'choice_attr' => function (?Service $service) use ($bookingDto, $participantIndex) { if (null === $service) { return []; diff --git a/templates/booking/_form_theme.html.twig b/templates/booking/_form_theme.html.twig index 0f16284..0c4264a 100644 --- a/templates/booking/_form_theme.html.twig +++ b/templates/booking/_form_theme.html.twig @@ -39,7 +39,7 @@ {%- block choice_widget_expanded -%}
| - {% if choiceData.price is defined %} - {% set isPkw = choiceData.subType is defined and choiceData.subType in ['PKW', 'CAR'] %} - {{ choiceData.price | format_service_price(not isPkw) }} - {% endif %} - | - {% endif %} ++ {% if choiceData and choiceData.price is defined %} + {% set isPkw = choiceData.subType is defined and choiceData.subType in ['PKW', 'CAR'] %} + {{ choiceData.price | format_service_price(not isPkw) }} + {% endif %} + |
{% set childTooltip = child.vars.attr['data-tooltip']|default(null) %}
{% if isReadonly or childTooltip is not null %}
diff --git a/templates/booking/_participant_form.html.twig b/templates/booking/_participant_form.html.twig
index e08f2c0..9544a9c 100644
--- a/templates/booking/_participant_form.html.twig
+++ b/templates/booking/_participant_form.html.twig
@@ -328,23 +328,50 @@
}
}) }}
- {{ macros.service_field(form, 'board', 'Verpflegung', {
- 'attr': {
- 'hx-trigger': htmx_change_trigger,
- 'hx-post': path(refreshRouteName, refreshRouteParams|default({index: participantIndex})),
- 'hx-target': '#main-content', 'hx-swap': 'innerHTML'
- }
- }) }}
-
- {# VEG field - only render when defined (hide completely when no VEG services available) #}
- {% if form.veg is defined %}
- {{ macros.service_field(form, 'veg', 'Verpflegungswunsch', {
- 'attr': {
- 'hx-trigger': htmx_change_trigger,
- 'hx-post': path(refreshRouteName, refreshRouteParams|default({index: participantIndex})),
- 'hx-target': '#main-content', 'hx-swap': 'innerHTML'
- }
- }) }}
+ {# Board and VEG fields combined in one fieldset #}
+ {% if form.board is defined or form.veg is defined %}
+
+
+ {% if form.board is defined %}
+ {{ form_errors(form.board) }}
+ {% endif %}
+
+ {% else %}
+
+
+ Bitte teile uns eventuelle Unverträglichkeiten an {{ customer_service_email }} (inkl. der Buchungsnummer) mit.
+
+
+
+
{% endif %}
{% set htmxAttr = {
|