diff --git a/components/AddPOIOnPolyline.js b/components/AddPOIOnPolyline.js index 904333c8f..8306f5a92 100644 --- a/components/AddPOIOnPolyline.js +++ b/components/AddPOIOnPolyline.js @@ -1,3 +1,4 @@ +// /components/AddPOIOnPolyline.js import React, { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { closeAddPoiOnPolylineModal } from "../redux/slices/addPoiOnPolylineSlice"; @@ -20,6 +21,7 @@ const AddPOIOnPolyline = () => { if (!isOpen) return null; const handleSubmit = async (event) => { + alert("POI auf Polyline hinzufügen"); event.preventDefault(); const formData = { name, latitude, longitude }; diff --git a/components/CircleIcon.js b/components/CircleIcon.js deleted file mode 100644 index c9f4843d3..000000000 --- a/components/CircleIcon.js +++ /dev/null @@ -1,13 +0,0 @@ -// /components/CircleIcon.js -// Custom circle icon for draggable markers -import L from "leaflet"; -import "leaflet/dist/leaflet.css"; - -const circleIcon = L.divIcon({ - className: "custom-div-icon", - html: "
", - iconSize: [25, 25], - iconAnchor: [5, 5], -}); - -export default circleIcon; diff --git a/components/CoordinateModal.js b/components/CoordinateModal.js deleted file mode 100644 index a6ad623b6..000000000 --- a/components/CoordinateModal.js +++ /dev/null @@ -1,29 +0,0 @@ -// components/CoordinateModal.js -import React from "react"; - -const CoordinateModal = ({ isOpen, onClose, coordinates }) => { - if (!isOpen) return null; - - return ( -
-
-

Koordinaten

-

Koordinaten: {coordinates}

