Files
nodeMap/components/DataSheet.js
ISA 39e5e1cb5a Refactor: Reorganize state management into atoms and selectors directories
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.
2024-05-03 10:18:42 +02:00

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;