diff --git a/.env.local b/.env.local
index 21b3fd80a..fb6a0ee81 100644
--- a/.env.local
+++ b/.env.local
@@ -12,5 +12,6 @@ DB_PORT=3306
#NEXT_PUBLIC_ONLINE_TILE_LAYER="http://127.0.0.1:3000/mapTiles/{z}/{x}/{y}.png"
#NEXT_PUBLIC_ONLINE_TILE_LAYER="http://10.10.0.13:3000/mapTiles/{z}/{x}/{y}.png"
####################
+NEXT_PUBLIC_SERVER_URL="http://10.10.0.70"
NEXT_PUBLIC_ENABLE_GEOCODER=true
diff --git a/components/MapComponent.js b/components/MapComponent.js
index 09e342b38..822a64f09 100644
--- a/components/MapComponent.js
+++ b/components/MapComponent.js
@@ -502,6 +502,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
fetchData();
}, []);
//--------------------------------------------
+
//Tooltip an mouse position anzeigen für die Linien
useEffect(() => {
if (!map) return;
@@ -511,17 +512,10 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
polylines.forEach((polyline) => polyline.remove());
// Setze neue Marker und Polylinien mit den aktuellen Daten
- const { markers: newMarkers, polylines: newPolylines } = setupPolylines(
- map,
- linePositions,
- lineColors,
- tooltipContents,
- setNewCoords,
- tempMarker,
- polylineVisible // polylineVisible wird jetzt korrekt übergeben
- );
+ const { markers: newMarkers, polylines: newPolylines } = setupPolylines(map, linePositions, lineColors, tooltipContents, setNewCoords, tempMarker, polylineVisible);
newPolylines.forEach((polyline, index) => {
+ console.log("polyline: ", polyline);
const tooltipContent = tooltipContents[`${linePositions[index].idLD}-${linePositions[index].idModul}`] || "Standard-Tooltip-Inhalt";
polyline.bindTooltip(tooltipContent, {
diff --git a/components/PoiUpdateModal.js b/components/PoiUpdateModal.js
index 9e4919dbc..d9811ab53 100644
--- a/components/PoiUpdateModal.js
+++ b/components/PoiUpdateModal.js
@@ -1,5 +1,5 @@
// pages/api/poiUpdateModal.js
-
+//
import React, { useState, useEffect } from "react";
import { useRecoilValue } from "recoil";
import { selectedPoiState } from "../redux/slices/selectedPoiSlice";
@@ -15,22 +15,50 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
const [locationDeviceData, setLocationDeviceData] = useState([]);
const [deviceName, setDeviceName] = useState("");
const [idLD, setIdLD] = useState(poiData ? poiData.idLD : "");
+ const [idLocationDevice, setIdLocationDevice] = useState("");
const [description, setDescription] = useState(poiData ? poiData.description : "");
+ // Log the initial POI data
useEffect(() => {
if (poiData) {
- console.log("Initial poiData:", poiData);
setPoiId(poiData.idPoi);
setName(poiData.name);
setPoiTypeId(poiData.idPoiTyp);
setIdLD(poiData.idLD);
+
setDescription(poiData.description);
setDeviceName(poiData.idLD);
console.log("Loaded POI Data for editing:", poiData);
+ console.log("POI ID:", poiData.idPoi);
+ console.log("POI Name:", poiData.name);
+ console.log("POI Typ ID:", poiData.idPoiTyp);
+ console.log("POI Beschreibung:", poiData.description);
+ console.log("POI Geräte-ID:", poiData.idLD);
}
}, [poiData]);
+ /* const fetchDeviceNameById = async (idLD) => {
+ try {
+ const response = await fetch(`/api/getDeviceNameById?idLD=${idLD}`);
+ const data = await response.json();
+ setDeviceName(data.deviceName);
+ } catch (error) {
+ console.error("Error fetching device name:", error);
+ }
+ }; */
+
+ /* const fetchDeviceNameById = async (idLD) => {
+ try {
+ const response = await fetch(`/api/talas_v5_DB/locationDevice/locationDeviceNameById?idLD=${idLD}`);
+ const data = await response.json();
+ setDeviceName(data.deviceName);
+ } catch (error) {
+ console.error("Error fetching device name:", error);
+ }
+ }; */
+
+ // Beim Öffnen des Modals die Geräte-ID basierend auf dem Gerätenamen abrufen, wenn vorhanden
useEffect(() => {
const fetchDeviceId = async () => {
if (poiData && poiData.idLD) {
@@ -47,6 +75,7 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
fetchDeviceId();
}, [poiData]);
+ // Function to handle deleting a POI
const handleDeletePoi = async () => {
if (confirm("Sind Sie sicher, dass Sie diesen POI löschen möchten?")) {
try {
@@ -55,7 +84,8 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
});
if (response.ok) {
alert("POI wurde erfolgreich gelöscht.");
- onClose();
+ onClose(); // Close the modal
+ //Browser neu laden, um die aktualisierte Liste anzuzeigen
window.location.reload();
} else {
throw new Error("Fehler beim Löschen des POI.");
@@ -67,6 +97,7 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
}
};
+ // Fetch POI types
useEffect(() => {
const fetchPoiTypData = async () => {
try {
@@ -86,13 +117,16 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
fetchPoiTypData();
}, [selectedPoi]);
+ // Fetch device data um den Gerät Namen in den dropdown menu anzuzeigen also erstmal die Liste der Geräte abrufen
useEffect(() => {
const fetchData = async () => {
try {
// const response = await fetch("/api/talas_v5/location_device"); //"/api/talas_v5_DB/locationDevice/location_device"
const response = await fetch("/api/talas_v5_DB/locationDevice/locationDevices");
const data = await response.json();
+ //console.log("Standort- und Gerätedaten:", data);
setLocationDeviceData(data);
+ console.log("Standort- und Gerätedaten poiData:", poiData);
if (poiData && poiData.idLD) {
const selectedDevice = data.find((device) => device.id === poiData.idLD);
setDeviceName(selectedDevice ? selectedDevice.id : data[0].id); // Hier wird die ID als initialer Zustand gesetzt
@@ -105,8 +139,11 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
};
fetchData();
}, []);
+ //--------------------------------------------------------------------------------------------
+ // Fetch device name basierend auf der Geräte-ID
useEffect(() => {
+ console.log("currentPoi von PoiUpdateModal.js : ", currentPoi.idLD);
fetch("/api/talas_v5_DB/locationDevice/locationDevices")
.then((response) => response.json())
.then((data) => {
@@ -125,6 +162,10 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
});
}, [poiData?.idLD, currentPoi]);
+ //--------------------------------------------------------------------------------------------
+ // Angenommen, deviceName enthält die Geräte-ID
+ //const idLD = deviceName; // Stellen Sie sicher, dass dies eine ID ist und kein Name
+
const handleSubmit = async (event) => {
event.preventDefault();
const idLDResponse = await fetch(`/api/talas_v5_DB/locationDevice/getDeviceId?deviceName=${encodeURIComponent(deviceName)}`);
@@ -142,6 +183,7 @@ const PoiUpdateModal = ({ onClose, poiData }) => {
description: description,
idPoiTyp: poiTypeId,
idLD: idLD,
+ //idLD: parseInt(deviceName, 10), // Konvertieren in eine Ganzzahl
}),
});
diff --git a/components/ShowAddStationPopup.js b/components/ShowAddStationPopup.js
index 205a655af..7b770e0ec 100644
--- a/components/ShowAddStationPopup.js
+++ b/components/ShowAddStationPopup.js
@@ -102,9 +102,6 @@ const ShowAddStationPopup = ({ onClose, map, latlng }) => {
onClose();
return newTrigger;
});
-
- // Browser aktualisieren
- window.location.reload();
} else {
console.error("Fehler beim Hinzufügen des POI");
}
@@ -113,7 +110,6 @@ const ShowAddStationPopup = ({ onClose, map, latlng }) => {
map.closePopup();
}
};
-
//-----------------handleSubmit-------------------
return (
diff --git a/components/imports.js b/components/imports.js
new file mode 100644
index 000000000..a81e36edb
--- /dev/null
+++ b/components/imports.js
@@ -0,0 +1,162 @@
+// imports.js
+import React, { useEffect, useRef, useState, useCallback } from "react";
+import L, { marker } from "leaflet";
+import "leaflet/dist/leaflet.css";
+import "leaflet-contextmenu/dist/leaflet.contextmenu.css";
+import "leaflet-contextmenu";
+import * as config from "../config/config.js";
+import * as urls from "../config/urls.js";
+import "leaflet.smooth_marker_bouncing";
+import OverlappingMarkerSpiderfier from "overlapping-marker-spiderfier-leaflet";
+import DataSheet from "./DataSheet.js";
+import { useRecoilState, useRecoilValue, useSetRecoilState } from "recoil";
+import { gisStationsStaticDistrictState } from "../store/atoms/gisStationState.js";
+import { gisSystemStaticState } from "../store/atoms/gisSystemState.js";
+import { mapLayersState } from "../store/atoms/mapLayersState.js";
+import { selectedAreaState } from "../store/atoms/selectedAreaState.js";
+import { zoomTriggerState } from "../store/atoms/zoomTriggerState.js";
+import { poiTypState } from "../store/atoms/poiTypState.js";
+import AddPoiModalWindow from "./pois/AddPoiModalWindow.js";
+import { poiReadFromDbTriggerAtom } from "../store/atoms/poiReadFromDbTriggerAtom.js";
+import { InformationCircleIcon } from "@heroicons/react/20/solid"; // oder 'outline'
+import PoiUpdateModal from "./pois/PoiUpdateModal.js";
+import { selectedPoiState } from "../store/atoms/poiState.js";
+import { currentPoiState } from "../store/atoms/currentPoiState.js";
+import { ToastContainer, toast } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import { mapIdState, userIdState } from "../store/atoms/urlParameterState.js";
+import { poiLayerVisibleState } from "../store/atoms/poiLayerVisibleState.js";
+import plusRoundIcon from "./PlusRoundIcon.js";
+import { parsePoint, findClosestPoints } from "../utils/geometryUtils.js";
+import { insertNewPOI, removePOI, handleEditPoi } from "../utils/poiUtils.js";
+import { createAndSetDevices } from "../utils/createAndSetDevices.js";
+import { redrawPolyline, restoreMapSettings, checkOverlappingMarkers } from "../utils/mapUtils.js";
+import circleIcon from "./gisPolylines/icons/CircleIcon.js";
+import startIcon from "./gisPolylines/icons/StartIcon.js";
+import endIcon from "./gisPolylines/icons/EndIcon.js";
+import { fetchGisStatusStations, fetchPriorityConfig, fetchPoiData, updateLocationInDatabase, fetchUserRights, fetchDeviceNameById } from "../services/apiService.js";
+import { addContextMenuToMarker } from "../utils/addContextMenuToMarker.js";
+import { MAP_VERSION } from "../config/settings.js";
+import * as layers from "../config/layers.js";
+import { zoomIn, zoomOut, centerHere } from "../utils/zoomAndCenterUtils.js";
+import { initializeMap } from "../utils/initializeMap.js";
+import { addItemsToMapContextMenu } from "./useMapContextMenu.js";
+import useGmaMarkersLayer from "../hooks/layers/useGmaMarkersLayer.js"; // Import the custom hook
+import useTalasMarkersLayer from "../hooks/layers/useTalasMarkersLayer.js"; // Import the custom hook
+import useEciMarkersLayer from "../hooks/layers/useEciMarkersLayer.js";
+import useGsmModemMarkersLayer from "../hooks/layers/useGsmModemMarkersLayer.js";
+import useCiscoRouterMarkersLayer from "../hooks/layers/useCiscoRouterMarkersLayer.js";
+import useWagoMarkersLayer from "../hooks/layers/useWagoMarkersLayer.js";
+import useSiemensMarkersLayer from "../hooks/layers/useSiemensMarkersLayer.js";
+import useOtdrMarkersLayer from "../hooks/layers/useOtdrMarkersLayer.js";
+import useWdmMarkersLayer from "../hooks/layers/useWdmMarkersLayer.js";
+import useMessstellenMarkersLayer from "../hooks/layers/useMessstellenMarkersLayer.js";
+import useTalasiclMarkersLayer from "../hooks/layers/useTalasiclMarkersLayer.js";
+import useDauzMarkersLayer from "../hooks/layers/useDauzMarkersLayer.js";
+import useSmsfunkmodemMarkersLayer from "../hooks/layers/useSmsfunkmodemMarkersLayer.js";
+import useUlafMarkersLayer from "../hooks/layers/useUlafMarkersLayer.js";
+import useSonstigeMarkersLayer from "../hooks/layers/useSonstigeMarkersLayer.js";
+import handlePoiSelect from "../utils/handlePoiSelect.js";
+import { fetchGisStationsStaticDistrict, fetchGisStationsStatusDistrict, fetchGisStationsMeasurements, fetchGisSystemStatic } from "../services/fetchData.js";
+import { setupPolylines } from "../utils/setupPolylines.js";
+import { setupPOIs } from "../utils/setupPOIs.js";
+import VersionInfoModal from "./VersionInfoModal.js";
+//--------------------------------------------
+import PoiUpdateModalWrapper from "./pois/PoiUpdateModalWrapper";
+import AddPoiModalWindowWrapper from "./pois/AddPoiModalWindowWrapper";
+import useFetchPoiData from "../hooks/useFetchPoiData";
+import usePoiTypData from "../hooks/usePoiTypData";
+import useMarkerLayers from "../hooks/useMarkerLayers";
+import useLayerVisibility from "../hooks/useLayerVisibility";
+import useLineData from "../hooks/useLineData.js";
+
+export {
+ React,
+ useEffect,
+ useRef,
+ useState,
+ useCallback,
+ L,
+ marker,
+ config,
+ urls,
+ OverlappingMarkerSpiderfier,
+ DataSheet,
+ useRecoilState,
+ useRecoilValue,
+ useSetRecoilState,
+ gisStationsStaticDistrictState,
+ gisSystemStaticState,
+ mapLayersState,
+ selectedAreaState,
+ zoomTriggerState,
+ poiTypState,
+ AddPoiModalWindow,
+ poiReadFromDbTriggerAtom,
+ InformationCircleIcon,
+ PoiUpdateModal,
+ selectedPoiState,
+ currentPoiState,
+ ToastContainer,
+ toast,
+ mapIdState,
+ userIdState,
+ poiLayerVisibleState,
+ plusRoundIcon,
+ parsePoint,
+ findClosestPoints,
+ insertNewPOI,
+ removePOI,
+ createAndSetDevices,
+ handleEditPoi,
+ redrawPolyline,
+ restoreMapSettings,
+ checkOverlappingMarkers,
+ circleIcon,
+ startIcon,
+ endIcon,
+ fetchGisStatusStations,
+ fetchPriorityConfig,
+ fetchPoiData,
+ updateLocationInDatabase,
+ fetchUserRights,
+ fetchDeviceNameById,
+ addContextMenuToMarker,
+ MAP_VERSION,
+ layers,
+ zoomIn,
+ zoomOut,
+ centerHere,
+ initializeMap,
+ addItemsToMapContextMenu,
+ useGmaMarkersLayer,
+ useTalasMarkersLayer,
+ useEciMarkersLayer,
+ useGsmModemMarkersLayer,
+ useCiscoRouterMarkersLayer,
+ useWagoMarkersLayer,
+ useSiemensMarkersLayer,
+ useOtdrMarkersLayer,
+ useWdmMarkersLayer,
+ useMessstellenMarkersLayer,
+ useTalasiclMarkersLayer,
+ useDauzMarkersLayer,
+ useSmsfunkmodemMarkersLayer,
+ useUlafMarkersLayer,
+ useSonstigeMarkersLayer,
+ handlePoiSelect,
+ fetchGisStationsStaticDistrict,
+ fetchGisStationsStatusDistrict,
+ fetchGisStationsMeasurements,
+ fetchGisSystemStatic,
+ setupPolylines,
+ setupPOIs,
+ VersionInfoModal,
+ PoiUpdateModalWrapper,
+ AddPoiModalWindowWrapper,
+ useFetchPoiData,
+ usePoiTypData,
+ useMarkerLayers,
+ useLayerVisibility,
+ useLineData,
+};
diff --git a/config/config.js b/config/config.js
index 8a5983fb1..40ee38cd4 100644
--- a/config/config.js
+++ b/config/config.js
@@ -1,53 +1,55 @@
// /config/config.js
import * as urls from "../config/urls.js";
-
// Definieren der grundlegenden Umgebungseinstellungen und Konfigurationen der Karte
const standardSideMenu = true; // Einstellung, ob ein standardmäßiges Seitenmenü verwendet wird
const fullSideMenu = false; // Einstellung, ob ein vollständiges Seitenmenü verwendet wird
-// Dynamische Bestimmung der Server-URL basierend auf window.location.origin ohne Port
-let serverURL;
-
-if (typeof window !== "undefined") {
- const url = new URL(window.location.origin);
- serverURL = `${url.protocol}//${url.hostname}`; // Nur Protokoll und Hostname, ohne Port
-} else {
- throw new Error("ServerURL kann nicht bestimmt werden, da der Code nicht im Browser läuft!");
+const serverURL = process.env.NEXT_PUBLIC_SERVER_URL;
+if (!serverURL) {
+ throw new Error("Die Umgebungsvariable NEXT_PUBLIC_SERVER_URL ist nicht gesetzt!");
}
+console.log("%c 1- serverURL in config:", "color: #006400;", serverURL);
-console.log("%c ServerURL (dynamisch ermittelt):", "color: #006400;", serverURL);
-
-// Initialisieren von Variablen
+// Initialisieren von Variablen, die später im Browserkontext gesetzt werden
let windowHeight, url_string, url, idMap, idUser;
-// URLs für Online-Daten
+//Online Daten
let mapGisStationsStaticDistrictUrl, mapGisStationsStatusDistrictUrl, mapGisStationsMeasurementsUrl, mapGisSystemStaticUrl, mapDataIconUrl, webserviceGisLinesStatusUrl;
-// Prüfen, ob der Code im Browser ausgeführt wird
+// Prüfen, ob das Code im Browser ausgeführt wird
if (typeof window !== "undefined") {
- // Initialisierung der Browser-spezifischen Variablen
- windowHeight = window.innerHeight;
- url_string = window.location.href;
- url = new URL(url_string);
+ // Diese Variablen werden nur im Browser-Kontext initialisiert
+ windowHeight = window.innerHeight; // Die Höhe des Browserfensters
+ url_string = window.location.href; // Die vollständige URL als String
+ url = new URL(url_string); // Die URL als URL-Objekt, um Teile der URL einfacher zu handhaben
+ console.log("%c 2- URL in config:", "color: #006400; font-size: 16px; background-color: #f0f0f0;", url);
- console.log("%c Aktuelle URL:", "color: #006400;", url);
+ console.log("%c 3- URL origin in config:", "color: #006400;", url.origin); //http://localhost:3000
+ idMap = url.searchParams.get("m"); // Ein Parameter aus der URL, Standardwert ist '10'
+ idUser = url.searchParams.get("u"); // Ein weiterer Parameter aus der URL, Standardwert ist '484 admin zu testen von Stationen ausblenden und einblenden in der Card'
- // Extrahiere URL-Parameter
- idMap = url.searchParams.get("m"); // Parameter 'm' (idMap)
- idUser = url.searchParams.get("u"); // Parameter 'u' (idUser)
+ console.log(`4- Parameter 'idMap' : ${idMap}`);
+ console.log(`5- Parameter 'idUser': ${idUser}`);
- console.log(`Parameter 'idMap': ${idMap}`);
- console.log(`Parameter 'idUser': ${idUser}`);
+ // Konstruktion von URLs, die auf spezifische Ressourcen auf dem Server zeigen
+ //http://localhost:3000/?m=10&u=485
- // Konstruktion der URLs basierend auf den Server- und URL-Parametern
- mapGisStationsStaticDistrictUrl = `${serverURL}/talas5/ClientData/WebserviceMap.asmx/GisStationsStaticDistrict?idMap=${idMap}&idUser=${idUser}`;
+ //-----------------Von WebService------------------------------------------------
+ mapGisStationsStaticDistrictUrl = `${serverURL}/talas5/ClientData/WebserviceMap.asmx/GisStationsStaticDistrict?idMap=${idMap}&idUser=${idUser}`; //idMap: 10, idUser: 484
mapGisStationsStatusDistrictUrl = `${serverURL}/talas5/ClientData/WebserviceMap.asmx/GisStationsStatusDistrict?idMap=${idMap}&idUser=${idUser}`;
mapGisStationsMeasurementsUrl = `${serverURL}/talas5/ClientData/WebserviceMap.asmx/GisStationsMeasurements?idMap=${idMap}`;
mapGisSystemStaticUrl = `${serverURL}/talas5/ClientData/WebserviceMap.asmx/GisSystemStatic?idMap=${idMap}&idUser=${idUser}`;
mapDataIconUrl = `${serverURL}/talas5/ClientData/WebserviceMap.asmx/GetIconsStatic`;
+
+ //webserviceGisLinesStatusUrl = `http://10.10.0.13/talas5/ClientData/WebServiceMap.asmx/GisLinesStatus?idMap=${idMap}`;
+
+ // webserviceGisLinesStatusUrl = `http://localhost:3000/api/linesColorApi`;
+ //webserviceGisLinesStatusUrl = `http://192.168.10.14/talas5/ClientData/WebServiceMap.asmx/GisLinesStatus?idMap=${idMap}`;
webserviceGisLinesStatusUrl = `${serverURL}/talas5/ClientData/WebServiceMap.asmx/GisLinesStatus?idMap=${idMap}`;
+
+ //http://10.10.0.13/talas5/ClientData/WebserviceMap.asmx/GisSystemStatic?idMap=12&idUser=484
}
-// Export der definierten Variablen und URLs
+// Export der definierten Variablen und URLs, damit sie in anderen Teilen der Anwendung verwendet werden können
export {
standardSideMenu,
fullSideMenu,
@@ -64,3 +66,9 @@ export {
mapDataIconUrl,
webserviceGisLinesStatusUrl,
};
+
+/*
+Access to fetch at 'http://localhost:3000/api/linesColorApi' from origin 'http://10.10.0.13:3000' has been blocked by CORS policy:
+ No 'Access-Control-Allow-Origin' header is present on the requested resource.
+ If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
+ */
diff --git a/config/settings.js b/config/settings.js
new file mode 100644
index 000000000..e48bd655d
--- /dev/null
+++ b/config/settings.js
@@ -0,0 +1,2 @@
+// /config/settings.js
+export const MAP_VERSION = "1.0.8.2";
diff --git a/hooks/layers/useGmaMarkersLayer - Kopie.js b/hooks/layers/useGmaMarkersLayer - Kopie.js
new file mode 100644
index 000000000..46f815b88
--- /dev/null
+++ b/hooks/layers/useGmaMarkersLayer - Kopie.js
@@ -0,0 +1,79 @@
+import { useEffect } from "react";
+import { addContextMenuToMarker } from "../../utils/addContextMenuToMarker";
+
+const useMarkersLayer = (map, markers, GisStationsMeasurements, GMA, oms) => {
+ useEffect(() => {
+ if (!map) return;
+
+ // Entferne alte Marker
+ GMA.clearLayers();
+
+ // Hinzufügen neuer Marker
+ markers.forEach((marker) => {
+ // Finde die Messungen, die zu diesem Marker gehören
+ const relevantMeasurements = GisStationsMeasurements.filter((m) => m.Area_Name === marker.options.areaName);
+
+ let measurements = {};
+ let area_name = marker.options.areaName;
+
+ relevantMeasurements.forEach((m) => {
+ measurements[m.Na] = m.Val;
+ });
+
+ // Überprüfe, ob die Messwerte vorhanden sind, und setze Standardwerte
+ const lt = measurements["LT"] || "---";
+ const fbt = measurements["FBT"] || "---";
+ const gt = measurements["GT"] || "---";
+ const rlf = measurements["RLF"] || "---";
+
+ console.log(`Station oder Bereich ${area_name} - LT: ${lt}, FBT: ${fbt}, GT: ${gt}, RLF: ${rlf}`);
+
+ // Tooltip für den Marker binden
+ marker.bindTooltip(
+ `
+
diff --git a/redux/actions.js b/redux/actions.js
deleted file mode 100644
index d147d7d35..000000000
--- a/redux/actions.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// /redux/actions.js
-export const connectWebSocket = (url) => ({
- type: "WS_CONNECT",
- payload: { url },
-});
-
-export const disconnectWebSocket = () => ({
- type: "WS_DISCONNECT",
-});
diff --git a/redux/reducer.js b/redux/reducer.js
deleted file mode 100644
index 2d75946d6..000000000
--- a/redux/reducer.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// redux/reducer.js
-import { combineReducers } from "redux";
-import currentPoiReducer from "./slices/currentPoiSlice";
-import gisStationsStaticDistrictReducer from "./slices/gisStationsStaticDistrictSlice";
-
-const rootReducer = combineReducers({
- currentPoi: currentPoiReducer,
- gisStationsStaticDistrict: gisStationsStaticDistrictReducer,
-});
-
-export default rootReducer;
diff --git a/redux/slices/lineVisibilitySlice.js b/redux/slices/lineVisibilitySlice.js
new file mode 100644
index 000000000..c2e8ca775
--- /dev/null
+++ b/redux/slices/lineVisibilitySlice.js
@@ -0,0 +1,23 @@
+// /rdux/slices/lineVisibilitySlice.js
+import { createSlice } from "@reduxjs/toolkit";
+
+const initialState = {
+ activeLines: {}, // Speichert `idLD -> Active`
+};
+
+const lineVisibilitySlice = createSlice({
+ name: "lineVisibility",
+ initialState,
+ reducers: {
+ updateLineStatus(state, action) {
+ const { idLD, active } = action.payload;
+ state.activeLines[idLD] = active; // Speichert `idLD` in Redux
+ },
+ setActiveLines(state, action) {
+ state.activeLines = action.payload;
+ },
+ },
+});
+
+export const { updateLineStatus, setActiveLines } = lineVisibilitySlice.actions;
+export default lineVisibilitySlice.reducer;
diff --git a/redux/slices/poiReadFromDbTriggerSlice.js b/redux/slices/poiReadFromDbTriggerSlice.js
index 4c6c36996..ba59a3c30 100644
--- a/redux/slices/poiReadFromDbTriggerSlice.js
+++ b/redux/slices/poiReadFromDbTriggerSlice.js
@@ -1,7 +1,15 @@
// redux/slices/poiReadFromDbTriggerSlice.js
-import { atom } from 'recoil';
+import { atom } from "recoil";
-export const poiReadFromDbTriggerAtom = atom({
- key: 'poiReadFromDbTriggerAtom',
- default: 0, // Sie können auch einen booleschen Wert verwenden
-});
+const atomKey = "poiReadFromDbTriggerAtom";
+
+export const poiReadFromDbTriggerAtom =
+ globalThis.poiReadFromDbTriggerAtom ||
+ atom({
+ key: atomKey,
+ default: 0,
+ });
+
+if (process.env.NODE_ENV !== "production") {
+ globalThis.poiReadFromDbTriggerAtom = poiReadFromDbTriggerAtom;
+}
diff --git a/redux/slices/readPoiMarkersStoreSlice.js b/redux/slices/readPoiMarkersStoreSlice.js
index 7748fae02..89d7d45cc 100644
--- a/redux/slices/readPoiMarkersStoreSlice.js
+++ b/redux/slices/readPoiMarkersStoreSlice.js
@@ -1,7 +1,17 @@
//redux/slices/readPoiMarkersStoreSlice.js
-import { atom } from 'recoil';
+import { atom } from "recoil";
-export const readPoiMarkersStore = atom({
- key: 'readPoiMarkersStore',
- default: [],
-});
\ No newline at end of file
+const storeKey = "readPoiMarkersStore";
+
+// Verhindert doppelte Registrierung bei HMR
+export const readPoiMarkersStore =
+ globalThis.readPoiMarkersStore ||
+ atom({
+ key: storeKey,
+ default: [],
+ });
+
+// Speichert das Atom im globalen Namespace (nur in Dev)
+if (process.env.NODE_ENV !== "production") {
+ globalThis.readPoiMarkersStore = readPoiMarkersStore;
+}
diff --git a/redux/store.js b/redux/store.js
index b41afa444..b231f13df 100644
--- a/redux/store.js
+++ b/redux/store.js
@@ -1,10 +1,12 @@
import { configureStore } from "@reduxjs/toolkit";
-import websocketMiddleware from "./middleware/websocketMiddleware";
-import rootReducer from "./reducer";
+import lineVisibilityReducer from "./slices/lineVisibilitySlice";
+import currentPoiReducer from "./slices/currentPoiSlice";
+import gisStationsStaticDistrictReducer from "./slices/gisStationsStaticDistrictSlice";
-const store = configureStore({
- reducer: rootReducer, // Kombinierter Root-Reducer
- middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(websocketMiddleware),
+export const store = configureStore({
+ reducer: {
+ lineVisibility: lineVisibilityReducer,
+ currentPoi: currentPoiReducer,
+ gisStationsStaticDistrict: gisStationsStaticDistrictReducer,
+ },
});
-
-export default store;
diff --git a/services/apiService.js b/services/apiService.js
index be6921939..930a9565f 100644
--- a/services/apiService.js
+++ b/services/apiService.js
@@ -1,8 +1,6 @@
// services/apiService.js
import * as config from "../config/config";
-import SERVER_URL from "../config/urls";
-const url = new URL(window.location.origin);
-const originWithoutPort = `${url.protocol}//${url.hostname}`;
+import * as urls from "../config/urls";
let timeoutId;
@@ -23,22 +21,19 @@ const fetchWithTimeout = async (url, options, timeout = 5000) => {
}
};
-export const fetchGisStatusStations = async () => {
- //idMap und idUser von URL Parameter hersuslesen
- const idMap = url.searchParams.get("m");
- const idUser = url.searchParams.get("u");
+export const fetchGisStatusStations = async (idMap, idUser) => {
// Verhindere wiederholte schnelle API-Aufrufe durch Debouncing
if (timeoutId) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(async () => {
- //const SERVER_URL = process.env.NEXT_PUBLIC_SERVER_URL;
+ const SERVER_URL = process.env.NEXT_PUBLIC_SERVER_URL;
try {
// Verwende das Timeout für die API-Anfrage
const response = await fetchWithTimeout(
- `${originWithoutPort}/talas5/ClientData/WebServiceMap.asmx/GisStationsStatusDistrict?idMap=${idMap}&idUser=${idUser}`,
+ `${SERVER_URL}/talas5/ClientData/WebServiceMap.asmx/GisStationsStatusDistrict?idMap=${idMap}&idUser=${idUser}`,
{
method: "GET",
headers: {
@@ -141,13 +136,6 @@ export const fetchDeviceNameById = async (idLD) => {
// ----------------------------------------------
// services/apiService.js
export const fetchUserRights = async () => {
- // Aktuelle URL abrufen
- const url = new URL(window.location.href);
-
- // idMap und idUser von URL-Parametern abrufen
- const idMap = url.searchParams.get("m");
- const idUser = url.searchParams.get("u");
-
// Zähler für API-Aufrufe in localStorage speichern
let userRightsRequestCount = localStorage.getItem("userRightsRequestCount") || 0;
userRightsRequestCount++;
@@ -155,16 +143,7 @@ export const fetchUserRights = async () => {
console.log(`fetchUserRights wurde ${userRightsRequestCount} Mal aufgerufen.`);
try {
- // Basis-URL ohne Port abrufen
- const protocol = window.location.protocol; // z. B. 'http:' oder 'https:'
- const hostname = window.location.hostname; // z. B. 'example.com'
- const originWithoutPort = `${protocol}//${hostname}`; // z. B. 'https://example.com'
-
- console.log("originWithoutPort in fetchUserRights", originWithoutPort);
- console.log("idMap in fetchUserRights", idMap);
- console.log("idUser in fetchUserRights", idUser);
-
- const response = await fetch(`${originWithoutPort}/talas5/ClientData/WebserviceMap.asmx/GisSystemStatic?idMap=${idMap}&idUser=${idUser}`, {
+ const response = await fetch(`${process.env.NEXT_PUBLIC_SERVER_URL}/talas5/ClientData/WebserviceMap.asmx/GisSystemStatic?idMap=${config.idMap}&idUser=${config.idUser}`, {
method: "GET",
headers: {
Connection: "close",
@@ -182,7 +161,7 @@ export const fetchUserRights = async () => {
throw new Error("Invalid response structure");
}
- const rightsArray = data.Rights; // Rechte-Array abrufen
+ const rightsArray = data.Rights; // Nehmen an, dass 'Rights' das Array von Rechten ist
const userRightsIds = rightsArray.map((right) => right.IdRight);
return userRightsIds;
diff --git a/utils/createAndSetDevices.js b/utils/createAndSetDevices.js
index 69a8814fe..6218166a3 100644
--- a/utils/createAndSetDevices.js
+++ b/utils/createAndSetDevices.js
@@ -1,162 +1,133 @@
// /utils/createAndSetDevices.js
import L from "leaflet";
import "leaflet.smooth_marker_bouncing";
-import { SERVER_URL } from "../config/urls.js";
+import { toast } from "react-toastify";
import * as config from "../config/config.js";
+import { disablePolylineEvents, enablePolylineEvents } from "./setupPolylines";
+//import { setPolylineEventsDisabled } from "../store/atoms/polylineEventsDisabledState";
+import { store } from "../redux/store";
+import { updateLineStatus } from "../redux/slices/lineVisibilitySlice";
-// Variable zum Speichern der Prioritätskonfiguration (z.B. Level und Farben)
-let priorityConfig = [];
-
-// Funktion zum Abrufen der Prioritätsdaten von der API
-const fetchPriorityConfig = async () => {
- try {
- // Ruft die API auf, um die Prioritätsdaten zu laden
- const response = await fetch(`${SERVER_URL}:3000/api/prio`);
-
- // Konvertiert die Antwort in ein JSON-Format
- const data = await response.json();
-
- // Gibt die empfangenen Daten in der Konsole aus, um die Struktur zu überprüfen
- // console.log("Prioritätsdaten: ", data);
-
- // Speichert die empfangenen Prioritätsdaten in der Variablen priorityConfig
- priorityConfig = data;
- } catch (error) {
- // Gibt einen Fehler in der Konsole aus, falls die API nicht erreichbar ist
- console.error("Fehler beim Abrufen der Prioritätsdaten: ", error);
+const determinePriority = (iconPath, priorityConfig) => {
+ for (let priority of priorityConfig) {
+ if (iconPath.includes(priority.name.toLowerCase())) {
+ return priority.level;
+ }
}
+ return 5;
};
-// Funktion zur Bestimmung der Farbe basierend auf dem Level
-const getColorClass = (level) => {
- // Sucht in priorityConfig nach einem Objekt, dessen level-Wert dem übergebenen Level entspricht
- const priority = priorityConfig.find((p) => p.level === level);
-
- // Gibt die Farbe zurück, wenn das Level gefunden wurde, ansonsten die Standardfarbe (#999999)
- return priority ? priority.color : "#999999"; // Fallback-Farbe, wenn kein Level gefunden wurde
-};
-
-/* // Ruft die Funktion zum Abrufen der Prioritätsdaten auf und wartet, bis sie abgeschlossen ist
-fetchPriorityConfig().then(() => {
- // Gibt die geladenen Prioritätsdaten in der Konsole aus, um zu überprüfen, ob die Daten korrekt geladen wurden
- console.log("Prioritätsdaten wurden geladen:", priorityConfig);
-
- // Testet die Funktion getColorClass für verschiedene Level und gibt die entsprechenden Farben aus
- console.log("Farbe für Level 0:", getColorClass(0)); // Farbe für Level 0 anzeigen
- console.log("Farbe für Level 1:", getColorClass(1)); // Farbe für Level 1 anzeigen
- console.log("Farbe für Level 2:", getColorClass(2)); // Farbe für Level 2 anzeigen
- console.log("Farbe für Level 3:", getColorClass(3)); // Farbe für Level 3 anzeigen
- console.log("Farbe für Level 4:", getColorClass(4)); // Farbe für Level 4 anzeigen
- console.log("Farbe für Level 100:", getColorClass(100)); // Farbe für Level 100 anzeigen
- console.log("Farbe für Level 101:", getColorClass(101)); // Farbe für Level 101 anzeigen
-}); */
-
-// Funktion zum Erstellen und Setzen von Markern
-// Funktion zum Erstellen und Setzen von Markern
-export const createAndSetDevices = async (systemId, setMarkersFunction, GisSystemStatic) => {
+export const createAndSetDevices = async (systemId, setMarkersFunction, GisSystemStatic, priorityConfig) => {
try {
- // Lade die statischen Daten
const response1 = await fetch(config.mapGisStationsStaticDistrictUrl);
const jsonResponse = await response1.json();
const response2 = await fetch(config.mapGisStationsStatusDistrictUrl);
const statusResponse = await response2.json();
- //console.log("statusResponse: ", statusResponse);
- const getIdSystemAndAllowValueMap = new Map(GisSystemStatic.map((system) => [system.IdSystem, system.Allow]));
+ if (!jsonResponse.Points || !statusResponse.Statis) {
+ console.error("❌ Fehlende Daten in API-Response!");
+ return;
+ }
- if (jsonResponse.Points && statusResponse.Statis) {
- const statisMap = new Map(statusResponse.Statis.map((s) => [s.IdLD, { color: s.Co, level: s.Le }]));
+ console.log("✅ API-Daten geladen:", jsonResponse.Points.length, "Punkte gefunden.");
- // console.log("idLD , Farbe und Level: ", statisMap);
+ // Erstelle eine Map für Statusinformationen
+ const statisMap = new Map(statusResponse.Statis.map((s) => [s.IdLD, s]));
- let markersData = jsonResponse.Points.filter((station) => station.System === systemId && getIdSystemAndAllowValueMap.get(station.System) === 1).map((station) => {
- // Statusdaten für die Station abrufen
- const statisForStation = statusResponse.Statis.filter((status) => status.IdLD === station.IdLD);
+ // Speichere `idLD` und `Active` Werte in Redux
+ const allLines = jsonResponse.Points.filter((station) => station.System === systemId).map((station) => {
+ console.log("------------------------");
+ console.log("station.IdLD: ", station.IdLD);
+ console.log("station.Active: ", station.Active);
+ console.log("------------------------");
- // Niedrigstes Level ermitteln
- const minLevel = Math.min(...statisForStation.map((status) => status.Le));
+ // Redux: Aktualisiere `idLD` und `Active` Werte
+ store.dispatch(updateLineStatus({ idLD: station.IdLD, active: station.Active }));
- // Farbe für das niedrigste Level bestimmen
- const color = getColorClass(minLevel); // Farbe anhand des Levels
+ return {
+ idLD: station.IdLD,
+ active: station.Active,
+ };
+ });
- //console.log(`Station: ${station.LD_Name}, Min Level: ${minLevel}, Color: ${color}`);
- const statisData = statisMap.get(station.IdLD); // Hole Farbe und Level
- const outerColor = statisData ? statisData.color : "#008013"; // Dynamische Farbe oder Standard-Grün
- const innerColor = "rgba(255, 255, 255, 0.8)"; // Weiß mit 80% Deckkraft
+ console.log("🔄 Alle Linien gespeichert:", allLines);
- const marker = L.marker([station.X, station.Y], {
- icon: L.divIcon({
- className: `custom-marker`,
- html: `
-
-
-
-
-
-

-
`,
- iconSize: [30, 45],
- iconAnchor: [27, 41],
- popupAnchor: [1, -34],
- }),
- areaName: station.Area_Name, // Stelle sicher, dass dieser Bereich gesetzt wird
- link: station.Link,
+ // Filtere nur aktive Stationen für Marker
+ const activeStations = jsonResponse.Points.filter((station) => station.System === systemId && station.Active === 1);
+ console.log("🔍 Gefilterte aktive Stationen:", activeStations);
- zIndexOffset: 100 * (6 - minLevel),
- });
+ let markersData = activeStations.map((station) => {
+ const statis = statisMap.get(station.IdLD);
+ const iconPath = statis ? `img/icons/${statis.Na}-marker-icon-${station.Icon}.png` : `img/icons/marker-icon-${station.Icon}.png`;
- // Popup-Info dynamisch erstellen
- const statusInfo = statisForStation
- .map(
- (status) => `
-
-
- ${status.Me}
(${status.Na})
-
- `
- )
- .join("");
+ const priority = determinePriority(iconPath, priorityConfig);
+ const zIndexOffset = 100 * (5 - priority);
- marker.bindPopup(`
-
-
${station.LD_Name}
-
${station.Device}
-
${station.Area_Short} (${station.Area_Name})
-
${station.Location_Short} (${station.Location_Name})
-
${statusInfo}
-
- `);
-
- // **Mouseover zeigt Popup**
- marker.on("mouseover", function () {
- this.openPopup();
- });
-
- // **Mouseout schließt Popup**
- marker.on("mouseout", function () {
- this.closePopup();
- });
-
- return marker;
+ const marker = L.marker([station.X, station.Y], {
+ icon: L.icon({
+ iconUrl: iconPath,
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ }),
+ areaName: station.Area_Name,
+ link: station.Link,
+ zIndexOffset: zIndexOffset,
});
- setMarkersFunction(markersData);
- }
+ marker.bindPopup(`
+
+
${station.LD_Name}
+
${station.Device}
+
${station.Area_Short} (${station.Area_Name})
+
${station.Location_Short} (${station.Location_Name})
+
+ ${statusResponse.Statis.filter((status) => status.IdLD === station.IdLD)
+ .reverse()
+ .map(
+ (status) => `
+
+
+ ${status.Me}
(${status.Na})
+
+ `
+ )
+ .join("")}
+
+
+ `);
+
+ marker.on("mouseover", function () {
+ this.openPopup();
+ });
+
+ marker.on("mouseout", function () {
+ this.closePopup();
+ });
+
+ marker.on("contextmenu", function (event) {
+ if (event && event.preventDefault) event.preventDefault();
+ this.openPopup();
+ });
+
+ document.addEventListener("mouseout", function (event) {
+ if (event.relatedTarget === null || event.relatedTarget.nodeName === "BODY") {
+ enablePolylineEvents(window.polylines, window.lineColors);
+ }
+ });
+
+ if (typeof marker.bounce === "function" && statis) {
+ marker.on("add", () => marker.bounce(3));
+ }
+
+ return marker;
+ });
+
+ console.log("📌 Marker erstellt:", markersData.length, markersData);
+
+ setMarkersFunction(markersData);
} catch (error) {
- console.error("Fehler beim Abrufen der Daten: ", error);
+ console.error("❌ Fehler beim Abrufen der Daten in createAndSetDevices.js: ", error);
}
};
diff --git a/utils/mapUtils.js b/utils/mapUtils.js
index 1250bb44c..89d13493b 100644
--- a/utils/mapUtils.js
+++ b/utils/mapUtils.js
@@ -1,41 +1,6 @@
// /utils/mapUtils.js
import L from "leaflet";
-export const redrawPolyline = (lineData, lineColors, tooltipContents, map) => {
- if (!lineData || !lineColors || !tooltipContents || !map) {
- console.error("Invalid parameters for redrawPolyline");
- return;
- }
-
- if (!lineData.coordinates || !Array.isArray(lineData.coordinates)) {
- console.error("Invalid coordinates in lineData");
- return;
- }
-
- const color = lineColors[lineData.idModul] || "#000000";
- const tooltipContent = tooltipContents[lineData.idModul] || "Standard-Tooltip-Inhalt";
-
- if (lineData.polyline) map.removeLayer(lineData.polyline);
-
- lineData.polyline = L.polyline(lineData.coordinates, {
- color: color,
- }).addTo(map);
-
- lineData.polyline.bindTooltip(tooltipContent, {
- permanent: false,
- direction: "auto",
- });
-
- lineData.polyline.on("mouseover", () => {
- lineData.polyline.setStyle({ weight: 10 });
- lineData.polyline.bringToFront();
- });
-
- lineData.polyline.on("mouseout", () => {
- lineData.polyline.setStyle({ weight: 5 });
- });
-};
-
export const saveLineData = (lineData) => {
fetch("/api/talas_v5_DB/gisLines/updateLineCoordinates", {
method: "POST",
@@ -86,7 +51,8 @@ export const checkOverlappingMarkers = (map, markers, plusIcon) => {
// Gruppiere Marker basierend auf ihrer Position
markers.forEach((marker) => {
- if (map.hasLayer(marker)) { // Überprüfen, ob der Marker sichtbar ist
+ if (map.hasLayer(marker)) {
+ // Überprüfen, ob der Marker sichtbar ist
const latlngStr = marker.getLatLng().toString();
if (overlappingGroups[latlngStr]) {
overlappingGroups[latlngStr].push(marker);
@@ -133,7 +99,6 @@ export const checkOverlappingMarkers = (map, markers, plusIcon) => {
}
};
-
export const handlePlusIconClick = (map, markers, oms, clickedLatLng) => {
// Debugging-Ausgabe
console.log("Plus-Icon Position:", clickedLatLng);
diff --git a/utils/mysqlPool.js b/utils/mysqlPool.js
index d9cc249fd..80b5f98ef 100644
--- a/utils/mysqlPool.js
+++ b/utils/mysqlPool.js
@@ -7,7 +7,7 @@ let connectionCount = 0; // Zähler für die aktiven Verbindungen
function getPool() {
if (!cachedPool) {
cachedPool = mysql.createPool({
- host: "127.0.0.1",
+ host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
diff --git a/utils/setupPOIs.js b/utils/setupPOIs.js
index 7aa30d322..7abc7c945 100644
--- a/utils/setupPOIs.js
+++ b/utils/setupPOIs.js
@@ -83,9 +83,7 @@ export const setupPOIs = async (
`);
marker.on("mouseover", function () {
- //loaclStorage benutzen statt console.log
- //console.log("Device Name:", marker); // Debugging
- localStorage.setItem("deviceName", marker.options.name);
+ console.log("Device Name:", marker); // Debugging
handlePoiSelect(
{
id: location.idPoi,
diff --git a/utils/setupPolylines copy.js b/utils/setupPolylines copy.js
new file mode 100644
index 000000000..7e28edeeb
--- /dev/null
+++ b/utils/setupPolylines copy.js
@@ -0,0 +1,423 @@
+// utils/setupPolylines.js
+import { findClosestPoints } from "./geometryUtils";
+import handlePoiSelect from "./handlePoiSelect";
+import { updateLocationInDatabase } from "../services/apiService";
+import { handleEditPoi, insertNewPOI, removePOI } from "./poiUtils";
+import { parsePoint } from "./geometryUtils";
+import circleIcon from "../components/gisPolylines/icons/CircleIcon";
+import startIcon from "../components/gisPolylines/icons/StartIcon";
+import endIcon from "../components/gisPolylines/icons/EndIcon";
+import { redrawPolyline } from "./mapUtils";
+import { openInNewTab } from "./openInNewTab";
+import { toast } from "react-toastify";
+import { polylineLayerVisibleState } from "../store/atoms/polylineLayerVisibleState";
+import { useRecoilValue } from "recoil";
+
+// Funktion zum Deaktivieren der Polyline-Ereignisse
+export function disablePolylineEvents(polylines) {
+ polylines.forEach((polyline) => {
+ polyline.off("mouseover");
+ polyline.off("mouseout");
+ });
+}
+
+// Funktion zum Aktivieren der Polyline-Ereignisse
+export function enablePolylineEvents(polylines, lineColors) {
+ // Überprüfe, ob polylines definiert ist und ob es Elemente enthält
+ if (!polylines || polylines.length === 0) {
+ //console.warn("Keine Polylinien vorhanden oder polylines ist undefined.");
+ return;
+ }
+
+ // Falls Polylinien vorhanden sind, wende die Events an
+ polylines.forEach((polyline) => {
+ polyline.on("mouseover", (e) => {
+ //console.log("Mouseover on polyline", polyline.options);
+ polyline.setStyle({ weight: 14 });
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?id=${polyline.options.idLD}`;
+ //localStorage.setItem("lastElementType", "polyline");
+ //localStorage.setItem("polylineLink", link);
+ });
+
+ polyline.on("mouseout", (e) => {
+ //console.log("Mouseout from polyline", polyline.options);
+ polyline.setStyle({ weight: 3 });
+ });
+ });
+}
+// Funktion zum Schließen des Kontextmenüs und Entfernen der Markierung
+function closePolylineSelectionAndContextMenu(map) {
+ try {
+ // Entferne alle markierten Polylinien
+ if (window.selectedPolyline) {
+ window.selectedPolyline.setStyle({ weight: 3 }); // Originalstil wiederherstellen
+ window.selectedPolyline = null;
+ }
+
+ // Überprüfe, ob map und map.contextmenu definiert sind
+ if (map && map.contextmenu) {
+ map.contextmenu.hide(); // Kontextmenü schließen
+ } else {
+ console.warn("Kontextmenü ist nicht verfügbar.");
+ }
+ } catch (error) {
+ console.error("Fehler beim Schließen des Kontextmenüs:", error);
+ window.location.reload();
+ }
+
+ // Countdown-Status zurücksetzen
+ localStorage.removeItem("contextMenuCountdown");
+ localStorage.removeItem("contextMenuExpired");
+}
+
+// Überprüft regelmäßig den Status in localStorage
+function monitorContextMenu(map) {
+ setInterval(() => {
+ const isContextMenuExpired = localStorage.getItem("contextMenuExpired") === "true";
+ if (isContextMenuExpired) {
+ closePolylineSelectionAndContextMenu(map);
+ localStorage.removeItem("contextMenuExpired"); // Flagge entfernen, um wiederverwendbar zu sein
+ }
+ }, 1000); // Alle 1 Sekunde überprüfen
+}
+
+export const setupPolylines = (map, linePositions, lineColors, tooltipContents, setNewCoords, tempMarker, currentZoom, currentCenter, polylineVisible) => {
+ if (localStorage.getItem("polylineVisible") === null) {
+ localStorage.setItem("polylineVisible", "true"); // Standardwert setzen
+ polylineVisible = true; // Wert in der Funktion initialisieren
+ } else {
+ polylineVisible = localStorage.getItem("polylineVisible") === "true";
+ }
+
+ if (!polylineVisible) {
+ // Entferne alle Polylinien, wenn sie ausgeblendet werden sollen
+ if (window.polylines) {
+ window.polylines.forEach((polyline) => {
+ if (map.hasLayer(polyline)) {
+ map.removeLayer(polyline);
+ }
+ });
+ }
+ return { markers: [], polylines: [] };
+ }
+ const markers = [];
+ const polylines = [];
+ const editMode = localStorage.getItem("editMode") === "true"; // Prüfen, ob der Bearbeitungsmodus aktiv ist
+
+ linePositions.forEach((lineData, lineIndex) => {
+ const lineMarkers = [];
+
+ lineData.coordinates.forEach((coord, index) => {
+ let icon = circleIcon;
+ if (index === 0) {
+ icon = startIcon;
+ } else if (index === lineData.coordinates.length - 1) {
+ icon = endIcon;
+ }
+
+ // Nur Marker mit circleIcon ausblenden, wenn Bearbeitungsmodus deaktiviert ist
+ if (icon !== circleIcon || editMode) {
+ const marker = L.marker(coord, {
+ icon: icon,
+ draggable: editMode, // Nur verschiebbar, wenn Bearbeitungsmodus aktiv ist
+ contextmenu: true,
+ contextmenuInheritItems: false,
+ contextmenuItems: [],
+ }).addTo(map);
+
+ marker.on("dragend", () => {
+ console.log("Marker wurde verschoben in setupPolylines.js");
+ if (editMode) {
+ const newCoords = marker.getLatLng();
+ setNewCoords(newCoords);
+ const newCoordinates = [...lineData.coordinates];
+ newCoordinates[index] = [newCoords.lat, newCoords.lng];
+
+ const updatedPolyline = L.polyline(newCoordinates, {
+ color: lineColors[`${lineData.idLD}-${lineData.idModul}`] || "#000000",
+ }).addTo(map);
+
+ updatedPolyline.bindTooltip(tooltipContents[`${lineData.idLD}-${lineData.idModul}`] || "Standard-Tooltip-Inhalt", {
+ permanent: false,
+ direction: "auto",
+ });
+
+ updatedPolyline.on("mouseover", () => {
+ updatedPolyline.setStyle({ weight: 20 });
+ updatedPolyline.bringToFront();
+ });
+
+ updatedPolyline.on("mouseout", () => {
+ updatedPolyline.setStyle({ weight: 3 });
+ });
+
+ polylines[lineIndex].remove();
+ polylines[lineIndex] = updatedPolyline;
+ lineData.coordinates = newCoordinates;
+
+ const requestData = {
+ idModul: lineData.idModul,
+ idLD: lineData.idLD,
+ newCoordinates,
+ };
+
+ fetch("/api/talas_v5_DB/gisLines/updateLineCoordinates", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(requestData),
+ })
+ .then((response) => {
+ if (!response.ok) {
+ return response.json().then((data) => {
+ throw new Error(data.error || "Unbekannter Fehler");
+ });
+ }
+ return response.json();
+ })
+ .then((data) => {
+ console.log("Koordinaten erfolgreich aktualisiert:", data);
+ })
+ .catch((error) => {
+ console.error("Fehler beim Aktualisieren der Koordinaten:", error.message);
+ });
+ } else {
+ toast.error("Benutzer hat keine Berechtigung zum Bearbeiten.", {
+ position: "top-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ });
+ }
+ });
+
+ marker.on("mouseover", function () {
+ this.bindContextMenu({
+ contextmenuItems: [
+ {
+ text: "Stützpunkt entfernen",
+ icon: "/img/icons/gisLines/remove-support-point.svg",
+ callback: () => {
+ if (editMode) {
+ const newCoords = marker.getLatLng();
+ const newCoordinates = [...lineData.coordinates];
+ newCoordinates[index] = [newCoords.lat, newCoords.lng];
+
+ removePOI(marker, lineData, currentZoom, currentCenter);
+ polylines[lineIndex].remove();
+ lineData.coordinates = newCoordinates;
+ } else {
+ toast.error("Benutzer hat keine Berechtigung zum Bearbeiten.", {
+ position: "top-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ });
+ }
+ },
+ },
+ ],
+ });
+ });
+
+ marker.on("mouseout", function () {
+ this.unbindContextMenu();
+ });
+
+ lineMarkers.push(marker);
+ }
+ });
+
+ const polyline = L.polyline(lineData.coordinates, {
+ color: lineColors[`${lineData.idLD}-${lineData.idModul}`] || "#000000",
+ weight: 3,
+ contextmenu: true,
+ contextmenuInheritItems: false, // Standard-Kontextmenü deaktivieren
+ contextmenuItems: [],
+ }).addTo(map);
+
+ // Füge "Stützpunkt hinzufügen" nur hinzu, wenn editMode aktiv ist
+ if (editMode) {
+ polyline.options.contextmenuItems.push(
+ {
+ text: "Station öffnen (Tab)",
+ icon: "/img/screen_new.png",
+ callback: (e) => {
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
+ window.open(link, "_blank");
+ },
+ },
+ { separator: true },
+
+ {
+ text: "Koordinaten anzeigen",
+ icon: "/img/not_listed_location.png",
+ callback: (e) => {
+ alert("Breitengrad: " + e.latlng.lat.toFixed(5) + "\nLängengrad: " + e.latlng.lng.toFixed(5));
+ },
+ },
+ { separator: true },
+ {
+ text: "Reinzoomen",
+ icon: "/img/zoom_in.png",
+ callback: (e) => map.zoomIn(),
+ },
+ {
+ text: "Rauszoomen",
+ icon: "/img/zoom_out.png",
+ callback: (e) => map.zoomOut(),
+ },
+ {
+ text: "Hier zentrieren",
+ icon: "/img/center_focus.png",
+ callback: (e) => map.panTo(e.latlng),
+ },
+ { separator: true },
+ {
+ text: "POI hinzufügen",
+ icon: "/img/add_station.png",
+ callback: (e) => {
+ // Hier kannst du die Logik für das Hinzufügen eines POIs implementieren
+ alert("POI hinzufügen an: " + e.latlng);
+ },
+ },
+ {
+ text: "Stützpunkt hinzufügen",
+ icon: "/img/icons/gisLines/add-support-point.svg",
+ callback: (e) => {
+ if (tempMarker) {
+ tempMarker.remove();
+ }
+ const newPoint = e.latlng;
+ const closestPoints = findClosestPoints(lineData.coordinates, newPoint, map);
+ insertNewPOI(closestPoints, newPoint, lineData, map);
+ redrawPolyline(lineData, lineColors, tooltipContents, map);
+ window.location.reload();
+ },
+ }
+ );
+ } else {
+ polyline.options.contextmenuItems.push(
+ {
+ text: "Station öffnen (Tab)",
+ icon: "/img/screen_new.png",
+ callback: (e) => {
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
+ window.open(link, "_blank");
+ },
+ },
+ { separator: true },
+
+ {
+ text: "Koordinaten anzeigen",
+ icon: "/img/not_listed_location.png",
+ callback: (e) => {
+ alert("Breitengrad: " + e.latlng.lat.toFixed(5) + "\nLängengrad: " + e.latlng.lng.toFixed(5));
+ },
+ },
+ { separator: true },
+ {
+ text: "Reinzoomen",
+ icon: "/img/zoom_in.png",
+ callback: (e) => map.zoomIn(),
+ },
+ {
+ text: "Rauszoomen",
+ icon: "/img/zoom_out.png",
+ callback: (e) => map.zoomOut(),
+ },
+
+ {
+ text: "Hier zentrieren",
+ icon: "/img/center_focus.png",
+ callback: (e) => map.panTo(e.latlng),
+ },
+ { separator: true },
+ {
+ text: "POI hinzufügen",
+ icon: "/img/add_station.png",
+ callback: (e) => {
+ // Hier kannst du die Logik für das Hinzufügen eines POIs implementieren
+ alert("POI hinzufügen an: " + e.latlng);
+ },
+ }
+ );
+ }
+
+ // Hier wird der Tooltip hinzugefügt
+ polyline.bindTooltip(tooltipContents[`${lineData.idLD}-${lineData.idModul}`] || "Standard-Tooltip-Inhalt", {
+ permanent: false,
+ direction: "auto",
+ });
+
+ polyline.on("mouseover", (e) => {
+ const startTime = Date.now(); // Startzeit erfassen
+ localStorage.setItem("contextMenuStartTime", startTime); // Speichern in localStorage
+
+ // Starte einen Intervall-Timer, um die Differenz zu berechnen
+ /* const countdownInterval = setInterval(() => {
+ const currentTime = Date.now();
+ const elapsedTime = (currentTime - startTime) / 1000; // Differenz in Sekunden
+
+ // Speichern der abgelaufenen Zeit in localStorage
+ localStorage.setItem("contextMenuCountdown", elapsedTime);
+
+ // Wenn die Zeit 17 Sekunden erreicht, schließe das Menü
+ if (elapsedTime >= 17) {
+ clearInterval(countdownInterval);
+ const contextMenu = map.contextmenu; // Zugriff auf das Kontextmenü
+ contextMenu.hide(); // Kontextmenü schließen
+ }
+ }, 1000); */
+ // Jede Sekunde
+ //console.log("Mouseover on polyline", lineData);
+ polyline.setStyle({ weight: 14 });
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
+ console.log("Link der Linie:", link);
+ //localStorage.setItem("lastElementType", "polyline");
+ //localStorage.setItem("polylineLink", link);
+ });
+
+ polyline.on("mouseout", (e) => {
+ // console.log("Mouseout from polyline", lineData);
+ polyline.setStyle({ weight: 3 });
+ // Setze den Countdown auf 0, wenn mouseout ausgelöst wird
+ localStorage.setItem("contextMenuCountdown", 0);
+ });
+ // Speichere den Link bei einem Rechtsklick (Kontextmenü)
+ /*
+ polyline.on("contextmenu", (e) => {
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
+ console.log("Link der Linie (via Rechtsklick):", link);
+ localStorage.setItem("lastElementType", "polyline");
+ localStorage.setItem("polylineLink", link);
+ });
+ */
+ // Starte den Timer zum Schließen des Kontextmenüs nach 15 Sekunden
+ polyline.on("contextmenu", function (e) {
+ const contextMenu = this._map.contextmenu; // Zugriff auf das Kontextmenü
+ const closeMenu = () => contextMenu.hide(); // Funktion zum Schließen des Menüs
+
+ const countdown = parseInt(localStorage.getItem("contextMenuCountdown"), 30);
+ if (countdown >= 28) {
+ closeMenu();
+ }
+ });
+
+ polylines.push(polyline);
+ markers.push(...lineMarkers);
+ });
+
+ // Speichere Polylines und LineColors global für den Zugriff in anderen Funktionen
+ window.polylines = polylines;
+ window.lineColors = lineColors;
+ monitorContextMenu(map);
+ return { markers, polylines };
+};
diff --git a/utils/setupPolylines.js b/utils/setupPolylines.js
index 9cc8f418b..8abfd3d52 100644
--- a/utils/setupPolylines.js
+++ b/utils/setupPolylines.js
@@ -12,11 +12,7 @@ import { openInNewTab } from "./openInNewTab";
import { toast } from "react-toastify";
import { polylineLayerVisibleState } from "../redux/slices/polylineLayerVisibleSlice";
import { useRecoilValue } from "recoil";
-
-const protocol = window.location.protocol; // z. B. 'http:' oder 'https:'
-const hostname = window.location.hostname; // z. B. 'example.com'
-const originWithoutPort = `${protocol}//${hostname}`; // z. B. 'https://example.com'
-const BASE_URL = `${originWithoutPort}/talas5/devices/`; // Dynamische Basis-URL
+import { store } from "../redux/store"; // Importiere den Store
// Funktion zum Deaktivieren der Polyline-Ereignisse
export function disablePolylineEvents(polylines) {
@@ -39,7 +35,7 @@ export function enablePolylineEvents(polylines, lineColors) {
polyline.on("mouseover", (e) => {
//console.log("Mouseover on polyline", polyline.options);
polyline.setStyle({ weight: 14 });
- const link = `${BASE_URL}cpl.aspx?id=${polyline.options.idLD}`;
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?id=${polyline.options.idLD}`;
//localStorage.setItem("lastElementType", "polyline");
//localStorage.setItem("polylineLink", link);
});
@@ -87,6 +83,15 @@ function monitorContextMenu(map) {
}
export const setupPolylines = (map, linePositions, lineColors, tooltipContents, setNewCoords, tempMarker, currentZoom, currentCenter, polylineVisible) => {
+ // Hole activeLines direkt aus Redux
+ const state = store.getState(); // Hole den gesamten Zustand
+ const activeLines = state.lineVisibility.activeLines; // Zugriff auf activeLines
+
+ if (!activeLines) {
+ console.warn("activeLines ist undefined oder null.");
+ return { markers: [], polylines: [] };
+ }
+
if (localStorage.getItem("polylineVisible") === null) {
localStorage.setItem("polylineVisible", "true"); // Standardwert setzen
polylineVisible = true; // Wert in der Funktion initialisieren
@@ -110,6 +115,17 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents,
const editMode = localStorage.getItem("editMode") === "true"; // Prüfen, ob der Bearbeitungsmodus aktiv ist
linePositions.forEach((lineData, lineIndex) => {
+ console.log("LineData:", lineData.idLD, lineData.idModul);
+ console.log("ActiveLines:", activeLines);
+
+ // **Fix: Sicherstellen, dass activeLines definiert ist und idLD existiert**
+ const isActive = activeLines && lineData.idLD && activeLines[String(lineData.idLD)] === 1;
+
+ if (!isActive) {
+ console.warn(`Linie mit idLD ${lineData.idLD} wird ausgeblendet.`);
+ return;
+ }
+
const lineMarkers = [];
lineData.coordinates.forEach((coord, index) => {
@@ -142,7 +158,7 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents,
color: lineColors[`${lineData.idLD}-${lineData.idModul}`] || "#000000",
}).addTo(map);
- updatedPolyline.bindTooltip(tooltipContents[`${lineData.idLD}-${lineData.idModul}`] || "Standard-Tooltip-Inhalt", {
+ updatedPolyline.bindTooltip(tooltipContents[`${lineData.idLD}-${lineData.idModul}`] || "Standard-Tooltip-Inhalt setup 1", {
permanent: false,
direction: "auto",
});
@@ -255,7 +271,7 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents,
text: "Station öffnen (Tab)",
icon: "/img/screen_new.png",
callback: (e) => {
- const link = `${BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
window.open(link, "_blank");
},
},
@@ -314,7 +330,7 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents,
text: "Station öffnen (Tab)",
icon: "/img/screen_new.png",
callback: (e) => {
- const link = `${BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
window.open(link, "_blank");
},
},
@@ -357,7 +373,7 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents,
}
// Hier wird der Tooltip hinzugefügt
- polyline.bindTooltip(tooltipContents[`${lineData.idLD}-${lineData.idModul}`] || "Standard-Tooltip-Inhalt", {
+ polyline.bindTooltip(tooltipContents[`${lineData.idLD}-${lineData.idModul}`] || "Standard-Tooltip-Inhalt setup", {
permanent: false,
direction: "auto",
});
@@ -384,11 +400,10 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents,
// Jede Sekunde
//console.log("Mouseover on polyline", lineData);
polyline.setStyle({ weight: 14 });
- const link = `${BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
- //console.log("Link der Linie:", link);
-
+ const link = `${process.env.NEXT_PUBLIC_BASE_URL}cpl.aspx?ver=35&kue=24&id=${lineData.idLD}`;
+ console.log("Link der Linie:", link);
//localStorage.setItem("lastElementType", "polyline");
- localStorage.setItem("Link_der_Linie:", link);
+ //localStorage.setItem("polylineLink", link);
});
polyline.on("mouseout", (e) => {
diff --git a/utils/utils.js b/utils/utils.js
new file mode 100644
index 000000000..b5d4407c2
--- /dev/null
+++ b/utils/utils.js
@@ -0,0 +1,211 @@
+// /utils/utils.js
+import { useState } from "react";
+import circleIcon from "../components/CircleIcon";
+
+export const parsePoint = (position) => {
+ const [longitude, latitude] = position.slice(6, -1).split(" ");
+ return { latitude: parseFloat(latitude), longitude: parseFloat(longitude) };
+};
+//----------------------------------------------
+
+export const determinePriority = (iconPath) => {
+ const [priorityConfig, setPriorityConfig] = useState([]);
+ for (let priority of priorityConfig) {
+ if (iconPath.includes(priority.name.toLowerCase())) {
+ return priority.level;
+ }
+ }
+ return 5; // Default priority (lowest)
+};
+//----------------------------------------------
+export const createAndSetMarkers = async (systemId, setMarkersFunction) => {
+ try {
+ const response1 = await fetch(config.mapGisStationsStaticDistrictUrl);
+ const jsonResponse = await response1.json();
+ const response2 = await fetch(config.mapGisStationsStatusDistrictUrl);
+ const statusResponse = await response2.json();
+
+ const getIdSystemAndAllowValueMap = new Map(GisSystemStatic.map((system) => [system.IdSystem, system.Allow]));
+ //console.log("getIdSystemAndAllowValueMap:", getIdSystemAndAllowValueMap);
+
+ if (jsonResponse.Points && statusResponse.Statis) {
+ const statisMap = new Map(statusResponse.Statis.map((s) => [s.IdLD, s]));
+ let markersData = jsonResponse.Points.filter((station) => station.System === systemId && getIdSystemAndAllowValueMap.get(station.System) === 1).map((station) => {
+ const statis = statisMap.get(station.IdLD);
+ const iconPath = statis ? `img/icons/${statis.Na}-marker-icon-${station.Icon}.png` : `img/icons/marker-icon-${station.Icon}.png`;
+
+ const priority = determinePriority(iconPath);
+ const zIndexOffset = 100 * (5 - priority); // Adjusted for simplicity and positive values
+
+ const marker = L.marker([station.X, station.Y], {
+ icon: L.icon({
+ iconUrl: iconPath,
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ }),
+ areaName: station.Area_Name, // Stelle sicher, dass dieser Bereich gesetzt wird
+ link: station.Link,
+ zIndexOffset: zIndexOffset,
+ bounceOnAdd: !!statis,
+ });
+
+ if (statis) {
+ marker.on("add", () => marker.bounce(3));
+ }
+
+ const statusInfo = statusResponse.Statis.filter((status) => status.IdLD === station.IdLD)
+ .reverse()
+ .map(
+ (status) => `
+
+
+ ${status.Me}
(${status.Na})
+
+ `
+ )
+ .join("");
+
+ marker.bindPopup(`
+
+
${station.LD_Name}
+
${station.Device}
+
${station.Area_Short} (${station.Area_Name})
+
${station.Location_Short} (${station.Location_Name})
+
${statusInfo}
+
+ `);
+ return marker;
+ });
+
+ setMarkersFunction(markersData);
+ }
+ } catch (error) {
+ console.error("Error fetching data: ", error);
+ }
+};
+//----------------------------------------------
+export const fetchPriorityConfig = async () => {
+ try {
+ const response = await fetch("/api/talas_v5_DB/priorityConfig");
+ const data = await response.json();
+ console.log("Prioritätskonfiguration:", data);
+ setPriorityConfig(data);
+ } catch (error) {
+ console.error("Fehler beim Laden der Prioritätskonfiguration:", error);
+ }
+};
+//----------------------------------------------
+export const fetchGisStatusStations = async (idMap, idUser) => {
+ try {
+ const response = await fetch(`/api/talas5/webserviceMap/GisStationsStatusDistrict?idMap=${idMap}&idUser=${idUser}`);
+ if (!response.ok) {
+ throw new Error(`Error: ${response.statusText}`);
+ }
+ const data = await response.json();
+ console.log("GisStatusStations:", data);
+ return data;
+ } catch (error) {
+ console.error("Fehler beim Abrufen der Daten:", error);
+ }
+};
+//----------------------------------------------
+export const handleEditPoi = (marker) => {
+ // Prüfung, ob der Benutzer die notwendigen Rechte hat
+ if (!userRights || !userRights.includes(56)) {
+ toast.error("Benutzer hat keine Berechtigung zum Bearbeiten.", {
+ position: "top-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ });
+ console.log("Benutzer hat keine Berechtigung zum Bearbeiten.");
+ return; // Beendet die Funktion frühzeitig, wenn keine Berechtigung vorliegt
+ }
+
+ //console.log("Selected Marker ID (idPoi):", marker.options.idPoi);
+ //console.log("Selected Marker Description:", marker.options.description);
+
+ setCurrentPoiData({
+ idPoi: marker.options.id,
+ name: marker.options.name,
+ description: marker.options.description,
+ });
+ //console.log("POI-Daten1:", currentPoiData);
+
+ fetchPoiData(marker.options.id);
+
+ setShowPoiUpdateModal(true);
+};
+//----------------------------------------------
+export const insertNewMarker = (closestPoints, newPoint, lineData, map) => {
+ const newMarker = L.marker(newPoint, {
+ icon: circleIcon,
+ draggable: true,
+ }).addTo(map);
+ lineData.coordinates.splice(closestPoints[2], 0, [newPoint.lat, newPoint.lng]);
+
+ // Hier direkt speichern nach Einfügen
+ saveLineData(lineData);
+
+ redrawPolyline(lineData);
+
+ // Event-Listener für das Verschieben des Markers hinzufügen
+ newMarker.on("dragend", () => {
+ const newCoords = newMarker.getLatLng();
+ setNewCoords(newCoords);
+ const newCoordinates = [...lineData.coordinates];
+ newCoordinates[closestPoints[2]] = [newCoords.lat, newCoords.lng];
+ lineData.coordinates = newCoordinates;
+ redrawPolyline(lineData);
+
+ updateMarkerPosition(newMarker.getLatLng(), lineData, newMarker);
+ saveLineData(lineData); // Speichern der neuen Koordinaten nach dem Verschieben
+ });
+};
+//----------------------------------------------
+/* export const addItemsToMapContextMenu = () => {
+ const [menuItemAdded, setMenuItemAdded] = useState(false);
+ if (!menuItemAdded) {
+ //console.log("contextMenuItems hasRights:", hasRights);
+
+ map.contextmenu.addItem({
+ text: "POI hinzufügen",
+ icon: "img/add_station.png",
+ className: "background-red",
+ callback: (event) => addStationCallback(event, hasRights),
+ });
+
+ setMenuItemAdded(true); // Menüpunkt wurde hinzugefült, Zustand aktualisieren
+ }
+}; */
+//----------------------------------------------
+export const saveLineData = (lineData) => {
+ fetch("/api/talas_v5_DB/gisLines/updateLineCoordinates", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ idModul: lineData.idModul,
+ idLD: lineData.idLD,
+ newCoordinates: lineData.coordinates,
+ }),
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error("Fehler beim Speichern der Linienänderungen");
+ }
+ return response.json();
+ })
+ .then((data) => {
+ console.log("Linienänderungen gespeichert:", data);
+ })
+ .catch((error) => {
+ console.error("Fehler beim Speichern der Linienänderungen:", error);
+ });
+};
+//----------------------------------------------