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_API_URL='https://wn.krbl.ru'
VITE_REACT_APP ='https://content.wn.polygon.unprism.ru/' VITE_REACT_APP ='https://wn.krbl.ru'
VITE_KRBL_MEDIA='https://content.wn.polygon.unprism.ru/media/' VITE_KRBL_MEDIA='https://wn.krbl.ru/media/'

View File

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

View File

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

View File

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

View File

@@ -15,7 +15,7 @@ import {
} from "@mui/material"; } from "@mui/material";
import { MediaViewer, VideoPreviewCard } from "@widgets"; import { MediaViewer, VideoPreviewCard } from "@widgets";
import { observer } from "mobx-react-lite"; 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 { useEffect, useState } from "react";
import { useNavigate, useParams } from "react-router-dom"; import { useNavigate, useParams } from "react-router-dom";
@@ -102,10 +102,6 @@ export const RouteEditPage = observer(() => {
toast.error("Заполните номер маршрута в Говорящем Городе"); toast.error("Заполните номер маршрута в Говорящем Городе");
return; return;
} }
if (!editRouteData.governor_appeal) {
toast.error("Выберите статью для обращения к пассажирам");
return;
}
const validationResult = validateCoordinates(coordinates); const validationResult = validateCoordinates(coordinates);
if (validationResult !== true) { 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 <Button
variant="outlined" variant="outlined"
onClick={() => setIsSelectArticleDialogOpen(true)} onClick={() => setIsSelectArticleDialogOpen(true)}

View File

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

View File

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