// ===================================================================== // WebGIS Citizen Participation Portal — Onboarding Tour // Guides Users through the Participation Portal. // On Mobile centered Overlays. On Desktop attached to User Interface. // ===================================================================== // ================================================================= // Block 1: Onboarding Configuration // ================================================================= // ONBOARDING_MODE — Controls when the Tutorial is shown: const ONBOARDING_MODE = 'once'; // 'once' — Shown on first Visit, stored in localStorage // 'session' — Shown per Browser Session, stored in sessionStorage // 'always' — Shows always, nothing stored // Prevents double Initialization let onboardingStarted = false; // Detects Mobile Viewport function isMobile() { return window.innerWidth < 769; } // ================================================================= // Block 2: Tour Initialization // ================================================================= function initOnboardingTour() { // Checks if Tutorial should be shown based on Onboarding Mode if (ONBOARDING_MODE === 'once' && localStorage.getItem('webgis_onboarding_done')) { return; } if (ONBOARDING_MODE === 'session' && sessionStorage.getItem('webgis_onboarding_done')) { return; } // Waits for Welcome and Login Modals to be closed waitForModalsToClose(function () { setTimeout(startTour, 600); }); } // ================================================================= // Block 3: Modal Watcher — Starts Tour after Welcome and Login Modals closed // ================================================================= function waitForModalsToClose(callback) { const welcomeModal = document.getElementById('welcome-modal'); const loginModal = document.getElementById('login-modal'); const checkInterval = setInterval(function () { const welcomeHidden = !welcomeModal || welcomeModal.style.display === 'none' || welcomeModal.style.display === ''; const loginHidden = !loginModal || loginModal.style.display === 'none' || loginModal.style.display === ''; if (welcomeHidden && loginHidden) { clearInterval(checkInterval); callback(); } }, 300); // Safety Timeout setTimeout(function () { clearInterval(checkInterval); callback(); }, 30000); } // ================================================================= // Block 4: Tour Definition // ================================================================= function startTour() { // Prevents double Start if (onboardingStarted) return; onboardingStarted = true; const mobile = isMobile(); const tour = new Shepherd.Tour({ useModalOverlay: !mobile, defaultStepOptions: { cancelIcon: { enabled: true }, scrollTo: false, classes: 'onboarding-step', popperOptions: { modifiers: [ { name: 'offset', options: { offset: [0, 14] } } ] } } }); // ----------------------------------------------------------------- // Step 1: Welcome (identical on Mobile and Desktop) // ----------------------------------------------------------------- tour.addStep({ id: 'welcome', title: ' Willkommen bei der Mitmachkarte!', text: 'Dieses interaktive Tutorial zeigt Ihnen die Kernfunktionen der Mitmachkarte.' + '

Sie können das Tutorial jederzeit über den Hilfe-Tab der Seitenleiste wiederholen.', buttons: [ { text: 'Überspringen', action: tour.cancel, classes: 'shepherd-button-secondary' }, { text: 'Los geht\'s ', action: tour.next, classes: 'shepherd-button-primary' } ] }); // ----------------------------------------------------------------- // Step 2: Drawing Tools // ----------------------------------------------------------------- var drawingStep = { id: 'drawing-tools', title: ' Beitrag hinzufügen', buttons: [ { text: ' Zurück', action: tour.back, classes: 'shepherd-button-secondary' }, { text: 'Weiter ', action: tour.next, classes: 'shepherd-button-primary' } ] }; if (mobile) { drawingStep.text = 'Verwenden Sie die Zeichenwerkzeuge ' + ' ' + 'rechts, um Hinweise als Punkte, Linien oder Flächen hinzuzufügen.'; } else { drawingStep.text = 'Verwenden Sie die Zeichenwerkzeuge, um Hinweise, Anregungen und Vorschläge auf der Mitmachkarte als Punkte, Linien oder Flächen hinzuzufügen.'; drawingStep.attachTo = { element: '.leaflet-pm-toolbar', on: 'left' }; drawingStep.beforeShowPromise = function () { return new Promise(function (resolve) { sidebar.close(); setTimeout(resolve, 300); }); }; } tour.addStep(drawingStep); // ----------------------------------------------------------------- // Step 3: Address Search // ----------------------------------------------------------------- var searchStep = { id: 'address-search', title: ' Adresssuche', buttons: [ { text: ' Zurück', action: tour.back, classes: 'shepherd-button-secondary' }, { text: 'Weiter ', action: tour.next, classes: 'shepherd-button-primary' } ] }; if (mobile) { searchStep.text = 'Verwenden Sie die Adresssuche ' + ' rechts, um schnell den richtigen Ort auf der Mitmachkarte zu finden.'; } else { searchStep.text = 'Verwenden Sie die Adresssuche, um schnell den richtigen Ort auf der Mitmachkarte zu finden.'; searchStep.attachTo = { element: '.leaflet-control-geocoder', on: 'left' }; } tour.addStep(searchStep); // ----------------------------------------------------------------- // Step 4: Layer Control // ----------------------------------------------------------------- var layerStep = { id: 'layer-control', title: ' Kartenansicht', buttons: [ { text: ' Zurück', action: tour.back, classes: 'shepherd-button-secondary' }, { text: 'Weiter ', action: tour.next, classes: 'shepherd-button-primary' } ] }; if (mobile) { layerStep.text = 'Wechseln Sie über das Layer-Symbol ' + ' oben rechts zwischen verschiedenen Hintergrundkarten und Satellitenbildern.'; } else { layerStep.text = 'Wechseln Sie zwischen verschiedenen Hintergrundkarten und Satellitenbildern.'; layerStep.attachTo = { element: '.leaflet-control-layers', on: 'left' }; } tour.addStep(layerStep); // ----------------------------------------------------------------- // Step 5: Sidebar // ----------------------------------------------------------------- var sidebarStep = { id: 'sidebar', title: ' Seitenleiste', buttons: [ { text: ' Zurück', action: tour.back, classes: 'shepherd-button-secondary' }, { text: 'Beenden ', action: tour.next, classes: 'shepherd-button-primary' } ] }; if (mobile) { sidebarStep.text = 'In der Seitenleiste ' + ' ' + 'links finden Sie Hilfestellungen, Listenansichten und Neuigkeiten.'; } else { sidebarStep.text = 'In der Seitenleiste finden Sie Hilfestellungen, Listenansichten und Neuigkeiten.'; sidebarStep.attachTo = { element: '#sidebar', on: 'right' }; sidebarStep.beforeShowPromise = function () { return new Promise(function (resolve) { sidebar.open('tab-help'); setTimeout(resolve, 400); }); }; } tour.addStep(sidebarStep); // ----------------------------------------------------------------- // Completion and Cancellation // ----------------------------------------------------------------- tour.on('complete', function () { markOnboardingDone(); onboardingStarted = false; if (mobile) sidebar.close(); }); tour.on('cancel', function () { markOnboardingDone(); onboardingStarted = false; if (mobile) sidebar.close(); }); tour.start(); } // ================================================================= // Marks Onboarding as completed // ================================================================= function markOnboardingDone() { if (ONBOARDING_MODE === 'once') { localStorage.setItem('webgis_onboarding_done', 'true'); } else if (ONBOARDING_MODE === 'session') { sessionStorage.setItem('webgis_onboarding_done', 'true'); } } // ================================================================= // Manual Tour Restart // ================================================================= function restartOnboarding() { localStorage.removeItem('webgis_onboarding_done'); sessionStorage.removeItem('webgis_onboarding_done'); onboardingStarted = false; startTour(); } // ================================================================= // Auto-Start on Page Load // ================================================================= initOnboardingTour();