WIP: polyline Slice visiblity

This commit is contained in:
ISA
2025-08-20 15:36:34 +02:00
parent ee5319a928
commit 44b29469b9
7 changed files with 26 additions and 71 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.329 NEXT_PUBLIC_APP_VERSION=1.1.330

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.329 NEXT_PUBLIC_APP_VERSION=1.1.330

View File

@@ -31,34 +31,26 @@ const useDynamicDeviceLayers = (map, GisSystemStatic, mapLayersVisibility, prior
GisSystemStatic.forEach(({ Name, IdSystem }) => { GisSystemStatic.forEach(({ Name, IdSystem }) => {
const key = `system-${IdSystem}`; const key = `system-${IdSystem}`;
// LayerGroup-Instanzierung und Bereinigung // LayerGroup immer komplett neu erstellen, um doppelte Marker zu verhindern
if (layerRefs.current[key]) { if (layerRefs.current[key]) {
// Entferne alte LayerGroup von der Map, falls vorhanden
if (map.hasLayer(layerRefs.current[key])) { if (map.hasLayer(layerRefs.current[key])) {
map.removeLayer(layerRefs.current[key]); map.removeLayer(layerRefs.current[key]);
} }
layerRefs.current[key].clearLayers(); layerRefs.current[key].clearLayers();
delete layerRefs.current[key];
} }
// Neue oder wiederverwendete LayerGroup anlegen und zur Map hinzufügen layerRefs.current[key] = new L.LayerGroup();
if (!layerRefs.current[key]) {
layerRefs.current[key] = new L.LayerGroup();
}
layerRefs.current[key].addTo(map); layerRefs.current[key].addTo(map);
// Debug-Ausgabe
/* console.log(
`[DeviceLayers] LayerGroup für ${key} auf Map hinzugefügt. Aktuelle LayerGroups:`,
Object.keys(layerRefs.current)
); */
createAndSetDevices( createAndSetDevices(
IdSystem, IdSystem,
newMarkers => { newMarkers => {
// Füge neue Marker der LayerGroup hinzu (nur Geräte-Marker) // Füge neue Marker der LayerGroup hinzu (nur Geräte-Marker)
if (layerRefs.current[key]) { if (layerRefs.current[key]) {
// Entferne alle Marker aus der LayerGroup, bevor neue hinzugefügt werden
layerRefs.current[key].clearLayers(); layerRefs.current[key].clearLayers();
newMarkers.forEach(marker => { // Nur eindeutige Marker hinzufügen
// Nur LayerGroup verwenden, nicht direkt auf map const uniqueMarkers = Array.isArray(newMarkers) ? Array.from(new Set(newMarkers)) : [];
uniqueMarkers.forEach(marker => {
marker.addTo(layerRefs.current[key]); marker.addTo(layerRefs.current[key]);
}); });
// Debug: Anzahl Marker in LayerGroup // Debug: Anzahl Marker in LayerGroup
@@ -83,29 +75,20 @@ const useDynamicDeviceLayers = (map, GisSystemStatic, mapLayersVisibility, prior
if (!map) return; if (!map) return;
const editMode = localStorage.getItem("editMode") === "true"; const editMode = localStorage.getItem("editMode") === "true";
Object.entries(markerStates).forEach(([key, markers]) => { Object.entries(layerRefs.current).forEach(([key, layerGroup]) => {
const isVisible = mapLayersVisibility[key] ?? true; // undefined = true const isVisible = mapLayersVisibility[key] ?? true;
if (editMode || isVisible === false) {
markers.forEach(marker => { if (map.hasLayer(layerGroup)) {
const hasLayer = map.hasLayer(marker); map.removeLayer(layerGroup);
// Logik korrigiert:
// - Im editMode: alle Marker verstecken
// - Nicht im editMode: nur sichtbare Marker anzeigen (isVisible === true)
if (editMode || isVisible === false) {
// Marker verstecken
if (hasLayer) {
map.removeLayer(marker);
}
} else if (isVisible === true) {
// Marker anzeigen (nur wenn explizit true)
if (!hasLayer) {
marker.addTo(map);
}
} }
}); } else if (isVisible === true) {
if (!map.hasLayer(layerGroup)) {
layerGroup.addTo(map);
}
}
}); });
// Overlapping-Check bleibt wie gehabt
const allMarkers = Object.values(markerStates).filter(Array.isArray).flat(); const allMarkers = Object.values(markerStates).filter(Array.isArray).flat();
checkOverlappingMarkers(map, allMarkers, plusRoundIcon); checkOverlappingMarkers(map, allMarkers, plusRoundIcon);
}, [map, markerStates, mapLayersVisibility]); }, [map, markerStates, mapLayersVisibility]);

View File

@@ -40,40 +40,24 @@ function MapLayersControlPanel() {
const handlePolylineCheckboxChange = event => { const handlePolylineCheckboxChange = event => {
const checked = event.target.checked; const checked = event.target.checked;
console.log("🖱️ Kabelstrecken checkbox clicked, new value:", checked);
// Beide localStorage-Variablen setzen für Kompatibilität
setKabelstreckenVisible(checked); setKabelstreckenVisible(checked);
localStorage.setItem("kabelstreckenVisible", checked.toString()); localStorage.setItem("kabelstreckenVisible", checked.toString());
localStorage.setItem("polylineVisible", checked.toString()); // Auch die alte Variable setzen localStorage.setItem("polylineVisible", checked.toString());
console.log("💾 Saved to localStorage as kabelstreckenVisible:", checked);
console.log("💾 Saved to localStorage as polylineVisible:", checked);
// Redux für andere Teile der App aktualisieren
dispatch(setPolylineVisible(checked)); dispatch(setPolylineVisible(checked));
// Event auslösen, damit andere Komponenten über die Änderung informiert werden
setTimeout(() => { setTimeout(() => {
const event = new Event("polylineVisibilityChanged"); const event = new Event("polylineVisibilityChanged");
window.dispatchEvent(event); window.dispatchEvent(event);
console.log("📢 Event 'polylineVisibilityChanged' dispatched");
}, 100); }, 100);
// Wenn aktiviert, TALAS aktivieren
// Wenn Kabelstrecken aktiviert wird, aktiviere automatisch auch TALAS (IdSystem 1)
if (checked) { if (checked) {
const talasKey = "system-1"; // TALAS hat IdSystem 1 const talasKey = "system-1";
dispatch(setLayerVisibility({ layer: talasKey, visibility: true })); dispatch(setLayerVisibility({ layer: talasKey, visibility: true }));
// 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";
const updatedVisibility = { ...mapLayersVisibility, [talasKey]: true }; const updatedVisibility = { ...mapLayersVisibility, [talasKey]: true };
localStorage.setItem(mapStorageKey, JSON.stringify(updatedVisibility)); localStorage.setItem(mapStorageKey, JSON.stringify(updatedVisibility));
console.log("🔗 Kabelstrecken aktiviert → TALAS automatisch aktiviert");
} }
}; };
@@ -221,35 +205,23 @@ function MapLayersControlPanel() {
const handleCheckboxChange = (key, event) => { const handleCheckboxChange = (key, event) => {
if (editMode) return; if (editMode) return;
const { checked } = event.target; const { checked } = event.target;
dispatch(setLayerVisibility({ layer: key, visibility: checked })); dispatch(setLayerVisibility({ layer: key, visibility: checked }));
// 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";
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, deaktiviere automatisch auch Kabelstrecken
if (key === "system-1" && !checked) { if (key === "system-1" && !checked) {
console.log("🔗 TALAS deaktiviert → Kabelstrecken automatisch deaktiviert");
// Kabelstrecken deaktivieren
setKabelstreckenVisible(false); setKabelstreckenVisible(false);
localStorage.setItem("kabelstreckenVisible", "false"); localStorage.setItem("kabelstreckenVisible", "false");
localStorage.setItem("polylineVisible", "false"); localStorage.setItem("polylineVisible", "false");
dispatch(setPolylineVisible(false)); dispatch(setPolylineVisible(false));
// Event für Kabelstrecken auslösen
setTimeout(() => { setTimeout(() => {
const polylineEvent = new Event("polylineVisibilityChanged"); const polylineEvent = new Event("polylineVisibilityChanged");
window.dispatchEvent(polylineEvent); window.dispatchEvent(polylineEvent);
console.log("📢 Event 'polylineVisibilityChanged' dispatched (auto-deactivated)");
}, 50); }, 50);
} }
setTimeout(() => { setTimeout(() => {
const event = new Event("visibilityChanged"); const event = new Event("visibilityChanged");
window.dispatchEvent(event); window.dispatchEvent(event);

Binary file not shown.

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "nodemap", "name": "nodemap",
"version": "1.1.329", "version": "1.1.330",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "nodemap", "name": "nodemap",
"version": "1.1.329", "version": "1.1.330",
"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.329", "version": "1.1.330",
"dependencies": { "dependencies": {
"@emotion/react": "^11.13.3", "@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0", "@emotion/styled": "^11.13.0",