feat: update route center calculating

This commit is contained in:
2025-11-26 04:29:19 +03:00
parent 04a9ac452e
commit 95fe297aae
7 changed files with 67 additions and 39 deletions

6
.env
View File

@@ -1,3 +1,3 @@
VITE_API_URL='https://content.wn.polygon.unprism.ru/'
VITE_REACT_APP ='https://content.wn.polygon.unprism.ru/'
VITE_KRBL_MEDIA='https://content.wn.polygon.unprism.ru/media/'
VITE_API_URL='https://wn.krbl.ru'
VITE_REACT_APP ='https://wn.krbl.ru'
VITE_KRBL_MEDIA='https://wn.krbl.ru/media/'

View File

@@ -21,7 +21,7 @@ function a11yProps(index: number) {
export const EditSightPage = observer(() => {
const [value, setValue] = useState(0);
const [isLoadingData, setIsLoadingData] = useState(true);
const { sight, getSightInfo, needLeaveAgree } = editSightStore;
const { sight, getSightInfo, needLeaveAgree, getRightArticles } = editSightStore;
const { getArticles } = articlesStore;
const { id } = useParams();
@@ -48,6 +48,8 @@ export const EditSightPage = observer(() => {
await getArticles("ru");
await getArticles("en");
await getArticles("zh");
// Загружаем данные правого виджета перед завершением загрузки
await getRightArticles(+id);
} finally {
setIsLoadingData(false);
}

View File

@@ -488,16 +488,6 @@ class MapStore {
const route_number = properties.name || "Маршрут 1";
const path = geometry.coordinates.map((c: any) => [c[1], c[0]]);
const lineGeom = new GeoJSON().readGeometry(geometry, {
dataProjection: "EPSG:4326",
featureProjection: "EPSG:3857",
});
const centerCoords = getCenter(lineGeom.getExtent());
const [center_longitude, center_latitude] = toLonLat(
centerCoords,
"EPSG:3857"
);
let carrier_id = 0;
let carrier = "";
@@ -515,8 +505,8 @@ class MapStore {
const routeData = {
route_number,
path,
center_latitude,
center_longitude,
center_latitude: path[0][0],
center_longitude: path[0][1],
carrier,
carrier_id,
governor_appeal: 0,
@@ -2662,18 +2652,16 @@ const MapSightbar: React.FC<MapSightbarProps> = observer(
description.trim() !== "";
const routeName =
featureType === "route"
? ((feature.get("routeName") as string) || "")
? (feature.get("routeName") as string) || ""
: "";
const routeNumber =
featureType === "route"
? ((feature.get("routeNumber") as string) || fName)
? (feature.get("routeNumber") as string) || fName
: "";
const routeNumberTrimmed = routeNumber.trim();
const routeNameTrimmed = routeName.trim();
const displayName =
featureType === "route"
? routeNumberTrimmed || fName
: fName;
featureType === "route" ? routeNumberTrimmed || fName : fName;
const showRouteName =
featureType === "route" &&
routeNameTrimmed !== "" &&

View File

@@ -15,7 +15,7 @@ import {
} from "@mui/material";
import { MediaViewer, VideoPreviewCard } from "@widgets";
import { observer } from "mobx-react-lite";
import { ArrowLeft, Loader2, Save, Plus } from "lucide-react";
import { ArrowLeft, Loader2, Save, Plus, X } from "lucide-react";
import { useEffect, useState, useMemo } from "react";
import { useNavigate } from "react-router-dom";
import { toast } from "react-toastify";
@@ -174,11 +174,6 @@ export const RouteCreatePage = observer(() => {
setIsLoading(false);
return;
}
if (!governorAppeal) {
toast.error("Выберите статью для обращения к пассажирам");
setIsLoading(false);
return;
}
const validationResult = validateCoordinates(routeCoords);
if (validationResult !== true) {
@@ -213,7 +208,9 @@ export const RouteCreatePage = observer(() => {
}
const carrier_id = Number(carrier);
const governor_appeal = Number(governorAppeal);
const governor_appeal = governorAppeal
? Number(governorAppeal)
: undefined;
const rotate = turn ? Number(turn) : undefined;
const center_latitude = centerLat ? Number(centerLat) : undefined;
const center_longitude = centerLng ? Number(centerLng) : undefined;
@@ -238,7 +235,6 @@ export const RouteCreatePage = observer(() => {
carrier_id,
route_number: routeNumber,
route_sys_number: govRouteNumber,
governor_appeal,
route_name: routeName,
route_direction,
scale_min: scale_min !== null ? scale_min : 0,
@@ -251,6 +247,10 @@ export const RouteCreatePage = observer(() => {
videoPreview && videoPreview !== "" ? videoPreview : undefined,
};
if (governor_appeal !== undefined) {
newRoute.governor_appeal = governor_appeal;
}
await routeStore.createRoute(newRoute);
toast.success("Маршрут успешно создан");
navigate(-1);
@@ -382,6 +382,17 @@ export const RouteCreatePage = observer(() => {
},
}}
/>
{selectedArticle && (
<Button
variant="outlined"
color="error"
onClick={() => setGovernorAppeal("")}
startIcon={<X size={16} />}
sx={{ minWidth: "auto", px: 2 }}
>
Сбросить
</Button>
)}
<Button
variant="outlined"
onClick={() => setIsSelectArticleDialogOpen(true)}

View File

@@ -15,7 +15,7 @@ import {
} from "@mui/material";
import { MediaViewer, VideoPreviewCard } from "@widgets";
import { observer } from "mobx-react-lite";
import { ArrowLeft, Copy, Save, Plus } from "lucide-react";
import { ArrowLeft, Copy, Save, Plus, X } from "lucide-react";
import { useEffect, useState } from "react";
import { useNavigate, useParams } from "react-router-dom";
@@ -102,10 +102,6 @@ export const RouteEditPage = observer(() => {
toast.error("Заполните номер маршрута в Говорящем Городе");
return;
}
if (!editRouteData.governor_appeal) {
toast.error("Выберите статью для обращения к пассажирам");
return;
}
const validationResult = validateCoordinates(coordinates);
if (validationResult !== true) {
@@ -531,6 +527,21 @@ export const RouteEditPage = observer(() => {
},
}}
/>
{selectedArticle && (
<Button
variant="outlined"
color="error"
onClick={() =>
routeStore.setEditRouteData({
governor_appeal: 0,
})
}
startIcon={<X size={16} />}
sx={{ minWidth: "auto", px: 2 }}
>
Сбросить
</Button>
)}
<Button
variant="outlined"
onClick={() => setIsSelectArticleDialogOpen(true)}

View File

@@ -12,6 +12,7 @@ export function RightSidebar() {
saveChanges,
originalRouteData,
setMapRotation,
setMapCenter,
setIconSize: updateIconSize,
setFontSize: updateFontSize,
} = useMapData();
@@ -386,7 +387,11 @@ export function RightSidebar() {
value={Math.round(localCenter.x * 1000) / 1000}
onChange={(e) => {
setIsUserEditing(true);
setLocalCenter((prev) => ({ ...prev, x: Number(e.target.value) }));
const newValue = Number(e.target.value);
setLocalCenter((prev) => ({ ...prev, x: newValue }));
if (!isNaN(newValue) && localCenter.y !== undefined) {
setMapCenter(newValue, localCenter.y);
}
}}
onBlur={() => {
setIsUserEditing(false);
@@ -406,12 +411,16 @@ export function RightSidebar() {
/>
<TextField
type="number"
label="Центр карты, высота"
label="Центр карты, долгота"
variant="filled"
value={Math.round(localCenter.y * 1000) / 1000}
onChange={(e) => {
setIsUserEditing(true);
setLocalCenter((prev) => ({ ...prev, y: Number(e.target.value) }));
const newValue = Number(e.target.value);
setLocalCenter((prev) => ({ ...prev, y: newValue }));
if (!isNaN(newValue) && localCenter.x !== undefined) {
setMapCenter(localCenter.x, newValue);
}
}}
onBlur={() => {
setIsUserEditing(false);

View File

@@ -123,11 +123,18 @@ class RouteStore {
if (!this.editRouteData.video_preview) {
delete this.editRouteData.video_preview;
}
const response = await authInstance.patch(`/route/${id}`, {
const dataToSend: any = {
...this.editRouteData,
center_latitude: parseFloat(this.editRouteData.center_latitude),
center_longitude: parseFloat(this.editRouteData.center_longitude),
});
};
if (
this.editRouteData.governor_appeal === 0 ||
!this.editRouteData.governor_appeal
) {
dataToSend.governor_appeal = null;
}
const response = await authInstance.patch(`/route/${id}`, dataToSend);
runInAction(() => {
this.route[id] = response.data;