{% block content %}
{% if editmode %}
{{ include('includes/backend-kopf.html.twig') }}
{% set tabContentArray = {1: 'Data'} %}
{% set tab = 1 %}
<style>
section.tabContent {
display: block;
}
</style>
<div id="content">
<section class="tabContent">
<p class="hl">Email Betreff:</p>
<span class="parentbox">
{{ pimcore_textarea("subject", {
"nl2br": true,
"width": 735,
}) }}
</span>
</section>
<section class="tabContent">
<p class="hl">Titel:</p>
<span class="parentbox">
{{ pimcore_textarea("title", {
"nl2br": true,
"width": 735,
}) }}
</span>
</section>
<section class="tabContent">
<p class="hl">Beschreibung:</p>
<span class="parentbox">
{{ pimcore_textarea("description", {
"nl2br": true,
"width": 735,
}) }}
</span>
</section>
{# <section class="tabContent">
<p class="hl">Bild:</p>
<span class="parentbox">
{{ pimcore_image("image", {
"width": 200,
"height": 130,
"thumbnail": "img-default-edm"
}) }}
</span>
</section> #}
<section class="tabContent">
<p class="hl">Saisonsende:</p>
<span class="parentbox">
{{ pimcore_date("maxDate", {
"format": "d.m.Y",
"outputIsoFormat": "DD.MM.YYYY"
}) }}
</span>
</section>
<section class="tabContent">
<p class="hl">Erster Termin (Uhrzeit):</p>
<span class="parentbox">
{{ pimcore_textarea("minHours", {
"nl2br": true,
"width": 735,
"placeholder": "09:00"
}) }}
</span>
</section>
<section class="tabContent">
<p class="hl">Letzter Termin (Uhrzeit): </p>
<span class="parentbox">
{{ pimcore_textarea("maxHours", {
"nl2br": true,
"width": 735,
"placeholder": "18:00"
}) }}
</span>
</section>
<section class="tabContent">
<p class="hl">Zeitintervall:</p>
<span class="parentbox">
{{ pimcore_select("timeIntervals", {
"store": [
["15", "15min"],
["30", "30min"],
["60", "60min"]
],
}) }}
</span>
</section>
<section class="tabContent">
<p class="hl">Service wählen (Zwischen den Services muss ein ; stehen):</p>
<span class="parentbox">
{{ pimcore_textarea("services", {
"nl2br": true,
"width": 735,
"placeholder": "Skischuhfitting ; Shopping Beratung"
}) }}
</span>
</section>
<section class="tabContent">
<p class="hl">Filiale (Zwischen den Standorten muss ein ; stehen):</p>
<span class="parentbox">
{{ pimcore_textarea("locations", {
"nl2br": true,
"width": 735,
"placeholder": "Zentrum ; Giggijochbahn"
}) }}
</span>
</section>
</div>
{{ include('includes/backend-fuss.html.twig') }}
{% else %}
<style>
.ski-boot-fitting {
padding-bottom: 2rem;
padding-top: 2rem;
}
.ski-boot-fitting {
background-color: #164194;
}
[data-theme="shops"] .ski-boot-fitting {
background-color: #e3e3e0;
}
[data-theme="rent"] .ski-boot-fitting {
background-color: #164194;
}
[data-theme="homes"] .ski-boot-fitting {
background-color: #bc9f60;
}
.form-termin-heading,
.form-termin-description {
color: #fff;
}
[data-theme="shops"] .form-termin-heading,
[data-theme="shops"] .form-termin-description {
color: #e50000;
}
[data-theme="rent"] .form-termin-heading,
[data-theme="rent"] .form-termin-description {
color: #fff;
}
[data-theme="homes"] .form-termin-heading,
[data-theme="homes"] .form-termin-description {
color: #000;
}
.form-termin-heading {
margin: 0;
}
.form-termin-form-container {
display: flex;
flex-wrap: wrap;
column-gap: 10px;
justify-content: space-between;
gap: 10px;
}
.form-termin-input-container {
width: 100%;
}
.form-termin-input-container input,
.form-termin-input-container select,
.form-termin-input-container button {
width: 100%;
}
.form-termin-input-container input,
.form-termin-input-container select,
.form-termin-input-container button {
background-color: rgba(255, 255, 255, 0.1);
color: #ffffff;
border: none;
box-shadow: none;
padding: 0.375rem 0.75rem;
font-size: 1rem;
line-height: 1.5;
border-radius: 5px;
}
[data-theme="rent"] .form-termin-input-container input,
[data-theme="rent"] .form-termin-input-container select,
[data-theme="rent"] .form-termin-input-container button {
background-color: rgba(255, 255, 255, 0.1);
color: #ffffff;
}
.form-termin-input-container input,
.form-termin-input-container select {
color: #000;
background-color: #fff;
}
/* Change placeholder color for all browsers */
.form-termin-input-container input::placeholder {
color: #000; /* Replace with your desired color */
opacity: 1; /* Ensures the color is fully opaque */
}
/* For specific browsers */
.form-termin-input-container input::-webkit-input-placeholder {
color: #000; /* Chrome, Safari, and Opera */
}
.form-termin-input-container input:-ms-input-placeholder {
color: #000; /* Internet Explorer */
}
.form-termin-input-container input::-ms-input-placeholder {
color: #000; /* Microsoft Edge */
}
.form-termin-input-container button {
cursor: pointer;
}
[data-theme="shops"] .form-termin-input-container input,
[data-theme="shops"] .form-termin-input-container select {
color: #fff;
background-color: #e50000;
}
/* Change placeholder color for all browsers */
[data-theme="shops"] .form-termin-input-container input::placeholder {
color: #fff; /* Replace with your desired color */
opacity: 1; /* Ensures the color is fully opaque */
}
/* For specific browsers */
[data-theme="shops"] .form-termin-input-container input::-webkit-input-placeholder {
color: #fff; /* Chrome, Safari, and Opera */
}
[data-theme="shops"] .form-termin-input-container input:-ms-input-placeholder {
color: #fff; /* Internet Explorer */
}
[data-theme="shops"] .form-termin-input-container input::-ms-input-placeholder {
color: #fff; /* Microsoft Edge */
}
[data-theme="shops"] .form-termin-input-container button {
cursor: pointer;
}
/* Change placeholder color for all browsers */
[data-theme="rent"] .form-termin-input-container input::placeholder {
color: #fff; /* Replace with your desired color */
opacity: 1; /* Ensures the color is fully opaque */
}
/* For specific browsers */
[data-theme="rent"] .form-termin-input-container input::-webkit-input-placeholder {
color: #fff; /* Chrome, Safari, and Opera */
}
[data-theme="rent"] .form-termin-input-container input:-ms-input-placeholder {
color: #fff; /* Internet Explorer */
}
[data-theme="rent"] .form-termin-input-container input::-ms-input-placeholder {
color: #fff; /* Microsoft Edge */
}
[data-theme="rent"] .form-termin-input-container button {
cursor: pointer;
}
[data-theme="homes"] .form-termin-input-container input,
[data-theme="homes"] .form-termin-input-container select {
color: #000;
}
/* Change placeholder color for all browsers */
[data-theme="homes"] .form-termin-input-container input::placeholder {
color: #fff; /* Replace with your desired color */
opacity: 1; /* Ensures the color is fully opaque */
}
/* For specific browsers */
[data-theme="homes"] .form-termin-input-container input::-webkit-input-placeholder {
color: #000; /* Chrome, Safari, and Opera */
}
[data-theme="homes"] .form-termin-input-container input:-ms-input-placeholder {
color: #000; /* Internet Explorer */
}
[data-theme="homes"] .form-termin-input-container input::-ms-input-placeholder {
color: #000; /* Microsoft Edge */
}
[data-theme="homes"] .form-termin-input-container button {
cursor: pointer;
}
.form-termin-input-container button {
background-color: #fff;
color: #000;
}
[data-theme="shops"] .form-termin-input-container button {
background-color: #e50000;
color: #fff;
}
[data-theme="rent"] .form-termin-input-container button {
background-color: rgba(255, 255, 255, 1);
color: #164194;
}
[data-theme="homes"] .form-termin-input-container button {
background-color: #000;
color: #fff;
}
@media only screen and (min-width: 740px) {
.form-termin-input-container {
width: 49%;
}
}
@media only screen and (min-width: 940px) {
.form-termin-input-container {
width: 32%;
}
}
.form-termin-input-container:has(button) {
width: 100%;
}
.form-termin-input-container .invalid-feedback,
.form-termin-input-container .form-termin-feedback {
margin-top: 4px;
color: #fff;
}
.form-termin-input-container .form-termin-feedback {
margin-top: 10px;
text-align: center;
font-weight: bold;
font-size: 20px;
}
[data-theme="shops"] .form-termin-input-container .invalid-feedback,
[data-theme="shops"] .form-termin-input-container .form-termin-feedback {
color: #e50000;
}
[data-theme="rent"] .form-termin-input-container .invalid-feedback,
[data-theme="rent"] .form-termin-input-container .form-termin-feedback {
color: #fff;
}
[data-theme="homes"] .form-termin-input-container .invalid-feedback,
[data-theme="homes"] .form-termin-input-container .form-termin-feedback {
color: #000;
}
</style>
<link rel="stylesheet" type="text/css" href="/bundles/app/static/frontend/css/pikaday.css" />
{% set lang = document.getProperty('language') %}
<div class="ski-boot-fitting">
<div class="constrainer-maxsize edgepadding">
<div class="row">
{# {% set image_src = pimcore_image("icon_teaser_1").getSrc() %}
{% if image_src %}
<div class="image-col col-12"><img alt="Sporthaus St.Anton, Dorfstrasse 1" src="{{ image_src }}"></div>
{% endif %} #}
<div class="text-col col-12">
<h2 class="form-termin-heading">{{ pimcore_textarea('title') }}</h2>
<p class="form-termin-description">{{ pimcore_textarea('description') }}</p>
<form id="form-{{ document.id }}" action="{{ path('handle_form_submission') }}" method="POST">
<input type="hidden" name="subject" id="id_subject" value="{{ pimcore_textarea("subject") }}" />
<div class="form-termin-form-container">
<div class="form-termin-input-container">
<input class="form-control" id="id_name-{{ document.id }}" name="name" placeholder="Name" required="true" type="text">
<div class="invalid-feedback"></div>
</div>
<div class="form-termin-input-container">
<input class="form-control" id="id_email-{{ document.id }}" name="email" placeholder="{% if lang == 'de' %}E-Mail{% else %}Email{% endif %}" required="true" type="email">
<div class="invalid-feedback"></div>
</div>
<div class="form-termin-input-container">
<select class="form-control" id="id_service-{{ document.id }}" name="service" required="true">
<option selected="true" disabled="disabled" value="">{% if lang == 'de' %}Service wählen{% else %}Choose service{% endif %}</option>
{% set servicesList = pimcore_textarea('services') | split(';') %}
{% for service in servicesList %}
<option value="{{ service | trim }}">{{ service | trim }}</option>
{% endfor %}
</select>
<div class="invalid-feedback"></div>
</div>
<div class="form-termin-input-container">
<select class="form-control" id="id_location-{{ document.id }}" name="location" required="true">
<option selected="true" disabled="disabled" value="">{% if lang == 'de' %}Filiale{% else %}Location{% endif %}</option>
{% set locationList = pimcore_textarea('locations') | split(';') %}
{% for location in locationList %}
<option value="{{ location | trim }}">{{ location | trim }}</option>
{% endfor %}
</select>
<div class="invalid-feedback"></div>
</div>
<div class="form-termin-input-container">
<input class="form-control flatpickr-input" id="id_date-{{ document.id }}" name="date" placeholder="{% if lang == 'de' %}Datum{% else %}Date{% endif %}" required="true" type="text" readonly="readonly">
<div class="invalid-feedback"></div>
</div>
<div class="form-termin-input-container">
<select class="form-control" id="id_time-{{ document.id }}" name="time" required="true">
<option selected="true" disabled="disabled" value="">{% if lang == 'de' %}Zeit{% else %}Time{% endif %}</option>
{% set minHours = pimcore_textarea("minHours") %}
{% set maxHours = pimcore_textarea("maxHours") %}
{% set selectedInterval = pimcore_select("timeIntervals").getData() %}
{% set minTimeParts = minHours|split(':') %}
{% set maxTimeParts = maxHours|split(':') %}
{% set interval = selectedInterval|number_format %}
{% set startHour = minTimeParts[0]|number_format %}
{% set startMinute = minTimeParts[1]|number_format %}
{% set endHour = maxTimeParts[0]|number_format %}
{% set endMinute = maxTimeParts[1]|number_format %}
{% set currentHour = startHour %}
{% set currentMinute = startMinute %}
{% set totalMinutes = ((endHour * 60) + endMinute) - ((startHour * 60) + startMinute) %}
{% set steps = totalMinutes // interval %}
{% set currentMinute = startMinute %}
{% for i in 0..steps %}
{% set currentTimeInMinutes = (startHour * 60) + startMinute + (i * interval) %}
{% set currentHour = currentTimeInMinutes // 60 %}
{% set currentMinute = currentTimeInMinutes % 60 %}
{% set formattedTime = (currentHour < 10 ? '0' ~ currentHour : currentHour) ~ ':' ~ (currentMinute < 10 ? '0' ~ currentMinute : currentMinute) %}
<option value="{{ formattedTime }}">{{ formattedTime }}</option>
{% endfor %}
</select>
<div class="invalid-feedback"></div>
</div>
<div class="form-termin-input-container">
<button id="form-termin-button-{{ document.id }}" type="submit">{% if lang == 'de' %}Termin Buchen{% else %}Book{% endif %}</button>
<div class="form-termin-feedback" id="form-termin-feedback-{{ document.id }}"></div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<script src="/bundles/app/static/frontend/js/pikaday.js"></script>
<script>
var picker{{ document.id }} = new Pikaday({
field: document.getElementById('id_date-{{ document.id }}'),
minDate: new Date(),
maxDate: new Date('{{ pimcore_date("maxDate") }}'),
theme: "form-termin",
toString: function(date) {
var parts = [('0'+date.getDate()).slice(-2), ('0'+(date.getMonth()+1)).slice(-2), date.getFullYear()];
return parts.join(".");
},
{% if lang == 'de' %}
i18n: {
previousMonth : 'Vorheriger Monat',
nextMonth : 'Nächster Monat',
months : ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
weekdays : ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
weekdaysShort : ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
}
{% endif %}
});
document.getElementById('form-{{ document.id }}').addEventListener('submit', async function (e) {
e.preventDefault();
const form = this;
const formBtn = document.getElementById('form-termin-button-{{ document.id }}');
const nameField = document.getElementById('id_name-{{ document.id }}');
const emailField = document.getElementById('id_email-{{ document.id }}');
const serviceField = document.getElementById('id_service-{{ document.id }}');
const locationField = document.getElementById('id_location-{{ document.id }}');
const dateField = document.getElementById('id_date-{{ document.id }}');
const timeField = document.getElementById('id_time-{{ document.id }}');
const formFeedback = document.getElementById('form-termin-feedback-{{ document.id }}');
// Clear previous validation messages
const inputs = form.querySelectorAll('.invalid-feedback');
inputs.forEach(feedback => feedback.textContent = '');
let isValid = true;
// Validate Name
if (!nameField.value.trim()) {
isValid = false;
nameField.nextElementSibling.textContent = '{% if lang == "de" %}Bitte geben Sie Ihren Namen ein.{% else %}Please enter your name.{% endif %}';
}
// Validate Email
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailField.value.trim() || !emailRegex.test(emailField.value)) {
isValid = false;
emailField.nextElementSibling.textContent = '{% if lang == "de" %}Bitte geben Sie eine gültige E-Mail-Adresse ein.{% else %}Please enter a valid email address.{% endif %}';
}
// Validate Service
if (!serviceField.value) {
isValid = false;
serviceField.nextElementSibling.textContent = '{% if lang == "de" %}Bitte wählen Sie einen Service.{% else %}Please choose a service.{% endif %}';
}
// Validate Location
if (!locationField.value) {
isValid = false;
locationField.nextElementSibling.textContent = '{% if lang == "de" %}Bitte wählen Sie einen Standort.{% else %}Please choose a location.{% endif %}';
}
// Validate Date
if (!dateField.value.trim()) {
isValid = false;
dateField.nextElementSibling.textContent = '{% if lang == "de" %}Bitte wählen Sie ein Datum.{% else %}Please select a date.{% endif %}';
}
// Validate Time
if (!timeField.value) {
isValid = false;
timeField.nextElementSibling.textContent = '{% if lang == "de" %}Bitte wählen Sie eine Zeit.{% else %}Please select a time.{% endif %}';
}
// If validation fails, do not proceed
if (!isValid) {
return;
}
// Disable the button
formBtn.disabled = true;
try {
// Prepare the form data
const formData = new FormData(form);
const response = await fetch(form.action, {
method: form.method,
body: formData,
});
const result = await response.json();
if (result.success) {
formFeedback.textContent = '{% if lang == "de" %}Termin erfolgreich gebucht.{% else %}Booking successfully completed.{% endif %}';
} else {
formFeedback.textContent = '{% if lang == "de" %}Etwas ist schief gelaufen.{% else %}Something went wrong.{% endif %}';
if(result.error) {
console.error("Mailer Error: ", result.error);
}
}
} catch (error) {
formFeedback.textContent = '{% if lang == "de" %}Etwas ist schief gelaufen.{% else %}Something went wrong.{% endif %}';
console.error('{% if lang == "de" %}Buchung fehlgeschlagen, Fehler:{% else %}Booking failed, error:{% endif %}', error);
}
// Re-enable the button
formBtn.disabled = false;
});
</script>
{% endif %}
{% endblock %}