From 4f038551a253d51bcb53bbaaae9cfee73014d7d3 Mon Sep 17 00:00:00 2001 From: itoshi Date: Mon, 28 Jul 2025 08:18:21 +0300 Subject: [PATCH] fix: Fix problems and bugs --- src/pages/MapPage/index.tsx | 164 +++++------ src/pages/Route/LinekedStations.tsx | 2 +- .../Snapshot/SnapshotCreatePage/index.tsx | 94 ++++--- src/pages/Snapshot/index.ts | 1 - src/pages/Station/LinkedSights.tsx | 2 +- src/shared/store/SnapshotStore/index.ts | 264 ++++++++++++++++++ tsconfig.tsbuildinfo | 2 +- 7 files changed, 381 insertions(+), 148 deletions(-) diff --git a/src/pages/MapPage/index.tsx b/src/pages/MapPage/index.tsx index e58d87c..a7ef7ec 100644 --- a/src/pages/MapPage/index.tsx +++ b/src/pages/MapPage/index.tsx @@ -75,6 +75,19 @@ import { makeAutoObservable } from "mobx"; import { stationsStore, routeStore, sightsStore } from "@shared"; +// Функция для сброса кешей карты +export const clearMapCaches = () => { + // Сброс кешей маршрутов + mapStore.routes = []; + mapStore.stations = []; + mapStore.sights = []; + + // Сброс кешей MapService если он доступен + if (typeof window !== "undefined" && (window as any).mapServiceInstance) { + (window as any).mapServiceInstance.clearCaches(); + } +}; + interface ApiRoute { id: number; route_number: string; @@ -328,6 +341,11 @@ class MapStore { const mapStore = new MapStore(); +// Делаем mapStore доступным глобально для сброса кешей +if (typeof window !== "undefined") { + (window as any).mapStore = mapStore; +} + // --- CONFIGURATION --- export const mapConfig = { center: [30.311, 59.94] as [number, number], @@ -453,7 +471,7 @@ class MapService { public routeLayer: VectorLayer>>; // Public for deselect private clusterSource: Cluster; private clusterStyleCache: { [key: number]: Style }; - private unclusteredRouteIds: Set = new Set(); + private tooltipElement: HTMLElement; private tooltipOverlay: Overlay | null; private mode: string | null; @@ -488,8 +506,7 @@ class MapService { private sightIconStyle: Style; private selectedSightIconStyle: Style; private drawSightIconStyle: Style; - private routeIconStyle: Style; - private selectedRouteIconStyle: Style; + private universalHoverStylePoint: Style; private hoverSightIconStyle: Style; private universalHoverStyleLine: Style; @@ -574,21 +591,6 @@ class MapService { }), }); - this.routeIconStyle = new Style({ - image: new CircleStyle({ - radius: 8, - fill: new Fill({ color: "rgba(34, 197, 94, 0.8)" }), // Green - stroke: new Stroke({ color: "#ffffff", width: 1.5 }), - }), - }); - this.selectedRouteIconStyle = new Style({ - image: new CircleStyle({ - radius: 10, - fill: new Fill({ color: "rgba(221, 107, 32, 0.9)" }), // Orange on select - stroke: new Stroke({ color: "#ffffff", width: 2 }), - }), - }); - this.sightIconStyle = new Style({ image: new RegularShape({ fill: new Fill({ color: "rgba(139, 92, 246, 0.8)" }), @@ -659,10 +661,7 @@ class MapService { if (!feature) return this.defaultStyle; const fId = feature.getId(); - if (fId === undefined || !this.unclusteredRouteIds.has(fId)) { - return null; - } - + // Все маршруты всегда отображаются, так как они не кластеризуются const isSelected = this.selectInteraction?.getFeatures().getArray().includes(feature) || (fId !== undefined && this.selectedIds.has(fId)); @@ -705,8 +704,6 @@ class MapService { const originalFeature = featuresInCluster[0]; const fId = originalFeature.getId(); const featureType = originalFeature.get("featureType"); - const isProxy = originalFeature.get("isProxy"); - if (isProxy) return new Style(); // Invisible empty style const isSelected = fId !== undefined && this.selectedIds.has(fId); const isHovered = this.hoveredFeatureId === fId; @@ -719,45 +716,20 @@ class MapService { if (isSelected) { if (featureType === "sight") return this.selectedSightIconStyle; - if (featureType === "route") return this.selectedRouteIconStyle; return this.selectedBusIconStyle; } if (featureType === "sight") return this.sightIconStyle; - if (featureType === "route") return this.routeIconStyle; return this.busIconStyle; } }, }); this.clusterSource.on("change", () => { - const newUnclusteredRouteIds = new Set(); - this.clusterSource - .getFeatures() - .forEach((clusterFeature: Feature) => { - const originalFeatures = clusterFeature.get( - "features" - ) as Feature[]; - if (originalFeatures && originalFeatures.length === 1) { - const originalFeature = originalFeatures[0]; - if (originalFeature.get("featureType") === "route") { - const featureId = originalFeature.getId(); - if (featureId !== undefined) { - newUnclusteredRouteIds.add(featureId); - } - } - } - }); - - if ( - newUnclusteredRouteIds.size !== this.unclusteredRouteIds.size || - ![...newUnclusteredRouteIds].every((id) => - this.unclusteredRouteIds.has(id) - ) - ) { - this.unclusteredRouteIds = newUnclusteredRouteIds; - this.routeLayer.changed(); - } + // Поскольку маршруты больше не добавляются как точки, + // нам не нужно отслеживать unclusteredRouteIds + // Все маршруты всегда отображаются как линии + this.routeLayer.changed(); }); this.boundHandlePointerMove = this.handlePointerMove.bind(this); @@ -1209,23 +1181,7 @@ class MapService { lineFeature.set("featureType", "route"); lineFeatures.push(lineFeature); - if (route.center_longitude != null && route.center_latitude != null) { - const centerPoint = new Point( - transform( - [route.center_longitude, route.center_latitude], - "EPSG:4326", - projection - ) - ); - const proxyPointFeature = new Feature({ - geometry: centerPoint, - name: route.route_number, - isProxy: true, - }); - proxyPointFeature.setId(routeId); - proxyPointFeature.set("featureType", "route"); - pointFeatures.push(proxyPointFeature); - } + // Не создаем прокси-точки для маршрутов - они должны оставаться только линиями }); this.pointSource.addFeatures(pointFeatures); @@ -1926,6 +1882,32 @@ class MapService { return this.map; } + // Метод для сброса кешей карты + public clearCaches() { + this.clusterStyleCache = {}; + this.history = []; + this.historyIndex = -1; + this.beforeActionState = null; + this.hoveredFeatureId = null; + this.selectedIds.clear(); + + // Очищаем источники данных + if (this.pointSource) { + this.pointSource.clear(); + } + if (this.lineSource) { + this.lineSource.clear(); + } + + // Обновляем слои + if (this.clusterLayer) { + this.clusterLayer.changed(); + } + if (this.routeLayer) { + this.routeLayer.changed(); + } + } + public saveCurrentPosition(): void { if (!this.map) return; const center = this.map.getView().getCenter(); @@ -1941,20 +1923,6 @@ class MapService { const featureId = feature.getId(); if (!featureType || featureId === undefined || !this.map) return; - if ( - featureType === "route" && - feature.getGeometry()?.getType() === "LineString" - ) { - const proxyPoint = this.pointSource.getFeatureById( - featureId - ) as Feature; - if (proxyPoint) { - const lineGeom = feature.getGeometry() as LineString; - const newCenter = getCenter(lineGeom.getExtent()); - proxyPoint.getGeometry()?.setCoordinates(newCenter); - } - } - if (typeof featureId === "number" || !String(featureId).includes("-")) { console.warn( "Skipping save for feature with non-standard ID:", @@ -2023,22 +1991,7 @@ class MapService { ); feature.setGeometry(lineGeom); - // Create and add proxy point - const centerPointGeom = new Point( - transform( - [routeData.center_longitude, routeData.center_latitude], - "EPSG:4326", - projection - ) - ); - const proxyPointFeature = new Feature({ - geometry: centerPointGeom, - name: displayName, - isProxy: true, - }); - proxyPointFeature.setId(newFeatureId); - proxyPointFeature.set("featureType", "route"); - this.pointSource.addFeature(proxyPointFeature); + // Не создаем прокси-точку для маршрута - только линия } else { // For points: update existing feature.setId(newFeatureId); @@ -2603,6 +2556,12 @@ export const MapPage: React.FC = () => { setSelectedIds ); setMapServiceInstance(service); + + // Делаем mapServiceInstance доступным глобально для сброса кешей + if (typeof window !== "undefined") { + (window as any).mapServiceInstance = service; + } + loadInitialData(service); } catch (e: any) { setError( @@ -2615,6 +2574,11 @@ export const MapPage: React.FC = () => { return () => { service?.destroy(); setMapServiceInstance(null); + + // Удаляем глобальную ссылку + if (typeof window !== "undefined") { + delete (window as any).mapServiceInstance; + } }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/src/pages/Route/LinekedStations.tsx b/src/pages/Route/LinekedStations.tsx index 43ebb56..03da037 100644 --- a/src/pages/Route/LinekedStations.tsx +++ b/src/pages/Route/LinekedStations.tsx @@ -225,7 +225,7 @@ export const LinkedItemsContents = < if (type === "edit") { setError(null); authInstance - .get(`/${childResource}/`) + .get(`/${childResource}`) .then((response) => { setAllItems(response?.data || []); }) diff --git a/src/pages/Snapshot/SnapshotCreatePage/index.tsx b/src/pages/Snapshot/SnapshotCreatePage/index.tsx index 4c931e9..971a2de 100644 --- a/src/pages/Snapshot/SnapshotCreatePage/index.tsx +++ b/src/pages/Snapshot/SnapshotCreatePage/index.tsx @@ -1,4 +1,4 @@ -import { Button, Paper, TextField } from "@mui/material"; +import { Button, TextField } from "@mui/material"; import { snapshotStore } from "@shared"; import { observer } from "mobx-react-lite"; import { ArrowLeft, Loader2, Save } from "lucide-react"; @@ -20,50 +20,56 @@ export const SnapshotCreatePage = observer(() => { }, [id]); return ( - -
- -
-

