Moved all Recoil atoms to a new 'atoms' directory and selectors to a 'selectors' directory to clarify the project structure and improve maintainability. This change separates concerns by clearly distinguishing between simple state (atoms) and derived state (selectors), facilitating better understanding and scalability of the application's state management.
146 lines
5.3 KiB
JavaScript
146 lines
5.3 KiB
JavaScript
//components/DataSheet.js
|
|
import React, { useEffect, useState } from "react";
|
|
import { useRecoilState, useRecoilValue, useSetRecoilState } from "recoil";
|
|
import { gisStationsStaticDistrictState } from "../store/atoms/gisStationState";
|
|
import { gisSystemStaticState } from "../store/atoms/gisSystemState";
|
|
import { mapLayersState } from "../store/atoms/mapLayersState";
|
|
import { selectedAreaState } from "../store/atoms/selectedAreaState";
|
|
import { zoomTriggerState } from "../store/atoms/zoomTriggerState";
|
|
|
|
function DataSheet() {
|
|
const setSelectedArea = useSetRecoilState(selectedAreaState);
|
|
const [mapLayersVisibility, setMapLayersVisibility] =
|
|
useRecoilState(mapLayersState);
|
|
const [stationListing, setStationListing] = useState([]);
|
|
const [systemListing, setSystemListing] = useState([]);
|
|
const GisStationsStaticDistrict = useRecoilValue(
|
|
gisStationsStaticDistrictState
|
|
);
|
|
const GisSystemStatic = useRecoilValue(gisSystemStaticState);
|
|
// In deiner Dropdown onChange Funktion
|
|
const handleAreaChange = (event) => {
|
|
const selectedIndex = event.target.options.selectedIndex;
|
|
const areaName = event.target.options[selectedIndex].text;
|
|
setSelectedArea(areaName);
|
|
//console.log("Area selected oder areaName in DataSheet.js:", areaName); // Nur zur Bestätigung in der Konsole
|
|
//console.log("event.target:", event.target);
|
|
};
|
|
|
|
useEffect(() => {
|
|
// Identify allowed system IDs
|
|
const allowedSystems = new Set(
|
|
GisSystemStatic.filter((system) => system.Allow === 1).map(
|
|
(system) => system.IdSystem
|
|
)
|
|
);
|
|
//console.log("allowedSystems:", allowedSystems);
|
|
|
|
// Filter unique areas that belong to allowed systems
|
|
const seenNames = new Set();
|
|
const filteredAreas = GisStationsStaticDistrict.filter((item) => {
|
|
const isUnique =
|
|
!seenNames.has(item.Area_Name) && allowedSystems.has(item.System);
|
|
if (isUnique) {
|
|
seenNames.add(item.Area_Name);
|
|
//console.log("Unique area:", item.Area_Name); //Dropdown menu
|
|
}
|
|
return isUnique;
|
|
});
|
|
//console.log("GisStationsStaticDistrict:", GisStationsStaticDistrict);
|
|
|
|
// Set the station listings
|
|
setStationListing(
|
|
filteredAreas.map((area, index) => ({
|
|
id: index + 1,
|
|
name: area.Area_Name,
|
|
}))
|
|
);
|
|
|
|
// Prepare system listings as before
|
|
const seenSystemNames = new Set();
|
|
const filteredSystems = GisSystemStatic.filter((item) => {
|
|
// Entferne alle Leerzeichen und Bindestriche aus dem Namen
|
|
const formattedName = item.Name.replace(/[\s\-]+/g, "");
|
|
const isUnique = !seenSystemNames.has(formattedName) && item.Allow === 1;
|
|
if (isUnique) {
|
|
seenSystemNames.add(formattedName); // Füge den formatierten Namen hinzu
|
|
//console.log("Unique system in DataSheet:", formattedName); // Zeige den formatierten Namen in der Konsole
|
|
}
|
|
return isUnique;
|
|
});
|
|
|
|
setSystemListing(
|
|
filteredSystems.map((system, index) => ({
|
|
id: index + 1,
|
|
name: system.Name.replace(/[\s\-]+/g, ""), // Auch hier Leerzeichen und Bindestriche entfernen
|
|
}))
|
|
);
|
|
}, [GisStationsStaticDistrict, GisSystemStatic]);
|
|
//---------------------------------------------------------
|
|
const handleCheckboxChange = (name, event) => {
|
|
const { checked } = event.target;
|
|
//console.log(`Checkbox ${name} checked state:`, checked); // Log the checked state of the checkbox
|
|
|
|
setMapLayersVisibility((prev) => {
|
|
const newState = {
|
|
...prev,
|
|
[name]: checked,
|
|
};
|
|
//console.log(`New mapLayersVisibility state:`, newState); // Log the new state after update
|
|
return newState;
|
|
});
|
|
};
|
|
//---------------------------------------------------------
|
|
const setZoomTrigger = useSetRecoilState(zoomTriggerState);
|
|
|
|
const handleIconClick = () => {
|
|
setZoomTrigger((current) => current + 1); // Trigger durch Inkrementierung
|
|
};
|
|
//---------------------------------------------------------
|
|
|
|
return (
|
|
<div
|
|
id="mainDataSheet"
|
|
className="absolute top-3 right-3 w-1/6 min-w-[300px] z-10 bg-white p-2 rounded-lg shadow-lg"
|
|
>
|
|
<div className="flex flex-col gap-4 p-4">
|
|
<div className="flex items-center justify-between">
|
|
<select
|
|
onChange={handleAreaChange} // Verwenden der neuen handleAreaChange Funktion
|
|
id="stationListing"
|
|
className="border-solid-1 p-2 rounded ml-1"
|
|
>
|
|
<option>Station wählen</option>
|
|
{stationListing.map((station) => (
|
|
<option key={station.id} value={station.id}>
|
|
{station.name}
|
|
</option>
|
|
))}
|
|
</select>
|
|
<img
|
|
src="/img/expand-icon.svg"
|
|
alt="Expand"
|
|
className="h-6 w-6 ml-2 cursor-pointer"
|
|
onClick={handleIconClick}
|
|
/>
|
|
</div>
|
|
<div>
|
|
{systemListing.map((system) => (
|
|
<React.Fragment key={system.id}>
|
|
<input
|
|
type="checkbox"
|
|
checked={mapLayersVisibility[system.name] || false}
|
|
onChange={(e) => handleCheckboxChange(system.name, e)}
|
|
/>
|
|
<label className="text-sm font-bold ml-2">{system.name}</label>
|
|
<br />
|
|
</React.Fragment>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default DataSheet;
|