fix: Kabelstrecken werden ausgeblendet

This commit is contained in:
ISA
2025-08-22 09:46:31 +02:00
parent bf7b62d110
commit f2a322a91b
8 changed files with 82 additions and 36 deletions

View File

@@ -24,4 +24,4 @@ NEXT_PUBLIC_USE_MOCKS=true
# z.B. http://10.10.0.13/xyz/index.aspx -> basePath in config.json auf /xyz setzen # z.B. http://10.10.0.13/xyz/index.aspx -> basePath in config.json auf /xyz setzen
# basePath wird jetzt in public/config.json gepflegt # basePath wird jetzt in public/config.json gepflegt
# App-Versionsnummer # App-Versionsnummer
NEXT_PUBLIC_APP_VERSION=1.1.341 NEXT_PUBLIC_APP_VERSION=1.1.342

View File

@@ -25,4 +25,4 @@ NEXT_PUBLIC_USE_MOCKS=false
# basePath wird jetzt in public/config.json gepflegt # basePath wird jetzt in public/config.json gepflegt
# App-Versionsnummer # App-Versionsnummer
NEXT_PUBLIC_APP_VERSION=1.1.341 NEXT_PUBLIC_APP_VERSION=1.1.342

View File

@@ -367,6 +367,14 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
//Tooltip an mouse position anzeigen für die Linien //Tooltip an mouse position anzeigen für die Linien
useEffect(() => { useEffect(() => {
if (!map) return; if (!map) return;
console.log(
"[MapComponent/useEffect] polylineVisible:",
polylineVisible,
"isTalasAllowed:",
isTalasAllowed,
"poiLayerVisible:",
poiLayerVisible
);
// Wenn TALAS nicht erlaubt ist, Polyline-Checkbox und Anzeige deaktivieren // Wenn TALAS nicht erlaubt ist, Polyline-Checkbox und Anzeige deaktivieren
if (!isTalasAllowed) { if (!isTalasAllowed) {
@@ -381,6 +389,7 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
marker.remove(); marker.remove();
}); });
cleanupPolylinesForMemory(polylines, map); cleanupPolylinesForMemory(polylines, map);
console.log("[MapComponent/useEffect] Nach cleanupPolylinesForMemory, polylines:", polylines);
// Setze neue Marker und Polylinien mit den aktuellen Daten (asynchron!) // Setze neue Marker und Polylinien mit den aktuellen Daten (asynchron!)
const updatePolylines = async () => { const updatePolylines = async () => {
@@ -442,9 +451,19 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
cleanupMarkers(markers, oms); cleanupMarkers(markers, oms);
setMarkers(newMarkers); setMarkers(newMarkers);
setPolylines(newPolylines); setPolylines(newPolylines);
console.log("[MapComponent/useEffect] setPolylines (sichtbar):", newPolylines);
} else { } else {
// Entferne wirklich alle Polylinien-Layer von der Karte
if (map) {
map.eachLayer(layer => {
if (layer instanceof L.Polyline) {
map.removeLayer(layer);
}
});
}
cleanupPolylinesForMemory(polylines, map); cleanupPolylinesForMemory(polylines, map);
setPolylines([]); setPolylines([]);
console.log("[MapComponent/useEffect] setPolylines ([]), alle Polylinien entfernt");
} }
}; };
updatePolylines(); updatePolylines();

View File

