// /components/pois/PoiUpdateModal.js import React, { useState, useEffect } from "react"; import Select from "react-select"; // Importiere react-select import { useRecoilState } from "recoil"; import { selectedPoiState } from "../../store/atoms/poiState"; import { currentPoiState } from "../../store/atoms/currentPoiState"; import { mapLayersState } from "../../store/atoms/mapLayersState"; const PoiUpdateModal = ({ onClose, poiData, onSubmit }) => { const currentPoi = useRecoilState(currentPoiState); const selectedPoi = useRecoilState(selectedPoiState); const [mapLayersVisibility] = useRecoilState(mapLayersState); const [poiId, setPoiId] = useState(poiData ? poiData.idPoi : ""); const [name, setName] = useState(poiData ? poiData.name : ""); const [poiTypData, setPoiTypData] = useState([]); const [poiTypeId, setPoiTypeId] = useState(null); // Verwende null für react-select const [locationDeviceData, setLocationDeviceData] = useState([]); const [filteredDevices, setFilteredDevices] = useState([]); const [deviceName, setDeviceName] = useState(poiData ? poiData.deviceName : null); // Verwende null für react-select const [idLD, setIdLD] = useState(poiData ? poiData.idLD : ""); const [description, setDescription] = useState(poiData ? poiData.description : ""); // Map von Systemnamen zu IDs (wie zuvor) const systemNameToIdMap = { TALAS: 1, ECI: 2, ULAF: 3, GSMModem: 5, CiscoRouter: 6, WAGO: 7, Siemens: 8, OTDR: 9, WDM: 10, GMA: 11, Messdatensammler: 12, Messstellen: 13, TALASICL: 100, DAUZ: 110, SMSFunkmodem: 111, Basisgerät: 200, }; useEffect(() => { if (poiData) { setPoiId(poiData.idPoi); setName(poiData.name); setPoiTypeId(poiData.idPoiTyp); // Setze den Typ-ID setIdLD(poiData.idLD); setDescription(poiData.description); } }, [poiData]); // Fetch POI types and set the current POI type in the react-select dropdown useEffect(() => { const fetchPoiTypData = async () => { try { const response = await fetch("/api/talas_v5_DB/poiTyp/readPoiTyp"); const data = await response.json(); setPoiTypData(data); // Prüfe den gespeicherten Typ im localStorage const storedPoiType = localStorage.getItem("selectedPoiType"); // Finde den passenden Typ in den abgerufenen Daten und setze ihn als ausgewählt if (storedPoiType) { const matchingType = data.find((type) => type.name === storedPoiType); if (matchingType) { setPoiTypeId({ value: matchingType.idPoiTyp, label: matchingType.name }); } } else if (poiData && poiData.idPoiTyp) { // Falls kein Typ im localStorage ist, setze den Typ von poiData const matchingType = data.find((type) => type.idPoiTyp === poiData.idPoiTyp); if (matchingType) { setPoiTypeId({ value: matchingType.idPoiTyp, label: matchingType.name }); } } } catch (error) { console.error("Fehler beim Abrufen der poiTyp Daten:", error); } }; fetchPoiTypData(); }, [poiData]); // Fetch location devices and pre-select the current device useEffect(() => { const fetchLocationDevices = async () => { try { const response = await fetch("/api/talas5/location_device"); const data = await response.json(); setLocationDeviceData(data); filterDevices(data); if (poiData && poiData.idLD) { const selectedDevice = data.find((device) => device.idLD === poiData.idLD); setDeviceName(selectedDevice ? { value: selectedDevice.name, label: selectedDevice.name } : null); } } catch (error) { console.error("Fehler beim Abrufen der Standort- und Gerätedaten:", error); } }; fetchLocationDevices(); }, [poiData]); // Funktion zum Filtern der Geräte basierend auf den aktiven Systemen (Layern) const filterDevices = (devices) => { const activeSystems = Object.keys(mapLayersVisibility).filter((system) => mapLayersVisibility[system]); // Mappe aktive Systeme auf ihre ids const activeSystemIds = activeSystems.map((system) => systemNameToIdMap[system]).filter((id) => id !== undefined); // Filtere die Geräte nach aktiven Systemen basierend auf idsystem_typ const filtered = devices.filter((device) => activeSystemIds.includes(device.idsystem_typ)); setFilteredDevices(filtered); }; const handleSubmit = async (event) => { event.preventDefault(); const idLDResponse = await fetch(`/api/talas_v5_DB/locationDevice/getDeviceId?deviceName=${encodeURIComponent(deviceName?.value)}`); const idLDData = await idLDResponse.json(); const idLD = idLDData.idLD; try { const response = await fetch("/api/talas_v5_DB/pois/updatePoi", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ idPoi: poiId, name: name, description: description, idPoiTyp: poiTypeId?.value, // Den ausgewählten Typ mitsenden idLD: idLD, }), }); if (response.ok) { onClose(); window.location.reload(); } else { const errorResponse = await response.json(); throw new Error(errorResponse.error || "Fehler beim Aktualisieren des POI."); } } catch (error) { console.error("Fehler beim Aktualisieren des POI:", error); alert("Fehler beim Aktualisieren des POI."); } }; const handleDeletePoi = async () => { if (confirm("Sind Sie sicher, dass Sie diesen POI löschen möchten?")) { try { const response = await fetch(`/api/talas_v5_DB/pois/deletePoi?id=${poiId}`, { method: "DELETE", }); if (response.ok) { onClose(); window.location.reload(); // Aktualisiert die Seite nach dem Löschen } else { throw new Error("Fehler beim Löschen des POI."); } } catch (error) { console.error("Fehler beim Löschen des POI:", error); alert("Fehler beim Löschen des POI."); } } }; // Erstelle Optionen für react-select const poiTypeOptions = poiTypData.map((poiTyp) => ({ value: poiTyp.idPoiTyp, label: poiTyp.name, })); const deviceOptions = filteredDevices.map((device) => ({ value: device.name, label: device.name, })); // Custom styles for react-select const customStyles = { control: (provided) => ({ ...provided, width: "100%", minWidth: "300px", // Minimum width for the dropdown maxWidth: "100%", // Maximum width (you can adjust this if needed) }), menu: (provided) => ({ ...provided, width: "100%", minWidth: "300px", // Ensure the dropdown menu stays at the minimum width }), }; return (
e.stopPropagation()}>
setDescription(e.target.value)} placeholder="Beschreibung der Station" className="block p-2 w-full border-2 border-gray-200 rounded-md text-sm" />
{/* React Select for Devices */}
); }; export default PoiUpdateModal;