// /utils/mapInitialization.js import L from "leaflet"; import "leaflet-contextmenu"; import "leaflet/dist/leaflet.css"; import "leaflet-contextmenu/dist/leaflet.contextmenu.css"; import * as urls from "../config/urls.js"; import * as layers from "../config/layers.js"; import { openInNewTab } from "../utils/contextMenuUtils.js"; import { findNearestPolyline } from "./geometryUtils"; // Importiere die Funktion zur Suche der nächsten Linie let lastClickedTarget = null; // Variable zur Zwischenspeicherung des Ziels export const initializeMap = (mapRef, setMap, setOms, setMenuItemAdded, addItemsToMapContextMenu, hasRights) => { const offlineTileLayer = urls.OFFLINE_TILE_LAYER; const onlineTileLayer = urls.ONLINE_TILE_LAYER; const TALAS = layers.MAP_LAYERS.TALAS; const ECI = layers.MAP_LAYERS.ECI; const ULAF = layers.MAP_LAYERS.ULAF; const GSMModem = layers.MAP_LAYERS.GSMModem; const CiscoRouter = layers.MAP_LAYERS.CiscoRouter; const WAGO = layers.MAP_LAYERS.WAGO; const Siemens = layers.MAP_LAYERS.Siemens; const OTDR = layers.MAP_LAYERS.OTDR; const WDM = layers.MAP_LAYERS.WDM; const GMA = layers.MAP_LAYERS.GMA; const Sonstige = layers.MAP_LAYERS.Sonstige; const TALASICL = layers.MAP_LAYERS.TALASICL; if (mapRef.current) { const initMap = L.map(mapRef.current, { center: [53.111111, 8.4625], zoom: 12, layers: [TALAS, ECI, ULAF, GSMModem, CiscoRouter, WAGO, Siemens, OTDR, WDM, GMA, Sonstige, TALASICL], minZoom: 5, maxZoom: 15, zoomControl: false, contextmenu: true, contextmenuItems: [ { text: "Station Öffnen (Tab)", icon: "/img/screen_new.png", callback: (e) => { const clickedTarget = lastClickedTarget || findNearestPolyline(initMap, e.latlng); // Verwende zwischengespeichertes Ziel oder die nächstgelegene Linie if (clickedTarget) { openInNewTab(e, clickedTarget); // Gemeinsame Funktion für Linien und Stationen } else { console.error("Kein gültiges Ziel im Kontextmenü"); } }, }, "-", ], }); L.tileLayer(onlineTileLayer, { attribution: '© OpenStreetMap contributors', }).addTo(initMap); const overlappingMarkerSpiderfier = new OverlappingMarkerSpiderfier(initMap, { nearbyDistance: 20, }); setMap(initMap); setOms(overlappingMarkerSpiderfier); initMap.on("zoomend", function () { if (initMap.getZoom() > 15) { initMap.setZoom(15); } else if (initMap.getZoom() < 5) { initMap.setZoom(5); } }); // Speichere das Ziel, wenn die Maus über eine Linie oder einen Marker fährt initMap.on("mouseover", function (e) { if (e.layer instanceof L.Polyline || e.layer instanceof L.Marker) { lastClickedTarget = e.layer; // Speichere das zuletzt überfahrene Element } }); // Kontextmenü-Event initMap.on("contextmenu", function (e) { const clickedTarget = lastClickedTarget || findNearestPolyline(initMap, e.latlng) || e.relatedTarget || e.layer; // Verwende entweder das zwischengespeicherte Ziel oder die nächstgelegene Linie if (!clickedTarget) { console.error("Kein gültiges Ziel im Kontextmenü"); return; } if (clickedTarget instanceof L.Polyline) { console.log("ID der Linie (idLD):", clickedTarget.options.idLD); // Das Kontextmenü wird nun geöffnet und beim Klicken wird `openInNewTab` ausgeführt } else if (clickedTarget instanceof L.Marker) { openInNewTab(e, clickedTarget); } else { console.error("Fehler: Ungültiges Ziel."); } }); initMap.whenReady(() => { console.log("Karte ist jetzt bereit und initialisiert."); addItemsToMapContextMenu(hasRights); }); } };