Создание снапшота

-
- setName(e.target.value)} - /> +
+
+
+ +
+

Создание снапшота

+
+ setName(e.target.value)} + /> - + +
- +
); }); diff --git a/src/pages/Snapshot/index.ts b/src/pages/Snapshot/index.ts index 3b43ed1..98e38a6 100644 --- a/src/pages/Snapshot/index.ts +++ b/src/pages/Snapshot/index.ts @@ -1,3 +1,2 @@ export * from "./SnapshotListPage"; - export * from "./SnapshotCreatePage"; diff --git a/src/pages/Station/LinkedSights.tsx b/src/pages/Station/LinkedSights.tsx index cacb2b6..74b79f2 100644 --- a/src/pages/Station/LinkedSights.tsx +++ b/src/pages/Station/LinkedSights.tsx @@ -176,7 +176,7 @@ export const LinkedSightsContents = < if (type === "edit") { setError(null); authInstance - .get(`/${childResource}/`) + .get(`/${childResource}`) .then((response) => { setAllItems(response?.data || []); }) diff --git a/src/shared/store/SnapshotStore/index.ts b/src/shared/store/SnapshotStore/index.ts index 204d82f..524f3c2 100644 --- a/src/shared/store/SnapshotStore/index.ts +++ b/src/shared/store/SnapshotStore/index.ts @@ -1,6 +1,24 @@ import { authInstance } from "@shared"; import { makeAutoObservable, runInAction } from "mobx"; +// Импорт функции сброса кешей карты +// import { clearMapCaches } from "../../pages/MapPage"; +import { + articlesStore, + cityStore, + countryStore, + carrierStore, + stationsStore, + sightsStore, + routeStore, + vehicleStore, + userStore, + mediaStore, + createSightStore, + editSightStore, + devicesStore, + authStore, +} from "@shared"; type Snapshot = { ID: string; @@ -17,6 +35,248 @@ class SnapshotStore { makeAutoObservable(this); } + // Функция для сброса всех кешей в приложении + private clearAllCaches = () => { + // Сброс кешей статей + articlesStore.articleList = { + ru: { data: [], loaded: false }, + en: { data: [], loaded: false }, + zh: { data: [], loaded: false }, + }; + articlesStore.articlePreview = {}; + articlesStore.articleData = null; + articlesStore.articleMedia = null; + + // Сброс кешей городов + cityStore.cities = { + ru: { data: [], loaded: false }, + en: { data: [], loaded: false }, + zh: { data: [], loaded: false }, + }; + cityStore.ruCities = { data: [], loaded: false }; + cityStore.city = {}; + + // Сброс кешей стран + countryStore.countries = { + ru: { data: [], loaded: false }, + en: { data: [], loaded: false }, + zh: { data: [], loaded: false }, + }; + + // Сброс кешей перевозчиков + carrierStore.carriers = { + ru: { data: [], loaded: false }, + en: { data: [], loaded: false }, + zh: { data: [], loaded: false }, + }; + + // Сброс кешей станций + stationsStore.stationLists = { + ru: { data: [], loaded: false }, + en: { data: [], loaded: false }, + zh: { data: [], loaded: false }, + }; + stationsStore.stationPreview = {}; + + // Сброс кешей достопримечательностей + sightsStore.sights = []; + sightsStore.sight = null; + + // Сброс кешей маршрутов + routeStore.routes = { data: [], loaded: false }; + + // Сброс кешей транспорта + vehicleStore.vehicles = { data: [], loaded: false }; + + // Сброс кешей пользователей + userStore.users = { data: [], loaded: false }; + + // Сброс кешей медиа + mediaStore.media = []; + mediaStore.oneMedia = null; + + // Сброс кешей создания и редактирования достопримечательностей + createSightStore.sight = JSON.parse( + JSON.stringify({ + city_id: 0, + city: "", + latitude: 0, + longitude: 0, + thumbnail: null, + watermark_lu: null, + watermark_rd: null, + left_article: 0, + preview_media: null, + video_preview: null, + ru: { + name: "", + address: "", + left: { heading: "", body: "", media: [] }, + right: [], + }, + en: { + name: "", + address: "", + left: { heading: "", body: "", media: [] }, + right: [], + }, + zh: { + name: "", + address: "", + left: { heading: "", body: "", media: [] }, + right: [], + }, + }) + ); + createSightStore.uploadMediaOpen = false; + createSightStore.fileToUpload = null; + createSightStore.needLeaveAgree = false; + + editSightStore.sight = { + common: { + id: 0, + city_id: 0, + city: "", + latitude: 0, + longitude: 0, + thumbnail: null, + watermark_lu: null, + watermark_rd: null, + left_article: 0, + preview_media: null, + video_preview: null, + }, + ru: { + id: 0, + name: "", + address: "", + left: { heading: "", body: "", media: [] }, + right: [], + }, + en: { + id: 0, + name: "", + address: "", + left: { heading: "", body: "", media: [] }, + right: [], + }, + zh: { + id: 0, + name: "", + address: "", + left: { heading: "", body: "", media: [] }, + right: [], + }, + }; + editSightStore.hasLoadedCommon = false; + editSightStore.uploadMediaOpen = false; + editSightStore.fileToUpload = null; + editSightStore.needLeaveAgree = false; + + // Сброс кешей устройств + devicesStore.devices = []; + devicesStore.uuid = null; + devicesStore.sendSnapshotModalOpen = false; + + // Сброс кешей авторизации (кроме токена) + authStore.payload = null; + authStore.error = null; + authStore.isLoading = false; + + // Сброс кешей карты (если они загружены) + try { + // Сбрасываем кеши mapStore если он доступен + if (typeof window !== "undefined" && (window as any).mapStore) { + (window as any).mapStore.routes = []; + (window as any).mapStore.stations = []; + (window as any).mapStore.sights = []; + } + + // Сбрасываем кеши MapService если он доступен + if (typeof window !== "undefined" && (window as any).mapServiceInstance) { + (window as any).mapServiceInstance.clearCaches(); + } + } catch (error) { + console.warn("Не удалось сбросить кеши карты:", error); + } + + // Сброс localStorage кешей (кроме токена авторизации) + const token = localStorage.getItem("token"); + const rememberedEmail = localStorage.getItem("rememberedEmail"); + const rememberedPassword = localStorage.getItem("rememberedPassword"); + + localStorage.clear(); + sessionStorage.clear(); + + // Восстанавливаем важные данные + if (token) localStorage.setItem("token", token); + if (rememberedEmail) + localStorage.setItem("rememberedEmail", rememberedEmail); + if (rememberedPassword) + localStorage.setItem("rememberedPassword", rememberedPassword); + + // Сброс кешей карты (если они есть) + const mapPositionKey = "mapPosition"; + const activeSectionKey = "mapActiveSection"; + if (localStorage.getItem(mapPositionKey)) { + localStorage.removeItem(mapPositionKey); + } + if (localStorage.getItem(activeSectionKey)) { + localStorage.removeItem(activeSectionKey); + } + + // Попытка очистить кеш браузера (если поддерживается) + if ("caches" in window) { + try { + caches + .keys() + .then((cacheNames) => { + return Promise.all( + cacheNames.map((cacheName) => { + return caches.delete(cacheName); + }) + ); + }) + .then(() => { + console.log("Кеш браузера очищен"); + }) + .catch((error) => { + console.warn("Не удалось очистить кеш браузера:", error); + }); + } catch (error) { + console.warn("Кеш браузера не поддерживается:", error); + } + } + + // Попытка очистить IndexedDB (если поддерживается) + if ("indexedDB" in window) { + try { + indexedDB + .databases() + .then((databases) => { + return Promise.all( + databases.map((db) => { + if (db.name) { + return indexedDB.deleteDatabase(db.name); + } + return Promise.resolve(); + }) + ); + }) + .then(() => { + console.log("IndexedDB очищен"); + }) + .catch((error) => { + console.warn("Не удалось очистить IndexedDB:", error); + }); + } catch (error) { + console.warn("IndexedDB не поддерживается:", error); + } + } + + console.log("Все кеши приложения сброшены"); + }; + getSnapshots = async () => { const response = await authInstance.get(`/snapshots`); @@ -42,6 +302,10 @@ class SnapshotStore { }; restoreSnapshot = async (id: string) => { + // Сначала сбрасываем все кеши + this.clearAllCaches(); + + // Затем восстанавливаем снапшот await authInstance.post(`/snapshots/${id}/restore`); }; diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index 140a5a9..df0eaf8 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/main.tsx","./src/vite-env.d.ts","./src/app/index.tsx","./src/app/router/index.tsx","./src/entities/index.ts","./src/entities/navigation/index.ts","./src/entities/navigation/model/index.ts","./src/entities/navigation/ui/index.tsx","./src/features/index.ts","./src/features/navigation/index.ts","./src/features/navigation/ui/index.tsx","./src/pages/index.ts","./src/pages/article/index.ts","./src/pages/article/articlecreatepage/index.tsx","./src/pages/article/articleeditpage/index.tsx","./src/pages/article/articlelistpage/index.tsx","./src/pages/article/articlepreviewpage/previewleftwidget.tsx","./src/pages/article/articlepreviewpage/previewrightwidget.tsx","./src/pages/article/articlepreviewpage/index.tsx","./src/pages/carrier/index.ts","./src/pages/carrier/carriercreatepage/index.tsx","./src/pages/carrier/carriereditpage/index.tsx","./src/pages/carrier/carrierlistpage/index.tsx","./src/pages/city/index.ts","./src/pages/city/citycreatepage/index.tsx","./src/pages/city/cityeditpage/index.tsx","./src/pages/city/citylistpage/index.tsx","./src/pages/city/citypreviewpage/index.tsx","./src/pages/country/index.ts","./src/pages/country/countryaddpage/index.tsx","./src/pages/country/countrycreatepage/index.tsx","./src/pages/country/countryeditpage/index.tsx","./src/pages/country/countrylistpage/index.tsx","./src/pages/country/countrypreviewpage/index.tsx","./src/pages/createsightpage/index.tsx","./src/pages/devicespage/index.tsx","./src/pages/editsightpage/index.tsx","./src/pages/loginpage/index.tsx","./src/pages/mainpage/index.tsx","./src/pages/mappage/index.tsx","./src/pages/mappage/mapstore.ts","./src/pages/media/index.ts","./src/pages/media/mediacreatepage/index.tsx","./src/pages/media/mediaeditpage/index.tsx","./src/pages/media/medialistpage/index.tsx","./src/pages/media/mediapreviewpage/index.tsx","./src/pages/route/linekedstations.tsx","./src/pages/route/index.ts","./src/pages/route/routecreatepage/index.tsx","./src/pages/route/routeeditpage/index.tsx","./src/pages/route/routelistpage/index.tsx","./src/pages/route/route-preview/constants.ts","./src/pages/route/route-preview/infinitecanvas.tsx","./src/pages/route/route-preview/leftsidebar.tsx","./src/pages/route/route-preview/mapdatacontext.tsx","./src/pages/route/route-preview/rightsidebar.tsx","./src/pages/route/route-preview/sight.tsx","./src/pages/route/route-preview/sightinfowidget.tsx","./src/pages/route/route-preview/station.tsx","./src/pages/route/route-preview/transformcontext.tsx","./src/pages/route/route-preview/travelpath.tsx","./src/pages/route/route-preview/widgets.tsx","./src/pages/route/route-preview/index.tsx","./src/pages/route/route-preview/types.ts","./src/pages/route/route-preview/utils.ts","./src/pages/sight/index.ts","./src/pages/sight/sightlistpage/index.tsx","./src/pages/sightpage/index.tsx","./src/pages/snapshot/index.ts","./src/pages/snapshot/snapshotcreatepage/index.tsx","./src/pages/snapshot/snapshotlistpage/index.tsx","./src/pages/station/linkedsights.tsx","./src/pages/station/index.ts","./src/pages/station/stationcreatepage/index.tsx","./src/pages/station/stationeditpage/index.tsx","./src/pages/station/stationlistpage/index.tsx","./src/pages/station/stationpreviewpage/index.tsx","./src/pages/user/index.ts","./src/pages/user/usercreatepage/index.tsx","./src/pages/user/usereditpage/index.tsx","./src/pages/user/userlistpage/index.tsx","./src/pages/vehicle/index.ts","./src/pages/vehicle/vehiclecreatepage/index.tsx","./src/pages/vehicle/vehicleeditpage/index.tsx","./src/pages/vehicle/vehiclelistpage/index.tsx","./src/pages/vehicle/vehiclepreviewpage/index.tsx","./src/shared/index.tsx","./src/shared/api/index.tsx","./src/shared/config/carriersvg.tsx","./src/shared/config/constants.tsx","./src/shared/config/index.ts","./src/shared/const/index.ts","./src/shared/lib/index.ts","./src/shared/lib/decodejwt/index.ts","./src/shared/lib/mui/theme.ts","./src/shared/modals/index.ts","./src/shared/modals/previewmediadialog/index.tsx","./src/shared/modals/selectarticledialog/index.tsx","./src/shared/modals/selectmediadialog/index.tsx","./src/shared/modals/uploadmediadialog/index.tsx","./src/shared/store/index.ts","./src/shared/store/articlesstore/index.tsx","./src/shared/store/authstore/index.tsx","./src/shared/store/carrierstore/index.tsx","./src/shared/store/citystore/index.ts","./src/shared/store/countrystore/index.ts","./src/shared/store/createsightstore/index.tsx","./src/shared/store/devicesstore/index.tsx","./src/shared/store/editsightstore/index.tsx","./src/shared/store/languagestore/index.tsx","./src/shared/store/mediastore/index.tsx","./src/shared/store/routestore/index.ts","./src/shared/store/sightsstore/index.tsx","./src/shared/store/snapshotstore/index.ts","./src/shared/store/stationsstore/index.ts","./src/shared/store/userstore/index.ts","./src/shared/store/vehiclestore/index.ts","./src/shared/ui/index.ts","./src/shared/ui/backbutton/index.tsx","./src/shared/ui/coordinatesinput/index.tsx","./src/shared/ui/input/index.tsx","./src/shared/ui/modal/index.tsx","./src/shared/ui/tabpanel/index.tsx","./src/widgets/index.ts","./src/widgets/createbutton/index.tsx","./src/widgets/deletemodal/index.tsx","./src/widgets/devicestable/index.tsx","./src/widgets/imageuploadcard/index.tsx","./src/widgets/languageswitcher/index.tsx","./src/widgets/layout/index.tsx","./src/widgets/layout/ui/appbar.tsx","./src/widgets/layout/ui/drawer.tsx","./src/widgets/layout/ui/drawerheader.tsx","./src/widgets/leaveagree/index.tsx","./src/widgets/mediaarea/index.tsx","./src/widgets/mediaareaforsight/index.tsx","./src/widgets/mediaviewer/threeview.tsx","./src/widgets/mediaviewer/index.tsx","./src/widgets/modelviewer3d/index.tsx","./src/widgets/reactmarkdown/index.tsx","./src/widgets/reactmarkdowneditor/index.tsx","./src/widgets/sightedit/index.tsx","./src/widgets/sightheader/index.ts","./src/widgets/sightheader/ui/index.tsx","./src/widgets/sighttabs/index.ts","./src/widgets/sighttabs/createinformationtab/mediauploadbox.tsx","./src/widgets/sighttabs/createinformationtab/index.tsx","./src/widgets/sighttabs/createlefttab/index.tsx","./src/widgets/sighttabs/createrighttab/index.tsx","./src/widgets/sighttabs/informationtab/index.tsx","./src/widgets/sighttabs/leftwidgettab/index.tsx","./src/widgets/sighttabs/rightwidgettab/index.tsx","./src/widgets/sightstable/index.tsx","./src/widgets/snapshotrestore/index.tsx","./src/widgets/videopreviewcard/index.tsx","./src/widgets/modals/editstationmodal.tsx","./src/widgets/modals/index.ts","./src/widgets/modals/selectarticledialog/index.tsx"],"version":"5.8.3"} \ No newline at end of file +{"root":["./src/main.tsx","./src/vite-env.d.ts","./src/app/index.tsx","./src/app/router/index.tsx","./src/entities/index.ts","./src/entities/navigation/index.ts","./src/entities/navigation/model/index.ts","./src/entities/navigation/ui/index.tsx","./src/features/index.ts","./src/features/navigation/index.ts","./src/features/navigation/ui/index.tsx","./src/pages/index.ts","./src/pages/article/index.ts","./src/pages/article/articlecreatepage/index.tsx","./src/pages/article/articleeditpage/index.tsx","./src/pages/article/articlelistpage/index.tsx","./src/pages/article/articlepreviewpage/previewleftwidget.tsx","./src/pages/article/articlepreviewpage/previewrightwidget.tsx","./src/pages/article/articlepreviewpage/index.tsx","./src/pages/carrier/index.ts","./src/pages/carrier/carriercreatepage/index.tsx","./src/pages/carrier/carriereditpage/index.tsx","./src/pages/carrier/carrierlistpage/index.tsx","./src/pages/city/index.ts","./src/pages/city/citycreatepage/index.tsx","./src/pages/city/cityeditpage/index.tsx","./src/pages/city/citylistpage/index.tsx","./src/pages/city/citypreviewpage/index.tsx","./src/pages/country/index.ts","./src/pages/country/countryaddpage/index.tsx","./src/pages/country/countrycreatepage/index.tsx","./src/pages/country/countryeditpage/index.tsx","./src/pages/country/countrylistpage/index.tsx","./src/pages/country/countrypreviewpage/index.tsx","./src/pages/createsightpage/index.tsx","./src/pages/devicespage/index.tsx","./src/pages/editsightpage/index.tsx","./src/pages/loginpage/index.tsx","./src/pages/mainpage/index.tsx","./src/pages/mappage/index.tsx","./src/pages/mappage/mapstore.ts","./src/pages/media/index.ts","./src/pages/media/mediacreatepage/index.tsx","./src/pages/media/mediaeditpage/index.tsx","./src/pages/media/medialistpage/index.tsx","./src/pages/media/mediapreviewpage/index.tsx","./src/pages/route/linekedstations.tsx","./src/pages/route/index.ts","./src/pages/route/routecreatepage/index.tsx","./src/pages/route/routeeditpage/index.tsx","./src/pages/route/routelistpage/index.tsx","./src/pages/route/route-preview/constants.ts","./src/pages/route/route-preview/infinitecanvas.tsx","./src/pages/route/route-preview/leftsidebar.tsx","./src/pages/route/route-preview/mapdatacontext.tsx","./src/pages/route/route-preview/rightsidebar.tsx","./src/pages/route/route-preview/sight.tsx","./src/pages/route/route-preview/sightinfowidget.tsx","./src/pages/route/route-preview/station.tsx","./src/pages/route/route-preview/transformcontext.tsx","./src/pages/route/route-preview/travelpath.tsx","./src/pages/route/route-preview/widgets.tsx","./src/pages/route/route-preview/index.tsx","./src/pages/route/route-preview/types.ts","./src/pages/route/route-preview/utils.ts","./src/pages/sight/index.ts","./src/pages/sight/sightlistpage/index.tsx","./src/pages/sightpage/index.tsx","./src/pages/snapshot/index.ts","./src/pages/snapshot/snapshotcreatepage/index.tsx","./src/pages/snapshot/snapshotlistpage/index.tsx","./src/pages/station/linkedsights.tsx","./src/pages/station/index.ts","./src/pages/station/stationcreatepage/index.tsx","./src/pages/station/stationeditpage/index.tsx","./src/pages/station/stationlistpage/index.tsx","./src/pages/station/stationpreviewpage/index.tsx","./src/pages/user/index.ts","./src/pages/user/usercreatepage/index.tsx","./src/pages/user/usereditpage/index.tsx","./src/pages/user/userlistpage/index.tsx","./src/pages/vehicle/index.ts","./src/pages/vehicle/vehiclecreatepage/index.tsx","./src/pages/vehicle/vehicleeditpage/index.tsx","./src/pages/vehicle/vehiclelistpage/index.tsx","./src/pages/vehicle/vehiclepreviewpage/index.tsx","./src/shared/index.tsx","./src/shared/api/index.tsx","./src/shared/config/carriersvg.tsx","./src/shared/config/constants.tsx","./src/shared/config/index.ts","./src/shared/const/index.ts","./src/shared/lib/index.ts","./src/shared/lib/decodejwt/index.ts","./src/shared/lib/mui/theme.ts","./src/shared/modals/index.ts","./src/shared/modals/previewmediadialog/index.tsx","./src/shared/modals/selectarticledialog/index.tsx","./src/shared/modals/selectmediadialog/index.tsx","./src/shared/modals/uploadmediadialog/index.tsx","./src/shared/store/index.ts","./src/shared/store/articlesstore/index.tsx","./src/shared/store/authstore/index.tsx","./src/shared/store/carrierstore/index.tsx","./src/shared/store/citystore/index.ts","./src/shared/store/countrystore/index.ts","./src/shared/store/createsightstore/index.tsx","./src/shared/store/devicesstore/index.tsx","./src/shared/store/editsightstore/index.tsx","./src/shared/store/languagestore/index.tsx","./src/shared/store/mediastore/index.tsx","./src/shared/store/routestore/index.ts","./src/shared/store/sightsstore/index.tsx","./src/shared/store/snapshotstore/index.ts","./src/shared/store/stationsstore/index.ts","./src/shared/store/userstore/index.ts","./src/shared/store/vehiclestore/index.ts","./src/shared/ui/index.ts","./src/shared/ui/backbutton/index.tsx","./src/shared/ui/coordinatesinput/index.tsx","./src/shared/ui/input/index.tsx","./src/shared/ui/modal/index.tsx","./src/shared/ui/tabpanel/index.tsx","./src/widgets/index.ts","./src/widgets/createbutton/index.tsx","./src/widgets/deletemodal/index.tsx","./src/widgets/devicestable/index.tsx","./src/widgets/imageuploadcard/index.tsx","./src/widgets/languageswitcher/index.tsx","./src/widgets/layout/index.tsx","./src/widgets/layout/ui/appbar.tsx","./src/widgets/layout/ui/drawer.tsx","./src/widgets/layout/ui/drawerheader.tsx","./src/widgets/leaveagree/index.tsx","./src/widgets/mediaarea/index.tsx","./src/widgets/mediaareaforsight/index.tsx","./src/widgets/mediaviewer/threeview.tsx","./src/widgets/mediaviewer/index.tsx","./src/widgets/modelviewer3d/index.tsx","./src/widgets/reactmarkdown/index.tsx","./src/widgets/reactmarkdowneditor/index.tsx","./src/widgets/sightedit/index.tsx","./src/widgets/sightheader/index.ts","./src/widgets/sightheader/ui/index.tsx","./src/widgets/sighttabs/index.ts","./src/widgets/sighttabs/createinformationtab/mediauploadbox.tsx","./src/widgets/sighttabs/createinformationtab/index.tsx","./src/widgets/sighttabs/createlefttab/index.tsx","./src/widgets/sighttabs/createrighttab/index.tsx","./src/widgets/sighttabs/informationtab/index.tsx","./src/widgets/sighttabs/leftwidgettab/index.tsx","./src/widgets/sighttabs/rightwidgettab/index.tsx","./src/widgets/sightstable/index.tsx","./src/widgets/snapshotrestore/index.tsx","./src/widgets/videopreviewcard/index.tsx","./src/widgets/modals/editstationmodal.tsx","./src/widgets/modals/index.ts","./src/widgets/modals/selectarticledialog/index.tsx"],"errors":true,"version":"5.8.3"} \ No newline at end of file