- - -
-
- ); -}; - -export default CoordinateModal; diff --git a/components/EndIcon.js b/components/EndIcon.js deleted file mode 100644 index c6d56a8bc..000000000 --- a/components/EndIcon.js +++ /dev/null @@ -1,10 +0,0 @@ -// Viereck als End-Icon für die Route -import L from "leaflet"; -const endIcon = L.divIcon({ - className: "custom-end-icon", - html: "
", // Graues Viereck - iconSize: [14, 14], - iconAnchor: [7, 7], // Mittelpunkt des Vierecks als Anker -}); - -export default endIcon; diff --git a/components/StartIcon.js b/components/StartIcon.js deleted file mode 100644 index dc54c0f30..000000000 --- a/components/StartIcon.js +++ /dev/null @@ -1,16 +0,0 @@ -// Custom triangle icon for draggable markers -import L from "leaflet"; - -const startIcon = L.divIcon({ - className: "custom-start-icon", - html: ` - - - - - `, // Schwarzes Dreieck innerhalb eines grauen Dreiecks - iconSize: [18, 18], - iconAnchor: [9, 10], -}); - -export default startIcon; diff --git a/components/mainComponent/MapComponent.js b/components/mainComponent/MapComponent.js index 826faf938..ff780d9b7 100644 --- a/components/mainComponent/MapComponent.js +++ b/components/mainComponent/MapComponent.js @@ -7,7 +7,7 @@ import "leaflet-contextmenu"; import "leaflet.smooth_marker_bouncing"; import OverlappingMarkerSpiderfier from "overlapping-marker-spiderfier-leaflet"; //sieht deaktiviert aber ist das nicht so und wird benötigt import "react-toastify/dist/ReactToastify.css"; -import MapLayersControlPanel from "../MapLayersControlPanel.js"; +import MapLayersControlPanel from "../uiWidgets/MapLayersControlPanel.js"; import { InformationCircleIcon } from "@heroicons/react/20/solid"; import PoiUpdateModal from "../pois/PoiUpdateModal.js"; @@ -23,7 +23,7 @@ import useSmsfunkmodemMarkersLayer from "../../hooks/layers/useSmsfunkmodemMarke import useBereicheMarkersLayer from "../../hooks/layers/useBereicheMarkersLayer.js"; import { setupPolylines } from "../../utils/polylines/setupPolylines.js"; import { setupPOIs } from "../../utils/setupPOIs.js"; -import VersionInfoModal from "../VersionInfoModal.js"; +import VersionInfoModal from "../uiWidgets/VersionInfoModal.js"; import useLayerVisibility from "../../hooks/useLayerVisibility.js"; import useLineData from "../../hooks/useLineData.js"; import { useMapComponentState } from "../../hooks/useMapComponentState.js"; @@ -31,15 +31,14 @@ import { updateLocation } from "../../utils/updateBereichUtil.js"; import { selectMapLayersState } from "../../redux/slices/mapLayersSlice"; import { useSelector, useDispatch } from "react-redux"; import { setCurrentPoi } from "../../redux/slices/currentPoiSlice.js"; -import CoordinateInput from "../CoordinateInput.js"; -import CoordinateModal from "../CoordinateModal.js"; +import CoordinateInput from "../uiWidgets/CoordinateInput.js"; import CoordinatePopup from "../CoordinatePopup.js"; //------------------------Daten aus API-------------------- import { fetchPoiDataService } from "../../services/database/fetchPoiDataService.js"; import { selectPolylineVisible, setPolylineVisible } from "../../redux/slices/polylineLayerVisibleSlice.js"; import { selectGisStationsStaticDistrict } from "../../redux/slices/webservice/gisStationsStaticDistrictSlice.js"; import { selectGisSystemStatic, setGisSystemStatic } from "../../redux/slices/webservice/gisSystemStaticSlice.js"; -import ShowAddStationPopup from "../AddPOIModal.js"; +import ShowAddStationPopup from "../pois/AddPOIModal.js"; import AddPOIOnPolyline from "../AddPOIOnPolyline"; import { enablePolylineEvents, disablePolylineEvents } from "../../utils/polylines/eventHandlers"; import { updateCountdown, closePolylineContextMenu } from "../../redux/slices/polylineContextMenuSlice"; @@ -865,8 +864,6 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => { return ( <> {useSelector((state) => state.addPoiOnPolyline.isOpen) && } - {/* Zeigt das Koordinaten-Modal, wenn `showCoordinatesModal` true ist */} - {showCoordinatesModal && setShowCoordinatesModal(false)} />} {/* Zeigt das POI-Modal, wenn `showPoiModal` true ist */} {showPoiModal && setShowPoiModal(false)} />} diff --git a/components/AddPOIModal.js b/components/pois/AddPOIModal.js similarity index 93% rename from components/AddPOIModal.js rename to components/pois/AddPOIModal.js index bbc68df85..61e56ffa1 100644 --- a/components/AddPOIModal.js +++ b/components/pois/AddPOIModal.js @@ -1,13 +1,13 @@ -// components/AddStationPopup.js +// components/AddPOIModal.js import React, { useState, useEffect, use } from "react"; import ReactDOM from "react-dom"; -import { setPoiMarkers } from "../redux/slices/readPoiMarkersStoreSlice"; -import { selectGisStationsStaticDistrict } from "../redux/slices/webservice/gisStationsStaticDistrictSlice"; +import { setPoiMarkers } from "../../redux/slices/readPoiMarkersStoreSlice"; +import { selectGisStationsStaticDistrict } from "../../redux/slices/webservice/gisStationsStaticDistrictSlice"; import { useDispatch, useSelector } from "react-redux"; -import { fetchPoiTypes } from "../redux/slices/database/poiTypesSlice"; -import { incrementTrigger } from "../redux/slices/poiReadFromDbTriggerSlice"; +import { fetchPoiTypes } from "../../redux/slices/database/poiTypesSlice"; +import { incrementTrigger } from "../../redux/slices/poiReadFromDbTriggerSlice"; -const ShowAddStationPopup = ({ onClose, map, latlng }) => { +const AddPOIModal = ({ onClose, map, latlng }) => { const dispatch = useDispatch(); const poiTypData = useSelector((state) => state.poiTypes.data); @@ -176,4 +176,4 @@ const ShowAddStationPopup = ({ onClose, map, latlng }) => { ); }; -export default ShowAddStationPopup; +export default AddPOIModal; diff --git a/components/CoordinateInput.js b/components/uiWidgets/CoordinateInput.js similarity index 100% rename from components/CoordinateInput.js rename to components/uiWidgets/CoordinateInput.js diff --git a/components/MapLayersControlPanel.js b/components/uiWidgets/MapLayersControlPanel.js similarity index 93% rename from components/MapLayersControlPanel.js rename to components/uiWidgets/MapLayersControlPanel.js index 49bf9a6f0..857aacb5e 100644 --- a/components/MapLayersControlPanel.js +++ b/components/uiWidgets/MapLayersControlPanel.js @@ -1,14 +1,14 @@ // /componentss/MapLayersControlPanel.js import React, { useEffect, useState } from "react"; -import { setSelectedArea } from "../redux/slices/selectedAreaSlice"; -import EditModeToggle from "./EditModeToggle"; +import { setSelectedArea } from "../../redux/slices/selectedAreaSlice"; +import EditModeToggle from "../EditModeToggle"; import { useSelector, useDispatch } from "react-redux"; -import { selectPolylineVisible, setPolylineVisible } from "../redux/slices/polylineLayerVisibleSlice"; -import { selectGisSystemStatic } from "../redux/slices/webservice/gisSystemStaticSlice"; -import { selectGisStationsStaticDistrict } from "../redux/slices/webservice/gisStationsStaticDistrictSlice"; -import { selectMapLayersState, setLayerVisibility } from "../redux/slices/mapLayersSlice"; -import { setVisible } from "../redux/slices/poiLayerVisibleSlice"; -import { incrementZoomTrigger } from "../redux/slices/zoomTriggerSlice"; +import { selectPolylineVisible, setPolylineVisible } from "../../redux/slices/polylineLayerVisibleSlice"; +import { selectGisSystemStatic } from "../../redux/slices/webservice/gisSystemStaticSlice"; +import { selectGisStationsStaticDistrict } from "../../redux/slices/webservice/gisStationsStaticDistrictSlice"; +import { selectMapLayersState, setLayerVisibility } from "../../redux/slices/mapLayersSlice"; +import { setVisible } from "../../redux/slices/poiLayerVisibleSlice"; +import { incrementZoomTrigger } from "../../redux/slices/zoomTriggerSlice"; function MapLayersControlPanel() { const [editMode, setEditMode] = useState(false); // Zustand für editMode diff --git a/components/VersionInfoModal.js b/components/uiWidgets/VersionInfoModal.js similarity index 100% rename from components/VersionInfoModal.js rename to components/uiWidgets/VersionInfoModal.js diff --git a/config/appVersion.js b/config/appVersion.js index b17893dc9..fe427d0f8 100644 --- a/config/appVersion.js +++ b/config/appVersion.js @@ -1,2 +1,2 @@ // /config/appVersion -export const APP_VERSION = "1.1.151"; +export const APP_VERSION = "1.1.152"; diff --git a/package-lock.json b/package-lock.json index 23bede652..a470322f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "22.05.2025 NodeMap", + "name": "23.05.2025 NodeMap", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/redux/slices/database/addPoiSlice.js b/redux/slices/database/addPoiSlice.js new file mode 100644 index 000000000..71bf3fea9 --- /dev/null +++ b/redux/slices/database/addPoiSlice.js @@ -0,0 +1,38 @@ +import { createSlice } from "@reduxjs/toolkit"; +import { addPoiThunk } from "../../thunks/database/addPoiThunk"; + +const initialState = { + status: "idle", // idle | loading | succeeded | failed + error: null, +}; + +const addPoiSlice = createSlice({ + name: "addPoi", + initialState, + reducers: { + resetAddPoiStatus: (state) => { + state.status = "idle"; + state.error = null; + }, + }, + extraReducers: (builder) => { + builder + .addCase(addPoiThunk.pending, (state) => { + state.status = "loading"; + }) + .addCase(addPoiThunk.fulfilled, (state) => { + state.status = "succeeded"; + state.error = null; + }) + .addCase(addPoiThunk.rejected, (state, action) => { + state.status = "failed"; + state.error = action.payload; + }); + }, +}); + +export const { resetAddPoiStatus } = addPoiSlice.actions; +export default addPoiSlice.reducer; + +export const selectAddPoiStatus = (state) => state.addPoi.status; +export const selectAddPoiError = (state) => state.addPoi.error; diff --git a/redux/store.js b/redux/store.js index c2ea25e2f..a36c586cf 100644 --- a/redux/store.js +++ b/redux/store.js @@ -27,6 +27,7 @@ import gisStationsMeasurementsReducer from "./slices/webservice/gisStationsMeasu import gisSystemStaticReducer from "./slices/webservice/gisSystemStaticSlice"; import userRightsReducer from "./slices/webservice/userRightsSlice"; import gisLinesStatusFromWebserviceReducer from "./slices/webservice/gisLinesStatusSlice"; +import addPoiReducer from "./slices/database/addPoiSlice"; export const store = configureStore({ reducer: { @@ -55,5 +56,6 @@ export const store = configureStore({ zoomTrigger: zoomTriggerReducer, urlParameter: urlParameterReducer, priorityConfig: priorityConfigReducer, + addPoi: addPoiReducer, }, }); diff --git a/redux/thunks/database/addPoiThunk.js b/redux/thunks/database/addPoiThunk.js new file mode 100644 index 000000000..600a9f8c9 --- /dev/null +++ b/redux/thunks/database/addPoiThunk.js @@ -0,0 +1,11 @@ +// /redux/thunks/database/addPoiThunk.js +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { addPoiService } from "../../../services/database/addPoiService"; + +export const addPoiThunk = createAsyncThunk("poi/add", async (formData, thunkAPI) => { + try { + return await addPoiService(formData); + } catch (error) { + return thunkAPI.rejectWithValue(error.message); + } +}); diff --git a/services/database/addPoiService.js b/services/database/addPoiService.js new file mode 100644 index 000000000..80043e1bc --- /dev/null +++ b/services/database/addPoiService.js @@ -0,0 +1,14 @@ +// /services/database/addPoiService.js +export const addPoiService = async (formData) => { + const response = await fetch("/api/talas_v5_DB/pois/addLocation", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(formData), + }); + + if (!response.ok) { + throw new Error("Fehler beim Hinzufügen des POI"); + } + + return await response.json(); +};