fix: Fix name on map and fix city name in sight list

This commit is contained in:
2025-07-13 14:36:57 +03:00
parent a908c63771
commit ced3067915
3 changed files with 448 additions and 55 deletions

View File

@ -146,7 +146,7 @@ class MapStore {
if (featureType === "station") {
data = {
name: properties.name || "Новая остановка",
name: properties.name || "Остановка 1",
latitude: geometry.coordinates[1],
longitude: geometry.coordinates[0],
};
@ -159,7 +159,7 @@ class MapStore {
};
} else if (featureType === "sight") {
data = {
name: properties.name || "Новая достопримечательность",
name: properties.name || "Достопримечательность 1",
description: properties.description || "",
latitude: geometry.coordinates[1],
longitude: geometry.coordinates[0],
@ -1263,14 +1263,42 @@ class MapService {
feature.set("featureType", fType);
// --- ИЗМЕНЕНИЕ: Именование с порядковым номером для маршрутов ---
// --- ИЗМЕНЕНИЕ: Именование с порядковым номером для всех типов объектов ---
let resourceName: string;
switch (fType) {
case "station":
resourceName = "Новая остановка";
// Находим следующий доступный номер остановки
const existingStations = this.vectorSource
.getFeatures()
.filter((f) => f.get("featureType") === "station");
const stationNumbers = existingStations
.map((f) => {
const name = f.get("name") as string;
const match = name.match(/^Остановка (\d+)$/);
return match ? parseInt(match[1], 10) : 0;
})
.filter((num) => num > 0);
const nextStationNumber =
stationNumbers.length > 0 ? Math.max(...stationNumbers) + 1 : 1;
resourceName = `Остановка ${nextStationNumber}`;
break;
case "sight":
resourceName = "Новая достопримечательность";
// Находим следующий доступный номер достопримечательности
const existingSights = this.vectorSource
.getFeatures()
.filter((f) => f.get("featureType") === "sight");
const sightNumbers = existingSights
.map((f) => {
const name = f.get("name") as string;
const match = name.match(/^Достопримечательность (\d+)$/);
return match ? parseInt(match[1], 10) : 0;
})
.filter((num) => num > 0);
const nextSightNumber =
sightNumbers.length > 0 ? Math.max(...sightNumbers) + 1 : 1;
resourceName = `Достопримечательность ${nextSightNumber}`;
break;
case "route":
// Находим следующий доступный номер маршрута
@ -1285,9 +1313,9 @@ class MapService {
})
.filter((num) => num > 0);
const nextNumber =
const nextRouteNumber =
routeNumbers.length > 0 ? Math.max(...routeNumbers) + 1 : 1;
resourceName = `Маршрут ${nextNumber}`;
resourceName = `Маршрут ${nextRouteNumber}`;
break;
default:
resourceName = "Объект";
@ -1920,7 +1948,7 @@ const MapSightbar: React.FC<MapSightbarProps> = ({
if (aIsChecked && !bIsChecked) return -1;
if (!aIsChecked && bIsChecked) return 1;
// 3. Сортировка по ID (новые объекты с большими ID в начале)
// 3. Сортировка по ID (объекты остаются в порядке создания)
const aNumericId = aId ? parseInt(String(aId).split("-")[1], 10) : 0;
const bNumericId = bId ? parseInt(String(bId).split("-")[1], 10) : 0;
if (
@ -1928,7 +1956,7 @@ const MapSightbar: React.FC<MapSightbarProps> = ({
!isNaN(bNumericId) &&
aNumericId !== bNumericId
) {
return bNumericId - aNumericId; // По убыванию - новые сверху
return aNumericId - bNumericId; // По возрастанию - старые сверху, новые снизу
}
// 4. Запасная сортировка по имени

View File

@ -1,6 +1,6 @@
import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid";
import { ruRU } from "@mui/x-data-grid/locales";
import { languageStore, sightsStore } from "@shared";
import { cityStore, languageStore, sightsStore } from "@shared";
import { useEffect, useState } from "react";
import { observer } from "mobx-react-lite";
import { Pencil, Trash2, Minus } from "lucide-react";
@ -10,6 +10,7 @@ import { Box, CircularProgress } from "@mui/material";
export const SightListPage = observer(() => {
const { sights, getSights, deleteListSight } = sightsStore;
const { cities, getCities } = cityStore;
const navigate = useNavigate();
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const [isBulkDeleteModalOpen, setIsBulkDeleteModalOpen] = useState(false);
@ -21,7 +22,9 @@ export const SightListPage = observer(() => {
useEffect(() => {
const fetchSights = async () => {
setIsLoading(true);
await getCities(language);
await getSights();
setIsLoading(false);
};
fetchSights();
@ -45,14 +48,14 @@ export const SightListPage = observer(() => {
},
},
{
field: "city",
field: "city_id",
headerName: "Город",
flex: 1,
renderCell: (params: GridRenderCellParams) => {
return (
<div className="w-full h-full flex items-center">
{params.value ? (
params.value
cities[language].data.find((el) => el.id == params.value)?.name
) : (
<Minus size={20} className="text-red-500" />
)}
@ -92,7 +95,7 @@ export const SightListPage = observer(() => {
const rows = sights.map((sight) => ({
id: sight.id,
name: sight.name,
city: sight.city,
city_id: sight.city_id,
}));
return (