diff --git a/CITY_SELECTOR_FEATURE.md b/CITY_SELECTOR_FEATURE.md new file mode 100644 index 0000000..a1aea66 --- /dev/null +++ b/CITY_SELECTOR_FEATURE.md @@ -0,0 +1,62 @@ +# Селектор городов + +## Описание функциональности + +Добавлена функциональность выбора города в админ-панели "Белые ночи": + +### Основные возможности: + +1. **Селектор городов в шапке приложения** + + - Расположен рядом с именем пользователя в верхней части приложения + - Показывает список всех доступных городов + - Имеет иконку MapPin для лучшего UX + +2. **Сохранение в localStorage** + + - Выбранный город автоматически сохраняется в localStorage + - При перезагрузке страницы выбранный город восстанавливается + +3. **Автоматическое использование в формах** + - При создании новой станции выбранный город автоматически подставляется + - При создании нового перевозчика выбранный город автоматически подставляется + - Пользователь может изменить город в форме при необходимости + +### Технические детали: + +#### Новые компоненты и сторы: + +- `SelectedCityStore` - стор для управления выбранным городом +- `CitySelector` - компонент селектора городов +- `useSelectedCity` - хук для удобного доступа к выбранному городу + +#### Интеграция: + +- Селектор добавлен в `Layout` компонент +- Интегрирован в `StationCreatePage` и `CarrierCreatePage` +- Использует существующий `CityStore` для получения списка городов + +#### Файлы, которые были изменены: + +- `src/widgets/Layout/index.tsx` - добавлен CitySelector +- `src/pages/Station/StationCreatePage/index.tsx` - автоматическая подстановка города +- `src/pages/Carrier/CarrierCreatePage/index.tsx` - автоматическая подстановка города +- `src/shared/store/index.ts` - добавлен экспорт SelectedCityStore +- `src/widgets/index.ts` - добавлен экспорт CitySelector +- `src/shared/index.tsx` - добавлен экспорт hooks + +#### Новые файлы: + +- `src/shared/store/SelectedCityStore/index.ts` +- `src/widgets/CitySelector/index.tsx` +- `src/shared/hooks/useSelectedCity.ts` +- `src/shared/hooks/index.ts` + +### Использование: + +1. Пользователь выбирает город в селекторе в шапке приложения +2. Выбранный город сохраняется в localStorage +3. При создании новой станции или перевозчика выбранный город автоматически подставляется в форму +4. Пользователь может изменить город в форме если нужно + +Функциональность полностью интегрирована и готова к использованию. diff --git a/src/pages/Carrier/CarrierCreatePage/index.tsx b/src/pages/Carrier/CarrierCreatePage/index.tsx index f447921..98e795a 100644 --- a/src/pages/Carrier/CarrierCreatePage/index.tsx +++ b/src/pages/Carrier/CarrierCreatePage/index.tsx @@ -12,7 +12,13 @@ import { ArrowLeft, Save } from "lucide-react"; import { Loader2 } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { toast } from "react-toastify"; -import { carrierStore, cityStore, mediaStore, languageStore } from "@shared"; +import { + carrierStore, + cityStore, + mediaStore, + languageStore, + useSelectedCity, +} from "@shared"; import { useState, useEffect } from "react"; import { ImageUploadCard, LanguageSwitcher } from "@widgets"; import { @@ -25,6 +31,7 @@ export const CarrierCreatePage = observer(() => { const navigate = useNavigate(); const { createCarrierData, setCreateCarrierData } = carrierStore; const { language } = languageStore; + const { selectedCityId } = useSelectedCity(); const [selectedMediaId, setSelectedMediaId] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isSelectMediaOpen, setIsSelectMediaOpen] = useState(false); @@ -41,6 +48,20 @@ export const CarrierCreatePage = observer(() => { languageStore.setLanguage("ru"); }, []); + // Автоматически устанавливаем выбранный город при загрузке страницы + useEffect(() => { + if (selectedCityId && !createCarrierData.city_id) { + setCreateCarrierData( + createCarrierData[language].full_name, + createCarrierData[language].short_name, + selectedCityId, + createCarrierData[language].slogan, + selectedMediaId || "", + language + ); + } + }, [selectedCityId, createCarrierData.city_id]); + const handleCreate = async () => { try { setIsLoading(true); diff --git a/src/pages/Station/StationCreatePage/index.tsx b/src/pages/Station/StationCreatePage/index.tsx index ce31b69..c7e49f4 100644 --- a/src/pages/Station/StationCreatePage/index.tsx +++ b/src/pages/Station/StationCreatePage/index.tsx @@ -6,14 +6,18 @@ import { MenuItem, FormControl, InputLabel, -} -from "@mui/material"; +} from "@mui/material"; import { observer } from "mobx-react-lite"; import { ArrowLeft, Save } from "lucide-react"; import { Loader2 } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { toast } from "react-toastify"; -import { stationsStore, languageStore, cityStore } from "@shared"; +import { + stationsStore, + languageStore, + cityStore, + useSelectedCity, +} from "@shared"; import { useEffect, useState } from "react"; import { LanguageSwitcher } from "@widgets"; import { SaveWithoutCityAgree } from "@widgets"; @@ -29,6 +33,7 @@ export const StationCreatePage = observer(() => { setLanguageCreateStationData, } = stationsStore; const { cities, getCities } = cityStore; + const { selectedCityId, selectedCity } = useSelectedCity(); const [coordinates, setCoordinates] = useState(""); // НОВОЕ СОСТОЯНИЕ ДЛЯ ПРЕДУПРЕЖДАЮЩЕГО ОКНА const [isSaveWarningOpen, setIsSaveWarningOpen] = useState(false); @@ -93,6 +98,16 @@ export const StationCreatePage = observer(() => { fetchCities(); }, []); + // Автоматически устанавливаем выбранный город при загрузке страницы + useEffect(() => { + if (selectedCityId && selectedCity && !createStationData.common.city_id) { + setCreateCommonData({ + city_id: selectedCityId, + city: selectedCity.name, + }); + } + }, [selectedCityId, selectedCity, createStationData.common.city_id]); + return ( @@ -242,4 +257,4 @@ export const StationCreatePage = observer(() => { )} ); -}); \ No newline at end of file +}); diff --git a/src/shared/hooks/index.ts b/src/shared/hooks/index.ts new file mode 100644 index 0000000..446d312 --- /dev/null +++ b/src/shared/hooks/index.ts @@ -0,0 +1 @@ +export * from "./useSelectedCity"; diff --git a/src/shared/hooks/useSelectedCity.ts b/src/shared/hooks/useSelectedCity.ts new file mode 100644 index 0000000..8269e13 --- /dev/null +++ b/src/shared/hooks/useSelectedCity.ts @@ -0,0 +1,12 @@ +import { selectedCityStore } from "@shared"; + +export const useSelectedCity = () => { + const { selectedCity, selectedCityId, selectedCityName } = selectedCityStore; + + return { + selectedCity, + selectedCityId, + selectedCityName, + hasSelectedCity: !!selectedCity, + }; +}; diff --git a/src/shared/index.tsx b/src/shared/index.tsx index 291c73a..58d69ed 100644 --- a/src/shared/index.tsx +++ b/src/shared/index.tsx @@ -5,3 +5,4 @@ export * from "./store"; export * from "./const"; export * from "./api"; export * from "./modals"; +export * from "./hooks"; diff --git a/src/shared/store/SelectedCityStore/index.ts b/src/shared/store/SelectedCityStore/index.ts new file mode 100644 index 0000000..270cc20 --- /dev/null +++ b/src/shared/store/SelectedCityStore/index.ts @@ -0,0 +1,48 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import { City } from "../CityStore"; + +class SelectedCityStore { + selectedCity: City | null = null; + + constructor() { + makeAutoObservable(this); + this.initialize(); + } + + private initialize() { + const storedCity = localStorage.getItem("selectedCity"); + if (storedCity) { + try { + this.selectedCity = JSON.parse(storedCity); + } catch (error) { + console.error("Error parsing stored city:", error); + localStorage.removeItem("selectedCity"); + } + } + } + + setSelectedCity = (city: City | null) => { + runInAction(() => { + this.selectedCity = city; + if (city) { + localStorage.setItem("selectedCity", JSON.stringify(city)); + } else { + localStorage.removeItem("selectedCity"); + } + }); + }; + + clearSelectedCity = () => { + this.setSelectedCity(null); + }; + + get selectedCityId() { + return this.selectedCity?.id || null; + } + + get selectedCityName() { + return this.selectedCity?.name || null; + } +} + +export const selectedCityStore = new SelectedCityStore(); diff --git a/src/shared/store/index.ts b/src/shared/store/index.ts index 9154594..41ddbc4 100644 --- a/src/shared/store/index.ts +++ b/src/shared/store/index.ts @@ -14,4 +14,5 @@ export * from "./RouteStore"; export * from "./UserStore"; export * from "./CarrierStore"; export * from "./StationsStore"; -export * from "./MenuStore" +export * from "./MenuStore"; +export * from "./SelectedCityStore"; diff --git a/src/widgets/CitySelector/index.tsx b/src/widgets/CitySelector/index.tsx new file mode 100644 index 0000000..6ac2771 --- /dev/null +++ b/src/widgets/CitySelector/index.tsx @@ -0,0 +1,77 @@ +import React, { useEffect } from "react"; +import { + FormControl, + Select, + MenuItem, + SelectChangeEvent, + Typography, + Box, +} from "@mui/material"; +import { observer } from "mobx-react-lite"; +import { cityStore, selectedCityStore } from "@shared"; +import { MapPin } from "lucide-react"; + +export const CitySelector: React.FC = observer(() => { + const { getCities, cities } = cityStore; + const { selectedCity, setSelectedCity } = selectedCityStore; + + useEffect(() => { + getCities("ru"); + }, []); + + const handleCityChange = (event: SelectChangeEvent) => { + const cityId = event.target.value; + if (cityId === "") { + setSelectedCity(null); + return; + } + + const city = cities["ru"].data.find((c) => c.id === Number(cityId)); + if (city) { + setSelectedCity(city); + } + }; + + const currentCities = cities["ru"].data; + + return ( + + + + + + + ); +}); diff --git a/src/widgets/Layout/index.tsx b/src/widgets/Layout/index.tsx index f54d9f8..28ae5b2 100644 --- a/src/widgets/Layout/index.tsx +++ b/src/widgets/Layout/index.tsx @@ -12,6 +12,7 @@ import { authStore, userStore, menuStore } from "@shared"; import { observer } from "mobx-react-lite"; import { useEffect } from "react"; import { Typography } from "@mui/material"; +import { CitySelector } from "@widgets"; interface LayoutProps { children: React.ReactNode; @@ -26,8 +27,6 @@ export const Layout: React.FC = observer(({ children }) => { setIsMenuOpen(open); }, [open]); - - const { getUsers, users } = userStore; useEffect(() => { @@ -63,7 +62,7 @@ export const Layout: React.FC = observer(({ children }) => { > -
+
{(() => { diff --git a/src/widgets/index.ts b/src/widgets/index.ts index 154ed28..03fd69b 100644 --- a/src/widgets/index.ts +++ b/src/widgets/index.ts @@ -17,5 +17,6 @@ export * from "./LeaveAgree"; export * from "./DeleteModal"; export * from "./SnapshotRestore"; export * from "./CreateButton"; -export * from "./SaveWithoutCityAgree" +export * from "./SaveWithoutCityAgree"; +export * from "./CitySelector"; export * from "./modals"; diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index e8aa570..d81fce0 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/menustore/index.ts","./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/savewithoutcityagree/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/hooks/index.ts","./src/shared/hooks/useselectedcity.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/menustore/index.ts","./src/shared/store/routestore/index.ts","./src/shared/store/selectedcitystore/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/cityselector/index.tsx","./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/savewithoutcityagree/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