Merge branch 'master' into develop

This commit is contained in:
Björn Fromme
2025-05-15 11:33:21 +02:00
70 changed files with 668 additions and 557 deletions
Generated
+53 -49
View File
@@ -465,26 +465,29 @@
},
{
"name": "doctrine/deprecations",
"version": "1.1.4",
"version": "1.1.5",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"phpunit/phpunit": "<=7.5 || >=13"
},
"require-dev": {
"doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "1.4.10 || 2.0.3",
"doctrine/coding-standard": "^9 || ^12 || ^13",
"phpstan/phpstan": "1.4.10 || 2.1.11",
"phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
"psr/log": "^1 || ^2 || ^3"
},
"suggest": {
@@ -504,9 +507,9 @@
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.4"
"source": "https://github.com/doctrine/deprecations/tree/1.1.5"
},
"time": "2024-12-07T21:18:45+00:00"
"time": "2025-04-07T20:06:18+00:00"
},
{
"name": "doctrine/event-manager",
@@ -2161,16 +2164,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "5.6.1",
"version": "5.6.2",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8"
"reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
"reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
"reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
"shasum": ""
},
"require": {
@@ -2219,9 +2222,9 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1"
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
},
"time": "2024-12-07T09:39:29+00:00"
"time": "2025-04-13T19:20:35+00:00"
},
{
"name": "phpdocumentor/type-resolver",
@@ -4487,7 +4490,7 @@
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
@@ -4546,7 +4549,7 @@
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
},
"funding": [
{
@@ -4566,7 +4569,7 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
@@ -4624,7 +4627,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
},
"funding": [
{
@@ -4644,16 +4647,16 @@
},
{
"name": "symfony/polyfill-intl-icu",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-icu.git",
"reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78"
"reference": "763d2a91fea5681509ca01acbc1c5e450d127811"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
"reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811",
"reference": "763d2a91fea5681509ca01acbc1c5e450d127811",
"shasum": ""
},
"require": {
@@ -4708,7 +4711,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0"
},
"funding": [
{
@@ -4724,20 +4727,20 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2024-12-21T18:38:29+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
"reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
"reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
"shasum": ""
},
"require": {
@@ -4791,7 +4794,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0"
},
"funding": [
{
@@ -4807,11 +4810,11 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2024-09-10T14:38:51+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
@@ -4872,7 +4875,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
},
"funding": [
{
@@ -4892,19 +4895,20 @@
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
"reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
"reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
"shasum": ""
},
"require": {
"ext-iconv": "*",
"php": ">=7.2"
},
"provide": {
@@ -4952,7 +4956,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
},
"funding": [
{
@@ -4968,7 +4972,7 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2024-12-23T08:48:59+00:00"
},
{
"name": "symfony/polyfill-php72",
@@ -5037,7 +5041,7 @@
},
{
"name": "symfony/polyfill-php73",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
@@ -5093,7 +5097,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0"
},
"funding": [
{
@@ -5113,16 +5117,16 @@
},
{
"name": "symfony/polyfill-php80",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
"reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
"reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
"shasum": ""
},
"require": {
@@ -5173,7 +5177,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
},
"funding": [
{
@@ -5189,11 +5193,11 @@
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
"time": "2025-01-02T08:10:11+00:00"
},
{
"name": "symfony/polyfill-php81",
"version": "v1.31.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
@@ -5249,7 +5253,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0"
"source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0"
},
"funding": [
{
@@ -52,10 +52,10 @@ class GroupsPriceController extends ActionController
$this->view->assign('hotel', $hotel);
$this->view->assign('runningCostsEUR', $this->settings['runningCostsEUR']);
$this->view->assign('runningCostsCHF', $this->settings['runningCostsCHF']);
$this->view->assign('undersubscriptionEUR', $this->settings['undersubscriptionEUR']);
$this->view->assign('undersubscriptionCHF', $this->settings['undersubscriptionCHF']);
$this->view->assign('undersubscriptionExtEUR', $this->settings['undersubscriptionExtEUR']);
$this->view->assign('undersubscriptionExtCHF', $this->settings['undersubscriptionExtCHF']);
$this->view->assign('undersubscription30EUR', $this->settings['undersubscription30EUR']);
$this->view->assign('undersubscription30CHF', $this->settings['undersubscription30CHF']);
$this->view->assign('undersubscription40EUR', $this->settings['undersubscription40EUR']);
$this->view->assign('undersubscription40CHF', $this->settings['undersubscription40CHF']);
$this->view->assign('countryCode', $hotel->getCountry()->getCode());
$this->view->assign('configs', json_encode(array_values($configs), JSON_HEX_APOS));
$this->view->assign('boards', json_encode($hotel->getGroupsPriceBoards()->toArray(), JSON_HEX_APOS));
@@ -5,7 +5,6 @@ namespace EP\EpProducts\Controller;
use EP\EpProducts\Domain\Model\Date;
use EP\EpProducts\Domain\Model\Travelinfo;
use EP\EpProducts\Domain\Repository\DateRepository;
use EP\EpProducts\Domain\Repository\ProductRepository;
use EP\EpProducts\Domain\Repository\TravelinfoRepository;
use TYPO3\CMS\Core\Http\ImmediateResponseException;
use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -24,19 +23,12 @@ class TravelinfoController extends ActionController
*/
private $travelinfoRepository;
/**
* @var ProductRepository
*/
private $productRepository;
public function __construct(
DateRepository $dateRepository,
TravelinfoRepository $travelinfoRepository,
ProductRepository $productRepository
TravelinfoRepository $travelinfoRepository
) {
$this->dateRepository = $dateRepository;
$this->travelinfoRepository = $travelinfoRepository;
$this->productRepository = $productRepository;
}
public function travelCodeAction(string $travelCode)
@@ -97,6 +97,11 @@ class GroupsPriceInquiry
*/
protected $pax;
/**
* @var string
*/
protected $children;
/**
* @var array
*/
@@ -297,6 +302,22 @@ class GroupsPriceInquiry
$this->pax = $pax;
}
/**
* @return string
*/
public function getChildren()
{
return $this->children;
}
/**
* @param string $pax
*/
public function setChildren($children)
{
$this->children = $children;
}
/**
* @return array
*/
@@ -191,7 +191,7 @@ class ProductRepository extends AbstractRepository
;
}
public function getPricetable(Product $product, Hotel $hotel, array $filterSettings, Date $date = null, bool $sortByRoom = true): array
public function getPricetable(Product $product, Hotel $hotel, array $filterSettings, Date $date = null): array
{
$qb = $this->getDbConnection()->createQueryBuilder();
@@ -207,18 +207,11 @@ class ProductRepository extends AbstractRepository
)
->from('tx_epproducts_domain_model_date', 'date')
->innerJoin('date', 'tx_epproducts_domain_model_room', 'room', 'date.uid = room.date')
->orderBy('room.available', 'DESC')
->orderBy('room.pax', 'ASC')
->addOrderBy('room.price', 'ASC')
->addOrderBy('room.available', 'DESC')
;
if (true === $sortByRoom) {
$qb->addOrderBy('room.name', 'ASC');
} else {
$qb
->addOrderBy('room.pax', 'ASC')
->addOrderBy('room.price', 'ASC')
;
}
$qb
->where('date.date_start >= NOW()')
->andWhere($qb->expr()->eq(
@@ -109,7 +109,6 @@ class DateService implements SingletonInterface
$date = $resolvedOptions['date'];
$template = $resolvedOptions['template'];
$paCode = $resolvedOptions['paCode'];
$sortByRoom = $resolvedOptions['sortByRoom'];
if ($filterSettings === null) {
$filterSettings = $this->filterService->getNormalizedFilterSettings();
@@ -118,7 +117,7 @@ class DateService implements SingletonInterface
$nonBookableDateUids = GeneralUtility::trimExplode(',', $product->getNonBookableDates(), true);
return $this->preprocessPriceTable([
'priceTableData' => $this->productRepository->getPricetable($product, $hotel, $filterSettings, $date, $sortByRoom),
'priceTableData' => $this->productRepository->getPricetable($product, $hotel, $filterSettings, $date),
'template' => $template,
'paCode' => $paCode,
'isDayTrip' => $product->isDaytrip(),
@@ -188,7 +187,11 @@ class DateService implements SingletonInterface
$resolver->setDefault('isDayTrip', false);
$resolver->setDefault('showBookingButton', true);
$resolvedOptions = $resolver->resolve($options);
$priceTable = [];
$priceTable = [
'available' => [],
'unavailable' => [],
];
$priceTableData = $resolvedOptions['priceTableData'];
$template = $resolvedOptions['template'];
@@ -210,7 +213,10 @@ class DateService implements SingletonInterface
'isDayTrip' => $isDayTrip,
]);
$optionalServices = $this->preprocessOptionalServices(unserialize($row['roomOptionalServices'], ['allowed_classes' => false]));
$priceTable[] = [
$key = $row['roomAvailable'] && $row['roomPrice'] ? 'available' : 'unavailable';
$priceTable[$key][] = [
'dateStart' => $dateStart->format('d.m.Y'),
'dateEnd' => $dateEnd->format('d.m.Y'),
'season' => $row['season'],
@@ -69,7 +69,7 @@ class SearchResultService implements SingletonInterface
'destinationUid' => null,
'destinationType' => null,
'nights' => null,
'pax' => 1,
'pax' => 0,
'pageUid' => null,
]);
@@ -32,7 +32,7 @@
</config>
</TCEforms>
</settings.runningCostsCHF>
<settings.undersubscriptionEUR>
<settings.undersubscription30EUR>
<TCEforms>
<exclude>0</exclude>
<label>Unterbelegung 30-39 Personen EUR</label>
@@ -42,8 +42,8 @@
<eval>double2,required</eval>
</config>
</TCEforms>
</settings.undersubscriptionEUR>
<settings.undersubscriptionCHF>
</settings.undersubscription30EUR>
<settings.undersubscription30CHF>
<TCEforms>
<exclude>0</exclude>
<label>Unterbelegung 30-39 Personen CHF</label>
@@ -53,8 +53,8 @@
<eval>double2,required</eval>
</config>
</TCEforms>
</settings.undersubscriptionCHF>
<settings.undersubscriptionExtEUR>
</settings.undersubscription30CHF>
<settings.undersubscription40EUR>
<TCEforms>
<exclude>0</exclude>
<label>Unterbelegung 40-49 Personen EUR</label>
@@ -64,8 +64,8 @@
<eval>double2,required</eval>
</config>
</TCEforms>
</settings.undersubscriptionExtEUR>
<settings.undersubscriptionExtCHF>
</settings.undersubscription40EUR>
<settings.undersubscription40CHF>
<TCEforms>
<exclude>0</exclude>
<label>Unterbelegung 40-49 Personen CHF</label>
@@ -75,7 +75,7 @@
<eval>double2,required</eval>
</config>
</TCEforms>
</settings.undersubscriptionExtCHF>
</settings.undersubscription40CHF>
</el>
</ROOT>
</sDEF>
@@ -29,6 +29,7 @@ class IconViewHelper extends AbstractTagBasedViewHelper
$content = sprintf('<use href="%s#icon-%s"></use>', $imageUrl, $this->arguments['icon']);
$this->tag->setContent($content);
$this->tag->addAttributes(['aria-hidden' => 'true']);
return $this->tag->render();
}
@@ -41,6 +41,8 @@ class LazyLoadImageViewHelper extends ImageViewHelper
$classItems[] = 'lazyload';
$classes = implode(' ', array_unique($classItems));
$this->tag->addAttribute('class', $classes);
// ensure a11y compliance
$this->tag->removeAttribute('title');
return $this->tag->render();
}
@@ -38,7 +38,6 @@ plugin.tx_eptheme {
defaultDetailPageUid = {$plugin.tx_epproducts.settings.defaultDetailPageUid}
coronaUpdatesPageUid = {$plugin.tx_eptheme.settings.coronaUpdatesPageUid}
logoImage = {$plugin.tx_eptheme.settings.logoImage}
defaultTitle < sitetitle
forceActiveTopnavUid = {$plugin.tx_eptheme.settings.forceActiveTopnavUid}
eventDateDayFrom = {$plugin.tx_eptheme.settings.eventDateDayFrom}
eventDateDayTo = {$plugin.tx_eptheme.settings.eventDateDayTo}
@@ -1,4 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<!-- Symbols -->
<symbol id="icon-menu" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/></symbol>
<symbol id="icon-chevron-down" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/></symbol>

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

@@ -16,20 +16,37 @@
Einzelne Nächte sind nur auf Anfrage buchbar
</p>
</div>
<div class="mb-8"
<div class="mb-8 grid sm:grid-cols-2 gap-8"
v-show="!submitted">
<label class="mb-2 font-bold">
Personenzahl
</label>
<input type="number"
class="form-field"
v-model.number="selectedPax"
@change="onPaxUpdated()"
v-show="nightsCount > 0"/>
<p class="text-sm italic"
v-show="nightsCount === 0">
Bitte zuerst einen Zeitraum wählen
</p>
<div>
<label class="mb-2 font-bold">
Personenzahl
</label>
<input type="number"
class="form-field"
min="30"
v-model.number="selectedPax"
@change="onPaxUpdated()"
v-show="nightsCount > 0"/>
<p class="text-sm italic"
v-show="nightsCount === 0">
Bitte zuerst einen Zeitraum wählen
</p>
</div>
<div>
<label class="mb-2 font-bold">
davon Kinder 0-3 Jahre
</label>
<input type="number"
class="form-field"
min="0"
v-model.number="childrenCount"
@change="onPaxUpdated()"
v-show="nightsCount > 0"/>
<p class="text-sm italic">
Kinder werden nur bei Strom- und Abfallgebühren berücksichtigt
</p>
</div>
</div>
<div class="mb-8"
v-show="options.length > 0 && !submitted">
@@ -68,10 +85,18 @@
</div>
</div>
<div class="mb-8">
<div class="pb-2" v-if="submitted">
<p class="text-lg font-bold pb-2">
Vielen Dank für Deine {{ mode === 'booking' ? 'Buchung' : 'Anfrage' }}.
</p>
<p>
Für folgendes habt ihr euch entschieden:
</p>
</div>
<div class="p-2 uppercase bg-ep-primary-dark text-white w-full">
Preise
</div>
<div class="bg-zinc-100 p-2">
<div class="bg-zinc-100 p-2 mb-2">
<table class="w-full" v-show="nightsCount > 0">
<tbody>
<tr class="odd:bg-zinc-100">
@@ -95,7 +120,7 @@
<tr class="odd:bg-zinc-100"
v-for="selectedOption in selectedOptions">
<th class="text-left py-2">{{ selectedOption.title }}</th>
<td>{{ formatCurrency(selectedOption.price) }}</td>
<td>{{ formatCurrency(calculateOptionPrice(selectedOption)) }}</td>
</tr>
<tr class="odd:bg-zinc-100"
v-if="priceBoard.EUR > 0 || priceBoard.CHF > 0">
@@ -114,8 +139,10 @@
</tr>
<tr class="odd:bg-zinc-100">
<th class="text-left py-2">Gesamtpreis</th>
<td><strong>{{ formatCurrency(priceTotal) }}</strong>
<br><small>zzgl. vor Ort zu entrichtender Ortstaxe</small>
<td>
<strong>{{ formatCurrency(priceTotal) }}</strong>
<br>
<small>zzgl. vor Ort zu entrichtender Ortstaxe</small>
</td>
</tr>
</tbody>
@@ -125,6 +152,15 @@
Bitte zuerst einen Zeitraum wählen
</p>
</div>
<div v-if="mode === 'booking' && submitted">
Bitte beachtet, dass die Buchung bei uns eingegangen, aber <strong>noch nicht bestätigt</strong> ist.
Wir behalten uns vor, die Buchungen auf Verfügbarkeit und Länge des gewünschten Aufenthalts zu prüfen.
Erst wenn wir euch die Buchung per Mail bestätigt haben, wird sie bindend.
</div>
<div v-if="mode === 'inquiry' && submitted">
Die Anfrage ist bei uns eingegangen und wird schnellstmöglich bearbeitet. Wir melden uns telefonisch
oder per Mail bei euch.
</div>
</div>
<div class="mb-8"
v-show="nightsCount > 0 && !submitted">
@@ -235,9 +271,6 @@
</div>
</div>
</div>
<div class="py-8 text-xl text-center font-bold" v-show="submitted">
Vielen Dank für Deine {{ mode === 'booking' ? 'Buchung' : 'Anfrage' }}. Wir werden diese schnellstmöglich bearbeiten.
</div>
<div>
<img :src="logoAt" alt="" v-if="countryCode === 'AT'" class="block w-full h-auto max-w-24">
<img :src="logoCh" alt="" v-if="countryCode === 'CH'" class="block w-full h-auto max-w-24">
@@ -292,19 +325,19 @@ export default {
type: Number,
default: 2.9,
},
undersubscriptionEur: {
undersubscription30Eur: {
type: Number,
default: 5.0,
},
undersubscriptionChf: {
undersubscription30Chf: {
type: Number,
default: 5.0,
},
undersubscriptionExtEur: {
undersubscription40Eur: {
type: Number,
default: 2.5,
},
undersubscriptionExtChf: {
undersubscription40Chf: {
type: Number,
default: 2.5,
},
@@ -348,6 +381,7 @@ export default {
selectedTo: null,
selectedRange: [],
selectedPax: 30,
childrenCount: 0,
selectedOptions: [],
selectedBoard: null,
name: null,
@@ -380,6 +414,28 @@ export default {
return price
},
calculateOptionPrice(option) {
let price = {
EUR: 0,
CHF: 0,
};
let optionPriceEUR = option.price.EUR
let optionPriceCHF = option.price.CHF
if (1 === option.type) {
price.EUR = optionPriceEUR;
price.CHF = optionPriceCHF;
} else if (2 === option.type) {
price.EUR = optionPriceEUR * this.paxCount;
price.CHF = optionPriceCHF * this.paxCount;
} else if (3 === option.type) {
price.EUR = optionPriceEUR * this.nightsCount;
price.CHF = optionPriceCHF * this.nightsCount;
} else if (4 === option.type) {
price.EUR = optionPriceEUR * this.nightsCount * this.paxCount;
price.CHF = optionPriceCHF * this.nightsCount * this.paxCount;
}
return price;
},
formatOptionPriceType(option) {
if (2 === option.type) {
return ` (${this.formatCurrency(option.price)} pro Person)`
@@ -438,6 +494,7 @@ export default {
'tx_epproducts_ajax[groupsPriceInquiry][dateFrom]': this.selectedFrom.format('DD.MM.YYYY'),
'tx_epproducts_ajax[groupsPriceInquiry][dateTo]': this.selectedTo.format('DD.MM.YYYY'),
'tx_epproducts_ajax[groupsPriceInquiry][pax]': this.selectedPax,
'tx_epproducts_ajax[groupsPriceInquiry][children]': this.childrenCount,
'tx_epproducts_ajax[groupsPriceInquiry][summary][paxBase]': this.formatCurrency(this.pricePax.base),
'tx_epproducts_ajax[groupsPriceInquiry][summary][paxAdditional]': this.formatCurrency(this.pricePax.additional),
'tx_epproducts_ajax[groupsPriceInquiry][summary][undersubscription]': this.formatCurrency(this.pricePax.undersubscription),
@@ -474,6 +531,10 @@ export default {
},
},
computed: {
paxCount() {
// subtract number of children from pax for price calculation, but minimum 30 pax
return Math.max(this.selectedPax - this.childrenCount, 30)
},
nightsCount() {
return this.selectedRange.length;
},
@@ -506,7 +567,7 @@ export default {
base.EUR += config.price.EUR
base.CHF += config.price.CHF
let included = config.personsIncluded
let additionalPax = this.selectedPax - included
let additionalPax = this.paxCount - included
if (this.selectedPax > included) {
additional.EUR += additionalPax * config.priceAdditionalPerson.EUR
additional.CHF += additionalPax * config.priceAdditionalPerson.CHF
@@ -514,12 +575,12 @@ export default {
}
}
}
if (this.selectedBoard && this.selectedPax < 40) {
undersubscription.EUR = this.selectedPax * this.undersubscriptionEur * this.selectedRange.length
undersubscription.CHF = this.selectedPax * this.undersubscriptionChf * this.selectedRange.length
} else if (this.selectedBoard && this.selectedPax < 50) {
undersubscription.EUR = this.selectedPax * this.undersubscriptionExtEur * this.selectedRange.length
undersubscription.CHF = this.selectedPax * this.undersubscriptionExtChf * this.selectedRange.length
if (this.selectedBoard && this.paxCount < 40) {
undersubscription.EUR = this.paxCount * this.undersubscription30Eur * this.selectedRange.length
undersubscription.CHF = this.paxCount * this.undersubscription30Chf * this.selectedRange.length
} else if (this.selectedBoard && this.paxCount < 50) {
undersubscription.EUR = this.paxCount * this.undersubscription40Eur * this.selectedRange.length
undersubscription.CHF = this.paxCount * this.undersubscription40Chf * this.selectedRange.length
}
return {base, additional, undersubscription}
@@ -530,21 +591,9 @@ export default {
CHF: 0,
};
for (let option of this.selectedOptions) {
let optionPriceEUR = option.price.EUR
let optionPriceCHF = option.price.CHF
if (1 === option.type) {
price.EUR += optionPriceEUR;
price.CHF += optionPriceCHF;
} else if (2 === option.type) {
price.EUR += optionPriceEUR * this.selectedPax;
price.CHF += optionPriceCHF * this.selectedPax;
} else if (3 === option.type) {
price.EUR += optionPriceEUR * this.nightsCount;
price.CHF += optionPriceCHF * this.nightsCount;
} else if (4 === option.type) {
price.EUR += optionPriceEUR * this.nightsCount * this.selectedPax;
price.CHF += optionPriceCHF * this.nightsCount * this.selectedPax;
}
let optionPrice = this.calculateOptionPrice(option)
price.EUR += optionPrice.EUR;
price.CHF += optionPrice.CHF;
}
return price;
},
@@ -554,8 +603,8 @@ export default {
CHF: 0,
}
if (this.selectedBoard) {
price.EUR = this.selectedBoard.price.EUR * this.nightsCount * this.selectedPax;
price.CHF = this.selectedBoard.price.CHF * this.nightsCount * this.selectedPax;
price.EUR = this.selectedBoard.price.EUR * this.nightsCount * this.paxCount;
price.CHF = this.selectedBoard.price.CHF * this.nightsCount * this.paxCount;
}
return price
},
@@ -25,7 +25,7 @@ h4,
}
.subline {
@apply block text-xs md:text-sm font-normal leading-6 opacity-60;
@apply block text-sm md:text-base font-normal leading-6;
}
// Lists
@@ -121,6 +121,11 @@ renderables:
type: Textarea
identifier: message
label: 'Deine Kontaktanfrage'
-
defaultValue: ''
type: Text
identifier: bookingNumber
label: 'Buchungsnummer (falls vorhanden)'
-
type: LinkedCheckbox
identifier: privacypolicyaccepted
@@ -4,14 +4,20 @@
<f:cObject typoscriptObjectPath="lib.searchBarCollapsed"/>
<f:alias map="{searchbarCollapsed: 1}">
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
</f:alias>
<f:render section="Content"/>
<f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
<main>
<f:render section="Content"/>
<f:render section="Teasers"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<aside>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
</aside>
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -2,22 +2,30 @@
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSlider" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:render section="Content"/>
<f:render partial="Footer" arguments="{_all}"/>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
<f:else>
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
</f:else>
</f:if>
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<header>
<f:render partial="HeaderSlider" arguments="{_all}"/>
</header>
<main>
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:render section="Content"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<aside>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
<f:else>
<f:render partial="Search/MobileSearch" arguments="{_all}"/>
</f:else>
</f:if>
</aside>
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -3,12 +3,20 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="EventHero" arguments="{_all}"/>
<f:render partial="EventDisturber" arguments="{headline: settings.eventDisturberHeadline, listItems: settings.eventDisturberListitems, buttonLabel: settings.eventDisturberButtonLabel, buttonLink: settings.eventDisturberButtonLink}"/>
<f:render section="Content"/>
<f:render partial="Footer" arguments="{_all}"/>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
<header>
<f:render partial="EventHero" arguments="{_all}"/>
<f:render partial="EventDisturber" arguments="{headline: settings.eventDisturberHeadline, listItems: settings.eventDisturberListitems, buttonLabel: settings.eventDisturberButtonLabel, buttonLink: settings.eventDisturberButtonLink}"/>
</header>
<main>
<f:render section="Content"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<aside>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
</aside>
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -3,16 +3,22 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Content"/>
<f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/>
<header>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
</header>
<main>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Content"/>
<f:render section="Teasers"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
@@ -3,24 +3,30 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
<f:render section="Sidebar"/>
<header>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
</header>
<main>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
<f:render section="Sidebar"/>
</div>
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
</div>
</div>
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
</div>
</div>
<f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/>
<f:render section="Teasers"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
@@ -3,19 +3,25 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
<f:render section="Sidebar"/>
<header>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
</header>
<main>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-1 order-last lg:order-none">
<f:render section="Sidebar"/>
</div>
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
</div>
</div>
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
</div>
</div>
<f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/>
<f:render section="Teasers"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
@@ -3,24 +3,30 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
<header>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:if condition="{data.tx_eptheme_hide_searchbar}">
<f:else>
<f:cObject typoscriptObjectPath="lib.searchBar"/>
</f:else>
</f:if>
</header>
<main>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
</div>
<div class="col-span-3 lg:col-span-1">
<f:render section="Sidebar"/>
</div>
</div>
<div class="col-span-3 lg:col-span-1">
<f:render section="Sidebar"/>
</div>
</div>
<f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/>
<f:render section="Teasers"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
@@ -3,19 +3,25 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:render partial="Mainnav" section="Main" arguments="{_all}"/>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
<header>
<f:render partial="HeaderSliderSmall" arguments="{_all}"/>
<f:cObject typoscriptObjectPath="lib.breadcrumb"/>
</header>
<main>
<f:render section="Header" optional="true"/>
<div class="container grid grid-cols-3 gap-8">
<div class="col-span-3 lg:col-span-2">
<f:render section="Content"/>
</div>
<div class="col-span-3 lg:col-span-1">
<f:render section="Sidebar"/>
</div>
</div>
<div class="col-span-3 lg:col-span-1">
<f:render section="Sidebar"/>
</div>
</div>
<f:render section="Teasers"/>
<f:render partial="Footer" arguments="{_all}"/>
<f:render section="Teasers"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<f:render partial="ContactBar" arguments="{_all}"/>
<f:render partial="Topnav" arguments="{_all}"/>
<f:render partial="Mobilenav" section="Main" arguments="{_all}"/>
@@ -3,13 +3,13 @@
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<div class="container bg-white flex items-center justify-between">
<header class="container bg-white flex items-center justify-between">
<f:link.typolink parameter="{f:if(condition: settings.logoLink, then: settings.logoLink, else: settings.defaultHomeUid)}"
class="block lg:pb-4"
title="{settings.defaultTitle}">
<f:image src="{settings.logoImage}"
title="zur Startseite">
<f:image src="Logo"
class="block w-auto {ep:themeClasses(classes: '{ep: \'h-10 lg:h-12\', sbw: \'h-14 lg:h-24\', snz: \'h-14 lg:h-24\', suz: \'h-14 lg:h-24\', uch: \'h-12 lg:h-20\', ser: \'h-10 lg:h-12\'}', key: settings.themekey)}"
alt="{settings.defaultTitle}"/>
alt="Logo"/>
</f:link.typolink>
<f:link.typolink parameter="{settings.myEpPageUid}"
title="My E&P"
@@ -17,8 +17,12 @@
<div class="text-xl lg:text-2xl font-light leading-none">Login</div>
<div class="text-lg lg:text-xl font-medium leading-none">My E&P</div>
</f:link.typolink>
</div>
<f:render section="Content"/>
<f:render partial="Footer" arguments="{_all}"/>
</header>
<main>
<f:render section="Content"/>
</main>
<footer>
<f:render partial="Footer" arguments="{_all}"/>
</footer>
<f:render partial="Config" arguments="{_all}" />
</html>
@@ -4,7 +4,7 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:section name="Teaser">
<a href="{f:uri.typolink(parameter: city.detailPage)}" class="flex flex-col" title="{city.name}">
<a href="{f:uri.typolink(parameter: city.detailPage)}" class="flex flex-col">
<div class="relative">
{ep:icon(icon: 'flag-{city.country.code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6 absolute top-0 left-0')}
<f:alias map="{teaserImage: city.teaserImage, defaultImage: city.images.0}">
@@ -5,7 +5,7 @@
<f:section name="Teaser">
<f:if condition="{concept}">
<a href="{f:uri.typolink(parameter: concept.detailPage)}" title="{concept.name}" class="flex flex-col">
<div class="relative flex flex-col">
<div class="relative">
<f:alias map="{teaserImage: concept.teaserImage, defaultImage: concept.headerImage}">
<f:if condition="{teaserImage}">
@@ -33,17 +33,19 @@
</f:else>
</f:if>
</f:alias>
<div class="absolute top-0 left-0 inset-0 bg-concept-{concept.code}/70">
<div class="flex h-full w-full p-4 items-end headline--3 text-white">
<div class="absolute z-10 inset-0 bg-concept-{concept.code}/70">
<f:link.typolink parameter="{concept.detailPage}"
class="flex h-full w-full p-4 items-end headline--3 text-white">
{concept.name}
</div>
<span class="absolute inset-0"></span>
</f:link.typolink>
</div>
</div>
<div class="p-4 flex-1">
{concept.teaser -> f:format.crop(maxCharacters: settings.teaserTextMaxChars) -> f:format.html()}
</div>
<div class="bg-concept-{concept.code} h-1 w-20"></div>
</a>
</div>
</f:if>
</f:section>
@@ -6,7 +6,6 @@
<div class="contact-bar">
<a href="{f:uri.typolink(parameter: settings.watchlistPageUid)}"
class="contact-bar__item"
title="Merkliste"
data-controller="watchlist-label"
data-action="watchlist-toggle:toggle@window->watchlist-label#update"
rel="nofollow">
@@ -17,7 +16,6 @@
</a>
<a href="tel:{settings.phoneNumberLink}"
class="contact-bar__item"
title="Telefonische Beratung"
rel="nofollow">
{ep:icon(icon: 'phone', class: 'contact-bar__icon')}
<div class="hidden md:block">
@@ -25,8 +23,7 @@
</div>
</a>
<f:link.email email="{settings.contactFormToEmail}"
class="contact-bar__item"
title="E-Mail">
class="contact-bar__item">
{ep:icon(icon: 'email', class: 'contact-bar__icon')}
<div class="contact-bar__label">
{settings.contactFormToEmail}
@@ -35,7 +32,6 @@
<f:if condition="{settings.whatsApp}">
<a href="{settings.whatsAppNumberLink}"
class="contact-bar__item"
title="Whatsapp"
target="_blank"
rel="nofollow">
{ep:icon(icon: 'whatsapp', class: 'contact-bar__icon')}
@@ -83,7 +79,7 @@
</a>
</f:if>
<f:if condition="{settings.englishPageUid}">
<f:link.typolink parameter="{settings.englishPageUid}" title="English" class="contact-bar__item">
<f:link.typolink parameter="{settings.englishPageUid}" class="contact-bar__item">
{ep:icon(icon: 'flag-gb', class: 'contact-bar__icon')}
<div class="contact-bar__label">
English
@@ -91,7 +87,7 @@
</f:link.typolink>
</f:if>
<f:if condition="{settings.germanPageUid}">
<f:link.typolink parameter="{settings.germanPageUid}" title="English" class="contact-bar__item">
<f:link.typolink parameter="{settings.germanPageUid}" class="contact-bar__item">
{ep:icon(icon: 'flag-de', class: 'contact-bar__icon')}
<div class="contact-bar__label">
Deutsch
@@ -18,8 +18,7 @@
class="block w-full h-auto rounded-full"
width="400"
height="400c"
alt="{image.alternative}"
title="{image.title}" />
alt="{image.alternative}" />
</f:if>
<a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}"
rel="nofollow"
@@ -12,7 +12,9 @@
<div>{data.text -> f:format.html()}</div>
<div>
{data.flexForm.buttons -> v:iterator.first() -> v:variable.set(name: 'button')}
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info" title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
{button.container.label -> f:format.raw()}
</a>
</div>
</div>
<f:render partial="Disrupter/Outlines"
@@ -13,16 +13,16 @@
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto rounded-full"
width="400"
alt="{image.alternative}"
title="{image.title}" />
alt="{image.alternative}" />
</f:if>
</a>
</div>
<div class="col-md-6 ">
<div>{data.text -> f:format.html()}</div>
</div>
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info"
title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
{button.container.label -> f:format.raw()}
</a>
</div>
</f:alias>
@@ -16,8 +16,7 @@
class="block w-full h-auto rounded-full"
width="400"
height="400c"
alt="{image.alternative}"
title="{image.title}" />
alt="{image.alternative}" />
</f:if>
</div>
<div class="px-16 md:px-4 md:w-5/6 md:pl-8 text-center text-white md:text-left" data-rte-content>
@@ -19,8 +19,7 @@
class="block w-full h-auto rounded-full"
width="400"
height="400c"
alt="{teaserImage.alternative}"
title="{teaserImage.title}" />
alt="{teaserImage.alternative}" />
</f:if>
<a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}"
rel="nofollow"
@@ -8,7 +8,7 @@
<div>{data.bodytext -> f:format.html()}</div>
<div>
{data.flexForm.buttons -> v:iterator.first() -> v:variable.set(name: 'button')}
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info" title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">{button.container.label -> f:format.raw()}</a>
</div>
</div>
@@ -13,16 +13,16 @@
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto rounded-full"
width="400"
alt="{teaserImage.alternative}"
title="{teaserImage.title}" />
alt="{teaserImage.alternative}" />
</f:if>
</a>
</div>
<div class="col-md-6 ">
<div>{data.bodytext -> f:format.html()}</div>
</div>
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info"
title="{button.container.label -> f:format.raw()}">{button.container.label -> f:format.raw()}</a>
<a href="{f:uri.typolink(parameter: button.container.link)}" class="btn btn-info">
{button.container.label -> f:format.raw()}
</a>
</div>
</f:alias>
@@ -16,8 +16,7 @@
class="block w-full h-auto rounded-full"
width="400"
height="400c"
alt="{teaserImage.alternative}"
title="{teaserImage.title}" />
alt="{teaserImage.alternative}" />
</f:if>
</div>
<div class="px-16 md:px-4 md:w-5/6 md:pl-8 text-center text-white md:text-left" data-rte-content>
@@ -22,8 +22,7 @@
</div>
<div class="w-full lg:w-1/3 lg:px-4">
<a class="button bg-button w-full"
href="{f:uri.typolink(parameter: buttonLink)}"
title="{buttonLabel -> f:format.raw()}">
href="{f:uri.typolink(parameter: buttonLink)}">
{buttonLabel -> f:format.raw()}
</a>
</div>
@@ -14,6 +14,7 @@
<f:if condition="{filter}">
<div class="mb-4 pr-2 w-80 border-b border-r border-white flex items-center justify-between">
<input type="text"
aria-label="Suchbegriff"
data-action="faq#filter"
class="bg-transparent border-0 uppercase ring-0 focus:ring-0 placeholder-white text-white"
placeholder="Suchbegriff">
@@ -44,8 +45,8 @@
<f:if condition="{settings.infoPageUid}">
<div class="flex items-center justify-end space-x-2 text-sm text-white">
{ep:icon(icon: 'info-circle', class: 'w-4 h-4')}
<a href="{f:uri.typolink(parameter: settings.infoPageUid)}">
Weitere Reiseinfos findet ihr <span class="underline">hier</span>
<a href="{f:uri.typolink(parameter: settings.infoPageUid)}" class="underline">
Weitere Reiseinfos findet ihr hier
</a>
</div>
</f:if>
@@ -20,7 +20,6 @@
<f:for each="{menuheader.children}" as="submenuitem">
<li>
<f:link.typolink parameter="{submenuitem.link}"
title="{submenuitem.linktext}"
class="inline-block py-2 text-lg leading-none text-white">
{submenuitem.title}
</f:link.typolink>
@@ -48,7 +47,6 @@
</span>
<a class="text-white whitespace-nowrap"
href="tel:{settings.phoneNumberLink}"
title="Service Telefon anrufen"
rel="nofollow">
{settings.phoneNumber}
</a>
@@ -73,7 +71,6 @@
</span>
<a class="text-white whitespace-nowrap"
href="{settings.whatsAppNumberLink}"
title="WhatsApp"
target="_blank"
rel="nofollow">
{settings.whatsApp}
@@ -100,22 +97,19 @@
<ul class="p-0 m-0">
<li>
<f:link.typolink parameter="{settings.legalNoticePageUid}"
class="text-white"
title="Impressum">
class="text-white">
Impressum
</f:link.typolink>
</li>
<li>
<f:link.typolink parameter="{settings.termsAndConditionsPageUid}"
class="text-white"
title="AGB">
class="text-white">
AGB
</f:link.typolink>
</li>
<li>
<f:link.typolink parameter="{settings.dataProtectionPageUid}"
class="text-white"
title="Datenschutz">
class="text-white">
Datenschutz
</f:link.typolink>
</li>
@@ -160,8 +154,7 @@
<ep:lazyLoadImage src="EXT:ep_theme/Resources/Public/images/pow_de.png"
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto"
alt="Protect our Winters"
title="Protect our Winters" />
alt="Protect our Winters" />
</a>
<a class="block bg-white p-2 w-24 md:w-16 xl:w-24 rounded"
href="https://www.unglobalcompact.org/"
@@ -172,8 +165,7 @@
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto"
width="100"
alt="Global Compact"
title="Global Compact" />
alt="Global Compact" />
</a>
</div>
</div>
@@ -16,7 +16,7 @@
<picture class="w-full h-full">
<source srcset="{f:uri.image(image: image, width: '1370')}" media="(min-width: 768px)">
<source srcset="{f:uri.image(image: image, height: '640', cropVariant: 'mobile')}" media="(max-width: 767px)">
<f:image image="{image}" cropVariant="mobile" height="640" class="w-full h-auto" alt="{image.alternative}"/>
<img src="{f:uri.image(image: image, cropVariant: 'mobile', height: '640')}" class="w-full h-auto" alt="{image.alternative}">
</picture>
</div>
</f:if>
@@ -34,6 +34,7 @@
</f:if>
<f:if condition="{slide.button}">
<f:link.typolink parameter="{slide.page_uid}"
additionalAttributes="{'tabindex': '-1'}"
class="button bg-button inline-block">
{slide.button}
</f:link.typolink>
@@ -44,17 +45,18 @@
<f:if condition="{slide.skipass} || {badge}">
<div class="herounit__badge-wrapper">
<f:if condition="{slide.skipass}">
<f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive">
<f:link.typolink parameter="{settings.skipassPageUid}"
additionalAttributes="{'tabindex': '-1'}">
<div class="herounit__badge herounit__badge--skipass">
<p class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</p>
<p class="uppercase">inklusive</p>
<div class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</div>
<div class="uppercase">inklusive</div>
</div>
</f:link.typolink>
</f:if>
<f:if condition="{badge}">
<f:alias map="{badgeData: badge.0.data}">
<f:link.typolink parameter="{badgeData.link}"
title="{badgeData.title}">
additionalAttributes="{'tabindex': '-1'}">
<div class="herounit__badge herounit__badge--custom">
<svg viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg"
@@ -7,7 +7,7 @@
<f:alias map="{image: slide.image.0}">
<f:if condition="{image}">
<picture>
<source srcset="{f:uri.image(image: image, width: '1370')}" media="(min-width: 768px)">
<source srcset="{f:uri.image(image: image, width: '1440')}" media="(min-width: 768px)">
<source srcset="{f:uri.image(image: image, height: '320', cropVariant: 'mobile')}" media="(max-width: 767px)">
<f:image class="block w-full h-full object-cover"
image="{image}"
@@ -38,7 +38,7 @@
<f:if condition="{slide.skipass} || {badge}">
<div class="herounit__badge-wrapper">
<f:if condition="{settings.showSkipassBadge}">
<f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive">
<f:link.typolink parameter="{settings.skipassPageUid}">
<div class="herounit__badge herounit__badge--skipass">
<p class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</p>
<p class="uppercase">inklusive</p>
@@ -47,8 +47,7 @@
</f:if>
<f:if condition="{badge}">
<f:alias map="{badgeData: badge.0.data}">
<f:link.typolink parameter="{badgeData.link}"
title="{badgeData.title}">
<f:link.typolink parameter="{badgeData.link}">
<div class="hidden md:block absolute top-0 right-0 mt-12 mr-8 w-40 rotate-6">
<svg viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg"
@@ -4,7 +4,7 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
<f:section name="Teaser">
<a href="{f:uri.typolink(parameter: hotel.detailPage)}" title="{hotel.name}" class="flex flex-col">
<a href="{f:uri.typolink(parameter: hotel.detailPage)}" class="flex flex-col">
<div class="relative">
{ep:icon(icon: 'flag-{hotel.country.code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6 absolute top-0 left-0')}
<f:if condition="{hotel.images.original.0}">
@@ -13,14 +13,14 @@
</div>
<f:alias map="{image: images.0}">
<a href="{f:uri.image(image: image, cropVariant: 'zoom', maxWidth: '2560')}"
title="{image.title}"
data-action="lightbox#open">
<ep:lazyLoadImage image="{image}"
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto"
width="770"
height="430c+100"
alt="{image.alternative}"
title="{image.title}" />
alt="{image.alternative}"/>
</a>
</f:alias>
<f:if condition="{thumbnails}">
@@ -33,14 +33,14 @@
data-lightbox-target="thumb"
data-lightbox-index="{iteration.cycle}"
data-lightbox-caption="{image.originalResource.description}"
title="{image.title}"
class="block">
<ep:lazyLoadImage image="{image}"
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto"
width="150"
height="85c+100"
alt="{image.alternative}"
title="{image.title}" />
alt="{image.alternative}"/>
</a>
</f:if>
</f:for>
@@ -53,8 +53,9 @@
<a href="{f:uri.image(image: image, cropVariant: 'zoom', maxWidth: '2560')}"
data-lightbox-target="thumb"
data-lightbox-index="{iteration.cycle}"
data-lightbox-caption="{image.originalResource.description}"
title="{image.originalResource.title}">{iteration.index}</a>
data-lightbox-caption="{image.originalResource.description}">
{iteration.index}
</a>
</f:if>
</f:for>
</div>
@@ -14,8 +14,7 @@
class="block w-full h-auto"
width="770"
height="430c+100"
alt="{journey.image.alternative}"
title="{journey.image.title}" />
alt="{journey.image.alternative}" />
</f:if>
<f:if condition="{journey.byBus}">
<h3>
@@ -8,10 +8,10 @@
<div class="flex items-center hover-hover:lg:items-end justify-between px-4 py-2 lg:px-0 lg:pt-4 lg:pb-0">
<f:link.typolink parameter="{f:if(condition: settings.logoLink, then: settings.logoLink, else: settings.defaultHomeUid)}"
class="block lg:pb-4"
title="{settings.defaultTitle}">
title="zur Startseite">
<f:image src="{settings.logoImage}"
class="block w-auto {ep:themeClasses(classes: '{ep: \'h-10 lg:h-12\', sbw: \'h-14 lg:h-24\', snz: \'h-14 lg:h-24\', suz: \'h-14 lg:h-24\', uch: \'h-12 lg:h-20\', ser: \'h-10 lg:h-12\'}', key: settings.themekey)}"
alt="{settings.defaultTitle}"/>
alt="Bildmarke"/>
</f:link.typolink>
<div class="hidden hover-hover:lg:block">
<f:render section="FirstLevel" arguments="{_all}"/>
@@ -43,15 +43,15 @@
</f:section>
<f:section name="FirstLevel">
<nav role="menu">
<ul class="m-0 p-0 list-none flex items-center justify-end space-x-4">
<nav role="navigation" aria-label="Hauptnavigation">
<ul class="m-0 p-0 list-none flex items-center justify-end space-x-4" role="menubar">
<f:for each="{mainnav}" as="topitem">
<li class="group pb-4">
<li class="group pb-4" role="none">
<f:if condition="{topitem.children}">
<f:then>
<a href="{f:uri.typolink(parameter: topitem.data.uid)}"
class="text-zinc-800 uppercase lg:text-lg font-bold flex items-center"
title="{topitem.title}">
role="menuitem"
class="text-zinc-800 uppercase lg:text-lg font-bold flex items-center">
<span>{topitem.title}</span>
{ep:icon(icon: 'chevron-down', class: 'ml-1 w-4 h-4 group-hover:rotate-180')}
</a>
@@ -59,8 +59,8 @@
</f:then>
<f:else>
<a href="{topitem.link}"{f:if(condition: '{topitem.doktype} == 3', then: ' target="_blank"')}
class="block text-zinc-800 uppercase lg:text-lg font-bold"
title="{topitem.title}">
role="menuitem"
class="block text-zinc-800 uppercase lg:text-lg font-bold">
{topitem.title}
</a>
</f:else>
@@ -69,7 +69,7 @@
</f:for>
<f:if condition="{data.tx_eptheme_hide_searchbar} || {settings.hideSearchbar}">
<f:else>
<li class="pb-4">
<li class="pb-4" role="none">
<f:if condition="{searchbarCollapsed}">
<f:then>
<button type="button"
@@ -80,7 +80,7 @@
</button>
</f:then>
<f:else>
<f:link.typolink parameter="{settings.defaultSearchPageUid}">
<f:link.typolink parameter="{settings.defaultSearchPageUid}" title="zur Suche" additionalAttributes="{'role': 'menuitem'}">
{ep:icon(icon: 'search', class: 'w-6 h-6')}
</f:link.typolink>
</f:else>
@@ -96,11 +96,11 @@
<div class="absolute top-100 left-0 inset-x-0 pt-4 invisible opacity-0 group-hover:visible group-hover:opacity-100 transition-opacity duration-300 ease-in-out">
<div class="bg-white grid grid-cols-3 lg:grid-cols-4 gap-8 p-4 shadow-lg rounded">
<f:for each="{topitem.children}" as="subitem">
<ul class="m-0 p-0 list-none">
<li>
<ul class="m-0 p-0 list-none" role="menu">
<li role="none">
<f:if condition="{subitem.doktype} == 3">
<f:then>
<a href="{subitem.link}" target="_blank" title="{subitem.title}">
<a href="{subitem.link}" target="_blank" role="menuitem">
<f:if condition="{subitem.data.tx_eptheme_context_country_code}">
{ep:icon(icon: 'flag-{subitem.data.tx_eptheme_context_country_code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6')}
</f:if>
@@ -111,8 +111,8 @@
</f:then>
<f:else>
<a href="{f:uri.typolink(parameter: subitem.data.uid)}"
class="flex items-center space-x-2 underlined"
title="{subitem.title}">
role="menuitem"
class="flex items-center space-x-2 underlined">
<f:if condition="{subitem.data.tx_eptheme_context_country_code}">
{ep:icon(icon: 'flag-{subitem.data.tx_eptheme_context_country_code -> f:format.case(mode: \'lower\')}', class: 'w-8 h-6')}
</f:if>
@@ -134,20 +134,20 @@
<f:for each="{subitem.children}" as="subsubitem">
<f:if condition="{subsubitem.doktype} == 3">
<f:then>
<li>
<li role="none">
<a href="{subsubitem.link}"
class="text-zinc-800 text-lg"
target="_blank"
title="{subsubitem.title}">
role="menuitem">
{subsubitem.title}
</a>
</li>
</f:then>
<f:else>
<li>
<li role="none">
<a href="{f:uri.typolink(parameter: subsubitem.data.uid)}"
class="text-zinc-800 text-lg"
title="{subsubitem.title}">
role="menuitem">
{subsubitem.title}
</a>
</li>
@@ -13,8 +13,8 @@
<div class="fixed top-0 left-0 z-100 inset-x-0 px-4 py-2 hover-none:lg:py-4 flex justify-between bg-white shadow-md">
<f:link.typolink parameter="{f:if(condition: settings.logoLink, then: settings.logoLink, else: settings.defaultHomeUid)}"
class="block hover-hover:lg:pb-4"
title="{settings.defaultTitle}">
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="{settings.defaultTitle}"/>
title="zur Startseite">
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="Bildmarke"/>
</f:link.typolink>
<div class="flex hover-hover:lg:hidden items-center space-x-4">
<f:if condition="{data.tx_eptheme_hide_searchbar}">
@@ -53,7 +53,6 @@
<div class="grid grid-cols-4 gap-x-2">
<a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}"
class="button bg-button flex items-center space-x-2"
title="Anrufen"
rel="nofollow">
{ep:icon(icon: 'phone', class: 'w-6 h-6 text-white')}
<span class="hidden sm:block">
@@ -62,7 +61,6 @@
</a>
<a href="https://api.whatsapp.com/send?phone={settings.whatsAppNumberLink}"
class="button bg-button flex items-center space-x-2"
title="WhatsApp"
rel="nofollow"
target="_blank">
{ep:icon(icon: 'whatsapp', class: 'w-6 h-6 text-white')}
@@ -72,8 +70,7 @@
</a>
<f:if condition="{settings.faqPageUid}">
<a href="{f:uri.typolink(parameter: settings.faqPageUid)}"
class="button bg-button flex items-center space-x-2"
title="FAQ">
class="button bg-button flex items-center space-x-2">
{ep:icon(icon: 'faq', class: 'w-6 h-6 text-white')}
<span class="hidden sm:block">
FAQ
@@ -82,8 +79,7 @@
</f:if>
<f:if condition="{settings.myEpPageUid}">
<f:link.typolink parameter="{settings.myEpPageUid}"
class="button bg-button flex items-center space-x-2"
title="My E&P">
class="button bg-button flex items-center space-x-2">
{ep:icon(icon: 'user', class: 'w-6 h-6 text-white')}
<span class="hidden sm:block">
My E&amp;P
@@ -105,8 +101,7 @@
data-collapse-collapsed-value="{f:if(condition: navitem.active, then: 'false', else: 'true')}">
<div class="flex items-center justify-between px-4 py-2 text-white {f:if(condition: navitem.data.tx_eptheme_navitemclass, then: navitem.data.tx_eptheme_navitemclass, else: 'bg-ep-primary')}">
<a href="{navitem.link}"
class="uppercase text-xl flex-1"
title="{navitem.title}">
class="uppercase text-xl flex-1">
{navitem.title}
</a>
<button type="button"
@@ -124,8 +119,7 @@
<f:else>
<li>
<a href="{navitem.link}"
class="block px-4 py-2 text-white uppercase text-xl {f:if(condition: navitem.data.tx_eptheme_navitemclass, then: navitem.data.tx_eptheme_navitemclass, else: 'bg-ep-primary')}"
title="{navitem.title}">
class="block px-4 py-2 text-white uppercase text-xl {f:if(condition: navitem.data.tx_eptheme_navitemclass, then: navitem.data.tx_eptheme_navitemclass, else: 'bg-ep-primary')}">
{navitem.title}
</a>
</li>
@@ -145,8 +139,7 @@
data-collapse-collapsed-value="{f:if(condition: subitem.active, then: 'false', else: 'true')}">
<div class="flex items-center justify-between">
<a href="{subitem.link}"
class="flex-1"
title="{subitem.title}">
class="flex-1">
{subitem.title}
</a>
<button type="button"
@@ -163,9 +156,7 @@
</f:then>
<f:else>
<li class="py-2">
<a href="{subitem.link}"
class=""
title="{subitem.title}">
<a href="{subitem.link}">
{subitem.title}
</a>
</li>
@@ -9,7 +9,7 @@
<f:link.typolink parameter="{images.0.originalResource.link}">
<img src="{f:uri.image(image: images.0, width: '770', height: '430c+100')}"
class="block w-full h-auto mb-4"
alt="{images.0.alternative}" title="{images.0.title}">
alt="{images.0.alternative}">
</f:link.typolink>
</f:then>
<f:else>
@@ -21,10 +21,10 @@
<f:for each="{images}" as="image" iteration="iteration">
<li class="splide__slide">
<f:link.typolink parameter="{image.originalResource.link}"
class="relative bg-cover bg-center">
class="relative bg-cover bg-center" title="{image.title}">
<img src="{f:uri.image(image: image, width: '770', height: '430c+100')}"
class="block w-full h-auto"
alt="{image.alternative}" title="{image.title}">
alt="{image.alternative}">
</f:link.typolink>
</li>
</f:for>
@@ -34,9 +34,9 @@
<div class="hidden md:grid md:grid-cols-5 md:gap-2 md:pt-4 md:pb-8">
<f:for each="{images}" as="image" iteration="iteration">
<f:if condition="{iteration.cycle} <= 5">
<a href="#" class="block" data-slide="{iteration.index}">
<a href="#" class="block" data-slide="{iteration.index}" title="{image.title}">
<img src="{f:uri.image(image: image, width: '150', height: '85c+100')}"
class="block w-full h-auto" alt="{image.alternative}" title="{image.title}">
class="block w-full h-auto" alt="{image.alternative}">
</a>
</f:if>
</f:for>
@@ -12,8 +12,7 @@
<f:alias map="{mediaElement: '{newsItem.mediaPreviews.0}'}">
<img class="block w-full h-auto lazyload"
data-src="{f:uri.image(image: mediaElement, width: '640', height: '360c+50')}"
alt="{mediaElement.originalResource.alternative}"
title="{mediaElement.originalResource.title}">
alt="{mediaElement.originalResource.alternative}">
</f:alias>
</f:if>
</f:then>
@@ -22,8 +21,7 @@
<f:alias map="{mediaElement: '{newsItem.media.0}'}">
<img class="block w-full h-auto lazyload"
data-src="{f:uri.image(image: mediaElement, width: '640', height: '360c+50')}"
alt="{mediaElement.originalResource.alternative}"
title="{mediaElement.originalResource.title}">
alt="{mediaElement.originalResource.alternative}">
</f:alias>
</f:if>
</f:else>
@@ -31,7 +29,7 @@
</n:link>
<div class="md:flex-1">
<h3 class="blog-entry__headline">
<n:link newsItem="{newsItem}" settings="{settings}" title="{newsItem.title}">
<n:link newsItem="{newsItem}" settings="{settings}">
{newsItem.title}
</n:link>
</h3>
@@ -40,7 +38,7 @@
<time datetime="{f:format.date(date:newsItem.datetime, format:'Y-m-d')}"><f:format.date format="{f:translate(key:'dateFormat')}">{newsItem.datetime}</f:format.date></time>
<f:if condition="{newsItem.tags}"> in
<f:for each="{newsItem.tags}" as="tag" iteration="iteration">
<f:link.page title="{tag.title}" pageUid="{settings.tagListPageUid}" additionalParams="{tx_news_pi1:{overwriteDemand:{tags: tag}}}">
<f:link.page pageUid="{settings.tagListPageUid}" additionalParams="{tx_news_pi1:{overwriteDemand:{tags: tag}}}">
{tag.title}
</f:link.page>
{f:if(condition: iteration.isLast, else: ', ')}
@@ -59,7 +57,7 @@
</f:if>
</div>
</n:removeMediaTags>
<n:link newsItem="{newsItem}" settings="{settings}" class="button bg-button button--small" title="{newsItem.title}">
<n:link newsItem="{newsItem}" settings="{settings}" class="button bg-button button--small">
<f:translate key="more-link"/>
</n:link>
</div>
@@ -5,7 +5,7 @@
<li><strong>Wir informieren dich,</strong> wenn deine Reise buchbar ist - Trage dich in unsere
<f:link.typolink parameter="{settings.travelAlertPageUid}">Reisealert-Liste</f:link.typolink> ein!</li>
<li>Du kannst diese aber ggf. auch <strong>vorreservieren</strong>, oder wir helfen dir, eine andere Unterkunft
zu finden. Ruf uns an unter <a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}" title="Service Telefon anrufen" rel="nofollow">{settings.phoneNumber}</a>
zu finden. Ruf uns an unter <a href="tel:{settings.phoneNumber -> v:format.pregReplace(pattern: '/[\-\s]/', replacement: '')}" rel="nofollow">{settings.phoneNumber}</a>
oder schreibe an <f:link.email email="[email protected]"/>.</li>
</ul>
</div>
@@ -3,7 +3,7 @@
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers"
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers">
<f:if condition="{pricetable -> f:count()} == 0">
<f:if condition="{pricetable.available -> f:count()} == 0">
<f:then>
<div class="alert alert-info" data-rte-content>
{nonBookableInfo.text -> f:format.html()}
@@ -32,7 +32,7 @@
</tr>
</thead>
<tbody>
<f:for each="{pricetable}" as="row" iteration="iteration">
<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}
@@ -88,8 +88,7 @@
data-pricetable-type-param="options"
data-pricetable-uid-param="{row.roomUid}"
data-cooltipz-dir="top"
aria-label="Alle Zusatzleistungen anzeigen"
role="tooltip">
aria-label="Alle Zusatzleistungen anzeigen">
{ep:icon(icon: 'plus-circle', class: 'w-4 h-4 md:w-5 md:h-5')}
</button>
</f:if>
@@ -137,7 +136,7 @@
</button>
</div>
<div class="h-128 p-4 overflow-y-scroll bg-white rounded-b">
<f:for each="{pricetable}" as="row">
<f:for each="{pricetable.available}" as="row">
<div class="hidden"
data-modal-target="content"
data-uid="{row.roomUid}">
@@ -14,7 +14,7 @@
</f:if>
<div class="herounit h-80 lg:h-96 mb-8">
<picture>
<source srcset="{f:uri.image(image: image, width: '1370c', height: '380c')}" media="(min-width: 768px)">
<source srcset="{f:uri.image(image: image, width: '1440c', height: '380c')}" media="(min-width: 768px)">
<source srcset="{f:uri.image(image: image, height: '320c')}" media="(max-width: 767px)">
<f:image class="block w-full h-full object-cover"
image="{image}"
@@ -68,7 +68,6 @@
<f:if condition="{settings.showSkipassBadge} && {product.skipassIncluded}">
<div class="herounit__badge-wrapper">
<f:link.typolink parameter="{settings.skipassPageUid}"
title="Skipass inklusive"
class="herounit__badge herounit__badge--skipass">
<p class="uppercase text-4xl font-bold leading-7 mb-2">
Ski-<br>Pass
@@ -20,7 +20,7 @@
hx-target="body"
hx-swap="beforeend"
</f:if>
title="{region.name} {product.name} Details und Buchen">
>
<f:if condition="{productImage}">
<f:then>
<ep:lazyLoadImage image="{productImage}"
@@ -57,8 +57,7 @@
data-watchlist-toggle-target="ariaLabel"
data-action="watchlist-toggle#toggle"
data-cooltipz-dir="top-right"
aria-label="auf die Merkliste setzen"
role="tooltip">
aria-label="auf die Merkliste setzen">
<svg class="product-teaser__watchlist-icon" data-watchlist-toggle-target="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"></path></svg>
</button>
</div>
@@ -84,7 +83,6 @@
hx-target="body"
hx-swap="beforeend"
</f:if>
title="{region.name} {product.name} Details und Buchen"
class="flex-1 flex flex-col space-y-1 px-2 py-4 md:p-4">
<div class="product-teaser__label-name">
{product.name}
@@ -1,7 +1,6 @@
<f:if condition="{product.ratingVotesCount} > 0">
<a href="{f:uri.typolink(parameter: targetPageUid)}"
class="block bg-zinc-50 p-4 mb-4"
title="Reisebewertungen">
class="block bg-zinc-50 p-4 mb-4">
<p class="font-bold mb-1">
{label}
</p>
@@ -17,8 +17,7 @@
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto"
width="330"
alt="Webcam {region.name}"
title="Webcam {region.name}" />
alt="Webcam {region.name}" />
</a>
</div>
</f:if>
@@ -10,7 +10,6 @@
<f:link.typolink parameter="{region.awardLink}" title="{region.name}">
<f:image image="{region.awardImage}"
alt="{region.awardImage.alternative}"
title="{region.awardImage.title}"
maxWidth="165"
class="block max-w-full mx-auto"
/>
@@ -21,8 +21,7 @@
loaderimg="EXT:ep_theme/Resources/Public/images/lazy.png"
class="block w-full h-auto"
width="330"
alt="{regionMap.alternative}"
title="{regionMap.title}"/>
alt="{regionMap.alternative}"/>
</a>
</f:for>
</div>
@@ -10,8 +10,8 @@
<div class="fixed top-0 left-0 z-100 inset-x-0 px-4 py-2 hover-none:lg:py-4 flex justify-between bg-white shadow-md">
<a href="{f:uri.typolink(parameter: settings.defaultHomeUid)}"
class="block hover-hover:lg:pb-4"
title="{settings.defaultTitle}">
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="{settings.defaultTitle}"/>
title="zur Startseite">
<f:image class="block h-10 lg:h-12 w-auto" src="{settings.logoImage}" alt="Bildmarke"/>
</a>
<button type="button"
aria-label="Suche schließen"
@@ -33,7 +33,7 @@
<f:if condition="{settings.showSkipassBadge} || {badge}">
<div class="herounit__badge-wrapper">
<f:if condition="{settings.showSkipassBadge}">
<f:link.typolink parameter="{settings.skipassPageUid}" title="Skipass inklusive">
<f:link.typolink parameter="{settings.skipassPageUid}">
<div class="herounit__badge herounit__badge--skipass">
<p class="uppercase text-4xl font-bold leading-7 mb-2">Ski-<br>Pass</p>
<p class="uppercase">inklusive</p>
@@ -42,8 +42,7 @@
</f:if>
<f:if condition="{badge}">
<f:alias map="{badgeData: badge.0.data}">
<f:link.typolink parameter="{badgeData.link}"
title="{badgeData.title}">
<f:link.typolink parameter="{badgeData.link}">
<div class="herounit__badge herounit__badge--custom">
<svg viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg"
@@ -26,8 +26,7 @@
class="block w-full h-auto"
width="500"
height="250c-100"
alt="{image.alternative}"
title="{image.title}" />
alt="{image.alternative}" />
</picture>
</f:then>
<f:else>
@@ -13,7 +13,7 @@
<source media="(max-width: 768px)" data-srcset="{f:uri.image(
image: image, width: '320', height: '140c-100'
)} 320w"/>
<img class="scale lazyload" title="{image.title}" alt="{image.alternative}"
<img class="scale lazyload" alt="{image.alternative}"
src="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/lazy.png', width: '260', height: '160')}"
data-src="{f:uri.image(image: image, width: '260', height: '160c-100')}"
>
@@ -6,12 +6,10 @@
<f:render partial="Header/Header" arguments="{header: data.header, subheader: data.subheader, layout: data.header_layout, link: data.header_link, default: settings.defaultHeaderType}" />
{data.bodytext -> f:format.html()}
<f:if condition="{files}">
<f:link.typolink parameter="{files.0.link}">
<f:link.typolink parameter="{files.0.link}" title="{files.0.originalResource.title}">
<img class="img-responsive lazyload"
data-src="{f:uri.image(image: files.0, maxWidth: '770')}"
alt="{files.0.originalResource.alternative}"
title="{files.0.originalResource.title}"
>
alt="{files.0.originalResource.alternative}">
</f:link.typolink>
</f:if>
</f:section>
@@ -11,7 +11,6 @@
<div class="tiles__tile lg:col-span-2 lg:row-span-1"
style="background-image:url('{f:uri.image(image: images.0)}');">
<f:link.typolink parameter="{images.0.link}"
title="{images.0.title -> f:format.raw()}"
class="tiles__link">
<span class="tiles__label">
{images.0.title -> f:format.raw()}
@@ -23,7 +22,6 @@
<div class="tiles__tile lg:col-span-2 lg:row-span-1"
style="background-image:url('{f:uri.image(image: images.1)}');">
<f:link.typolink parameter="{images.1.link}"
title="{images.1.title -> f:format.raw()}"
class="tiles__link">
<span class="tiles__label">
{images.1.title -> f:format.raw()}
@@ -35,7 +33,6 @@
<div class="tiles__tile lg:col-span-12 lg:row-span-1"
style="background-image:url('{f:uri.image(image: images.4)}');">
<f:link.typolink parameter="{images.4.link}"
title="{images.4.title -> f:format.raw()}"
class="tiles__link">
<span class="tiles__label">
{images.4.title -> f:format.raw()}
@@ -47,7 +44,6 @@
<div class="tiles__tile lg:col-span-4 lg:row-span-2"
style="background-image:url('{f:uri.image(image: images.2)}');">
<f:link.typolink parameter="{images.2.link}"
title="{images.2.title -> f:format.raw()}"
class="tiles__link">
<span class="tiles__label">
{images.2.title -> f:format.raw()}
@@ -59,7 +55,6 @@
<div class="tiles__tile lg:col-span-6 lg:row-span-2"
style="background-image:url('{f:uri.image(image: images.3)}');">
<f:link.typolink parameter="{images.3.link}"
title="{images.3.title -> f:format.raw()}"
class="tiles__link">
<span class="tiles__label">
{images.3.title -> f:format.raw()}
@@ -30,8 +30,7 @@
class="block w-full h-auto"
width="400c"
height="400"
alt="{image.alternative}"
title="{image.title}" />
alt="{image.alternative}" />
</f:link.typolink>
</div>
</f:section>
@@ -7,15 +7,15 @@
<f:else>
<div class="topnav">
<div class="container">
<nav role="navigation" class="topnav__nav">
<nav role="navigation" aria-label="Bereichs-Navigation" class="topnav__nav">
<div class="flex items-center border-l border-white/50">
<f:if condition="{settings.mainSitePid}">
<f:link.typolink parameter="{settings.mainSitePid}"
class="topnav__item"
title="{settings.defaultTitle}">
title="zur Startseite">
<f:image src="EXT:ep_theme/Resources/Public/images/logo.svg"
class="h-5 w-auto"
alt="{settings.defaultTitle}"/>
alt=""/>
</f:link.typolink>
</f:if>
<f:link.typolink parameter="{settings.defaultHomeUid}" class="topnav__item" title="E&amp;P">
@@ -26,8 +26,7 @@
<div class="flex-1 flex items-center">
<f:for each="{topnav}" as="menuitem">
<a class="topnav__item flex-grow{f:if(condition: menuitem.data.tx_eptheme_navitemclass, then: ' {menuitem.data.tx_eptheme_navitemclass}')}{f:if(condition: '{menuitem.active} || {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}">
href="{menuitem.link}"{f:if(condition: '{menuitem.data.doktype} == 3', then: ' target="_blank"')}>
{menuitem.title}
</a>
</f:for>
@@ -58,8 +58,7 @@
data-daytrip-type-param="services"
data-daytrip-uid-param="{iteration.cycle}"
data-cooltipz-dir="top"
aria-label="Alle Inklusivleistungen anzeigen"
role="tooltip">
aria-label="Alle Inklusivleistungen anzeigen">
<svg class="w-4 h-4">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-info-circle"></use>
</svg>
@@ -47,129 +47,17 @@
</tr>
</thead>
<tbody>
<f:for each="{prices}" as="row">
<tr class="odd:bg-zinc-50 hover:bg-zinc-100 odd:hover:bg-zinc-100"
data-pricetable-target="row">
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
<f:if condition="{row.showBookingButton} && {row.available}">
<f:then>
<a class="inline-block text-ep-primary-light text-xs sm:text-sm md:text-base leading-tight"
href="{row.bookingUrl}"
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-datalayer-action="trigger"
target="_blank"
title="{row.roomName}, {hotel.name}, {dateRange} buchen">
{row.roomName}
</a>
</f:then>
<f:else>
<span class="inline-block text-xs sm:text-sm md:text-base line-through leading-tight">
{row.roomName}
</span>
<f:if condition="{row.available}">
<f:else>
<span class="inline-block text-xs sm:text-sm md:text-base text-sm leading-tight lg:ml-2">ausgebucht</span>
</f:else>
</f:if>
</f:else>
</f:if>
</td>
<f:if condition="{hasIncludedServices}">
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
<div class="flex items-center justify-around space-x-1">
<div class="grid grid-cols-2">
<f:if condition="{row.busIncluded}">
<f:then>
<span class="block p-1"
data-cooltipz-dir="top"
aria-label="Busfahrt inklusive"
role="tooltip"
data-pricetable-target="busIcon"
data-bus-included="{row.busIncluded}"
data-bus-price="{row.busPrice}">
<svg class="w-4 h-4 md:w-5 md:h-5">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-bus"></use>
</svg>
</span>
</f:then>
<f:else>
<span class="block"></span>
</f:else>
</f:if>
<f:if condition="{row.skipassIncluded}">
<f:then>
<span class="block p-1"
data-cooltipz-dir="top"
aria-label="{f:if(condition: row.summer, then: 'Bergbahnticket inklusive', else: 'Skipass inklusive')}"
role="tooltip">
<svg class="w-4 h-4 md:w-5 md:h-5">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-tag"></use>
</svg>
</span>
</f:then>
<f:else>
<span class="block"></span>
</f:else>
</f:if>
</div>
</div>
</td>
</f:if>
<td class="border-r border-zinc-200 px-2 py-1 md:p-2 text-center">
<f:if condition="{row.hasOptionalServices} && {row.available}">
<button type="button"
class="text-ep-primary-light text-sm md:text-base text-left leading-none p-1"
data-action="pricetable#openModal"
data-pricetable-type-param="options"
data-pricetable-uid-param="{row.roomUid}"
data-cooltipz-dir="top"
aria-label="Alle Zusatzleistungen anzeigen"
role="tooltip">
Zusatz&shy;leistungen
</button>
</f:if>
</td>
<td class="px-2 py-1 md:p-2 whitespace-nowrap">
<f:if condition="{row.showBookingButton}">
<f:then>
<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}, {hotel.name}, {dateRange} buchen"
target="_blank">
<span class="font-bold normal-case whitespace-nowrap"
data-pricetable-target="price"
data-room="{row.minPrice}"
data-bus="{row.busPrice}"
data-discount="{row.discount}">
{row.minPrice}
</span>
</a>
</f:then>
<f:else>
<span class="button bg-button bg-button--muted button--small block cursor-not-allowed font-bold normal-case whitespace-nowrap"
data-cooltipz-dir="top"
aria-label="Leider ausgebucht"
role="tooltip"
data-pricetable-target="price"
data-room="{row.minPrice}"
data-bus="{row.busPrice}"
data-discount="{row.discount}">
{row.minPrice} €
</span>
</f:else>
</f:if>
</f:then>
<f:else>
<f:link.typolink parameter="{settings.travelAlertPageUid}"
class="button bg-button button--small">
Reisen-Alert
</f:link.typolink>
</f:else>
</f:if>
</td>
</tr>
<f:comment><!--
Render available and unavailable rooms separately to maintain order:
1. by pax
2. by price
3. by availability
--></f:comment>
<f:for each="{prices.available}" as="row">
<f:render section="Row" arguments="{_all}"/>
</f:for>
<f:for each="{prices.unavailable}" as="row">
<f:render section="Row" arguments="{_all}"/>
</f:for>
</tbody>
</table>
@@ -277,34 +165,161 @@
</button>
</div>
<div class="h-128 p-4 overflow-y-scroll bg-white rounded-b">
<f:for each="{prices}" as="row">
<div class="hidden"
data-modal-target="content"
data-uid="{row.roomUid}">
<f:for each="{row.optionalServices}" as="section" key="sectionCode">
<div class="py-2 -mx-1">
<div class="font-bold text-xl px-1">
{section.label}
</div>
<f:for each="{section.services}" as="service">
<f:if condition="{sectionCode} == 'BUS' || {service.price} != '0,00'">
<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:if>
</f:for>
</div>
</f:for>
</div>
<f:for each="{prices.available}" as="row">
<f:render section="OptionsModalRow" arguments="{_all}"/>
</f:for>
</div>
</div>
</div>
</f:section>
<f:section name="Row">
<tr class="odd:bg-zinc-50 hover:bg-zinc-100 odd:hover:bg-zinc-100"
data-pricetable-target="row">
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
<f:if condition="{row.showBookingButton} && {row.available}">
<f:then>
<a class="inline-block text-ep-primary-light text-xs sm:text-sm md:text-base leading-tight"
href="{row.bookingUrl}"
data-controller="datalayer" data-datalayer-event-value="ZurBuchung" data-datalayer-action="trigger"
target="_blank"
title="{row.roomName}, {hotel.name}, {dateRange} buchen">
{row.roomName}
</a>
</f:then>
<f:else>
<span class="inline-block text-xs sm:text-sm md:text-base line-through leading-tight">{row.roomName}</span>
<f:if condition="{row.available}">
<f:else>
<span class="inline-block text-xs sm:text-sm md:text-base text-sm leading-tight lg:ml-2">ausgebucht</span>
</f:else>
</f:if>
</f:else>
</f:if>
</td>
<f:if condition="{hasIncludedServices}">
<td class="border-r border-zinc-200 px-2 py-1 md:p-2">
<div class="flex items-center justify-around space-x-1">
<div class="grid grid-cols-2">
<f:if condition="{row.busIncluded}">
<f:then>
<span class="block p-1"
data-cooltipz-dir="top"
aria-label="Busfahrt inklusive"
role="tooltip"
data-pricetable-target="busIcon"
data-bus-included="{row.busIncluded}"
data-bus-price="{row.busPrice}">
<svg class="w-4 h-4 md:w-5 md:h-5">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-bus"></use>
</svg>
</span>
</f:then>
<f:else>
<span class="block"></span>
</f:else>
</f:if>
<f:if condition="{row.skipassIncluded}">
<f:then>
<span class="block p-1"
data-cooltipz-dir="top"
aria-label="{f:if(condition: row.summer, then: 'Bergbahnticket inklusive', else: 'Skipass inklusive')}"
role="tooltip">
<svg class="w-4 h-4 md:w-5 md:h-5">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-tag"></use>
</svg>
</span>
</f:then>
<f:else>
<span class="block"></span>
</f:else>
</f:if>
</div>
</div>
</td>
</f:if>
<td class="border-r border-zinc-200 px-2 py-1 md:p-2 text-center">
<f:if condition="{row.hasOptionalServices} && {row.available}">
<button type="button"
class="text-ep-primary-light text-sm md:text-base text-left leading-none p-1"
data-action="pricetable#openModal"
data-pricetable-type-param="options"
data-pricetable-uid-param="{row.roomUid}"
data-cooltipz-dir="top"
aria-label="Alle Zusatzleistungen anzeigen">
Zusatz&shy;leistungen
</button>
</f:if>
</td>
<td class="px-2 py-1 md:p-2 whitespace-nowrap">
<f:if condition="{row.showBookingButton}">
<f:then>
<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}, {hotel.name}, {dateRange} buchen"
target="_blank">
<span class="font-bold normal-case whitespace-nowrap"
data-pricetable-target="price"
data-room="{row.minPrice}"
data-bus="{row.busPrice}"
data-discount="{row.discount}">
{row.minPrice}
</span>
</a>
</f:then>
<f:else>
<span class="button bg-button bg-button--muted button--small block cursor-not-allowed font-bold normal-case whitespace-nowrap"
data-cooltipz-dir="top"
aria-label="Leider ausgebucht"
role="tooltip"
data-pricetable-target="price"
data-room="{row.minPrice}"
data-bus="{row.busPrice}"
data-discount="{row.discount}">
{row.minPrice} €
</span>
</f:else>
</f:if>
</f:then>
<f:else>
<f:link.typolink parameter="{settings.travelAlertPageUid}"
class="button bg-button button--small">
Reisen-Alert
</f:link.typolink>
</f:else>
</f:if>
</td>
</tr>
</f:section>
<f:Section name="OptionsModalRow">
<div class="hidden"
data-modal-target="content"
data-uid="{row.roomUid}">
<f:for each="{row.optionalServices}" as="section" key="sectionCode">
<f:if condition="{section.services}">
<div class="py-2 -mx-1">
<div class="font-bold text-xl px-1">
{section.label}
</div>
<f:for each="{section.services}" as="service">
<f:if condition="{sectionCode} == 'BUS' || {sectionCode} == 'VPF' || {service.price} != '0,00'">
<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:if>
</f:for>
</div>
</f:if>
</f:for>
</div>
</f:Section>
</html>
@@ -33,6 +33,7 @@
<button type="button"
class="opacity-50"
data-action="teasergrid#grid"
aria-label="kompakte Ansicht"
data-teasergrid-target="button">
<svg class="w-12 h-12 text-ep-primary">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-teaser-grid"></use>
@@ -40,6 +41,7 @@
</button>
<button type="button"
data-action="teasergrid#block"
aria-label="vergrößerte Ansicht"
data-teasergrid-target="button">
<svg class="w-12 h-12 text-ep-primary">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-teaser-single"></use>
@@ -54,6 +54,10 @@
<th>Anzahl der Personen</th>
<td>{pax -> v:or(alternative: '-')}</td>
</tr>
<tr>
<th>Anzahl Kinder 0-3 Jahre</th>
<td>{children -> v:or(alternative: '-')}</td>
</tr>
<tr>
<th>Verpflegung</th>
<td>
@@ -10,6 +10,7 @@
style="background-image: url({f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/lazy.png')})">
<iframe class="absolute top-0 left-0 w-full h-full"
width="640" height="360" allowfullscreen
title="eingebettetes Video"
data-src="{ep:uri.video(value: data.header_link, layout: data.layout)}"
data-cookiefirst-category="advertising"></iframe>
<div class="cookiefirst-disabled-resource">
@@ -15,10 +15,10 @@
options-json='{options}'
running-costs-factor-eur="{runningCostsEUR}"
running-costs-factor-chf="{runningCostsCHF}"
undersubscription-eur="{undersubscriptionEUR}"
undersubscription-chf="{undersubscriptionCHF}"
undersubscription-ext-eur="{undersubscriptionExtEUR}"
undersubscription-ext-chf="{undersubscriptionExtCHF}"
undersubscription-30-eur="{undersubscription30EUR}"
undersubscription-30-chf="{undersubscription30CHF}"
undersubscription-40-eur="{undersubscription40EUR}"
undersubscription-40-chf="{undersubscription40CHF}"
country-code="{countryCode}"
endpoint="{ep:uri.ajax(action: 'processForm', controller: 'AjaxGroupsPrice', pageUid: settings.defaultAjaxUid, arguments: '{hotel: hotel}')}"
loader-uri="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/ajax-loader-white.gif')}"
@@ -46,6 +46,7 @@
data-action="click->collapse#toggle"
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer placeholder-white"
placeholder="Zeitraum"
aria-label="Zeitraum"
value="{ep:dateRange(dateFrom: searchParams.dateFrom, dateTo: searchParams.dateTo, includeLabel: 0)}"
data-searchbar-target="dateRangeLabel"/>
<svg class="w-6 h-6 text-white absolute right-0 top-0 mr-2 mt-1 cursor-pointer"
@@ -57,6 +58,7 @@
<div class="flex justify-between divide-x divide-zinc-200">
<div class="pr-2">
<input type="hidden"
aria-label="Zeitraum"
data-datepicker-target="field">
</div>
<div class="flex-1 flex flex-col justify-between pl-2">
@@ -100,6 +102,7 @@
<input type="text"
data-action="click->collapse#toggle"
data-searchbar-target="paxLabel"
aria-label="Personenzahl"
value="{searchParams.pax}"
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer"/>
<svg class="w-6 h-6 text-white absolute right-0 top-0 mr-2 mt-1 cursor-pointer"
@@ -139,6 +142,7 @@
<input type="text"
data-action="click->collapse#toggle"
data-searchbar-target="destinationLabel"
aria-label="Reiseziel/Konzept"
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer placeholder-white"
placeholder="Reiseziel/Konzept"/>
<svg
@@ -161,9 +165,7 @@
<svg class="block w-8 h-6">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-flag-{destination.country.code -> f:format.case(mode: 'lower')}"></use>
</svg>
<span>
{destination.country.label}
</span>
<span>{destination.country.label}</span>
</button>
</div>
<div class="col-span-3 flex flex-col items-start space-y-1">
@@ -212,6 +214,7 @@
data-collapse-collapsed-value="true">
<div class="relative border-r border-b border-white/50">
<input type="text"
aria-label="Preis"
data-action="click->collapse#toggle"
data-searchbar-target="priceRangeLabel"
class="w-full bg-transparent border-0 ring-0 focus:ring-0 text-white uppercase px-2 py-1 cursor-pointer placeholder-white"
@@ -251,7 +254,7 @@
</div>
<button type="submit"
class="hidden reduced:block reduced:ml-4">
class="hidden reduced:block reduced:ml-4" title="Suchen">
<svg class="w-8 h-8 text-white bg-badge-gradient">
<use href="{f:uri.image(src: 'EXT:ep_theme/Resources/Public/images/icons_sprite.svg')}#icon-chevron-right"></use>
</svg>