Copied unchanged from public/typo3conf/ext/ of EP/website at 9593cc8631354f8a363d6609de8b7433f669a9a0 (Git-tracked files only). History stays in the old repository. Only composer.json files are added so the extensions install as path packages. Co-Authored-By: Claude Opus 5.5 <[email protected]>
167 lines
9.2 KiB
HTML
167 lines
9.2 KiB
HTML
<html data-namespace-typo3-fluid="true" lang="en"
|
|
xmlns="http://www.w3.org/1999/xhtml"
|
|
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
|
|
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
|
|
|
|
<f:if condition="{pricetable.available -> f:count()} == 0">
|
|
<f:then>
|
|
<div class="alert alert-info" data-rte-content>
|
|
{nonBookableInfo.text -> f:format.html()}
|
|
</div>
|
|
</f:then>
|
|
<f:else>
|
|
<div class="w-full max-w-full overflow-x-scroll md:overflow-x-auto"
|
|
data-controller="pricetable"
|
|
data-pricetable-show-all-rows-value="true">
|
|
<table class="min-w-full border border-zinc-200 border-collapse mb-8">
|
|
<thead>
|
|
<tr>
|
|
<th class="text-left" scope="col">
|
|
Zimmertyp
|
|
</th>
|
|
<th class="text-left" scope="col">
|
|
Preis/Pers.
|
|
</th>
|
|
<f:if condition="{hasIncludedServices}">
|
|
<th class="text-left">
|
|
inkl.
|
|
</th>
|
|
</f:if>
|
|
<th scope="col" aria-label="Links zu optionalen Zusatzleistungen"></th>
|
|
<th class="hidden lg:table-cell" scope="col" aria-label="Links zur Buchung"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<f:for each="{pricetable.available}" as="row" iteration="iteration">
|
|
<tr class="even:bg-zinc-50">
|
|
<td class="px-2 py-1 border border-zinc-200 whitespace-nowrap">
|
|
{row.roomName}
|
|
<div class="lg:hidden">
|
|
<f:if condition="{row.available}">
|
|
<f:then>
|
|
<a href="{row.bookingUrl}"
|
|
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-action="datalayer#trigger">
|
|
Jetzt buchen <i class="fa fa-angle-right"></i>
|
|
</a>
|
|
</f:then>
|
|
<f:else>
|
|
<span>ausgebucht</span>
|
|
</f:else>
|
|
</f:if>
|
|
</div>
|
|
</td>
|
|
<td class="px-2 py-1 border border-zinc-200">
|
|
<f:if condition="{row.available}">
|
|
<f:then>
|
|
{row.minPrice -> ep:price()} €
|
|
</f:then>
|
|
<f:else>
|
|
<s>{row.minPrice -> ep:price()} €</s>
|
|
</f:else>
|
|
</f:if>
|
|
</td>
|
|
<f:if condition="{hasIncludedServices}">
|
|
<td class="px-2 py-1 border border-zinc-200">
|
|
<f:if condition="{row.busIncluded}">
|
|
<span data-cooltipz-dir="top"
|
|
aria-label="Busfahrt"
|
|
role="tooltip"
|
|
data-pricetable-target="busIcon"
|
|
data-bus-included="{row.busIncluded}"
|
|
data-bus-price="{row.busPrice}">
|
|
{ep:icon(icon: 'bus', class: 'w-4 h-4 md:w-5 md:h-5')}
|
|
</span>
|
|
</f:if>
|
|
<f:if condition="{row.skiPassIncluded}">
|
|
<span data-cooltipz-dir="top"
|
|
aria-label="Skipass"
|
|
role="tooltip">
|
|
{ep:icon(icon: 'tag', class: 'w-4 h-4 md:w-5 md:h-5')}
|
|
</span>
|
|
</f:if>
|
|
</td>
|
|
</f:if>
|
|
<td class="px-2 py-1 border border-zinc-200">
|
|
<f:if condition="{row.optionalServices} && {row.available}">
|
|
<button type="button"
|
|
data-action="pricetable#openModal"
|
|
data-pricetable-type-param="options"
|
|
data-pricetable-uid-param="{row.roomUid}"
|
|
data-cooltipz-dir="top"
|
|
aria-label="Alle Zusatzleistungen anzeigen">
|
|
{ep:icon(icon: 'plus-circle', class: 'w-4 h-4 md:w-5 md:h-5')}
|
|
</button>
|
|
</f:if>
|
|
</td>
|
|
<td class="hidden lg:table-cell px-2 py-1 border border-zinc-200">
|
|
<f:if condition="{row.available}">
|
|
<f:then>
|
|
<a class="button bg-button button--small w-full"
|
|
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-action="datalayer#trigger"
|
|
href="{row.bookingUrl}"
|
|
title="{row.roomName} buchen"
|
|
target="_blank">
|
|
<span class="font-bold normal-case whitespace-nowrap">
|
|
Jetzt buchen
|
|
</span>
|
|
</a>
|
|
</f:then>
|
|
<f:else>
|
|
<span class="label label-default">ausgebucht</span>
|
|
</f:else>
|
|
</f:if>
|
|
</td>
|
|
</tr>
|
|
</f:for>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</f:else>
|
|
</f:if>
|
|
<div class="hidden fixed inset-0 w-full h-full z-50"
|
|
data-controller="modal"
|
|
data-action="pricetable:options-modal:open@window->modal#open">
|
|
<div class="absolute inset-0 w-full h-full bg-black/85 z-25"
|
|
data-action="click->modal#close"></div>
|
|
<div class="absolute top-1/2 left-1/2 -translate-xy-1/2 w-full max-w-xl px-4">
|
|
<div class="shadow flex items-center justify-between p-4 bg-ep-primary-light text-white rounded-t">
|
|
<span class="text-xl font-bold">
|
|
Optionale Zusatzleistungen
|
|
</span>
|
|
<button type="button"
|
|
class="inline-block"
|
|
aria-label="schließen"
|
|
data-action="modal#close">
|
|
{ep:icon(icon: 'close', class: 'w-8 h-8')}
|
|
</button>
|
|
</div>
|
|
<div class="h-128 p-4 overflow-y-scroll bg-white rounded-b">
|
|
<f:for each="{pricetable.available}" as="row">
|
|
<div class="hidden"
|
|
data-modal-target="content"
|
|
data-uid="{row.roomUid}">
|
|
<f:for each="{row.optionalServices}" as="section">
|
|
<div class="py-2 -mx-1">
|
|
<div class="font-bold text-xl px-1">
|
|
{section.label}
|
|
</div>
|
|
<f:for each="{section.services}" as="service">
|
|
<dl class="flex items-start justify-between p-1 hover:bg-zinc-50">
|
|
<dt class="font-normal">
|
|
{service.label}:
|
|
</dt>
|
|
<dd class="whitespace-nowrap">
|
|
{service.price} €
|
|
</dd>
|
|
</dl>
|
|
</f:for>
|
|
</div>
|
|
</f:for>
|
|
</div>
|
|
</f:for>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</html>
|