Adopt recent changes, migrate product detail page

This commit is contained in:
Björn Fromme
2021-12-20 16:00:41 +01:00
parent aef0f3df68
commit 34d36a68d9
28 changed files with 618 additions and 582 deletions
@@ -5,7 +5,10 @@ export default class extends Controller {
static values = { props: Object }
connect() {
fbq('track', 'ViewContent', this.propsValue)
const CF = window.CookieFirst
if (CF && null !== CF.consent && true === CF.consent.advertising) {
fbq('track', 'ViewContent', this.propsValue)
}
}
}
@@ -3,29 +3,39 @@ import { useDispatch } from 'stimulus-use'
export default class extends Controller {
static targets = [ 'tab', 'button' ]
static classes = [ 'buttonActive' ]
static values = { scroll: Boolean }
static targets = [ 'tab', 'pulldown', 'label' ]
static values = { activeTab: String }
initialize() {
useDispatch(this)
}
connect() {
this.activeTabValue = this.tabTargets[0].dataset.tab
}
togglePulldown() {
this.pulldownTarget.classList.toggle('hidden')
}
select(e) {
e.preventDefault()
let selectedTab = e.currentTarget.dataset.tab
this.buttonTargets.forEach(element => {
let currentTab = element.dataset.tab
element.classList.toggle('button--active', selectedTab === currentTab)
})
this.tabTargets.forEach(element => {
let currentTab = element.dataset.tab
element.classList.toggle('hidden', selectedTab !== currentTab)
})
if (true === this.scrollValue) {
this.element.scrollIntoView({ block: 'start', behavior: 'smooth' })
}
this.activeTabValue = selectedTab
this.pulldownTarget.classList.toggle('hidden', true)
this.dispatch('selected', selectedTab)
}
activeTabValueChanged() {
let activeTab = this.activeTabValue
this.tabTargets.forEach(element => {
let currentTab = element.dataset.tab
element.classList.toggle('hidden', activeTab !== currentTab)
if (activeTab === currentTab) {
this.labelTarget.innerText = element.dataset.label
}
})
}
}
@@ -101,7 +101,7 @@
/>
</div>
<div class="grid lg:grid-cols-2 gap-4 p-2">
<table class="table table-condensed text-sm mb-0">
<table class="text-sm mb-0">
<tbody>
<tr>
<th class="w-1/5">Zimmer</th>
@@ -132,9 +132,9 @@
</tbody>
</table>
<textarea rows="2" class="border-gray-400 focus:border-gray-800 ring-0 focus:ring-0 mt-1 w-full"
v-model="participant.data.accommodationRequest"
v-model="participant.data.additionRequest"
@change="dirty = true"
placeholder="Anmerkungen"
placeholder="Sonstiges (z. B. Allergien, Verleihgrößen)"
/>
</div>
</template>
@@ -1,52 +1,54 @@
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
{city.name}
<div class="space-y-2">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
{city.name}
</div>
</f:then>
<f:else>
<h2>
Ort
</h2>
</f:else>
</f:if>
{city.description -> f:format.html()}
</div>
<f:if condition="{city.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: city.images, id: 'city-{city.uid}', thumbnails: 1}"/>
</f:if>
<f:if condition="{city.party}">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Party
</div>
</f:then>
<f:else>
<h2>
Party
</h2>
</f:else>
</f:if>
{city.party -> f:format.html()}
</div>
</f:then>
<f:else>
<h2>
Ort
</h2>
</f:else>
</f:if>
<div class="city-details city-details--description" data-rte-content>
{city.description -> f:format.html()}
</f:if>
<f:if condition="{city.leisure}">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Freizeitangebot
</div>
</f:then>
<f:else>
<h2>
Freizeitangebot
</h2>
</f:else>
</f:if>
{city.leisure -> f:format.html()}
</div>
</f:if>
</div>
<f:if condition="{city.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: city.images, id: 'city-{city.uid}', thumbnails: 1}"/>
</f:if>
<f:if condition="{city.party}">
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Party
</div>
</f:then>
<f:else>
<h2>
Party
</h2>
</f:else>
</f:if>
<div class="city-details city-details--party" data-rte-content>
{city.party -> f:format.html()}
</div>
</f:if>
<f:if condition="{city.leisure}">
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Freizeitangebot
</div>
</f:then>
<f:else>
<h2>
Freizeitangebot
</h2>
</f:else>
</f:if>
<div class="city-details city-details--leisure" data-rte-content>
{city.leisure -> f:format.html()}
</div>
</f:if>
@@ -1,17 +0,0 @@
{namespace v=FluidTYPO3\Vhs\ViewHelpers}
<!-- Facebook Pixel Code -->
<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '1669863793235509');
fbq('track', 'PageView');
<f:if condition="{viewContent.productUid} && {viewContent.nameInternal}">
fbq('track', 'ViewContent', { content_ids: [ {viewContent.productUid} ], content_name: '{viewContent.nameInternal -> f:format.htmlentitiesDecode()}', content_type: 'product' });
</f:if>
</script>
<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1669863793235509&ev=PageView&noscript=1"/></noscript>
<!-- End Facebook Pixel Code -->
@@ -129,10 +129,10 @@
</a>
</li>
<li>
<a href="{f:uri.typolink(parameter: settings.imageCreditsPageUid)}"
<a href="#"
class="text-white"
title="AGB">
Bildrechte
onclick="cookiefirst_show_settings(); return false">
Cookie-Einstellungen
</a>
</li>
</ul>
@@ -1,5 +0,0 @@
<f:if condition="{googleTagManagerId}">
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id={googleTagManagerId}" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
</f:if>
@@ -1,129 +1,134 @@
{namespace ep=EP\EpTheme\ViewHelpers}
<f:variable name="hotelTitle">{hotel.name -> f:format.raw()}{f:if(condition: hotel.categoryLabel, then: ' ({hotel.categoryLabel -> f:format.raw()})')}</f:variable>
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
{hotelTitle}</div>
</f:then>
<f:else>
<h1>
{hotelTitle}
</h1>
</f:else>
</f:if>
<div class="hotel-details hotel-details--description" data-rte-content>
{hotel.description -> f:format.html()}
</div>
<f:if condition="{teasers}">
<f:then>
<a id="teasers" class="anchor"></a>
<div class="splide"
data-controller="slider"
data-slider-preset-value="teasers">
<div class="splide__track">
<ul class="splide__list">
<f:for each="{teasers}" as="teaser">
<li class="splide__slide">
<f:render partial="Product/Teaser" section="Teaser" arguments="{teaser: teaser}"/>
</li>
</f:for>
</ul>
</div>
</div>
<f:if condition="{settings.showMoreLink}">
<p class="text-right">
<f:link.action pageUid="{settings.defaultStaticSearchPageUid}" class="button"
action="staticresult" controller="Search"
arguments="{encodedFilterSettings: '{filterSettings -> ep:filterSettingsEncoder()}'}"
additionalAttributes="{rel: 'nofollow'}">
Alle anzeigen
</f:link.action>
</p>
<div class="space-y-2">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
{hotelTitle}
</div>
</f:then>
<f:else>
<h1>
{hotelTitle}
</h1>
</f:else>
</f:if>
</f:then>
<f:else>
<f:if condition="{showNonBookableHint}">
<div class="alert alert-info">
<p>Gerade noch kein Angebot buchbar? Dann frag doch schon mal an: <f:link.typolink parameter="{settings.defaultContactFormPageUid}">hier geht es zum Kontaktformular</f:link.typolink>.</p>
</div>
</f:if>
</f:else>
</f:if>
<f:if condition="{hotel.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: hotel.images, id: 'hotel-{hotel.uid}', thumbnails: 1}"/>
</f:if>
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Ausstattung
</div>
</f:then>
<f:else>
<h2>
Ausstattung
</h2>
</f:else>
</f:if>
<div class="hotel-details hotel-details--features" data-rte-content>
{hotel.features -> f:format.html()}
</div>
<f:if condition="{hotel.isApartment}">
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Apartments
</div>
</f:then>
<f:else>
<h2>Apartments</h2>
</f:else>
</f:if>
</f:if>
<f:if condition="{hotel.isHolidayFlat}">
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Ferienwohnungen
</div>
</f:then>
<f:else>
<h2>
Ferienwohnungen
</h2>
</f:else>
</f:if>
</f:if>
<f:if condition="{hotel.isOther}">
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Zimmerarten
</div>
</f:then>
<f:else>
<h2>
Zimmerarten
</h2>
</f:else>
</f:if>
</f:if>
<div class="hotel-details hotel-details--roomtypes" data-rte-content>
{hotel.roomTypes -> f:format.html()}
</div>
<f:if condition="{hotel.additionalInformation}">
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Zusatzinformationen
</div>
</f:then>
<f:else>
<h2>
Zusatzinformationen
</h2>
</f:else>
</f:if>
<div class="hotel-details hotel-details--additional" data-rte-content>
{hotel.additionalInformation -> f:format.html()}
{hotel.description -> f:format.html()}
</div>
</f:if>
<f:if condition="{teasers}">
<f:then>
<a id="teasers" class="anchor"></a>
<div class="splide"
data-controller="slider"
data-slider-preset-value="teasers">
<div class="splide__track">
<ul class="splide__list">
<f:for each="{teasers}" as="teaser">
<li class="splide__slide">
<f:render partial="Product/Teaser" section="Teaser" arguments="{teaser: teaser}"/>
</li>
</f:for>
</ul>
</div>
</div>
<f:if condition="{settings.showMoreLink}">
<p class="text-right">
<f:link.action pageUid="{settings.defaultStaticSearchPageUid}" class="button"
action="staticresult" controller="Search"
arguments="{encodedFilterSettings: '{filterSettings -> ep:filterSettingsEncoder()}'}"
additionalAttributes="{rel: 'nofollow'}">
Alle anzeigen
</f:link.action>
</p>
</f:if>
</f:then>
<f:else>
<f:if condition="{showNonBookableHint}">
<div class="alert alert-info">
<p>Gerade noch kein Angebot buchbar? Dann frag doch schon mal an: <f:link.typolink parameter="{settings.defaultContactFormPageUid}">hier geht es zum Kontaktformular</f:link.typolink>.</p>
</div>
</f:if>
</f:else>
</f:if>
<f:if condition="{hotel.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: hotel.images, id: 'hotel-{hotel.uid}', thumbnails: 1}"/>
</f:if>
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Ausstattung
</div>
</f:then>
<f:else>
<h2>
Ausstattung
</h2>
</f:else>
</f:if>
{hotel.features -> f:format.html()}
</div>
<f:if condition="{hotel.isApartment} || hotel.isHolidayFlat || hotel.isOther">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{hotel.isApartment}">
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Apartments
</div>
</f:then>
<f:else>
<h2>Apartments</h2>
</f:else>
</f:if>
</f:if>
<f:if condition="{hotel.isHolidayFlat}">
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Ferienwohnungen
</div>
</f:then>
<f:else>
<h2>
Ferienwohnungen
</h2>
</f:else>
</f:if>
</f:if>
<f:if condition="{hotel.isOther}">
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Zimmerarten
</div>
</f:then>
<f:else>
<h2>
Zimmerarten
</h2>
</f:else>
</f:if>
</f:if>
{hotel.roomTypes -> f:format.html()}
</div>
</f:if>
<f:if condition="{hotel.additionalInformation}">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Zusatzinformationen
</div>
</f:then>
<f:else>
<h2>
Zusatzinformationen
</h2>
</f:else>
</f:if>
{hotel.additionalInformation -> f:format.html()}
</div>
</f:if>
</div>
@@ -1,17 +1,16 @@
<f:if condition="{bars}">
<div class="headerbar">
Anreise
</div>
</f:if>
<div data-rte-content>
<h2>Eigenanreise</h2>
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<h3>
Eigenanreise
</h3>
{journey.byCar -> f:format.html()}
<f:if condition="{journey.image}">
<img src="{f:uri.image(image: journey.image, width: '770', height: '430c+100')}"
alt="{journey.image.alternative}" title="{journey.image.title}">
</f:if>
<f:if condition="{journey.byBus}">
<h2>Busanreise</h2>
<h3>
Busanreise
</h3>
{journey.byBus -> f:format.html()}
</f:if>
</div>
@@ -1,132 +1,132 @@
{namespace ep=EP\EpTheme\ViewHelpers}
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
{region.name -> f:format.raw()}
</div>
</f:then>
<f:else>
<h2 class="headline--has-subline">
<f:if condition="{region.season} == 's'">
<f:then>
<span class="subline">Urlaub im</span> Gebiet {region.name -> f:format.raw()}
</f:then>
<f:else>
<span class="subline">Skiurlaub im</span> Skigebiet {region.name -> f:format.raw()}
</f:else>
</f:if>
</h2>
</f:else>
</f:if>
<div class="region-details region-details--ski-area" data-rte-content>
<div class="grid grid-cols-3 gap-4 bg-gray-50 p-2 mb-4">
<div class="flex items-center space-x-2"
data-cooltipz-dir="top-left" aria-label="Pisten" role="tooltip">
<svg class="w-4 h-4 md:w-6 md:h-6">
<use href="#icon-ski"></use>
</svg>
<span class="text-sm md:text-base">
{region.length}
</span>
</div>
<div class="flex items-center space-x-2"
data-cooltipz-dir="top-left" aria-label="Höhe" role="tooltip">
<svg class="w-4 h-4 md:w-6 md:h-6">
<use href="#icon-mountain"></use>
</svg>
<span class="text-sm md:text-base">
{region.height}
</span>
</div>
<f:if condition="{region.lifts}">
<div class="space-y-2">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
{region.name -> f:format.raw()}
</div>
</f:then>
<f:else>
<h2 class="headline--has-subline">
<f:if condition="{region.season} == 's'">
<f:then>
<span class="subline">Urlaub im</span> Gebiet {region.name -> f:format.raw()}
</f:then>
<f:else>
<span class="subline">Skiurlaub im</span> Skigebiet {region.name -> f:format.raw()}
</f:else>
</f:if>
</h2>
</f:else>
</f:if>
<div class="grid grid-cols-3 gap-4 bg-gray-50 p-2 mb-4">
<div class="flex items-center space-x-2"
data-cooltipz-dir="top-left" aria-label="Lifte" role="tooltip">
data-cooltipz-dir="top-left" aria-label="Pisten" role="tooltip">
<svg class="w-4 h-4 md:w-6 md:h-6">
<use href="#icon-lift"></use>
<use href="#icon-ski"></use>
</svg>
<span class="text-sm md:text-base">
{region.lifts}
{region.length}
</span>
</div>
<div class="flex items-center space-x-2"
data-cooltipz-dir="top-left" aria-label="Höhe" role="tooltip">
<svg class="w-4 h-4 md:w-6 md:h-6">
<use href="#icon-mountain"></use>
</svg>
<span class="text-sm md:text-base">
{region.height}
</span>
</div>
<f:if condition="{region.lifts}">
<div class="flex items-center space-x-2"
data-cooltipz-dir="top-left" aria-label="Lifte" role="tooltip">
<svg class="w-4 h-4 md:w-6 md:h-6">
<use href="#icon-lift"></use>
</svg>
<span class="text-sm md:text-base">
{region.lifts}
</span>
</div>
</f:if>
</div>
{region.skiArea -> f:format.html()}
<f:if condition="{teasers}">
<f:then>
<a id="teasers" class="anchor"></a>
<div class="splide"
data-controller="slider"
data-slider-preset-value="teasersEmbedded">
<div class="splide__track">
<ul class="splide__list">
<f:for each="{teasers}" as="teaser">
<li class="splide__slide">
<f:render partial="Product/Teaser" section="Teaser" arguments="{teaser: teaser}"/>
</li>
</f:for>
</ul>
</div>
</div>
<f:if condition="{settings.showMoreLink}">
<p class="text-right">
<f:link.action pageUid="{settings.defaultStaticSearchPageUid}" class="button"
action="staticresult" controller="Search"
arguments="{encodedFilterSettings: '{filterSettings -> ep:filterSettingsEncoder()}'}"
additionalAttributes="{rel: 'nofollow'}">
Alle anzeigen
</f:link.action>
</p>
</f:if>
</f:then>
<f:else>
<f:if condition="{region.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: region.images, id: 'region-{region.uid}', thumbnails: 1}"/>
</f:if>
</f:else>
</f:if>
<f:if condition="{region.skiAreaExtended}">{region.skiAreaExtended -> f:format.html()}</f:if>
</div>
<f:if condition="{teasers}">
<f:if condition="{region.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: region.images, id: 'region-{region.uid}', thumbnails: 1}"/>
</f:if>
</f:if>
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')} {region.name}
</div>
</f:then>
<f:else>
<h3>
{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')} {region.name}
</h3>
</f:else>
</f:if>
<f:if condition="{region.skiPass}">
{region.skiPass -> f:format.html()}
</f:if>
<f:if condition="{region.description}">
{region.description -> f:format.html()}
</f:if>
</div>
{region.skiArea -> f:format.html()}
<f:if condition="{teasers}">
<f:then>
<a id="teasers" class="anchor"></a>
<div class="splide"
data-controller="slider"
data-slider-preset-value="teasersEmbedded">
<div class="splide__track">
<ul class="splide__list">
<f:for each="{teasers}" as="teaser">
<li class="splide__slide">
<f:render partial="Product/Teaser" section="Teaser" arguments="{teaser: teaser}"/>
</li>
</f:for>
</ul>
</div>
</div>
<f:if condition="{settings.showMoreLink}">
<p class="text-right">
<f:link.action pageUid="{settings.defaultStaticSearchPageUid}" class="button"
action="staticresult" controller="Search"
arguments="{encodedFilterSettings: '{filterSettings -> ep:filterSettingsEncoder()}'}"
additionalAttributes="{rel: 'nofollow'}">
Alle anzeigen
</f:link.action>
</p>
<f:if condition="{region.news}">
<div class="even:bg-ep-primary-bg p-4" data-rte-content>
<f:if condition="{bars}">
<f:then>
<div class="headline--3 headline--underlined">
Aktuelles {region.name}
</div>
</f:then>
<f:else>
<h2>
Aktuelles {region.name}
</h2>
</f:else>
</f:if>
</f:then>
<f:else>
<f:if condition="{region.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: region.images, id: 'region-{region.uid}', thumbnails: 1}"/>
</f:if>
</f:else>
</f:if>
<f:if condition="{region.skiAreaExtended}">{region.skiAreaExtended -> f:format.html()}</f:if>
</div>
<f:if condition="{teasers}">
<f:if condition="{region.images -> f:count()} > 0">
<f:render partial="ImageGallery" arguments="{images: region.images, id: 'region-{region.uid}', thumbnails: 1}"/>
</f:if>
</f:if>
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')} {region.name}
{region.news -> f:format.html()}
</div>
</f:then>
<f:else>
<h3>
{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')} {region.name}
</h3>
</f:else>
</f:if>
<f:if condition="{region.skiPass}">
<div class="region-details region-details--skipass" data-rte-content>
{region.skiPass -> f:format.html()}
</div>
</f:if>
<f:if condition="{region.description}">
<div class="region-details region-details--description" data-rte-content>
{region.description -> f:format.html()}
</div>
</f:if>
<f:if condition="{region.news}">
<f:if condition="{bars}">
<f:then>
<div class="headerbar">
Aktuelles {region.name}
</div>
</f:then>
<f:else>
<h2>
Aktuelles {region.name}
</h2>
</f:else>
</f:if>
<div class="region-details region-details--news" data-rte-content>
{region.news -> f:format.html()}
</div>
</f:if>
</div>
@@ -11,7 +11,7 @@
<svg class="w-5 h-5"><use href="#icon-home"/></svg>
</f:link.typolink>
<f:for each="{topnav}" as="menuitem">
<a class="block flex flex-grow h-8 justify-center items-center uppercase text-sm leading-none text-white hover:text-white focus:text-white hover:bg-ep-secondary{f:if(condition: '{menuitem.active} or {menuitem.data.uid} == {settings.forceActiveTopnavUid}', then: ' bg-ep-secondary')}"
<a class="block flex flex-grow h-8 justify-center items-center uppercase text-sm leading-none text-white hover:text-white focus:text-white hover:bg-ep-secondary{f:if(condition: menuitem.tx_eptheme_navitemclass, then: ' {menuitem.tx_eptheme_navitemclass}')}{f:if(condition: '{menuitem.active} or {menuitem.data.uid} == {settings.forceActiveTopnavUid}', then: ' bg-ep-secondary')}"
href="{menuitem.link}"{f:if(condition: '{menuitem.data.doktype} == 3', then: ' target="_blank"')}
title="{menuitem.title}">
{menuitem.title -> ep:topnavItem()}
@@ -6,7 +6,7 @@
<f:section name="Main">
<iframe class="border-0 h-96"
src="https://bpn.ep-reisen.de/buspronet/anmeldung_news.php"
src="{formUrl}"
width="100%" height="100"></iframe>
</f:section>
@@ -18,183 +18,134 @@
<f:render partial="Header/Header" arguments="{layout: 8, subheader: '{product.region.name} / {product.name}', header: product.headline}"/>
<div class="flex flex-col lg:flex-row-reverse lg:items-start"
data-controller="tabs"
data-tabs-button-active-class="tab-button--active"
data-tabs-scroll-value="true">
<div class="w-full lg:w-1/3">
<div class="lg:pl-4">
<div class="grid grid-cols-2 gap-2">
<f:if condition="{settings.hotelOnTop}">
<f:then>
<button type="button"
class="button button--light button--active col-span-1 md:col-span-2"
data-action="tabs#select"
data-tabs-target="button"
data-tab="hotel">
Unterkunft
</button>
<button type="button"
class="button button--light col-span-1 md:col-span-2"
data-action="tabs#select"
data-tabs-target="button"
data-tab="dates">
Termine/Preise
</button>
</f:then>
<f:else>
<button type="button"
class="button button--light button--active col-span-1 md:col-span-2"
data-action="tabs#select"
data-tabs-target="button"
data-tab="dates">
Termine/Preise
</button>
<button type="button"
class="button button--light col-span-1 md:col-span-2"
data-action="tabs#select"
data-tabs-target="button"
data-tab="hotel">
Unterkunft
</button>
</f:else>
</f:if>
<button type="button"
class="button button--light col-span-1 md:col-span-2"
data-action="tabs#select"
data-tabs-target="button"
data-tab="region">
Gebiet
</button>
<button type="button"
class="button button--light col-span-1 md:col-span-2"
data-action="tabs#select"
data-tabs-target="button"
data-tab="city">
Ort
</button>
<f:if condition="{product.journey}">
<button type="button"
class="button button--light col-span-1 md:col-span-2"
data-action="tabs#select"
data-tabs-target="button"
data-tab="journey">
Anreise
</button>
</f:if>
<f:if condition="{product.faqs}">
<button type="button"
class="button button--light col-span-1 md:col-span-2"
data-controller="scroll-to"
data-scroll-to-target-value="faq"
data-action="scroll-to#scroll">
FAQ
</button>
</f:if>
<div class="col-span-2">
<p class="mb-4">
<button type="button"
class="button button--light w-full"
data-controller="watchlist-toggle"
data-watchlist-toggle-key-value="{hotel.uid}:{product.uid}"
data-action="watchlist-toggle#toggle">
<span data-watchlist-toggle-target="label">
Auf die Merkliste setzen
</span>
</button>
</p>
<p class="mb-4">
<a href="{f:uri.typolink(parameter: settings.coronaUpdatesPageUid)}"
class="block w-full px-4 py-2 bg-red-500 text-white flex items-center space-x-2"
title="Corona Updates">
<svg class="w-4 h-4">
<use href="#icon-virus"></use>
</svg>
<span>
Corona Updates
</span>
</a>
</p>
</div>
</div>
<div class="hidden lg:block">
<div class="flex flex-col space-y-2 mb-4">
<a href="{f:uri.typolink(parameter: settings.coronaUpdatesPageUid)}"
class="block w-full px-4 py-2 bg-red-500 text-white flex items-center space-x-2"
title="Corona Updates">
<svg class="w-4 h-4">
<use href="#icon-virus"></use>
</svg>
<span>
Corona Updates
</span>
</a>
<f:if condition="{product.faqs}">
<button type="button"
class="button button--light col-span-1 md:col-span-2"
data-controller="scroll-to"
data-scroll-to-target-value="faq"
data-action="scroll-to#scroll">
FAQ
</button>
</f:if>
<button type="button"
class="button button--light w-full"
data-controller="watchlist-toggle"
data-watchlist-toggle-key-value="{hotel.uid}:{product.uid}"
data-action="watchlist-toggle#toggle">
<span data-watchlist-toggle-target="label">
Auf die Merkliste setzen
</span>
</button>
</div>
<f:render section="Sidebar" arguments="{_all}"/>
</div>
</div>
</div>
<div id="main" class="w-full lg:w-2/3">
<div class="lg:pr-4">
<!-- Loader -->
<div class="flex items-center space-x-2 mb-4 hidden bg-ep-secondary text-white p-2"
data-product-details-target="loadingIndicator">
<svg class="w-4 h-4 text-white">
<use href="#icon-spinner"></use>
</svg>
<span data-product-details-target="loadingMessage">
Loading...
</span>
</div>
<!-- /Loader -->
<!-- Dates -->
<div class="{f:if(condition: settings.hotelOnTop, then: 'hidden')}"
data-tabs-target="tab"
data-tab="dates">
<f:if condition="{isProductWithExcludedConcept}">
<f:if condition="{product.region.season} == 'w'">
<div class="alert alert-info">
<p><strong>Gruppenrabatt bis zu 100€ möglich</strong></p>
<p>Für Gruppen bis 15 Personen könnt ihr <f:link.typolink parameter="31">hier direkt buchen</f:link.typolink>.
Für Gruppen ab 16 Personen erstellen wir euch ein konkretes Angebot zu günstigen
Gruppenkonditionen zu dieser Reise. Anfrage via Tel. 0221 - 272 276 18 oder mit einer
<f:link.typolink parameter="{settings.defaultContactFormPageUid}">Kurzanfrage</f:link.typolink>!</p>
</div>
<div class="lg:pr-4 flex flex-col space-y-4">
<div class="relative">
<button type="button"
data-action="tabs#togglePulldown"
class="w-full flex items-center space-x-2 bg-ep-primary-light text-white uppercase p-2">
<svg class="w-6 h-6">
<use href="#icon-chevron-down"></use>
</svg>
<span data-tabs-target="label">
Termine/Preise
</span>
</button>
<div class="absolute z-20 top-100 left-0 w-full flex flex-col items-start divide-y divide-overlay-white bg-ep-primary-light text-white uppercase shadow hidden"
data-tabs-target="pulldown">
<f:if condition="{settings.hotelOnTop}">
<f:then>
<button type="button"
data-action="tabs#select"
data-tab="hotel"
class="w-full text-left p-2 pl-10">
Unterkunft
</button>
<button type="button"
data-action="tabs#select"
data-tab="dates"
class="w-full text-left p-2 pl-10">
Termine/Preise
</button>
</f:then>
<f:else>
<button type="button"
data-action="tabs#select"
data-tab="dates"
class="w-full text-left p-2 pl-10">
Termine/Preise
</button>
<button type="button"
data-action="tabs#select"
data-tab="hotel"
class="w-full text-left p-2 pl-10">
Unterkunft
</button>
</f:else>
</f:if>
</f:if>
<f:if condition="{product.daytrip}">
<f:then>
<f:render section="DaytripDateSelect" arguments="{_all}"/>
</f:then>
<f:else>
<div class="hidden" data-product-details-target="datesTableContainer"></div>
<div class="hidden" data-product-details-target="priceTableContainer"></div>
<f:if condition="{isProductWithNoInfoConcept}">
<f:else>
<template x-if="!available">
<f:render partial="NotBookable" arguments="{_all}"/>
</template>
</f:else>
</f:if>
</f:else>
</f:if>
<f:render partial="Product/Details" arguments="{_all}"/>
<button type="button"
data-action="tabs#select"
data-tab="region"
class="w-full text-left p-2 pl-10">
Gebiet
</button>
<button type="button"
data-action="tabs#select"
data-tab="city"
class="w-full text-left p-2 pl-10">
Ort
</button>
<f:if condition="{product.journey}">
<button type="button"
data-action="tabs#select"
data-tab="journey"
class="w-full text-left p-2 pl-10">
Anreise
</button>
</f:if>
</div>
</div>
<!-- /Dates -->
<!-- Hotel -->
<div class="{f:if(condition: settings.hotelOnTop, else: 'hidden')}"
data-tabs-target="tab"
data-tab="hotel">
<f:render partial="Hotel/Details" arguments="{hotel: hotel, bars: 1, showNonBookableHint: 0}"/>
</div>
<!-- /Hotel -->
<!-- City -->
<div class="hidden"
data-tabs-target="tab"
data-tab="city">
<f:render partial="City/Details" arguments="{city: product.city, bars: 1}"/>
</div>
<!-- /City -->
<!-- Region -->
<div class="hidden"
data-tabs-target="tab"
data-tab="region">
<f:render partial="Region/Details" arguments="{region: product.region, bars: 1}"/>
</div>
<!-- /Region -->
<!-- Journey -->
<div class="hidden"
data-tabs-target="tab"
data-tab="journey">
<f:render partial="Journey/Details" arguments="{journey: product.journey, bars: 1}"/>
</div>
<!-- /Journey -->
<f:if condition="{settings.hotelOnTop}">
<f:then>
<f:render section="Hotel" arguments="{_all}"/>
<f:render section="Dates" arguments="{_all}"/>
</f:then>
<f:else>
<f:render section="Dates" arguments="{_all}"/>
<f:render section="Hotel" arguments="{_all}"/>
</f:else>
</f:if>
<f:render section="City" arguments="{_all}"/>
<f:render section="Region" arguments="{_all}"/>
<f:render section="Journey" arguments="{_all}"/>
<div class="md:hidden">
<a href="{f:uri.typolink(parameter: settings.coronaUpdatesPageUid)}"
class="block w-full px-4 py-2 bg-red-500 text-white flex items-center space-x-2"
title="Corona Updates">
<svg class="w-4 h-4">
<use href="#icon-virus"></use>
</svg>
<span>Corona Updates</span>
</a>
<f:render section="Sidebar" arguments="{_all}"/>
</div>
</div>
@@ -209,6 +160,95 @@
</div>
</f:section>
<f:section name="Dates">
<div class="mb-4{f:if(condition: settings.hotelOnTop, then: ' hidden')}"
data-tabs-target="tab"
data-tab="dates"
data-label="Termine/Preise">
<f:if condition="{isProductWithExcludedConcept}">
<f:if condition="{product.region.season} == 'w'">
<div class="alert alert-info">
<p>
<strong>Gruppenrabatt bis zu 100€ möglich</strong>
</p>
<p>
Für Gruppen bis 15 Personen könnt ihr <f:link.typolink parameter="31">hier direkt buchen</f:link.typolink>.
Für Gruppen ab 16 Personen erstellen wir euch ein konkretes Angebot zu günstigen
Gruppenkonditionen zu dieser Reise. Anfrage via Tel. 0221 - 272 276 18 oder mit einer
<f:link.typolink parameter="{settings.defaultContactFormPageUid}">Kurzanfrage</f:link.typolink>!
</p>
</div>
</f:if>
</f:if>
<f:if condition="{product.daytrip}">
<f:then>
<f:render section="DaytripDateSelect" arguments="{_all}"/>
</f:then>
<f:else>
<div class="hidden" data-product-details-target="datesTableContainer"></div>
<div class="hidden" data-product-details-target="priceTableContainer"></div>
<f:if condition="{isProductWithNoInfoConcept}">
<f:else>
<f:if condition="{product.available}">
<f:else>
<f:render partial="NotBookable" arguments="{_all}"/>
</f:else>
</f:if>
</f:else>
</f:if>
</f:else>
</f:if>
<f:render partial="Product/Details" arguments="{_all}"/>
<div class="p-4 hidden"
data-product-details-target="loadingIndicator">
<div class="flex items-center space-x-4 bg-ep-secondary text-white text-lg p-4 rounded">
<svg class="w-6 h-6">
<use href="#icon-spinner"></use>
</svg>
<span data-product-details-target="loadingMessage">Loading...</span>
</div>
</div>
</div>
</f:section>
<f:section name="Hotel">
<div class="mb-4{f:if(condition: settings.hotelOnTop, else: ' hidden')}"
data-tabs-target="tab"
data-tab="hotel"
data-label="Unterkunft">
<f:render partial="Hotel/Details" arguments="{hotel: hotel, bars: 1, showNonBookableHint: 0}"/>
</div>
</f:section>
<f:section name="City">
<div class="mb-4 hidden"
data-tabs-target="tab"
data-tab="city"
data-label="Ort">
<f:render partial="City/Details" arguments="{city: product.city, bars: 1}"/>
</div>
</f:section>
<f:section name="Region">
<div class="mb-4 hidden"
data-tabs-target="tab"
data-tab="region"
data-label="Gebiet">
<f:render partial="Region/Details" arguments="{region: product.region, bars: 1}"/>
</div>
</f:section>
<f:section name="Journey">
<f:if condition="{product.journey}">
<div class="mb-4 hidden"
data-tabs-target="tab"
data-tab="journey"
data-label="Anreise">
<f:render partial="Journey/Details" arguments="{journey: product.journey, bars: 1}"/>
</div>
</f:if>
</f:section>
<f:section name="Sidebar">
<f:render section="Calendar" arguments="{_all}"/>
<f:render partial="Facts" arguments="{facts: product.facts}"/>