Merge branch 'develop' into feature/typo3-10
This commit is contained in:
@@ -93,9 +93,6 @@ return [
|
||||
'eval' => 'datetime',
|
||||
'checkbox' => 0,
|
||||
'default' => 0,
|
||||
'range' => [
|
||||
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
|
||||
],
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
@@ -111,9 +108,6 @@ return [
|
||||
'eval' => 'datetime',
|
||||
'checkbox' => 0,
|
||||
'default' => 0,
|
||||
'range' => [
|
||||
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
|
||||
],
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
|
||||
@@ -95,9 +95,6 @@ return [
|
||||
'eval' => 'datetime',
|
||||
'checkbox' => 0,
|
||||
'default' => 0,
|
||||
'range' => [
|
||||
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
|
||||
],
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
@@ -113,9 +110,6 @@ return [
|
||||
'eval' => 'datetime',
|
||||
'checkbox' => 0,
|
||||
'default' => 0,
|
||||
'range' => [
|
||||
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
|
||||
],
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
|
||||
@@ -97,9 +97,6 @@ return [
|
||||
'eval' => 'datetime',
|
||||
'checkbox' => 0,
|
||||
'default' => 0,
|
||||
'range' => [
|
||||
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
|
||||
],
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
@@ -115,9 +112,6 @@ return [
|
||||
'eval' => 'datetime',
|
||||
'checkbox' => 0,
|
||||
'default' => 0,
|
||||
'range' => [
|
||||
'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
|
||||
],
|
||||
'behaviour' => [
|
||||
'allowLanguageSynchronization' => true,
|
||||
],
|
||||
|
||||
+350
-267
@@ -6,7 +6,23 @@
|
||||
</div>
|
||||
<div class="form-group" v-show="!submitted">
|
||||
<label>Personenzahl</label>
|
||||
<input type="number" class="form-control" v-model="selectedPax" @change="onPaxUpdated()"/>
|
||||
<input type="number" class="form-control" v-model.number="selectedPax" @change="onPaxUpdated()"
|
||||
v-show="nightsCount > 0 && !includesBonusCard"/>
|
||||
<div class="flex space-x-4" v-show="nightsCount > 0 && includesBonusCard">
|
||||
<div class="w-1/3 flex flex-col space-y-1">
|
||||
<span>ab 15 Jahre</span>
|
||||
<input type="number" class="form-control" v-model.number="selectedPaxGroup3" @change="onPaxUpdated()"/>
|
||||
</div>
|
||||
<div class="w-1/3 flex flex-col space-y-1">
|
||||
<span>7-14 Jahre</span>
|
||||
<input type="number" class="form-control" v-model.number="selectedPaxGroup2" @change="onPaxUpdated()"/>
|
||||
</div>
|
||||
<div class="w-1/3 flex flex-col space-y-1">
|
||||
<span>4-6 Jahre</span>
|
||||
<input type="number" class="form-control" v-model.number="selectedPaxGroup1" @change="onPaxUpdated()"/>
|
||||
</div>
|
||||
</div>
|
||||
<p class="text-sm italic" v-show="nightsCount === 0">Bitte wählen Sie einen Zeitraum</p>
|
||||
</div>
|
||||
<div class="form-group" v-show="options.length > 0 && !submitted">
|
||||
<label>Optionale Zusatzleistungen</label>
|
||||
@@ -20,11 +36,13 @@
|
||||
</div>
|
||||
<div class="form-group" v-show="boards.length > 0 && !submitted">
|
||||
<label>Optionale Verpflegungsleistungen</label>
|
||||
<select class="form-control" v-model="selectedBoard" v-if="selectedPax >= 30">
|
||||
<select class="form-control" v-model="selectedBoard" v-if="totalPax >= 30">
|
||||
<option :value="null">Keine Auswahl</option>
|
||||
<option v-for="board of boards" :value="board" :key="board.uid">{{ board.title }} ({{ formatCurrency(board.price) }} pro Person und Nacht)</option>
|
||||
<option v-for="board of boards" :value="board" :key="board.uid">{{ board.title }}
|
||||
({{ formatCurrency(board.price) }} pro Person und Nacht)
|
||||
</option>
|
||||
</select>
|
||||
<div v-show="selectedPax < 30">
|
||||
<div v-show="totalPax < 30">
|
||||
<span class="label label-warning">Erst ab 30 Personen buchbar.</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -33,38 +51,47 @@
|
||||
<div class="panel-body">
|
||||
<table class="table table-striped" v-show="nightsCount > 0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Zeitraum</th>
|
||||
<td>{{ rangeFormatted }}, {{ nightsCount }} Nächte</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Basispreis</th>
|
||||
<td>{{ formatCurrency(pricePax.base) }}</td>
|
||||
</tr>
|
||||
<tr v-if="pricePax.additional > 0">
|
||||
<th>Aufpreis Personenzahl</th>
|
||||
<td>{{ formatCurrency(pricePax.additional) }}</td>
|
||||
</tr>
|
||||
<tr v-if="priceShortTerm > 0">
|
||||
<th>Aufpreis Kurzzeit</th>
|
||||
<td>{{ formatCurrency(priceShortTerm) }}</td>
|
||||
</tr>
|
||||
<tr v-if="selectedOptions.length > 0">
|
||||
<th>Zusatzleistungen</th>
|
||||
<td>{{ formatCurrency(priceOptions) }}</td>
|
||||
</tr>
|
||||
<tr v-if="priceBoard > 0">
|
||||
<th>Verpflegung</th>
|
||||
<td>{{ formatCurrency(priceBoard) }}</td>
|
||||
</tr>
|
||||
<tr v-if="priceRunningCosts > 0">
|
||||
<th>Strom- und Abfallgebühren</th>
|
||||
<td>{{ formatCurrency(priceRunningCosts) }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Gesamtpreis</th>
|
||||
<td><strong>{{ formatCurrency(priceTotal) }}</strong><br><small>zzgl. vor Ort zu entrichtender Ortstaxe</small></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Zeitraum</th>
|
||||
<td>{{ rangeFormatted }}, {{ nightsCount }} Nächte</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Basispreis</th>
|
||||
<td>{{ formatCurrency(pricePax.base) }}</td>
|
||||
</tr>
|
||||
<tr v-if="pricePax.additional > 0">
|
||||
<th>Aufpreis Personenzahl</th>
|
||||
<td>{{ formatCurrency(pricePax.additional) }}</td>
|
||||
</tr>
|
||||
<tr v-if="priceShortTerm > 0">
|
||||
<th>Aufpreis Kurzzeit</th>
|
||||
<td>{{ formatCurrency(priceShortTerm) }}</td>
|
||||
</tr>
|
||||
<tr v-if="includesBonusCard">
|
||||
<th>Inklusivleistungen</th>
|
||||
<td>
|
||||
<a href="https://www.saalbach.com/de/sommer/joker-card" target="_blank" class="uppercase">
|
||||
Joker Card
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="selectedOptions.length > 0">
|
||||
<th>Zusatzleistungen</th>
|
||||
<td>{{ formatCurrency(priceOptions) }}</td>
|
||||
</tr>
|
||||
<tr v-if="priceBoard > 0">
|
||||
<th>Verpflegung</th>
|
||||
<td>{{ formatCurrency(priceBoard) }}</td>
|
||||
</tr>
|
||||
<tr v-if="priceRunningCosts > 0">
|
||||
<th>Strom- und Abfallgebühren</th>
|
||||
<td>{{ formatCurrency(priceRunningCosts) }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Gesamtpreis</th>
|
||||
<td><strong>{{ formatCurrency(priceTotal) }}</strong><br><small>zzgl. vor Ort zu entrichtender
|
||||
Ortstaxe</small></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div v-show="nightsCount === 0">
|
||||
@@ -114,260 +141,316 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import $ from 'jquery';
|
||||
import dayjs from 'dayjs'
|
||||
import 'dayjs/locale/de'
|
||||
import 'flatpickr';
|
||||
import { German } from 'flatpickr/dist/l10n/de';
|
||||
import Vue from 'vue';
|
||||
import axios from 'axios';
|
||||
import $ from 'jquery';
|
||||
import dayjs from 'dayjs'
|
||||
import 'dayjs/locale/de'
|
||||
import 'flatpickr';
|
||||
import {German} from 'flatpickr/dist/l10n/de';
|
||||
import Vue from 'vue';
|
||||
import axios from 'axios';
|
||||
|
||||
export default {
|
||||
props: {
|
||||
loaderUri: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
endpoint: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
configs: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
boards: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
options: {
|
||||
type: Array,
|
||||
required: true
|
||||
export default {
|
||||
props: {
|
||||
loaderUri: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
endpoint: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
configs: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
boards: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
options: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
runningCostsFactor: {
|
||||
type: Number,
|
||||
default: 1.7,
|
||||
},
|
||||
shortTermFactors: {
|
||||
type: Object,
|
||||
default() {
|
||||
return {
|
||||
2: 0.2,
|
||||
3: 0.1,
|
||||
}
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
processing: false,
|
||||
submitted: false,
|
||||
picker: null,
|
||||
formErrors: {},
|
||||
selectedFrom: null,
|
||||
selectedTo: null,
|
||||
selectedRange: [],
|
||||
selectedPax: 30,
|
||||
selectedOptions: [],
|
||||
selectedBoard: null,
|
||||
name: null,
|
||||
email: null,
|
||||
phone: null,
|
||||
remarks: null
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
processing: false,
|
||||
submitted: false,
|
||||
picker: null,
|
||||
formErrors: {},
|
||||
selectedFrom: null,
|
||||
selectedTo: null,
|
||||
selectedRange: [],
|
||||
selectedPax: 30,
|
||||
selectedPaxGroup1: 0,
|
||||
selectedPaxGroup2: 0,
|
||||
selectedPaxGroup3: 30,
|
||||
selectedOptions: [],
|
||||
selectedBoard: null,
|
||||
name: null,
|
||||
email: null,
|
||||
phone: null,
|
||||
remarks: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
formatCurrency(value) {
|
||||
if (0 === value) {
|
||||
return '-';
|
||||
}
|
||||
return parseFloat(value).toFixed(2).replace(/\./, ',') + ' €';
|
||||
},
|
||||
methods: {
|
||||
formatCurrency (value) {
|
||||
if (0 === value) {
|
||||
return '-';
|
||||
}
|
||||
return parseFloat(value).toFixed(2).replace(/\./, ',') + ' €';
|
||||
},
|
||||
formatOptionPriceType (option) {
|
||||
if (2 === option.type) {
|
||||
return ' ('+this.formatCurrency(option.price)+' pro Person)';
|
||||
}
|
||||
if (3 === option.type) {
|
||||
return ' ('+this.formatCurrency(option.price)+' pro Nacht)';
|
||||
}
|
||||
if (4 === option.type) {
|
||||
return ' ('+this.formatCurrency(option.price)+' pro Person und Nacht)';
|
||||
}
|
||||
formatOptionPriceType(option) {
|
||||
if (2 === option.type) {
|
||||
return ' (' + this.formatCurrency(option.price) + ' pro Person)';
|
||||
}
|
||||
if (3 === option.type) {
|
||||
return ' (' + this.formatCurrency(option.price) + ' pro Nacht)';
|
||||
}
|
||||
if (4 === option.type) {
|
||||
return ' (' + this.formatCurrency(option.price) + ' pro Person und Nacht)';
|
||||
}
|
||||
|
||||
return ' ('+this.formatCurrency(option.price)+')';
|
||||
},
|
||||
initSelectableRanges () {
|
||||
let enabledDates = [];
|
||||
for (let config of this.configs) {
|
||||
const dateFrom = dayjs(config.dateFrom);
|
||||
const dateTo = dayjs(config.dateTo);
|
||||
enabledDates.push({
|
||||
from: dateFrom.format('DD.MM.YYYY'),
|
||||
to: dateTo.format('DD.MM.YYYY')
|
||||
});
|
||||
}
|
||||
this.picker.set('enable', enabledDates);
|
||||
if (enabledDates.length > 0) {
|
||||
const firstDate = enabledDates[0].from;
|
||||
this.picker.set('minDate', firstDate);
|
||||
}
|
||||
},
|
||||
updateSelectedRange () {
|
||||
let range = [];
|
||||
let currentDate = this.selectedFrom;
|
||||
while (currentDate < this.selectedTo) {
|
||||
range.push(currentDate);
|
||||
currentDate = currentDate.add(1, 'day');
|
||||
}
|
||||
this.selectedRange = range;
|
||||
},
|
||||
onPaxUpdated () {
|
||||
if (this.selectedPax < 30) {
|
||||
this.selectedBoard = null;
|
||||
}
|
||||
},
|
||||
submitForm () {
|
||||
let options = [];
|
||||
for (let option of this.selectedOptions) {
|
||||
options.push(option.uid);
|
||||
}
|
||||
let formData = {
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][name]': this.name,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][email]': this.email,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][phone]': this.phone,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][remarks]': this.remarks,
|
||||
'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][board]': this.selectedBoard ? this.selectedBoard.uid : null,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][options]': options,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][summary]': this.priceSummary
|
||||
};
|
||||
this.processing = true;
|
||||
this.submitted = false;
|
||||
axios({
|
||||
url: this.endpoint,
|
||||
method: 'POST',
|
||||
data: $.param(formData)
|
||||
}).then(response => {
|
||||
if ('validation' === response.data.status) {
|
||||
this.formErrors = response.data.errors;
|
||||
} else {
|
||||
this.submitted = true;
|
||||
}
|
||||
}).catch(error => {
|
||||
}).finally(() => {
|
||||
this.processing = false;
|
||||
return ' (' + this.formatCurrency(option.price) + ')';
|
||||
},
|
||||
initSelectableRanges() {
|
||||
let enabledDates = [];
|
||||
for (let config of this.configs) {
|
||||
const dateFrom = dayjs(config.dateFrom);
|
||||
const dateTo = dayjs(config.dateTo);
|
||||
enabledDates.push({
|
||||
from: dateFrom.format('DD.MM.YYYY'),
|
||||
to: dateTo.format('DD.MM.YYYY')
|
||||
});
|
||||
}
|
||||
this.picker.set('enable', enabledDates);
|
||||
if (enabledDates.length > 0) {
|
||||
const firstDate = enabledDates[0].from;
|
||||
this.picker.set('minDate', firstDate);
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
nightsCount () {
|
||||
return this.selectedRange.length;
|
||||
},
|
||||
rangeFormatted () {
|
||||
if (null === this.selectedFrom || null === this.selectedTo) {
|
||||
return '-';
|
||||
updateSelectedRange() {
|
||||
let range = [];
|
||||
let currentDate = this.selectedFrom;
|
||||
while (currentDate < this.selectedTo) {
|
||||
range.push(currentDate);
|
||||
currentDate = currentDate.add(1, 'day');
|
||||
}
|
||||
this.selectedRange = range;
|
||||
},
|
||||
onPaxUpdated() {
|
||||
if (this.totalPax < 30) {
|
||||
this.selectedBoard = null;
|
||||
}
|
||||
},
|
||||
submitForm() {
|
||||
let options = [];
|
||||
for (let option of this.selectedOptions) {
|
||||
options.push(option.uid);
|
||||
}
|
||||
let formData = {
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][name]': this.name,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][email]': this.email,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][phone]': this.phone,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][remarks]': this.remarks,
|
||||
'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.includesBonusCard ? '' : this.selectedPax,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][paxGroup1]': this.includesBonusCard ? this.selectedPaxGroup1 : '',
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][paxGroup2]': this.includesBonusCard ? this.selectedPaxGroup2 : '',
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][paxGroup3]': this.includesBonusCard ? this.selectedPaxGroup3 : '',
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][board]': this.selectedBoard ? this.selectedBoard.uid : null,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][options]': options,
|
||||
'tx_epproducts_ajax[groupsPriceInquiry][summary]': this.priceSummary
|
||||
};
|
||||
this.processing = true;
|
||||
this.submitted = false;
|
||||
axios({
|
||||
url: this.endpoint,
|
||||
method: 'POST',
|
||||
data: $.param(formData)
|
||||
}).then(response => {
|
||||
if ('validation' === response.data.status) {
|
||||
this.formErrors = response.data.errors;
|
||||
} else {
|
||||
this.submitted = true;
|
||||
}
|
||||
}).catch(error => {
|
||||
}).finally(() => {
|
||||
this.processing = false;
|
||||
});
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
nightsCount() {
|
||||
return this.selectedRange.length;
|
||||
},
|
||||
rangeFormatted() {
|
||||
if (null === this.selectedFrom || null === this.selectedTo) {
|
||||
return '-';
|
||||
}
|
||||
|
||||
return this.selectedFrom.format('DD.MM.YYYY') + ' - ' + this.selectedTo.format('DD.MM.YYYY');
|
||||
},
|
||||
pricePax () {
|
||||
let base = 0;
|
||||
let additional = 0;
|
||||
for (let date of this.selectedRange) {
|
||||
for (let config of this.configs) {
|
||||
if (date >= dayjs(config.dateFrom) && date < dayjs(config.dateTo)) {
|
||||
base += config.price;
|
||||
if (this.selectedPax > config.personsIncluded) {
|
||||
return this.selectedFrom.format('DD.MM.YYYY') + ' - ' + this.selectedTo.format('DD.MM.YYYY');
|
||||
},
|
||||
includesBonusCard() {
|
||||
let included = false
|
||||
for (let date of this.selectedRange) {
|
||||
for (let config of this.configs) {
|
||||
if (date >= dayjs(config.dateFrom) && date < dayjs(config.dateTo)) {
|
||||
if (config.bonusCardIncluded) {
|
||||
included = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return included
|
||||
},
|
||||
pricePax() {
|
||||
let base = 0
|
||||
let additional = 0
|
||||
for (let date of this.selectedRange) {
|
||||
for (let config of this.configs) {
|
||||
if (date >= dayjs(config.dateFrom) && date < dayjs(config.dateTo)) {
|
||||
base += config.price
|
||||
if (this.totalPax > config.personsIncluded) {
|
||||
if (false === config.bonusCardIncluded) {
|
||||
additional += (this.selectedPax - config.personsIncluded) * config.priceAdditionalPerson;
|
||||
} else {
|
||||
// Distribute additional persons costs by group
|
||||
let included = config.personsIncluded
|
||||
if (this.selectedPaxGroup3 <= included) {
|
||||
included -= this.selectedPaxGroup3
|
||||
} else {
|
||||
additional += (this.selectedPaxGroup3 - included) * config.priceAdditionalPersonByGroup[3]
|
||||
included = 0
|
||||
}
|
||||
if (this.selectedPaxGroup2 <= included) {
|
||||
included -= this.selectedPaxGroup2
|
||||
} else {
|
||||
additional += (this.selectedPaxGroup2 - included) * config.priceAdditionalPersonByGroup[2]
|
||||
included = 0
|
||||
}
|
||||
if (this.selectedPaxGroup1 > included) {
|
||||
additional += (this.selectedPaxGroup1 - included) * config.priceAdditionalPersonByGroup[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return { base, additional };
|
||||
},
|
||||
priceOptions () {
|
||||
let price = 0;
|
||||
for (let option of this.selectedOptions) {
|
||||
if (true === option.ignoreWithBoard && this.selectedBoard) {
|
||||
continue;
|
||||
}
|
||||
if (1 === option.type) {
|
||||
price += option.price;
|
||||
} else if (2 === option.type) {
|
||||
price += option.price * this.selectedPax;
|
||||
} else if (3 === option.type) {
|
||||
price += option.price * this.nightsCount;
|
||||
} else if (4 === option.type) {
|
||||
price += option.price * this.nightsCount * this.selectedPax;
|
||||
}
|
||||
}
|
||||
return {base, additional};
|
||||
},
|
||||
totalPax() {
|
||||
return this.includesBonusCard ? this.selectedPaxGroup1 + this.selectedPaxGroup2 + this.selectedPaxGroup3 : this.selectedPax
|
||||
},
|
||||
priceOptions() {
|
||||
let price = 0;
|
||||
for (let option of this.selectedOptions) {
|
||||
if (true === option.ignoreWithBoard && this.selectedBoard) {
|
||||
continue;
|
||||
}
|
||||
return price;
|
||||
},
|
||||
priceBoard () {
|
||||
let price = 0;
|
||||
if (this.selectedBoard) {
|
||||
price = this.selectedBoard.price * this.nightsCount * this.selectedPax;
|
||||
}
|
||||
return price;
|
||||
},
|
||||
priceShortTerm () {
|
||||
let price = 0;
|
||||
const totalPricePax = this.pricePax.base + this.pricePax.additional;
|
||||
if (2 === this.nightsCount) {
|
||||
price = totalPricePax * 0.2;
|
||||
}
|
||||
if (3 === this.nightsCount) {
|
||||
price = totalPricePax * 0.1;
|
||||
}
|
||||
return price;
|
||||
},
|
||||
priceRunningCosts () {
|
||||
if (this.selectedBoard) {
|
||||
return 0;
|
||||
}
|
||||
return this.nightsCount * this.selectedPax * 1.7;
|
||||
},
|
||||
priceTotal () {
|
||||
return this.pricePax.base + this.pricePax.additional + this.priceOptions
|
||||
+ this.priceBoard + this.priceShortTerm + this.priceRunningCosts;
|
||||
},
|
||||
priceSummary () {
|
||||
return {
|
||||
paxBase: this.formatCurrency(this.pricePax.base),
|
||||
paxAdditional: this.formatCurrency(this.pricePax.additional),
|
||||
shortTerm: this.formatCurrency(this.priceShortTerm),
|
||||
options: this.formatCurrency(this.priceOptions),
|
||||
board: this.formatCurrency(this.priceBoard),
|
||||
runningCosts: this.formatCurrency(this.priceRunningCosts),
|
||||
total: this.formatCurrency(this.priceTotal)
|
||||
if (1 === option.type) {
|
||||
price += option.price;
|
||||
} else if (2 === option.type) {
|
||||
price += option.price * this.totalPax;
|
||||
} else if (3 === option.type) {
|
||||
price += option.price * this.nightsCount;
|
||||
} else if (4 === option.type) {
|
||||
price += option.price * this.nightsCount * this.totalPax;
|
||||
}
|
||||
}
|
||||
return price;
|
||||
},
|
||||
mounted () {
|
||||
Vue.nextTick(() => {
|
||||
this.picker = $(this.$refs.picker).flatpickr({
|
||||
mode: 'range',
|
||||
dateFormat: 'd.m.Y',
|
||||
locale: German,
|
||||
onChange: selectedDates => {
|
||||
if (2 === selectedDates.length) {
|
||||
this.selectedFrom = dayjs(selectedDates[0]);
|
||||
this.selectedTo = dayjs(selectedDates[1]);
|
||||
this.updateSelectedRange();
|
||||
}
|
||||
}
|
||||
});
|
||||
this.initSelectableRanges();
|
||||
});
|
||||
priceBoard() {
|
||||
let price = 0;
|
||||
if (this.selectedBoard) {
|
||||
price = this.selectedBoard.price * this.nightsCount * this.totalPax;
|
||||
}
|
||||
return price;
|
||||
},
|
||||
priceShortTerm() {
|
||||
let price = 0;
|
||||
const totalPricePax = (this.pricePax.base + this.pricePax.additional);
|
||||
for (let [nights, factor] of Object.entries(this.shortTermFactors)) {
|
||||
if (nights === this.nightsCount) {
|
||||
price = totalPricePax * factor;
|
||||
}
|
||||
}
|
||||
return price;
|
||||
},
|
||||
priceRunningCosts() {
|
||||
if (this.selectedBoard) {
|
||||
return 0;
|
||||
}
|
||||
return this.nightsCount * this.totalPax * this.runningCostsFactor;
|
||||
},
|
||||
priceTotal() {
|
||||
return this.pricePax.base + this.pricePax.additional + this.priceOptions
|
||||
+ this.priceBoard + this.priceShortTerm + this.priceRunningCosts;
|
||||
},
|
||||
priceSummary() {
|
||||
return {
|
||||
paxBase: this.formatCurrency(this.pricePax.base),
|
||||
paxAdditional: this.formatCurrency(this.pricePax.additional),
|
||||
shortTerm: this.formatCurrency(this.priceShortTerm),
|
||||
options: this.formatCurrency(this.priceOptions),
|
||||
board: this.formatCurrency(this.priceBoard),
|
||||
runningCosts: this.formatCurrency(this.priceRunningCosts),
|
||||
total: this.formatCurrency(this.priceTotal)
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
Vue.nextTick(() => {
|
||||
this.picker = $(this.$refs.picker).flatpickr({
|
||||
mode: 'range',
|
||||
dateFormat: 'd.m.Y',
|
||||
locale: German,
|
||||
onChange: selectedDates => {
|
||||
if (2 === selectedDates.length) {
|
||||
this.selectedFrom = dayjs(selectedDates[0]);
|
||||
this.selectedTo = dayjs(selectedDates[1]);
|
||||
this.updateSelectedRange();
|
||||
}
|
||||
}
|
||||
});
|
||||
this.initSelectableRanges();
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.form-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
.form-control[readonly] {
|
||||
background-color: white;
|
||||
}
|
||||
.form-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: rgba(white, 0.85);
|
||||
}
|
||||
.form-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.form-control[readonly] {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.form-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: rgba(white, 0.85);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -101,6 +101,16 @@
|
||||
<th>Beförderung</th>
|
||||
<td>{{ getSelectedServicesLabels(participant.transportationIds, services.transportation) }}</td>
|
||||
</tr>
|
||||
<tr v-if="participant.surcharges.length > 0">
|
||||
<th>Zuschläge</th>
|
||||
<td>
|
||||
<ul class="list-none p-0 mb-0">
|
||||
<li v-for="surcharge in participant.surcharges">
|
||||
{{ surcharge.priceSingle.toFixed(2) }} € <span v-show="surcharge.name">({{ surcharge.name }})</span>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Gesamtpreis</th>
|
||||
<td>{{ calculateSinglePrice(participant).toFixed(2) }} €</td>
|
||||
@@ -307,6 +317,9 @@
|
||||
if ('S' === participant.data.status && participant.data.cancellationFee) {
|
||||
singlePrice += participant.data.cancellationFee;
|
||||
}
|
||||
for (let surcharge of participant.surcharges) {
|
||||
singlePrice += surcharge.priceSingle
|
||||
}
|
||||
return singlePrice;
|
||||
},
|
||||
onAccommodationSelected (accommodation, index) {
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="relative" v-if="mutable">
|
||||
<div class="relative" v-if="mutable && selectableAccommodations.length > 0">
|
||||
<button class="btn btn-primary btn-sm w-full lg:w-auto" type="button" @click.prevent="visible = !visible">
|
||||
Zimmer <span class="glyphicon" :class="{ 'glyphicon-chevron-up': visible, 'glyphicon-chevron-down': !visible }"></span>
|
||||
</button>
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@
|
||||
},
|
||||
props: {
|
||||
contingents: {
|
||||
type: Object,
|
||||
type: Array,
|
||||
required: true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,3 +5,7 @@
|
||||
max-width: 165px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.headline {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
<trans-unit id="tx_eptheme.label.teaserbutton.product_no_booking">
|
||||
<target>Details</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tx_eptheme.label.to_inquiry_form">
|
||||
<target>Direkt zum Anfrageformular</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="tx_eptheme_domain_model_lineup">
|
||||
<target>Lineup</target>
|
||||
</trans-unit>
|
||||
|
||||
@@ -43,6 +43,9 @@
|
||||
<trans-unit id="tx_eptheme.label.teaserbutton.product_no_booking">
|
||||
<source>Details</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="tx_eptheme.label.to_inquiry_form">
|
||||
<source>Inquiry Form</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="tx_eptheme_domain_model_lineup">
|
||||
<source>Lineup</source>
|
||||
</trans-unit>
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
<f:if condition="{facts -> f:count()} > 0">
|
||||
<div class="ep-sidebar ep-facts">
|
||||
<p><strong>Facts</strong></p>
|
||||
<f:if condition="{title}">
|
||||
<f:then>
|
||||
<h2 class="headline headline--4">Skiurlaub {title} Facts</h2>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<p><strong>Facts</strong></p>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<div>
|
||||
<ul class="ep-facts">
|
||||
<f:for each="{facts}" as="fact">
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:formvh="http://typo3.org/ns/TYPO3/CMS/Form/ViewHelpers" data-namespace-typo3-fluid="true">
|
||||
<formvh:renderRenderable renderable="{element}">
|
||||
<f:render partial="Field/Field" arguments="{element: element, doNotShowLabel: 1}" contentAs="elementContent">
|
||||
<span class="block text-gray-700 mb-1">{formvh:translateElementProperty(element: element, property: 'label')}<f:if condition="{element.required}"><f:render partial="Field/Required" /></f:if></span>
|
||||
<f:for each="{element.properties.options}" as="label" key="value" iteration="idIterator">
|
||||
<div>
|
||||
<label for="{element.uniqueIdentifier}-{idIterator.index}" class="inline-flex items-center">
|
||||
|
||||
@@ -17,35 +17,46 @@
|
||||
<div class="region-details region-details--ski-area" data-rte-content>
|
||||
{region.skiArea -> f:format.html()}
|
||||
<f:if condition="{teasers}">
|
||||
<a id="teasers" class="anchor"></a>
|
||||
<div class="slider slider--teasers in-column">
|
||||
<div class="row slider__items">
|
||||
<f:for each="{teasers}" as="teaser">
|
||||
<div class="col-md-4">
|
||||
<f:render partial="Product/Teaser" section="Teaser" arguments="{teaser: teaser}"/>
|
||||
</div>
|
||||
</f:for>
|
||||
<f:then>
|
||||
<a id="teasers" class="anchor"></a>
|
||||
<div class="slider slider--teasers in-column">
|
||||
<div class="row slider__items">
|
||||
<f:for each="{teasers}" as="teaser">
|
||||
<div class="col-md-4">
|
||||
<f:render partial="Product/Teaser" section="Teaser" arguments="{teaser: teaser}"/>
|
||||
</div>
|
||||
</f:for>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<f:if condition="{settings.showMoreLink}">
|
||||
<p class="text-right">
|
||||
<f:link.action pageUid="{settings.defaultStaticSearchPageUid}" class="button"
|
||||
action="staticresult" controller="Search"
|
||||
arguments="{encodedFilterSettings: '{filterSettings -> ep:filterSettingsEncoder()}'}"
|
||||
additionalAttributes="{rel: 'nofollow'}">
|
||||
Alle anzeigen
|
||||
</f:link.action>
|
||||
</p>
|
||||
</f:if>
|
||||
<f:if condition="{settings.showMoreLink}">
|
||||
<p class="text-right">
|
||||
<f:link.action pageUid="{settings.defaultStaticSearchPageUid}" class="button"
|
||||
action="staticresult" controller="Search"
|
||||
arguments="{encodedFilterSettings: '{filterSettings -> ep:filterSettingsEncoder()}'}"
|
||||
additionalAttributes="{rel: 'nofollow'}">
|
||||
Alle anzeigen
|
||||
</f:link.action>
|
||||
</p>
|
||||
</f:if>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:comment><!-- Show image gallery at teasers' position in case there are none --></f:comment>
|
||||
<f:if condition="{region.images -> f:count()} > 0">
|
||||
<f:render partial="ContentSlider" arguments="{images: region.images, id: 'region-{region.uid}', thumbnails: 1}"/>
|
||||
</f:if>
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:if condition="{region.skiAreaExtended}">{region.skiAreaExtended -> f:format.html()}</f:if>
|
||||
</div>
|
||||
<f:if condition="{region.images -> f:count()} > 0">
|
||||
<f:render partial="ContentSlider" arguments="{images: region.images, id: 'region-{region.uid}', thumbnails: 1}"/>
|
||||
<f:if condition="{teasers}">
|
||||
<f:comment><!-- Show image gallery unless there are no teasers --></f:comment>
|
||||
<f:if condition="{region.images -> f:count()} > 0">
|
||||
<f:render partial="ContentSlider" arguments="{images: region.images, id: 'region-{region.uid}', thumbnails: 1}"/>
|
||||
</f:if>
|
||||
</f:if>
|
||||
<f:if condition="{bars}">
|
||||
<f:then><div class="ep-headbar">{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')}</div></f:then>
|
||||
<f:else><h2>{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')}</h2></f:else>
|
||||
<f:then><div class="ep-headbar">{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')} {region.name}</div></f:then>
|
||||
<f:else><h3>{f:if(condition: '{region.season} == "w"', then: 'Skipass', else: 'Highlights')} {region.name}</h3></f:else>
|
||||
</f:if>
|
||||
<f:if condition="{region.skiPass}">
|
||||
<div class="region-details region-details--skipass" data-rte-content>
|
||||
@@ -60,7 +71,7 @@
|
||||
<f:if condition="{region.news}">
|
||||
<f:if condition="{bars}">
|
||||
<f:then><div class="ep-headbar">Aktuell</div></f:then>
|
||||
<f:else><h2>Aktuell</h2></f:else>
|
||||
<f:else><h3>Aktuelles {region.name}</h3></f:else>
|
||||
</f:if>
|
||||
<div class="region-details region-details--news" data-rte-content>
|
||||
{region.news -> f:format.html()}
|
||||
|
||||
@@ -1,40 +1,30 @@
|
||||
<html data-namespace-typo3-fluid="true" lang="en"
|
||||
xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers"
|
||||
xmlns:ep="http://typo3.org/ns/EP/EpTheme/ViewHelpers"
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:section name="Teaser">
|
||||
<f:if condition="{data.header_link}">
|
||||
<v:condition.string.isNumeric value="{data.header_link}">
|
||||
<f:then>
|
||||
<f:link.typolink parameter="{data.header_link}" title="{data.header}" class="teaserbox teaserbox--default">
|
||||
<f:render section="Content" arguments="{_all}"/>
|
||||
</f:link.typolink>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<a href="{data.header_link}" target="_blank" title="{data.header}" class="teaserbox teaserbox--default">
|
||||
<f:render section="Content" arguments="{_all}"/>
|
||||
</a>
|
||||
</f:else>
|
||||
</v:condition.string.isNumeric>
|
||||
</f:if>
|
||||
</f:section>
|
||||
|
||||
<f:section name="Content">
|
||||
<div class="teaserbox__image">
|
||||
<f:if condition="{context.country}">
|
||||
<f:image class="teaserbox__flag"
|
||||
src="{ep:flagiconSource(country: context.country)}" alt="{context.country.name}"/>
|
||||
</f:if>
|
||||
<f:render partial="TeaserImage" arguments="{image: teaserImage}"/>
|
||||
</div>
|
||||
<div class="teaserbox__main" data-rte-content>
|
||||
<span class="headline headline--3 headline--teaser">{data.header -> f:format.nl2br()}{f:if(condition: data.subheader, then: '<br>{data.subheader}')}</span>
|
||||
<hr>
|
||||
{data.bodytext -> f:format.html()}
|
||||
</div>
|
||||
<button class="button button--full">{data.button -> v:or(alternative: 'Details')}</button>
|
||||
<f:link.typolink parameter="{data.header_link}"
|
||||
class="teaserbox teaserbox--default">
|
||||
<div class="teaserbox__image">
|
||||
<f:if condition="{context.country}">
|
||||
<f:image class="teaserbox__flag"
|
||||
src="{ep:flagiconSource(country: context.country)}"
|
||||
alt="{context.country.name}"/>
|
||||
</f:if>
|
||||
<f:render partial="TeaserImage" arguments="{image: teaserImage}"/>
|
||||
</div>
|
||||
<div class="teaserbox__main" data-rte-content>
|
||||
<span class="headline headline--3 headline--teaser">
|
||||
{data.header -> f:format.nl2br()}{f:if(condition: data.subheader, then: '<br>{data.subheader}')}
|
||||
</span>
|
||||
<hr>
|
||||
{data.bodytext -> f:format.html()}
|
||||
</div>
|
||||
<button class="button w-full">
|
||||
{data.button -> v:or(alternative: 'Details')}
|
||||
</button>
|
||||
</f:link.typolink>
|
||||
</f:section>
|
||||
|
||||
</html>
|
||||
|
||||
@@ -3,35 +3,23 @@
|
||||
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers"
|
||||
xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">
|
||||
|
||||
<f:layout name="Default"/>
|
||||
|
||||
<f:section name="Teaser">
|
||||
<f:if condition="{data.header_link}">
|
||||
<v:condition.string.isNumeric value="{data.header_link}">
|
||||
<f:then>
|
||||
<f:link.typolink parameter="{data.header_link}" title="{data.header}" class="teaserbox teaserbox--default">
|
||||
<f:render section="Content" arguments="{_all}"/>
|
||||
</f:link.typolink>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<a href="{data.header_link}" target="_blank" title="{data.header}" class="teaserbox teaserbox--default">
|
||||
<f:render section="Content" arguments="{_all}"/>
|
||||
</a>
|
||||
</f:else>
|
||||
</v:condition.string.isNumeric>
|
||||
</f:if>
|
||||
</f:section>
|
||||
|
||||
<f:section name="Content">
|
||||
<div class="teasebox__image">
|
||||
<f:render partial="TeaserImage" arguments="{image: teaserImage}"/>
|
||||
</div>
|
||||
<div class="teaserbox__main" data-rte-content>
|
||||
<span class="headline headline--3 headline--teaser">{data.header -> f:format.nl2br()}{f:if(condition: data.subheader, then: '<br>{data.subheader}')}</span>
|
||||
<hr>
|
||||
{data.bodytext -> f:format.html()}
|
||||
</div>
|
||||
<button class="button button--full">{data.button -> v:or(alternative: 'Details')}</button>
|
||||
<f:link.typolink parameter="{data.header_link}"
|
||||
class="teaserbox teaserbox--default">
|
||||
<div class="teasebox__image">
|
||||
<f:render partial="TeaserImage" arguments="{image: teaserImage}"/>
|
||||
</div>
|
||||
<div class="teaserbox__main" data-rte-content>
|
||||
<span class="headline headline--3 headline--teaser">
|
||||
{data.header -> f:format.nl2br()}{f:if(condition: data.subheader, then: '<br>{data.subheader}')}
|
||||
</span>
|
||||
<hr>
|
||||
{data.bodytext -> f:format.html()}
|
||||
</div>
|
||||
<button class="button button--full">
|
||||
{data.button -> v:or(alternative: 'Details')}
|
||||
</button>
|
||||
</f:link.typolink>
|
||||
</f:section>
|
||||
|
||||
</html>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<f:if condition="{v:content.get(column: 1) -> f:count()} > 0">
|
||||
<p class="hidden-xs hidden-md"><a @click.prevent="scrollTo('#teasers')" href="#teasers" class="button button--full">Direkt zu den Angeboten</a></p>
|
||||
</f:if>
|
||||
<f:render partial="Facts" arguments="{facts: city.facts}"/>
|
||||
<f:render partial="Facts" arguments="{facts: city.facts, title: city.name}"/>
|
||||
<f:if condition="{city.region.season} == 'w'">
|
||||
<f:render partial="Snowreport" arguments="{snowreport: city.region.snowreport}"/>
|
||||
<f:render partial="Regioninfo" arguments="{region: city.region}"/>
|
||||
|
||||
@@ -58,7 +58,9 @@
|
||||
<f:if condition="{v:content.get(column: 1) -> f:count()} > 0">
|
||||
<p class="hidden-xs hidden-md"><a @click.prevent="scrollTo('#teasers')" href="#teasers" class="button button--full">Direkt zu den Angeboten</a></p>
|
||||
</f:if>
|
||||
<f:render partial="Facts" arguments="{facts: country.facts}"/>
|
||||
<f:render partial="Facts" arguments="{facts: country.facts, title: country.name}"/>
|
||||
<f:render partial="Officetip" arguments="{officetip: country.officetip}"/>
|
||||
<f:render partial="Snowreport" arguments="{snowreport: country.snowreport}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -29,7 +29,19 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Anzahl der Personen</th>
|
||||
<td>{pax}</td>
|
||||
<td>{pax -> v:or(alternative: '-')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Anzahl der Personen (ab 15 Jahre)</th>
|
||||
<td>{paxGroup3 -> v:or(alternative: '-')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Anzahl der Personen (7-14 Jahre)</th>
|
||||
<td>{paxGroup2 -> v:or(alternative: '-')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Anzahl der Personen (4-6 Jahre)</th>
|
||||
<td>{paxGroup1 -> v:or(alternative: '-')}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Verpflegung</th>
|
||||
@@ -63,6 +75,7 @@
|
||||
<td>
|
||||
Grundpreis: {summary.paxBase}<br>
|
||||
Aufpreis Personen: {summary.paxAdditional -> v:or(alternative: '-')}<br>
|
||||
Aufpreis Kurzzeit: {summary.shortTerm -> v:or(alternative: '-')}<br>
|
||||
Zusatzleistungen: {summary.options}<br>
|
||||
Strom- und Abfallgebühren: {summary.runningCosts -> v:or(alternative: '-')}<br>
|
||||
<strong>Gesamtpreis: {summary.total}</strong>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<f:if condition="{v:content.get(column: 1) -> f:count()} > 0">
|
||||
<p class="hidden-xs hidden-md"><a @click.prevent="scrollTo('#teasers')" href="#teasers" class="button button--full">Direkt zu den Angeboten</a></p>
|
||||
</f:if>
|
||||
<f:render partial="Facts" arguments="{facts: hotel.facts}"/>
|
||||
<f:render partial="Facts" arguments="{facts: hotel.facts, title: hotel.name}"/>
|
||||
<f:if condition="{hotel.region.season} == 'w'">
|
||||
<f:render partial="Snowreport" arguments="{snowreport: hotel.region.snowreport}"/>
|
||||
<f:render partial="Regioninfo" arguments="{region: hotel.region}"/>
|
||||
|
||||
@@ -282,7 +282,7 @@
|
||||
<f:if condition="{hotel.groupsPriceConfigs}">
|
||||
<f:else>
|
||||
<f:link.typolink class="button button--full" parameter="{settings.groupsContactFormPageUid}" additionalParams="&ref={currentPageUid}">
|
||||
Direkt zum Anfrageformular
|
||||
<f:translate key="tx_eptheme.label.to_inquiry_form" extensionName="ep_theme"/>
|
||||
</f:link.typolink>
|
||||
</f:else>
|
||||
</f:if>
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</p>
|
||||
</f:if>
|
||||
<f:if condition="{region.season} == 'w'">
|
||||
<f:render partial="Facts" arguments="{facts: region.facts}"/>
|
||||
<f:render partial="Facts" arguments="{facts: region.facts, title: region.name}"/>
|
||||
<f:render partial="Snowreport" arguments="{snowreport: region.snowreport}"/>
|
||||
<f:render partial="Regioninfo" arguments="{region: region}"/>
|
||||
<f:render partial="Region/Webcam" arguments="{region: region}"/>
|
||||
|
||||
Reference in New Issue
Block a user