From aa3b23ecb81948b4f1df70a0a6efbd66bdda9403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Tue, 20 Jan 2026 18:36:33 +0100 Subject: [PATCH] feat: info text and correct field type for service group 'VEG' addresses #869bvch71 --- .env | 1 + config/packages/twig.yaml | 1 + .../ParticipantFieldOptionsProvider.php | 16 ++++- templates/booking/_form_theme.html.twig | 16 +++-- templates/booking/_participant_form.html.twig | 61 +++++++++++++------ 5 files changed, 66 insertions(+), 29 deletions(-) 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 -%} {%- for child in form %} - {% set choiceData = form.vars.choices[loop.index0].data %} + {% set choiceData = form.vars.choices[loop.index0] is defined ? form.vars.choices[loop.index0].data : null %} {% set description = child.vars.attr['data-description']|default(null) %} {% set isReadonly = child.vars.attr.readonly is defined %} {%- set child_attr = {} -%} @@ -65,14 +65,12 @@ {%- endif -%} - {% if choiceData %} - - {% endif %} +
- {% 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 %} - + {% 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 %} +
+
+ Verpflegung + {% if form.board is defined %} + {{ form_widget(form.board, { + 'attr': { + 'hx-trigger': htmx_change_trigger, + 'hx-post': path(refreshRouteName, refreshRouteParams|default({index: participantIndex})), + 'hx-target': '#main-content', 'hx-swap': 'innerHTML' + } + }) }} + {% endif %} + {% if form.veg is defined %} +
+ {{ form_widget(form.veg, { + 'attr': { + 'hx-trigger': htmx_change_trigger, + 'hx-post': path(refreshRouteName, refreshRouteParams|default({index: participantIndex})), + 'hx-target': '#main-content', 'hx-swap': 'innerHTML' + } + }) }} + {{ form_errors(form.veg) }} +
+ {% endif %} +
+ {% if form.board is defined %} + {{ form_errors(form.board) }} + {% endif %} +
+ + + + Bitte teile uns eventuelle Unverträglichkeiten an {{ customer_service_email }} (inkl. der Buchungsnummer) mit. +
+
+ {% else %} +
+
+ Verpflegung +
Nicht wählbar
+
+
{% endif %} {% set htmxAttr = {