@@ -6,7 +6,6 @@ import { useSelector, useDispatch } from "react-redux";
import { import {
selectPolylineVisible, selectPolylineVisible,
setPolylineVisible, setPolylineVisible,
initializePolylineFromLocalStorageThunk,
} from "@/redux/slices/database/polylines/polylineLayerVisibleSlice"; } from "@/redux/slices/database/polylines/polylineLayerVisibleSlice";
import { selectGisSystemStatic } from "@/redux/slices/webservice/gisSystemStaticSlice"; import { selectGisSystemStatic } from "@/redux/slices/webservice/gisSystemStaticSlice";
import { selectGisStationsStaticDistrict } from "@/redux/slices/webservice/gisStationsStaticDistrictSlice"; import { selectGisStationsStaticDistrict } from "@/redux/slices/webservice/gisStationsStaticDistrictSlice";
@@ -15,11 +14,9 @@ import { setVisible } from "@/redux/slices/database/pois/poiLayerVisibleSlice";
import { incrementZoomTrigger } from "@/redux/slices/zoomTriggerSlice"; import { incrementZoomTrigger } from "@/redux/slices/zoomTriggerSlice";
function MapLayersControlPanel() { function MapLayersControlPanel() {
// Dummy state to force re-render after checkbox click (workaround for Redux/localStorage sync)
const [forceUpdate, setForceUpdate] = useState(0);
const [editMode, setEditMode] = useState(false); // Zustand für editMode const [editMode, setEditMode] = useState(false); // Zustand für editMode
const [localStorageLoaded, setLocalStorageLoaded] = useState(false); // Tracking ob localStorage geladen wurde const [localStorageLoaded, setLocalStorageLoaded] = useState(false); // Tracking ob localStorage geladen wurde
const kabelstreckenVisible = useSelector(selectPolylineVisible); // Redux State für Kabelstrecken const kabelstreckenVisible = useSelector(selectPolylineVisible); // Nur noch Redux
const poiVisible = useSelector(state => state.poiLayerVisible.visible); const poiVisible = useSelector(state => state.poiLayerVisible.visible);
const setPoiVisible = value => dispatch(setVisible(value)); const setPoiVisible = value => dispatch(setVisible(value));
const dispatch = useDispatch(); const dispatch = useDispatch();
@@ -43,18 +40,26 @@ function MapLayersControlPanel() {
const handlePolylineCheckboxChange = event => { const handlePolylineCheckboxChange = event => {
const checked = event.target.checked; const checked = event.target.checked;
// Debug-Ausgabe
const params = new URLSearchParams(window.location.search);
const mapId = params.get("m");
const userId = params.get("u");
const polylineKey =
mapId && userId ? `polylineVisible_m${mapId}_u${userId}` : "polylineVisible";
console.log(
"[UI/handlePolylineCheckboxChange] checked:",
checked,
"Redux:",
kabelstreckenVisible,
"localStorage:",
localStorage.getItem(polylineKey)
);
dispatch(setPolylineVisible(checked)); dispatch(setPolylineVisible(checked));
// Synchronisiere Redux nach localStorage-Update
setTimeout(() => {
dispatch(initializePolylineFromLocalStorageThunk());
setForceUpdate(f => f + 1); // Force re-render
const event = new Event("polylineVisibilityChanged");
window.dispatchEvent(event);
}, 100);
// Wenn aktiviert, TALAS aktivieren // Wenn aktiviert, TALAS aktivieren
if (checked) { if (checked) {
const talasKey = "system-1"; const talasKey = "system-1";
dispatch(setLayerVisibility({ layer: talasKey, visibility: true })); dispatch(setLayerVisibility({ layer: talasKey, visibility: true }));
// Optional: mapLayersVisibility im localStorage aktualisieren, aber nicht mehr für Sichtbarkeit nutzen
const mapId = localStorage.getItem("currentMapId"); const mapId = localStorage.getItem("currentMapId");
const userId = localStorage.getItem("currentUserId"); const userId = localStorage.getItem("currentUserId");
const mapStorageKey = const mapStorageKey =
@@ -64,23 +69,19 @@ function MapLayersControlPanel() {
} }
}; };
// Initialisiere Redux-State für Kabelstrecken-Checkbox bei Kartenwechsel (mapId/userId)
useEffect(() => { useEffect(() => {
// LocalStorage Werte beim ersten Laden der Komponente oder bei Kartenwechsel wiederherstellen // LocalStorage Werte beim ersten Laden der Komponente wiederherstellen (nur für POI und mapLayersVisibility, nicht mehr für Kabelstrecken)
const storedPoiVisible = localStorage.getItem("poiVisible"); const storedPoiVisible = localStorage.getItem("poiVisible");
if (storedPoiVisible !== null) { if (storedPoiVisible !== null) {
setPoiVisible(storedPoiVisible === "true"); setPoiVisible(storedPoiVisible === "true");
} }
// Kartenabhängige Sichtbarkeit für Kabelstrecken initialisieren // Kartenspezifischer localStorage-Key verwenden
const mapId = localStorage.getItem("currentMapId"); const mapId = localStorage.getItem("currentMapId");
const userId = localStorage.getItem("currentUserId"); const userId = localStorage.getItem("currentUserId");
const mapStorageKey = const mapStorageKey =
mapId && userId ? `mapLayersVisibility_m${mapId}_u${userId}` : "mapLayersVisibility"; mapId && userId ? `mapLayersVisibility_m${mapId}_u${userId}` : "mapLayersVisibility";
// Kabelstrecken-Checkbox initialisieren: Redux übernimmt map/user-spezifisch, keine Manipulation von 'polylineVisible' oder 'kabelstreckenVisible' hier mehr!
// mapLayersVisibility initialisieren
const storedMapLayersVisibility = localStorage.getItem(mapStorageKey); const storedMapLayersVisibility = localStorage.getItem(mapStorageKey);
if (storedMapLayersVisibility) { if (storedMapLayersVisibility) {
const parsedVisibility = JSON.parse(storedMapLayersVisibility); const parsedVisibility = JSON.parse(storedMapLayersVisibility);
@@ -88,6 +89,7 @@ function MapLayersControlPanel() {
dispatch(setLayerVisibility({ layer: key, visibility: parsedVisibility[key] })); dispatch(setLayerVisibility({ layer: key, visibility: parsedVisibility[key] }));
}); });
} else { } else {
// Initialisiere mapLayersVisibility basierend auf Allow & Map (nur Systeme mit Map===1 anzeigen)
if (Array.isArray(GisSystemStatic)) { if (Array.isArray(GisSystemStatic)) {
const initialVisibility = {}; const initialVisibility = {};
GisSystemStatic.forEach(system => { GisSystemStatic.forEach(system => {
@@ -106,7 +108,7 @@ function MapLayersControlPanel() {
setEditMode(storedEditMode === "true"); setEditMode(storedEditMode === "true");
setLocalStorageLoaded(true); setLocalStorageLoaded(true);
}, [localStorage.getItem("currentMapId"), localStorage.getItem("currentUserId")]); }, []); // Läuft nur beim Mount
const handleAreaChange = event => { const handleAreaChange = event => {
const selectedIndex = event.target.options.selectedIndex; const selectedIndex = event.target.options.selectedIndex;
@@ -165,16 +167,32 @@ function MapLayersControlPanel() {
const handleCheckboxChange = (key, event) => { const handleCheckboxChange = (key, event) => {
if (editMode) return; if (editMode) return;
const { checked } = event.target; const { checked } = event.target;
// Debug-Ausgabe
const params = new URLSearchParams(window.location.search);
const mapId = params.get("m");
const userId = params.get("u");
const polylineKey =
mapId && userId ? `polylineVisible_m${mapId}_u${userId}` : "polylineVisible";
console.log(
"[UI/handleCheckboxChange] key:",
key,
"checked:",
checked,
"Redux:",
kabelstreckenVisible,
"localStorage:",
localStorage.getItem(polylineKey)
);
dispatch(setLayerVisibility({ layer: key, visibility: checked })); dispatch(setLayerVisibility({ layer: key, visibility: checked }));
const mapId = localStorage.getItem("currentMapId"); const mapId2 = localStorage.getItem("currentMapId");
const userId = localStorage.getItem("currentUserId"); const userId2 = localStorage.getItem("currentUserId");
const mapStorageKey = const mapStorageKey =
mapId && userId ? `mapLayersVisibility_m${mapId}_u${userId}` : "mapLayersVisibility"; mapId2 && userId2 ? `mapLayersVisibility_m${mapId2}_u${userId2}` : "mapLayersVisibility";
localStorage.setItem(mapStorageKey, JSON.stringify({ ...mapLayersVisibility, [key]: checked })); localStorage.setItem(mapStorageKey, JSON.stringify({ ...mapLayersVisibility, [key]: checked }));
// Wenn TALAS (system-1) deaktiviert wird, Kabelstrecken deaktivieren // Wenn TALAS (system-1) deaktiviert wird, Kabelstrecken deaktivieren
if (key === "system-1" && !checked) { if (key === "system-1" && !checked) {
setKabelstreckenVisible(false); localStorage.setItem("kabelstreckenVisible", "false");
// entfernt: keine Manipulation von 'kabelstreckenVisible' oder 'polylineVisible' mehr localStorage.setItem("polylineVisible", "false");
dispatch(setPolylineVisible(false)); dispatch(setPolylineVisible(false));
setTimeout(() => { setTimeout(() => {
const polylineEvent = new Event("polylineVisibilityChanged"); const polylineEvent = new Event("polylineVisibilityChanged");
@@ -319,7 +337,7 @@ function MapLayersControlPanel() {
<div className="flex items-center"> <div className="flex items-center">
<input <input
type="checkbox" type="checkbox"
checked={kabelstreckenVisible} // Redux State checked={kabelstreckenVisible} // Lokaler State statt Redux
onChange={handlePolylineCheckboxChange} onChange={handlePolylineCheckboxChange}
id="polyline-checkbox" id="polyline-checkbox"
disabled={!isTalasAllowed || editMode} disabled={!isTalasAllowed || editMode}

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "nodemap", "name": "nodemap",
"version": "1.1.341", "version": "1.1.342",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "nodemap", "name": "nodemap",
"version": "1.1.341", "version": "1.1.342",
"dependencies": { "dependencies": {
"@emotion/react": "^11.13.3", "@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "nodemap", "name": "nodemap",
"version": "1.1.341", "version": "1.1.342",
"dependencies": { "dependencies": {
"@emotion/react": "^11.13.3", "@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",

View File

@@ -44,6 +44,14 @@ const polylineLayerVisibleSlice = createSlice({
if (mapId && userId) { if (mapId && userId) {
const key = `polylineVisible_m${mapId}_u${userId}`; const key = `polylineVisible_m${mapId}_u${userId}`;
localStorage.setItem(key, action.payload.toString()); localStorage.setItem(key, action.payload.toString());
console.log(
"[Redux/setPolylineVisible] payload:",
action.payload,
"key:",
key,
"localStorage:",
localStorage.getItem(key)
);
} }
} catch (e) { } catch (e) {
// fallback: do nothing // fallback: do nothing
@@ -54,7 +62,12 @@ const polylineLayerVisibleSlice = createSlice({
// Diese Action wird nur beim Initialisieren aus localStorage verwendet // Diese Action wird nur beim Initialisieren aus localStorage verwendet
state.visible = action.payload; state.visible = action.payload;
state.isInitialized = true; state.isInitialized = true;
console.log("🔧 Redux: initializePolylineFromLocalStorage called with:", action.payload); console.log(
"🔧 Redux: initializePolylineFromLocalStorage called with:",
action.payload,
"visible:",
state.visible
);
}, },
}, },
}); });

View File

@@ -37,19 +37,15 @@ export const setupPolylines = async (
basePath = config.basePath || ""; basePath = config.basePath || "";
} }
} catch (e) {} } catch (e) {}
if (!polylineVisible) {
//console.warn("Polylines deaktiviert - keine Zeichnung");
return { markers: [], polylines: [] };
}
if (!polylineVisible) { if (!polylineVisible) {
// Entferne alle Polylinien, wenn sie ausgeblendet werden sollen // Entferne alle Polylinien, wenn sie ausgeblendet werden sollen
if (window.polylines) { if (window.polylines) {
window.polylines.forEach(polyline => { window.polylines.forEach(polyline => {
if (map.hasLayer(polyline)) { if (map && map.hasLayer(polyline)) {
map.removeLayer(polyline); map.removeLayer(polyline);
} }
}); });
window.polylines = [];
} }
return { markers: [], polylines: [] }; return { markers: [], polylines: [] };
} }