diff --git a/app.js b/app.js index bcef331..963811d 100644 --- a/app.js +++ b/app.js @@ -56,11 +56,13 @@ document.addEventListener('DOMContentLoaded', async () => { state.map = L.map('map', { center: [51.5, 7.5], // Center NRW roughly zoom: 13, - zoomControl: false + zoomControl: false, + preferCanvas: true }); // Add Zoom Control to the right - L.control.zoom({ position: 'topright' }).addTo(state.map); + L.control.zoom({ position: 'bottomright' }).addTo(state.map); + L.control.scale({ imperial: false, position: 'bottomleft' }).addTo(state.map); const updateZoomClass = () => { const zoom = state.map.getZoom(); @@ -2939,3 +2941,97 @@ async function resolveLayerConfig(isLocalFile, statusEl) { } return layers; } + + // --- PDF Export Logic --- + const btnExportPDF = document.getElementById('btnExportPDF'); + if (btnExportPDF) { + btnExportPDF.addEventListener('click', async () => { + const originalText = btnExportPDF.innerText; + btnExportPDF.innerText = 'Exportiere...'; + btnExportPDF.disabled = true; + + try { + if (typeof html2canvas === 'undefined' || typeof jspdf === 'undefined') { + throw new Error('PDF Bibliotheken (html2canvas, jspdf) sind noch nicht geladen.'); + } + + const mapContainer = document.getElementById('map'); + + // Add Overlay + const exportOverlay = document.createElement('div'); + exportOverlay.style.position = 'absolute'; + exportOverlay.style.bottom = '30px'; + exportOverlay.style.left = '30px'; + exportOverlay.style.zIndex = '9999'; + exportOverlay.style.background = 'rgba(255, 255, 255, 0.95)'; + exportOverlay.style.padding = '15px'; + exportOverlay.style.border = '2px solid #333'; + exportOverlay.style.borderRadius = '5px'; + exportOverlay.style.color = '#333'; + exportOverlay.style.fontFamily = 'Arial, sans-serif'; + exportOverlay.style.boxShadow = '0 0 10px rgba(0,0,0,0.3)'; + + const projName = document.getElementById('projectSelector')?.options[document.getElementById('projectSelector')?.selectedIndex]?.text || 'Unbekannt'; + + exportOverlay.innerHTML = ` +