Merge branch 'feature/tailwind-3' into feature/sass-remove
This commit is contained in:
@@ -58,7 +58,7 @@ class CityController extends ActionController
|
||||
/**
|
||||
* @param City $city
|
||||
*/
|
||||
public function detailAction(City $city = null)
|
||||
public function detailAction(City $city = null): void
|
||||
{
|
||||
if (null === $city) {
|
||||
$cityUid = $this->settings['cityUid'];
|
||||
@@ -81,11 +81,14 @@ class CityController extends ActionController
|
||||
]);
|
||||
}
|
||||
|
||||
public function teasergroupAction()
|
||||
public function teasergroupAction(): void
|
||||
{
|
||||
$regionUid = $this->settings['regionUid'];
|
||||
$regionUid = (int)$this->settings['regionUid'];
|
||||
$countryUid = (int)$this->settings['countryUid'];
|
||||
$season = $this->settings['season'];
|
||||
$cities = $this->cityRepository->getTeasersByRegionAndSeason($regionUid, $season);
|
||||
$citiesPid = (int)$this->settings['citiesStoragePid'];
|
||||
|
||||
$cities = $this->cityRepository->getTeasersByCountryOrRegionAndSeason($regionUid, $countryUid, $season, $citiesPid);
|
||||
$data = $this->configurationManager->getContentObject()->data;
|
||||
$this->view->assign('data', $data);
|
||||
$this->view->assign('teasers', $cities);
|
||||
|
||||
@@ -161,12 +161,13 @@ class ProductController extends ActionController
|
||||
$enabledDates = array_keys($availableContingents);
|
||||
}
|
||||
|
||||
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids']);
|
||||
$isProductWithExcludedConcept = ($product->getConcept() !== null) && \in_array($product->getConcept()->getUid(),
|
||||
$excludedConceptUids, false);
|
||||
$noInfoConceptUids = GeneralUtility::trimExplode(',', $this->settings['noInfoConceptUids']);
|
||||
$isProductWithNoInfoConcept = ($product->getConcept() !== null) && \in_array($product->getConcept()->getUid(),
|
||||
$noInfoConceptUids, false);
|
||||
$concept = $product->getConcept();
|
||||
$excludedConceptUids = GeneralUtility::trimExplode(',', $this->settings['excludedConceptUids'], true);
|
||||
$isProductWithExcludedConcept = ($concept !== null) && \in_array($concept->getUid(), $excludedConceptUids);
|
||||
$noInfoConceptUids = GeneralUtility::trimExplode(',', $this->settings['noInfoConceptUids'], true);
|
||||
$isProductWithNoInfoConcept = ($concept !== null) && \in_array($concept->getUid(), $noInfoConceptUids);
|
||||
$groupInquiryFormConceptUids = GeneralUtility::trimExplode(',', $this->settings['groupInquiryFormConceptUids'], true);
|
||||
$isProductWithGroupInquiryForm = ($concept !== null) && \in_array($concept->getUid(), $groupInquiryFormConceptUids);
|
||||
|
||||
// Assemble backlink
|
||||
$backlinkUrl = GeneralUtility::_GET('ref');
|
||||
@@ -178,6 +179,7 @@ class ProductController extends ActionController
|
||||
'enabledDates' => $enabledDates ?? [],
|
||||
'isProductWithExcludedConcept' => $isProductWithExcludedConcept,
|
||||
'isProductWithNoInfoConcept' => $isProductWithNoInfoConcept,
|
||||
'isProductWithGroupInquiryForm' => $isProductWithGroupInquiryForm,
|
||||
'currentPageUid' => $GLOBALS['TSFE']->id,
|
||||
'dateFrom' => $dateFrom,
|
||||
'dateTo' => $dateTo,
|
||||
|
||||
@@ -83,9 +83,10 @@ class RegionController extends ActionController
|
||||
|
||||
public function teasergroupAction()
|
||||
{
|
||||
$countryUid = $this->settings['countryUid'];
|
||||
$countryUid = (int)$this->settings['countryUid'];
|
||||
$season = $this->settings['season'];
|
||||
$regions = $this->regionRepository->getTeasersByCountryAndSeason($countryUid, $season);
|
||||
$regionsPid = (int)$this->settings['regionsStoragePid'];
|
||||
$regions = $this->regionRepository->getTeasersByCountryAndSeason($countryUid, $season, $regionsPid);
|
||||
$data = $this->configurationManager->getContentObject()->data;
|
||||
$this->view->assign('data', $data);
|
||||
$this->view->assign('teasers', $regions);
|
||||
|
||||
@@ -93,6 +93,11 @@ class AbstractDestination extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
|
||||
*/
|
||||
protected $description = '';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $descriptionExtended = '';
|
||||
|
||||
/**
|
||||
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference>
|
||||
*/
|
||||
@@ -322,6 +327,22 @@ class AbstractDestination extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
|
||||
$this->description = $description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getDescriptionExtended()
|
||||
{
|
||||
return $this->descriptionExtended;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $descriptionExtended
|
||||
*/
|
||||
public function setDescriptionExtended($descriptionExtended)
|
||||
{
|
||||
$this->descriptionExtended = $descriptionExtended;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FileReference> $images
|
||||
*/
|
||||
|
||||
@@ -31,24 +31,25 @@ use EP\EpProducts\Domain\Model\AbstractDestination;
|
||||
|
||||
class CityRepository extends AbstractRepository
|
||||
{
|
||||
|
||||
/**
|
||||
* @param int $regionUid
|
||||
* @param string $season
|
||||
*
|
||||
* @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface
|
||||
*/
|
||||
public function getTeasersByRegionAndSeason($regionUid, $season = 'w')
|
||||
public function getTeasersByCountryOrRegionAndSeason(int $regionUid = 0, int $countryUid = 0, string $season = 'w', int $storagePid = 0)
|
||||
{
|
||||
if ($season === null) {
|
||||
$season = AbstractDestination::SEASON_WINTER;
|
||||
}
|
||||
$query = $this->createQuery();
|
||||
$constraints = [
|
||||
$query->equals('region', $regionUid),
|
||||
$query->equals('season', $season),
|
||||
$query->equals('excludeFromTeasergroups', 0)
|
||||
];
|
||||
if (0 < $regionUid) {
|
||||
$constraints[] = $query->equals('region', $regionUid);
|
||||
} elseif (0 < $countryUid) {
|
||||
$constraints[] = $query->equals('country', $countryUid);
|
||||
}
|
||||
if (0 < $storagePid) {
|
||||
$constraints[] = $query->equals('pid', $storagePid);
|
||||
}
|
||||
|
||||
return $query
|
||||
->matching($query->logicalAnd($constraints))
|
||||
->execute()
|
||||
|
||||
@@ -31,13 +31,7 @@ use EP\EpProducts\Domain\Model\AbstractDestination;
|
||||
|
||||
class RegionRepository extends AbstractRepository
|
||||
{
|
||||
|
||||
/**
|
||||
* @param int $countryUid
|
||||
* @param string $season
|
||||
* @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface
|
||||
*/
|
||||
public function getTeasersByCountryAndSeason($countryUid, $season = 'w')
|
||||
public function getTeasersByCountryAndSeason(int $countryUid, string $season = 'w', int $storagePid = 0)
|
||||
{
|
||||
if ($season === null) {
|
||||
$season = AbstractDestination::SEASON_WINTER;
|
||||
@@ -48,6 +42,11 @@ class RegionRepository extends AbstractRepository
|
||||
$query->equals('season', $season),
|
||||
$query->equals('excludeFromTeasergroups', 0)
|
||||
];
|
||||
|
||||
if (0 < $storagePid) {
|
||||
$constraints[] = $query->equals('pid', $storagePid);
|
||||
}
|
||||
|
||||
return $query
|
||||
->matching($query->logicalAnd($constraints))
|
||||
->execute()
|
||||
|
||||
+15
-2
@@ -23,7 +23,9 @@ return [
|
||||
],
|
||||
'types' => [
|
||||
'1' => [
|
||||
'showitem' => '--palette--;;top, name_internal, --palette--;;name, --palette--;;destinations, teaser, keywords, description, party, leisure, facts, officetip, --div--;Bilder/Dateien, teaser_images, header_images, images',
|
||||
'showitem' => '--palette--;;top, name_internal, --palette--;;name, --palette--;;destinations, teaser,
|
||||
keywords, description, description_extended, party, leisure, facts, officetip,
|
||||
--div--;Bilder/Dateien, teaser_images, header_images, images',
|
||||
],
|
||||
],
|
||||
'palettes' => [
|
||||
@@ -209,7 +211,18 @@ return [
|
||||
],
|
||||
'description' => [
|
||||
'exclude' => 0,
|
||||
'label' => 'Der Ort',
|
||||
'label' => 'Der Ort (oben)',
|
||||
'config' => [
|
||||
'type' => 'text',
|
||||
'cols' => 40,
|
||||
'rows' => 15,
|
||||
'eval' => 'trim',
|
||||
'enableRichtext' => true,
|
||||
],
|
||||
],
|
||||
'description_extended' => [
|
||||
'exclude' => 0,
|
||||
'label' => 'Der Ort (unten)',
|
||||
'config' => [
|
||||
'type' => 'text',
|
||||
'cols' => 40,
|
||||
|
||||
@@ -1,48 +1,60 @@
|
||||
# customsubcategory=100=Storage
|
||||
# customsubcategory=110=Pages
|
||||
# customsubcategory=120=Search/Filtering
|
||||
# customsubcategory=130=Email
|
||||
# customsubcategory=140=Misc
|
||||
|
||||
plugin.tx_epproducts {
|
||||
settings {
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Products storage PID
|
||||
# cat=epproducts/100/100; type=string; label=Products storage PID
|
||||
productsStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Hotels storage PID
|
||||
# cat=epproducts/100/110; type=string; label=Hotels storage PID
|
||||
hotelsStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Concepts storage PID
|
||||
# cat=epproducts/100/120; type=string; label=Concepts storage PID
|
||||
conceptsStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Facts storage PID
|
||||
# cat=epproducts/100/130; type=string; label=Facts storage PID
|
||||
factsStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Faqs storage PID
|
||||
# cat=epproducts/100/140; type=string; label=Faqs storage PID
|
||||
faqsStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Destinations storage PID
|
||||
# cat=epproducts/100/150; type=string; label=Destinations storage PID
|
||||
destinationsStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Teammember storage PID
|
||||
# cat=epproducts/100/160; type=string; label=Regions storage PID
|
||||
regionsStoragePid =
|
||||
# cat=epproducts/100/160; type=string; label=Cities storage PID
|
||||
citiesStoragePid =
|
||||
# cat=epproducts/100/170; type=string; label=Teammember storage PID
|
||||
teammemberStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Officetip storage PID
|
||||
# cat=epproducts/100/180; type=string; label=Officetip storage PID
|
||||
officetipStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Snow report storage PID
|
||||
# cat=epproducts/100/190; type=string; label=Snow report storage PID
|
||||
snowReportStoragePid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Default search page UID
|
||||
# cat=epproducts/110/100; type=string; label=Default search page UID
|
||||
defaultSearchPageUid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Default product detail page UID
|
||||
# cat=epproducts/110/110; type=string; label=Default product detail page UID
|
||||
defaultDetailPageUid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Exclude products with concept UIDs from search result (CSV)
|
||||
excludedConceptUids =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Exclude regions with these UIDs from filter options (CSV)
|
||||
excludedRegionUids =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Force concept UID in all search related parts (CSV)
|
||||
forcedConceptUids =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Don't show availability info for products with these concept UIDs
|
||||
noInfoConceptUids =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Room types for pricetables (CSV)
|
||||
priceTableRoomTypes = 1,2,3,4,5,6,7,8,9,10
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Ignore following IPs in searchlog
|
||||
searchLogIgnoreIps =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Page UID with reseller export plugin
|
||||
# cat=epproducts/110/120; type=string; label=Page UID with reseller export plugin
|
||||
resellerExportPageUid =
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Email recipient for groups price inquiries
|
||||
# cat=epproducts/120/100; type=string; label=Exclude products with concept UIDs from search result (CSV)
|
||||
excludedConceptUids =
|
||||
# cat=epproducts/120/110; type=string; label=Exclude regions with these UIDs from filter options (CSV)
|
||||
excludedRegionUids =
|
||||
# cat=epproducts/120/120; type=string; label=Force concept UID in all search related parts (CSV)
|
||||
forcedConceptUids =
|
||||
# cat=epproducts/120/130; type=string; label=Don't show availability info for products with these concept UIDs
|
||||
noInfoConceptUids =
|
||||
# cat=epproducts/130/110; type=string; label=Email recipient for groups price inquiries
|
||||
groupsPriceToEmail = [email protected]
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Email recipient for groups price inquiries
|
||||
# cat=epproducts/130/120; type=string; label=Email recipient for groups price inquiries
|
||||
groupsPriceToName = EP Reisen
|
||||
# cat=epproducts/140/100; type=string; label=Room types for pricetables (CSV)
|
||||
priceTableRoomTypes = 1,2,3,4,5,6,7,8,9,10
|
||||
# cat=epproducts/140/110; type=string; label=Ignore following IPs in searchlog
|
||||
searchLogIgnoreIps =
|
||||
# cat=epproducts/140/120; type=string; label=Concept UIDs to trigger inquiry form on product detail page (CSV)
|
||||
groupInquiryFormConceptUids =
|
||||
}
|
||||
persistence {
|
||||
# cat=plugin.tx_epproducts//a; type=string; label=Default storage PID
|
||||
# cat=epproducts/100/100; type=string; label=Default storage PID
|
||||
storagePid =
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,8 @@ plugin.tx_epproducts {
|
||||
settings {
|
||||
productsPid = {$plugin.tx_epproducts.settings.productsStoragePid}
|
||||
destinationsStoragePid = {$plugin.tx_epproducts.settings.destinationsStoragePid}
|
||||
regionsStoragePid = {$plugin.tx_epproducts.settings.regionsStoragePid}
|
||||
citiesStoragePid = {$plugin.tx_epproducts.settings.citiesStoragePid}
|
||||
snowReportStoragePid = {$plugin.tx_epproducts.settings.snowReportStoragePid}
|
||||
defaultSearchPageUid = {$plugin.tx_epproducts.settings.defaultSearchPageUid}
|
||||
defaultDetailPageUid = {$plugin.tx_epproducts.settings.defaultDetailPageUid}
|
||||
@@ -47,6 +49,7 @@ plugin.tx_epproducts {
|
||||
groupsPricePopupPageUid = {$plugin.tx_eptheme.settings.groupsPricePopupPageUid}
|
||||
groupsPriceToEmail = {$plugin.tx_epproducts.settings.groupsPriceToEmail}
|
||||
groupsPriceToName = {$plugin.tx_epproducts.settings.groupsPriceToName}
|
||||
groupInquiryFormConceptUids = {$plugin.tx_epproducts.settings.groupInquiryFormConceptUids}
|
||||
logoImage = {$plugin.tx_eptheme.settings.logoImage}
|
||||
themekey = {$plugin.tx_eptheme.settings.themekey}
|
||||
datePickerPresets {
|
||||
|
||||
@@ -714,6 +714,7 @@ CREATE TABLE tx_epproducts_domain_model_city
|
||||
header_subtitle varchar(255) DEFAULT '' NOT NULL,
|
||||
keywords text NOT NULL,
|
||||
description text NOT NULL,
|
||||
description_extended text NOT NULL,
|
||||
party text NOT NULL,
|
||||
leisure text NOT NULL,
|
||||
teaser_images int(11) unsigned NOT NULL default '0',
|
||||
|
||||
-6
@@ -36,15 +36,9 @@ export default class extends Controller {
|
||||
for (let item of this.markersValue) {
|
||||
const position = L.latLng(item.lat, item.lng)
|
||||
const marker = L.marker(position)
|
||||
if (item.externalLink) {
|
||||
marker.on('click', () => {
|
||||
window.open(item.externalLink, '_blank')
|
||||
})
|
||||
} else {
|
||||
const popupContent = '<div data-rte-content=""><strong>' + item.name + '</strong><br>' + item.teaser +
|
||||
'<br><a href="' + item.uri + '">zu den Details</a></div>'
|
||||
marker.bindPopup(popupContent)
|
||||
}
|
||||
marker.addTo(this.map)
|
||||
bounds.extend(position)
|
||||
}
|
||||
|
||||
@@ -470,7 +470,7 @@
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState(['config', 'loading']),
|
||||
...mapState(['config', 'loading', 'countries']),
|
||||
...mapGetters(['isGroupManager']),
|
||||
availableContingents () {
|
||||
let filteredContingents = {};
|
||||
|
||||
+1
-3
@@ -6,9 +6,7 @@
|
||||
<span>
|
||||
Zimmer
|
||||
</span>
|
||||
<svg class="w-4 h-4 transform" :class="{ 'rotate-180': visible }">
|
||||
<use href="#icon-chevron-down"></use>
|
||||
</svg>
|
||||
<svg class="w-4 h-4" fill="none" :class="{ 'rotate-180': visible }" 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"></path></svg>
|
||||
</button>
|
||||
<ul class="absolute top-100 left-0 z-50 mt-4 border shadow-md p-4 bg-white w-screen max-w-xs divide-y" v-show="visible">
|
||||
<li v-for="accommodation in selectableAccommodations" :key="accommodation.id" class="py-1">
|
||||
|
||||
+1
-3
@@ -5,9 +5,7 @@
|
||||
<a role="button" href="#" class="flex items-center justify-between"
|
||||
@click.prevent="expanded = !expanded">
|
||||
<span>{{ title }}</span>
|
||||
<svg class="w-6 h-6 transform" :class="{ 'rotate-180': expanded }">
|
||||
<use href="#icon-chevron-down"></use>
|
||||
</svg>
|
||||
<svg class="w-6 h-6" fill="none" :class="{ 'rotate-180': expanded }" 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"></path></svg>
|
||||
</a>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
+1
-3
@@ -6,9 +6,7 @@
|
||||
<span>
|
||||
Telefon
|
||||
</span>
|
||||
<svg class="w-4 h-4 transform" :class="{ 'rotate-180': visible }">
|
||||
<use href="#icon-chevron-down"></use>
|
||||
</svg>
|
||||
<svg class="w-4 h-4" fill="none" :class="{ 'rotate-180': visible }" 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"></path></svg>
|
||||
</button>
|
||||
<div class="absolute top-100 left-0 z-50 mt-4 border shadow-md p-4 bg-white w-screen max-w-xs space-y-2" v-show="visible">
|
||||
<input class="border-zinc-400 focus:border-zinc-800 ring-0 focus:ring-0 mt-1 w-full" type="text" placeholder="Mobil"
|
||||
|
||||
+1
-3
@@ -4,9 +4,7 @@
|
||||
<span>
|
||||
Größen
|
||||
</span>
|
||||
<svg class="w-4 h-4 transform" :class="{ 'rotate-180': visible }">
|
||||
<use href="#icon-chevron-down"></use>
|
||||
</svg>
|
||||
<svg class="w-4 h-4" fill="none" :class="{ 'rotate-180': visible }" 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"></path></svg>
|
||||
</button>
|
||||
<div class="absolute top-100 left-0 z-50 mt-4 border shadow-md p-4 bg-white w-screen max-w-xs space-y-2" v-show="visible">
|
||||
<input class="form-input w-full" type="text" placeholder="Körpergröße"
|
||||
|
||||
+1
-3
@@ -4,9 +4,7 @@
|
||||
<span>
|
||||
Zustieg
|
||||
</span>
|
||||
<svg class="w-4 h-4 transform" :class="{ 'rotate-180': visible }">
|
||||
<use href="#icon-chevron-down"></use>
|
||||
</svg>
|
||||
<svg class="w-4 h-4" fill="none" :class="{ 'rotate-180': visible }" 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"></path></svg>
|
||||
</button>
|
||||
<div class="absolute top-100 left-0 z-50 mt-4 border shadow-md p-4 bg-white w-screen max-w-xs" v-show="visible">
|
||||
<div class="py-1" v-for="pickup in pickups" :key="pickup.id">
|
||||
|
||||
+7
-4
@@ -4,11 +4,14 @@
|
||||
<span>
|
||||
{{ subType.label }}
|
||||
</span>
|
||||
<svg class="w-4 h-4 transform" :class="{ 'rotate-180': visible }">
|
||||
<use href="#icon-chevron-down"></use>
|
||||
</svg>
|
||||
<svg class="w-4 h-4" fill="none" :class="{ 'rotate-180': visible }" 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"></path></svg>
|
||||
</button>
|
||||
<div class="absolute top-100 left-0 z-50 mt-4 border shadow-md p-4 bg-white w-screen max-w-xs" v-show="visible">
|
||||
<div class="absolute top-100 left-0 z-50 mt-1 border shadow-md p-4 bg-white w-screen max-w-xs" v-show="visible">
|
||||
<div class="text-right">
|
||||
<button type="button" @click="visible = false">
|
||||
<svg class="w-4 h-4" 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="M6 18L18 6M6 6l12 12"></path></svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="py-1" v-for="service in availableServices" :key="service.id">
|
||||
<label class="inline-flex items-center text-sm">
|
||||
<input type="checkbox"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<h2 class="text-base font-bold mb-1">
|
||||
<f:if condition="{title}">
|
||||
<f:then>
|
||||
Skiurlaub {title} Facts
|
||||
{title}
|
||||
</f:then>
|
||||
<f:else>
|
||||
Facts
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
</f:else>
|
||||
</f:if>
|
||||
{hotel.description -> f:format.html()}
|
||||
<f:if condition="{showInquiryForm}">
|
||||
<f:if condition="{hotel.groupsPriceConfigs}">
|
||||
<f:else>
|
||||
<f:link.typolink class="button bg-button" parameter="{settings.groupsContactFormPageUid}" additionalParams="&ref={currentPageUid}">
|
||||
@@ -22,6 +23,7 @@
|
||||
</f:link.typolink>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</f:if>
|
||||
</div>
|
||||
<f:if condition="{teasers}">
|
||||
<f:then>
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
{hotel.teaser -> f:format.crop(maxCharacters: settings.teaserTextMaxChars) -> f:format.html()}
|
||||
<f:if condition="{hotel.available} != -1">
|
||||
<span class="teaserbox__price">
|
||||
<strong>{f:if(condition: '{hotel.available} > 0', then: 'ab {hotel.minPrice} €', else: 'bald buchbar')}</strong>
|
||||
<strong>{f:if(condition: '{hotel.available} > 0', then: 'ab {hotel.minPrice} €', else: 'aktuell nicht buchbar')}</strong>
|
||||
</span>
|
||||
</f:if>
|
||||
</div>
|
||||
|
||||
@@ -52,6 +52,12 @@
|
||||
<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>
|
||||
<f:if condition="{concept.code} == 'evt'">
|
||||
<div class="absolute bottom-0 left-0 inset-x-0 flex justify-between text-white {f:if(condition: landscape, else: 'text-sm')} bg-concept-evt/70 px-2 py-1">
|
||||
<span>{hotel.name}</span>
|
||||
<span class="uppercase">{hotel.category}</span>
|
||||
</div>
|
||||
</f:if>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
@@ -71,24 +77,18 @@
|
||||
<ul class="product-teaser__list-included flex-1 list-none m-0 text-zinc-800 divide-y divide-zinc-400">
|
||||
<li class="flex items-center space-x-1 py-1">
|
||||
{ep:icon(class: 'w-6 h-6 text-ep-primary-light', icon: 'check')}
|
||||
<span class="block flex-1 leading-none">
|
||||
{f:if(condition: '{season} == "s"', then: 'Bergbahnticket', else: 'Skipass')}
|
||||
</span>
|
||||
<span class="block flex-1 leading-none">{f:if(condition: '{season} == "s"', then: 'Bergbahnticket', else: 'Skipass')}</span>
|
||||
</li>
|
||||
<f:if condition="{product.feature}">
|
||||
<li class="flex items-center space-x-1 py-1">
|
||||
{ep:icon(class: 'w-6 h-6 text-ep-primary-light', icon: 'check')}
|
||||
<span class="block flex-1 leading-tight">
|
||||
{product.feature}
|
||||
</span>
|
||||
<span class="block flex-1 leading-tight">{product.feature}</span>
|
||||
</li>
|
||||
</f:if>
|
||||
<f:if condition="{board}">
|
||||
<li class="flex items-center space-x-1 py-1">
|
||||
{ep:icon(class: 'w-6 h-6 text-ep-primary-light', icon: 'check')}
|
||||
<span class="block flex-1 leading-tight">
|
||||
{board}
|
||||
</span>
|
||||
<span class="block flex-1 leading-tight">Verpflegung</span>
|
||||
</li>
|
||||
</f:if>
|
||||
</ul>
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
</div>
|
||||
<f:if condition="{settings.hideMoreLink}">
|
||||
<f:else>
|
||||
<f:link.typolink class="button bg-button"
|
||||
<f:link.typolink class="button bg-button ml-4"
|
||||
parameter="{settings.defaultSearchPageUid}"
|
||||
additionalParams="f={filterSettings -> ep:filterSettingsEncoder()}"
|
||||
additionalAttributes="{rel: 'nofollow'}">
|
||||
@@ -84,6 +84,11 @@
|
||||
</f:else>
|
||||
</f:if>
|
||||
</f:if>
|
||||
<f:if condition="{city.descriptionExtended}">
|
||||
<div class="p-4 mt-4" data-rte-content>
|
||||
{city.descriptionExtended -> f:format.html()}
|
||||
</div>
|
||||
</f:if>
|
||||
</div>
|
||||
<div class="col-span-3 lg:col-span-1">
|
||||
<f:if condition="{teasers}">
|
||||
|
||||
@@ -170,10 +170,11 @@
|
||||
</f:section>
|
||||
|
||||
<f:section name="Hotel">
|
||||
|
||||
<div class="mb-4{f:if(condition: settings.hotelOnTop, else: ' hidden')}"
|
||||
data-tabs-target="tab"
|
||||
data-tab="hotel">
|
||||
<f:render partial="Hotel/Details" arguments="{hotel: hotel, bars: 1, showNonBookableHint: 0, currentPageUid: currentPageUid}"/>
|
||||
<f:render partial="Hotel/Details" arguments="{hotel: hotel, bars: 1, showNonBookableHint: 0, currentPageUid: currentPageUid, showInquiryForm: isProductWithGroupInquiryForm}"/>
|
||||
</div>
|
||||
</f:section>
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<f:if condition="{teasers}">
|
||||
<p class="hidden lg:block">
|
||||
<button type="button"
|
||||
class="button bg-button w-full mb-8"
|
||||
class="button bg-button w-full mb-8 ml-4"
|
||||
data-controller="scroll-to"
|
||||
data-scroll-to-target-value="teasers"
|
||||
data-action="scroll-to#scroll">
|
||||
|
||||
@@ -101,6 +101,10 @@ module.exports = {
|
||||
'primary-light': '#04A4CC',
|
||||
},
|
||||
},
|
||||
opacity: {
|
||||
'55': 0.5,
|
||||
'85': 0.85,
|
||||
},
|
||||
backgroundImage: {
|
||||
'badge-gradient': 'linear-gradient(120deg, rgba(150,1,103,1) 0%, rgba(158,3,106,1) 40%, rgba(250,26,140,1) 100%)',
|
||||
'brand-gradient': 'linear-gradient(to top right, #009fff, #165883, #18527b)',
|
||||
|
||||
Reference in New Issue
Block a user