From 90f3d66b2276a5e02ee5c848582c1ddee1ce4d08 Mon Sep 17 00:00:00 2001 From: fisenko Date: Fri, 31 Oct 2025 11:13:08 +0000 Subject: [PATCH] =?UTF-8?q?#14=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D1=8C=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B0=D1=80=D1=88?= =?UTF-8?q?=D1=80=D1=83=D1=82=D0=B0=20(#16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлено новое поле route_name: Текстовые поля на двух страницах Поле в списке маршрутов Добавлено выбор видео на двух страниц вместе с редактором статей в виде модального окна Модальное окно позволяет создать статью, выбрать готовую, отредактировать выбранную сразу на трех языках Микаэл: Пожалуйста, перепроверь код, вдруг чего найдешь как улучшить + захости локально и потыкай пж: создай с 0 маршрут и прикрепи к нему созданную / какую-нибудь статью с видео, можешь попробовать загрузить либо взять готовое после того как создашь, попробуй потыкать и поменять чего-нибудь (проще обьясню: представь, что ты Руслан) Reviewed-on: https://gitea.unprism.ru/KRBL/WhiteNightsAdminPanel/pulls/16 Reviewed-by: Микаэл Оганесян <15lu.akari@unprism.ru> Co-authored-by: fisenko Co-committed-by: fisenko --- src/pages/Route/RouteCreatePage/index.tsx | 187 ++- src/pages/Route/RouteEditPage/index.tsx | 221 ++-- src/pages/Route/RouteListPage/index.tsx | 21 +- src/shared/lib/gltfCacheManager.ts | 2 - .../ArticleSelectOrCreateDialog/index.tsx | 1070 +++++++++++++++++ src/shared/modals/index.ts | 1 + src/shared/store/CreateSightStore/index.tsx | 50 +- src/shared/store/EditSightStore/index.tsx | 28 +- src/shared/store/RouteStore/index.ts | 7 +- src/widgets/ImageUploadCard/index.tsx | 14 +- src/widgets/MediaViewer/index.tsx | 2 +- src/widgets/VideoPreviewCard/index.tsx | 10 +- tsconfig.tsbuildinfo | 2 +- 13 files changed, 1344 insertions(+), 271 deletions(-) create mode 100644 src/shared/modals/ArticleSelectOrCreateDialog/index.tsx diff --git a/src/pages/Route/RouteCreatePage/index.tsx b/src/pages/Route/RouteCreatePage/index.tsx index bc0c5d6..4522405 100644 --- a/src/pages/Route/RouteCreatePage/index.tsx +++ b/src/pages/Route/RouteCreatePage/index.tsx @@ -13,7 +13,7 @@ import { DialogContent, DialogActions, } from "@mui/material"; -import { MediaViewer } from "@widgets"; +import { MediaViewer, VideoPreviewCard } from "@widgets"; import { observer } from "mobx-react-lite"; import { ArrowLeft, Loader2, Save, Plus } from "lucide-react"; import { useEffect, useState, useMemo } from "react"; @@ -24,9 +24,10 @@ import { articlesStore } from "../../../shared/store/ArticlesStore"; import { Route, routeStore } from "../../../shared/store/RouteStore"; import { languageStore, - SelectArticleModal, + ArticleSelectOrCreateDialog, SelectMediaDialog, selectedCityStore, + UploadMediaDialog, } from "@shared"; export const RouteCreatePage = observer(() => { @@ -39,6 +40,7 @@ export const RouteCreatePage = observer(() => { const [direction, setDirection] = useState("backward"); const [scaleMin, setScaleMin] = useState(""); const [scaleMax, setScaleMax] = useState(""); + const [routeName, setRouteName] = useState(""); const [turn, setTurn] = useState(""); const [centerLat, setCenterLat] = useState(""); const [centerLng, setCenterLng] = useState(""); @@ -48,6 +50,8 @@ export const RouteCreatePage = observer(() => { useState(false); const [isSelectVideoDialogOpen, setIsSelectVideoDialogOpen] = useState(false); const [isVideoPreviewOpen, setIsVideoPreviewOpen] = useState(false); + const [isUploadVideoDialogOpen, setIsUploadVideoDialogOpen] = useState(false); + const [fileToUpload, setFileToUpload] = useState(null); const { language } = languageStore; useEffect(() => { @@ -55,7 +59,6 @@ export const RouteCreatePage = observer(() => { articlesStore.getArticleList(); }, [language]); - // Фильтруем перевозчиков только из выбранного города const filteredCarriers = useMemo(() => { const carriers = carrierStore.carriers[language as keyof typeof carrierStore.carriers] @@ -110,6 +113,8 @@ export const RouteCreatePage = observer(() => { const handleArticleSelect = (articleId: number) => { setGovernorAppeal(articleId.toString()); setIsSelectArticleDialogOpen(false); + // Обновляем список статей после создания новой + articlesStore.getArticleList(); }; const handleVideoSelect = (media: { @@ -122,6 +127,26 @@ export const RouteCreatePage = observer(() => { setIsSelectVideoDialogOpen(false); }; + const handleVideoFileSelect = (file?: File) => { + if (file) { + setFileToUpload(file); + setIsUploadVideoDialogOpen(true); + } else { + setIsSelectVideoDialogOpen(true); + } + }; + + const handleVideoUpload = (media: { + id: string; + filename: string; + media_name?: string; + media_type: number; + }) => { + setVideoPreview(media.id); + setIsUploadVideoDialogOpen(false); + setFileToUpload(null); + }; + const handleVideoPreviewClick = () => { setIsVideoPreviewOpen(true); }; @@ -167,6 +192,7 @@ export const RouteCreatePage = observer(() => { route_number: routeNumber, route_sys_number: govRouteNumber, governor_appeal, + route_name: routeName, route_direction, scale_min, scale_max, @@ -208,6 +234,13 @@ export const RouteCreatePage = observer(() => {
+ setRouteName(e.target.value)} + /> Выберите перевозчика { const lines = coordinates.split("\n"); const lastLine = lines[lines.length - 1]; - // Если мы на последней строке и она не пустая if (lastLine && lastLine.trim()) { e.preventDefault(); const newValue = coordinates + "\n"; @@ -279,110 +315,6 @@ export const RouteEditPage = observer(() => { } /> - {/* Заменяем Select на кнопку для выбора статьи */} - - - - - - - - - {/* Селектор видеозаставки */} - - - - - - - {editRouteData.video_preview && - editRouteData.video_preview !== "" - ? "Видео выбрано" - : "Видео не выбрано"} - - {editRouteData.video_preview && - editRouteData.video_preview !== "" && ( - { - e.stopPropagation(); - routeStore.setEditRouteData({ video_preview: "" }); - }} - sx={{ - cursor: "pointer", - color: "#999", - "&:hover": { - color: "#666", - }, - }} - > - - × - - - )} - - - - - - Прямой/обратный маршрут