From 2ca1f2cba4290eabf4e19795eca7ccb69f5c88f3 Mon Sep 17 00:00:00 2001 From: itoshi Date: Mon, 9 Jun 2025 14:07:51 +0300 Subject: [PATCH] feat: Fixed path for routes --- public/Emblem.svg | 373 ++++++++++++++++++++++++ public/GET.png | Bin 0 -> 6600 bytes public/SightIcon.png | Bin 0 -> 750 bytes public/favicon_ship.png | Bin 0 -> 2382 bytes src/app/router/index.tsx | 4 +- src/pages/MapPage/index.tsx | 29 +- src/pages/MapPage/mapStore.ts | 26 +- src/pages/Media/MediaListPage/index.tsx | 4 +- src/pages/Route/RouteEditPage/index.tsx | 225 ++++++++++++++ src/pages/Route/RouteListPage/index.tsx | 14 +- src/pages/Route/index.ts | 1 + src/pages/Route/route-preview/index.tsx | 15 +- src/shared/store/RouteStore/index.ts | 47 +++ 13 files changed, 706 insertions(+), 32 deletions(-) create mode 100644 public/Emblem.svg create mode 100644 public/GET.png create mode 100644 public/SightIcon.png create mode 100644 public/favicon_ship.png create mode 100644 src/pages/Route/RouteEditPage/index.tsx diff --git a/public/Emblem.svg b/public/Emblem.svg new file mode 100644 index 0000000..724f0ee --- /dev/null +++ b/public/Emblem.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/GET.png b/public/GET.png new file mode 100644 index 0000000000000000000000000000000000000000..d224f3f39052362c005c0627c05dadc34bb9178f GIT binary patch literal 6600 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
a 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/src/app/router/index.tsx b/src/app/router/index.tsx index 8f77f1b..da3525a 100644 --- a/src/app/router/index.tsx +++ b/src/app/router/index.tsx @@ -38,6 +38,7 @@ import { StationEditPage, RouteCreatePage, RoutePreview, + RouteEditPage, } from "@pages"; import { authStore, createSightStore, editSightStore } from "@shared"; import { Layout } from "@widgets"; @@ -98,6 +99,7 @@ const router = createBrowserRouter([ ), }, + { path: "route-preview/:id", element: }, { path: "/", element: ( @@ -141,7 +143,7 @@ const router = createBrowserRouter([ // Route { path: "route", element: }, { path: "route/create", element: }, - { path: "route-preview/:id", element: }, + { path: "route/:id/edit", element: }, // User { path: "user", element: }, diff --git a/src/pages/MapPage/index.tsx b/src/pages/MapPage/index.tsx index 995f75c..005e0d9 100644 --- a/src/pages/MapPage/index.tsx +++ b/src/pages/MapPage/index.tsx @@ -35,6 +35,7 @@ import { Pencil, Save, Plus, + Loader2, } from "lucide-react"; import { toast } from "react-toastify"; import { singleClick, doubleClick } from "ol/events/condition"; @@ -1061,7 +1062,7 @@ const MapControls: React.FC = ({ }, { mode: "drawing-sight", - title: "Место", + title: "Достопримечательность", longTitle: "Добавить достопримечательность", icon: , action: () => mapService.startDrawingSight(), @@ -1109,6 +1110,7 @@ const MapSightbar: React.FC = ({ }) => { const [activeSection, setActiveSection] = useState("layers"); const navigate = useNavigate(); + const [isLoading, setIsLoading] = useState(false); const toggleSection = (id: string) => setActiveSection(activeSection === id ? null : id); @@ -1124,7 +1126,9 @@ const MapSightbar: React.FC = ({ (id: string | number | undefined, recourse: string) => { if ( mapService && - window.confirm("Вы действительно хотите удалить этот объект?") + window.confirm( + "Вы действительно хотите удалить этот объект? Утерянные данные не могут быть восстановлены." + ) ) mapService.deleteFeature(id, recourse); }, @@ -1144,8 +1148,16 @@ const MapSightbar: React.FC = ({ [navigate] ); - const handleSave = useCallback(() => { - mapStore.handleSave(mapService?.getAllFeaturesAsGeoJSON() || ""); + const handleSave = useCallback(async () => { + const geoJSON = mapService?.getAllFeaturesAsGeoJSON(); + if (geoJSON) { + setIsLoading(true); + await mapStore.handleSave(geoJSON); + toast.success("Данные успешно сохранены"); + } else { + toast.error("Ошибка при сохранении данных"); + } + setIsLoading(false); }, [mapService]); const stations = mapFeatures.filter( @@ -1470,10 +1482,15 @@ const MapSightbar: React.FC = ({ ); diff --git a/src/pages/MapPage/mapStore.ts b/src/pages/MapPage/mapStore.ts index 6ac6063..4e7bf28 100644 --- a/src/pages/MapPage/mapStore.ts +++ b/src/pages/MapPage/mapStore.ts @@ -34,13 +34,27 @@ class MapStore { getRoutes = async () => { const routes = await languageInstance("ru").get("/route"); - const mappedRoutes = routes.data.map((route: any) => ({ - id: route.id, - route_number: route.route_number, - path: route.path, - })); + const routedIds = routes.data.map((route: any) => route.id); - this.routes = mappedRoutes; + const mappedRoutes: ApiRoute[] = []; + for (const routeId of routedIds) { + const responseSoloRoute = await languageInstance("ru").get( + `/route/${routeId}` + ); + const route = responseSoloRoute.data; + + const mappedRoute = { + id: route.id, + route_number: route.route_number, + path: route.path, + }; + + mappedRoutes.push(mappedRoute); + } + + this.routes = mappedRoutes.sort((a, b) => + a.route_number.localeCompare(b.route_number) + ); }; getStations = async () => { diff --git a/src/pages/Media/MediaListPage/index.tsx b/src/pages/Media/MediaListPage/index.tsx index 53a4137..5bc131c 100644 --- a/src/pages/Media/MediaListPage/index.tsx +++ b/src/pages/Media/MediaListPage/index.tsx @@ -43,7 +43,7 @@ export const MediaListPage = observer(() => { { field: "actions", headerName: "Действия", - flex: 1, + width: 200, align: "center", headerAlign: "center", @@ -75,8 +75,6 @@ export const MediaListPage = observer(() => { return ( <> - -

Медиа

diff --git a/src/pages/Route/RouteEditPage/index.tsx b/src/pages/Route/RouteEditPage/index.tsx new file mode 100644 index 0000000..887e010 --- /dev/null +++ b/src/pages/Route/RouteEditPage/index.tsx @@ -0,0 +1,225 @@ +import { + Button, + Paper, + TextField, + Select, + MenuItem, + FormControl, + InputLabel, + Typography, + Box, +} from "@mui/material"; + +import { observer } from "mobx-react-lite"; +import { ArrowLeft, Save } from "lucide-react"; +import { useEffect, useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; + +import { carrierStore } from "../../../shared/store/CarrierStore"; +import { articlesStore } from "../../../shared/store/ArticlesStore"; +import { routeStore } from "../../../shared/store/RouteStore"; +import { toast } from "react-toastify"; + +export const RouteEditPage = observer(() => { + const navigate = useNavigate(); + const { id } = useParams(); + const { editRouteData } = routeStore; + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + const fetchData = async () => { + const response = await routeStore.getRoute(Number(id)); + routeStore.setEditRouteData(response); + carrierStore.getCarriers(); + articlesStore.getArticleList(); + }; + fetchData(); + }, [id]); + + const handleSave = async () => { + setIsLoading(true); + await routeStore.editRoute(Number(id)); + toast.success("Маршрут успешно сохранен"); + setIsLoading(false); + }; + + return ( + +
+ +
+ + Редактировать маршрут + + + + Выберите перевозчика + + + + routeStore.setEditRouteData({ + route_number: e.target.value, + }) + } + /> + p.join(" ")).join("\n") || ""} + onChange={(e) => + routeStore.setEditRouteData({ + path: e.target.value + .split("\n") + .map((line) => line.split(" ").map(Number)), + }) + } + /> + + routeStore.setEditRouteData({ + route_sys_number: e.target.value, + }) + } + /> + + Обращение губернатора + + + + Прямой/обратный маршрут + + + + routeStore.setEditRouteData({ + scale_min: Number(e.target.value), + }) + } + /> + + routeStore.setEditRouteData({ + scale_max: Number(e.target.value), + }) + } + /> + + routeStore.setEditRouteData({ + rotate: Number(e.target.value), + }) + } + /> + + routeStore.setEditRouteData({ + center_latitude: Number(e.target.value), + }) + } + /> + + routeStore.setEditRouteData({ + center_longitude: Number(e.target.value), + }) + } + /> + +
+ +
+
+ ); +}); diff --git a/src/pages/Route/RouteListPage/index.tsx b/src/pages/Route/RouteListPage/index.tsx index d3bd299..dab1c0a 100644 --- a/src/pages/Route/RouteListPage/index.tsx +++ b/src/pages/Route/RouteListPage/index.tsx @@ -2,7 +2,7 @@ import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid"; import { languageStore, routeStore } from "@shared"; import { useEffect, useState } from "react"; import { observer } from "mobx-react-lite"; -import { Eye, Trash2 } from "lucide-react"; +import { Eye, Map, Pencil, Trash2 } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { CreateButton, DeleteModal, LanguageSwitcher } from "@widgets"; @@ -49,15 +49,21 @@ export const RouteListPage = observer(() => { { field: "actions", headerName: "Действия", - width: 140, + width: 250, align: "center", headerAlign: "center", renderCell: (params: GridRenderCellParams) => { return (
- + + {/* */}