import Swiper from 'swiper'; // Lesen des 'step'-Parameters aus der URL function getQueryParam(param) { const urlParams = new URLSearchParams(window.location.search); return urlParams.get(param); } // Lesen des 'step'-Parameters aus der URL let initialSlide = getQueryParam('step') ? parseInt(getQueryParam('step')) - 1 : 0; // Stellen Sie sicher, dass der Wert im gültigen Bereich liegt initialSlide = Math.max(0, Math.min(initialSlide /* Maximaler Index der Slides */)); //Initialisierung des Sliders mit Optionen /** * Initializes a new Swiper slider with options. * - initialSlide: Index of initial slide to show. * - allowTouchMove: Whether to allow touch dragging/swiping. * - simulateTouch: Enable/disable touch simulation for testing on desktop. * - noSwiping: Disable swiping by condition. * - autoHeight: Enable auto height for dynamic height slides. * - noSwipingClass: Class used to disable swiping on elements. * - pagination: Pagination configuration. * - on: Event handlers for slider events like init and slide change. */ const swiper = new Swiper('.swiper', { initialSlide: initialSlide, allowTouchMove: false, simulateTouch: false, noSwiping: true, autoHeight: true, noSwipingClass: 'swiper-slide', pagination: { el: '.swiper-pagination', type: 'progressbar', }, on: { init: function () { updateProgressBar(this); updateQuestionCounter(this); }, slideChange: function () { if (!isPopStateEvent) { //const currentStep = this.activeIndex + 1; //window.history.pushState(null, null, '?step=' + currentStep); } window.scrollTo(0, 0); updateProgressBar(this); updateQuestionCounter(this); }, }, }); swiper.slides.forEach((slide) => { slide.setAttribute('tabindex', '-1'); }); document.addEventListener('DOMContentLoaded', (event) => { // Suche nach allen h1-Elementen mit der Klasse 'stelle' const headings = document.querySelectorAll('h1.stelle'); headings.forEach((heading) => { // Extrahiere den Text '(w/m/d)' const match = heading.innerHTML.match(/\(w\/m\/d\)/); if (match) { // Ersetze '(w/m/d)' im Text durch ein Span-Element mit der Klasse 'text-size-tiny' heading.innerHTML = heading.innerHTML.replace( /\(w\/m\/d\)/, `${match[0]}` ); } }); }); //Sorgt dafür, dass man über den Broswer zurück Button ein slide zurück kann und setzt den Query Parameter let isPopStateEvent = false; window.addEventListener('popstate', function () { isPopStateEvent = true; let step = getQueryParam('step') ? parseInt(getQueryParam('step')) - 1 : 0; step = Math.max(0, Math.min(step, swiper.slides.length - 1)); swiper.slideTo(step); isPopStateEvent = false; }); function collectAndSaveQuestionsData() { const slides = document.querySelectorAll('[data-slide="question"]'); const questionsData = {}; slides.forEach((slide) => { const inputs = slide.querySelectorAll( 'input[name][data-group], select[name], textarea[name], input[type="radio"][name]' ); inputs.forEach((input) => { let value = null; let groupName; // Unterscheidung zwischen Checkboxen/Radio-Buttons und anderen Input-Typen if (input.type === 'checkbox' || input.type === 'radio') { if (input.checked) { const label = input.labels.length > 0 ? input.labels[0] : null; if (label) { const span = label.querySelector('.checkbox_label') || label; value = span ? span.textContent.trim() : label.textContent.trim(); } // Verwenden des data-group Attributs, falls vorhanden, sonst des Input-Namens groupName = input.getAttribute('data-group') || input.name; } } else { // Für andere Input-Typen wie Textfelder direkt den Wert verwenden value = input.value.trim(); groupName = input.name; } if (value) { if (!questionsData[groupName]) { questionsData[groupName] = []; } questionsData[groupName].push(value); } }); }); localStorage.setItem('questions', JSON.stringify(questionsData)); transferDataToHiddenInput(); } function transferDataToHiddenInput() { const storedData = localStorage.getItem('questions'); if (storedData) { const hiddenInput = document.getElementById('answers'); if (hiddenInput) { hiddenInput.value = storedData; } } } //Ändert den Text auf jedem Slide, je nach dem wieviele Slides vorhanden sind function updateQuestionCounter(swiper) { const totalSlides = swiper.slides.length - 6; // Kontakt zählt nicht dazu const currentIndex = swiper.activeIndex - 2; // +1, da Index bei 0 beginnt const questionCounter = swiper.slides[swiper.activeIndex].querySelector('.question-counter'); if (currentIndex === 1) { if (questionCounter) { questionCounter.textContent = `Wir haben nur ${totalSlides} Fragen an Dich`; } } else { if (questionCounter) { questionCounter.textContent = `Frage ${currentIndex} von ${totalSlides}`; } } } //Füllt den Tracker je nach Fortschritt des Sliders function updateProgressBar(swiper) { const progressBar = document.querySelector('.track_wrapper'); const totalSlides = swiper.slides.length - 4; const currentIndex = swiper.realIndex; // Progress Bar nur ab dem dritten Slide anzeigen if (currentIndex < 3) { progressBar.style.display = 'none'; } else { progressBar.style.display = 'block'; let progress; if (currentIndex === 3) { progress = 20; // Standardwert für den ersten Slide } else { progress = ((currentIndex - 1) / totalSlides) * 101; } document.querySelector('.track_fill').style.width = progress + '%'; } } //Schaut ob ein Radio Field oder eine Checkbox valid sind function isInputValid() { const currentSlide = swiper.slides[swiper.activeIndex]; const errorMessage = currentSlide.querySelector('.error-message'); // Überprüfen von Radio-Buttons const radioButtons = currentSlide.querySelectorAll('input[type="radio"]'); if (radioButtons.length > 0 && !Array.from(radioButtons).some((radio) => radio.checked)) { if (errorMessage) errorMessage.style.display = 'block'; return false; } // Überprüfen von Checkboxen const checkboxes = currentSlide.querySelectorAll('input[type="checkbox"]'); if (checkboxes.length > 0 && !Array.from(checkboxes).some((checkbox) => checkbox.checked)) { if (errorMessage) errorMessage.style.display = 'block'; return false; } // Überprüfen von Text-Inputs const textInputs = currentSlide.querySelectorAll('input[type="text"]'); for (const input of textInputs) { if (input.value.trim() === '') { if (errorMessage) errorMessage.style.display = 'block'; return false; } } // Check inputs with needed="true", const neededInput = currentSlide.querySelector('input[needed="true"]:checked'); if (neededInput) { swiper.slideTo(swiper.slides.length - 1, 0); return false; } // Überprüfen des PLZ-Inputs const plzInput = currentSlide.querySelector('input[name="PLZ"]'); if (plzInput && !/\d{5}/.test(plzInput.value)) { if (errorMessage) errorMessage.style.display = 'block'; return false; } // Einblenden der Error Nachricht, falls kein Input ausgewählt wurde if (errorMessage) errorMessage.style.display = 'none'; return true; } //Auswählen eines Inputs versteckt die Error Meldung wieder document.querySelectorAll('.swiper-slide input').forEach((input) => { input.addEventListener('click', () => { const currentSlide = swiper.slides[swiper.activeIndex]; const errorMessage = currentSlide.querySelector('.error-message'); if (errorMessage) errorMessage.style.display = 'none'; }); }); document.querySelectorAll('.slide-next').forEach((button) => { button.addEventListener('click', () => { if (!isInputValid()) { } else { swiper.slideNext(); collectAndSaveQuestionsData(); createAndFillInputs(); } }); }); function createAndFillInputs() { const storedData = localStorage.getItem('questions'); if (storedData) { const questionsData = JSON.parse(storedData); const contactElement = document.getElementById('contact'); // Vorhandene Inputs entfernen, um Duplikate zu vermeiden contactElement.innerHTML = ''; // Jeden Schlüssel im questionsData verarbeiten Object.keys(questionsData).forEach((key, index) => { // Ein neues Input-Element erstellen const input = document.createElement('input'); input.type = 'hidden'; input.id = `answers${index + 1}`; input.name = `answers${index + 1}`; // Daten formatieren und dem Input-Element zuweisen const formattedData = questionsData[key].join(', '); input.value = formattedData; // Das Input-Element zum contact-Element hinzufügen contactElement.appendChild(input); }); } else { console.error('Keine Daten im localStorage unter dem Schlüssel "questions" gefunden.'); } } document.querySelector('#lastbutton')?.addEventListener('click', () => { createAndFillInputs(); }); // Observe all accordion content elements for style changes to update Swiper height document.querySelectorAll('.fs_accordion-1_content').forEach((accordionContent) => { const observerCallback = (mutations: MutationRecord[]): void => { mutations.forEach((mutation) => { if (mutation.type === 'attributes' && mutation.attributeName === 'style') { const computedStyle = window.getComputedStyle(accordionContent); if (computedStyle.display !== 'none') { swiper.updateAutoHeight(); } } }); }; const observer = new MutationObserver(observerCallback); observer.observe(accordionContent, { attributes: true, attributeFilter: ['style'] }); });