+
{VEHICLE_TYPES.find((type) => type.value === params.row.type)
?.label || params.row.type}
@@ -47,21 +44,17 @@ export const VehicleListPage = observer(() => {
field: "carrier",
headerName: "Перевозчик",
flex: 1,
- align: "center",
- headerAlign: "center",
},
{
field: "city",
headerName: "Город",
flex: 1,
- align: "center",
- headerAlign: "center",
},
{
field: "actions",
headerName: "Действия",
- flex: 1,
+ width: 200,
align: "center",
headerAlign: "center",
@@ -88,13 +81,14 @@ export const VehicleListPage = observer(() => {
},
];
- const rows = vehicles.map((vehicle) => ({
+ const rows = vehicles.data?.map((vehicle) => ({
id: vehicle.vehicle.id,
tail_number: vehicle.vehicle.tail_number,
type: vehicle.vehicle.type,
carrier: vehicle.vehicle.carrier,
- city: carriers.find((carrier) => carrier.id === vehicle.vehicle.carrier_id)
- ?.city,
+ city: carriers.data?.find(
+ (carrier) => carrier.id === vehicle.vehicle.carrier_id
+ )?.city,
}));
return (
diff --git a/src/shared/config/constants.tsx b/src/shared/config/constants.tsx
index 9a7f2d4..a72099d 100644
--- a/src/shared/config/constants.tsx
+++ b/src/shared/config/constants.tsx
@@ -18,6 +18,7 @@ import {
Newspaper,
PersonStanding,
Cpu,
+ BookImage,
} from "lucide-react";
export const DRAWER_WIDTH = 300;
@@ -28,6 +29,7 @@ interface NavigationItem {
path?: string;
onClick?: () => void;
nestedItems?: NavigationItem[];
+ isActive?: boolean;
}
export const NAVIGATION_ITEMS: {
@@ -77,18 +79,18 @@ export const NAVIGATION_ITEMS: {
label: "Все сущности",
icon: Table,
nestedItems: [
- // {
- // id: "media",
- // label: "Медиа",
- // icon: BookImage,
- // path: "/media",
- // },
- // {
- // id: "articles",
- // label: "Статьи",
- // icon: Newspaper,
- // path: "/article",
- // },
+ {
+ id: "media",
+ label: "Медиа",
+ icon: BookImage,
+ path: "/media",
+ },
+ {
+ id: "articles",
+ label: "Статьи",
+ icon: Newspaper,
+ path: "/article",
+ },
{
id: "attractions",
label: "Достопримечательности",
diff --git a/src/shared/store/ArticlesStore/index.tsx b/src/shared/store/ArticlesStore/index.tsx
index 75649e5..98e7ac0 100644
--- a/src/shared/store/ArticlesStore/index.tsx
+++ b/src/shared/store/ArticlesStore/index.tsx
@@ -15,6 +15,29 @@ type Media = {
media_type: number;
};
+type ArticleListCashed = {
+ ru: {
+ data: Article[];
+ loaded: boolean;
+ };
+ en: {
+ data: Article[];
+ loaded: boolean;
+ };
+ zh: {
+ data: Article[];
+ loaded: boolean;
+ };
+};
+
+type PreviewCashed = {
+ ru: Article;
+ en: Article;
+ zh: Article;
+};
+
+type ArticlePreviewCashed = Record
;
+
class ArticlesStore {
constructor() {
makeAutoObservable(this);
@@ -25,19 +48,47 @@ class ArticlesStore {
en: [],
zh: [],
};
- articleList: Article[] = [];
+ articleList: ArticleListCashed = {
+ ru: {
+ data: [],
+ loaded: false,
+ },
+ en: {
+ data: [],
+ loaded: false,
+ },
+ zh: {
+ data: [],
+ loaded: false,
+ },
+ };
+ articlePreview: ArticlePreviewCashed = {};
articleData: Article | null = null;
articleMedia: Media | null = null;
articleLoading: boolean = false;
getArticleList = async () => {
+ const { language } = languageStore;
+ if (this.articleList[language].loaded) {
+ return;
+ }
const response = await authInstance.get("/article");
runInAction(() => {
- this.articleList = response.data;
+ this.articleList[language].data = response.data;
+ this.articleList[language].loaded = true;
});
};
+ getArticlePreview = async (id: number) => {
+ const { language } = languageStore;
+ if (this.articlePreview[id][language]) {
+ return;
+ }
+ const response = await authInstance.get(`/article/${id}/preview`);
+ this.articlePreview[id][language] = response.data;
+ };
+
getArticles = async (language: Language) => {
this.articleLoading = true;
const response = await authInstance.get("/article");
diff --git a/src/shared/store/CarrierStore/index.tsx b/src/shared/store/CarrierStore/index.tsx
index 2c0a3b6..6fe5120 100644
--- a/src/shared/store/CarrierStore/index.tsx
+++ b/src/shared/store/CarrierStore/index.tsx
@@ -14,23 +14,32 @@ export type Carrier = {
right_color: string;
};
-type Carriers = Carrier[];
+type Carriers = {
+ data: Carrier[];
+ loaded: boolean;
+};
type CashedCarrier = Record;
class CarrierStore {
- carriers: Carriers = [];
+ carriers: Carriers = {
+ data: [],
+ loaded: false,
+ };
carrier: CashedCarrier = {};
+
constructor() {
makeAutoObservable(this);
}
getCarriers = async () => {
- if (this.carriers.length > 0) return;
+ if (this.carriers.loaded) return;
+
const response = await authInstance.get("/carrier");
runInAction(() => {
- this.carriers = response.data;
+ this.carriers.data = response.data;
+ this.carriers.loaded = true;
});
};
@@ -38,13 +47,15 @@ class CarrierStore {
await authInstance.delete(`/carrier/${id}`);
runInAction(() => {
- this.carriers = this.carriers.filter((carrier) => carrier.id !== id);
+ this.carriers.data = this.carriers.data.filter(
+ (carrier) => carrier.id !== id
+ );
delete this.carrier[id];
});
};
getCarrier = async (id: number) => {
- if (this.carrier[id]) return this.carrier[id];
+ if (this.carrier[id]) return;
const response = await authInstance.get(`/carrier/${id}`);
runInAction(() => {
@@ -90,7 +101,7 @@ class CarrierStore {
logo: logoId,
});
runInAction(() => {
- this.carriers.push(response.data);
+ this.carriers.data.push(response.data);
});
};
@@ -137,7 +148,7 @@ class CarrierStore {
);
runInAction(() => {
- this.carriers = this.carriers.map((carrier) =>
+ this.carriers.data = this.carriers.data.map((carrier) =>
carrier.id === id ? { ...carrier, ...response.data } : carrier
);
diff --git a/src/shared/store/CityStore/index.ts b/src/shared/store/CityStore/index.ts
index a83a950..5bce254 100644
--- a/src/shared/store/CityStore/index.ts
+++ b/src/shared/store/CityStore/index.ts
@@ -236,39 +236,41 @@ class CityStore {
(country) => country.code === country_code
);
- await languageInstance(language as Language).patch(`/city/${code}`, {
- name,
- country: country?.name || "",
- country_code: country_code,
- arms,
- });
+ if (name) {
+ await languageInstance(language as Language).patch(`/city/${code}`, {
+ name,
+ country: country?.name || "",
+ country_code: country_code,
+ arms,
+ });
- runInAction(() => {
- if (this.city[code]) {
- this.city[code][language as keyof CashedCities] = {
- name,
- country: country?.name || "",
- country_code: country_code,
- arms,
- };
- }
+ runInAction(() => {
+ if (this.city[code]) {
+ this.city[code][language as keyof CashedCities] = {
+ name,
+ country: country?.name || "",
+ country_code: country_code,
+ arms,
+ };
+ }
- if (this.cities[language as keyof CashedCities]) {
- this.cities[language as keyof CashedCities] = this.cities[
- language as keyof CashedCities
- ].map((city) =>
- city.id === Number(code)
- ? {
- id: city.id,
- name,
- country: country?.name || "",
- country_code: country_code,
- arms,
- }
- : city
- );
- }
- });
+ if (this.cities[language as keyof CashedCities]) {
+ this.cities[language as keyof CashedCities] = this.cities[
+ language as keyof CashedCities
+ ].map((city) =>
+ city.id === Number(code)
+ ? {
+ id: city.id,
+ name,
+ country: country?.name || "",
+ country_code: country_code,
+ arms,
+ }
+ : city
+ );
+ }
+ });
+ }
}
};
}
diff --git a/src/shared/store/RouteStore/index.ts b/src/shared/store/RouteStore/index.ts
index 14d8c4f..e105fef 100644
--- a/src/shared/store/RouteStore/index.ts
+++ b/src/shared/store/RouteStore/index.ts
@@ -19,17 +19,38 @@ export type Route = {
};
class RouteStore {
- routes: Route[] = [];
+ routes: {
+ data: Route[];
+ loaded: boolean;
+ } = {
+ data: [],
+ loaded: false,
+ };
+ route: Record = {};
constructor() {
makeAutoObservable(this);
}
getRoutes = async () => {
+ if (this.routes.loaded) return;
const response = await authInstance.get("/route");
runInAction(() => {
- this.routes = response.data;
+ this.routes = {
+ data: response.data,
+ loaded: true,
+ };
+ });
+ };
+
+ createRoute = async (route: any) => {
+ const response = await authInstance.post("/route", route);
+ const id = response.data.id;
+
+ runInAction(() => {
+ this.route[id] = { ...route, id };
+ this.routes.data = [...this.routes.data, { ...route, id }];
});
};
@@ -37,9 +58,12 @@ class RouteStore {
await authInstance.delete(`/route/${id}`);
runInAction(() => {
- this.routes = this.routes.filter((route) => route.id !== id);
+ this.routes = {
+ data: this.routes.data.filter((route) => route.id !== id),
+ loaded: true,
+ };
});
};
}
-export const routeStore = new RouteStore();
\ No newline at end of file
+export const routeStore = new RouteStore();
diff --git a/src/shared/store/StationsStore/index.ts b/src/shared/store/StationsStore/index.ts
index 650a1eb..9b0463d 100644
--- a/src/shared/store/StationsStore/index.ts
+++ b/src/shared/store/StationsStore/index.ts
@@ -1,6 +1,42 @@
-import { authInstance } from "@shared";
+import { authInstance, languageInstance, languageStore } from "@shared";
import { makeAutoObservable, runInAction } from "mobx";
+type Language = "ru" | "en" | "zh";
+
+type StationLanguageData = {
+ name: string;
+ system_name: string;
+ description: string;
+ address: string;
+ loaded: boolean; // Indicates if this language's data has been loaded/modified
+};
+
+type StationCommonData = {
+ city_id: number;
+ direction: boolean;
+ icon: string;
+ latitude: number;
+ longitude: number;
+ offset_x: number;
+ offset_y: number;
+ transfers: {
+ bus: string;
+ metro_blue: string;
+ metro_green: string;
+ metro_orange: string;
+ metro_purple: string;
+ metro_red: string;
+ train: string;
+ tram: string;
+ trolleybus: string;
+ };
+ city: string;
+};
+
+type EditStationData = {
+ [key in Language]: StationLanguageData;
+} & { common: StationCommonData };
+
type Station = {
id: number;
address: string;
@@ -32,6 +68,77 @@ class StationsStore {
stations: Station[] = [];
station: Station | null = null;
+ stationLists: {
+ [key in Language]: {
+ data: Station[];
+ loaded: boolean;
+ };
+ } = {
+ ru: {
+ data: [],
+ loaded: false,
+ },
+ en: {
+ data: [],
+ loaded: false,
+ },
+ zh: {
+ data: [],
+ loaded: false,
+ },
+ };
+
+ // This will store the full station data, keyed by ID and then by language
+ stationPreview: Record<
+ string,
+ Record
+ > = {};
+
+ editStationData: EditStationData = {
+ ru: {
+ name: "",
+ system_name: "",
+ description: "",
+ address: "",
+ loaded: false,
+ },
+ en: {
+ name: "",
+ system_name: "",
+ description: "",
+ address: "",
+ loaded: false,
+ },
+ zh: {
+ name: "",
+ system_name: "",
+ description: "",
+ address: "",
+ loaded: false,
+ },
+ common: {
+ city: "",
+ city_id: 0,
+ direction: false,
+ icon: "",
+ latitude: 0,
+ longitude: 0,
+ offset_x: 0,
+ offset_y: 0,
+ transfers: {
+ bus: "",
+ metro_blue: "",
+ metro_green: "",
+ metro_orange: "",
+ metro_purple: "",
+ metro_red: "",
+ train: "",
+ tram: "",
+ trolleybus: "",
+ },
+ },
+ };
+
constructor() {
makeAutoObservable(this);
}
@@ -44,11 +151,157 @@ class StationsStore {
});
};
+ getStationList = async () => {
+ const { language } = languageStore;
+ if (this.stationLists[language].loaded) {
+ return;
+ }
+ const response = await authInstance.get("/station");
+
+ runInAction(() => {
+ this.stationLists[language].data = response.data;
+ this.stationLists[language].loaded = true;
+ });
+ };
+
+ setEditCommonData = (data: Partial) => {
+ this.editStationData.common = {
+ ...this.editStationData.common,
+ ...data,
+ };
+ };
+
+ getEditStation = async (id: number) => {
+ if (this.editStationData.ru.loaded) {
+ return;
+ }
+ const ruResponse = await languageInstance("ru").get(`/station/${id}`);
+ const enResponse = await languageInstance("en").get(`/station/${id}`);
+ const zhResponse = await languageInstance("zh").get(`/station/${id}`);
+
+ this.editStationData = {
+ ru: {
+ name: ruResponse.data.name,
+ system_name: ruResponse.data.system_name,
+ description: ruResponse.data.description,
+ address: ruResponse.data.address,
+ loaded: true,
+ },
+ en: {
+ name: enResponse.data.name,
+ system_name: enResponse.data.system_name,
+ description: enResponse.data.description,
+ address: enResponse.data.address,
+ loaded: true,
+ },
+ zh: {
+ name: zhResponse.data.name,
+ system_name: zhResponse.data.system_name,
+ description: zhResponse.data.description,
+ address: zhResponse.data.address,
+ loaded: true,
+ },
+ common: {
+ city: ruResponse.data.city,
+ city_id: ruResponse.data.city_id,
+ direction: ruResponse.data.direction,
+ icon: ruResponse.data.icon,
+ latitude: ruResponse.data.latitude,
+ longitude: ruResponse.data.longitude,
+ offset_x: ruResponse.data.offset_x,
+ offset_y: ruResponse.data.offset_y,
+ transfers: ruResponse.data.transfers,
+ },
+ };
+ };
+
+ // Sets language-specific station data
+ setLanguageEditStationData = (
+ language: Language,
+ data: Partial
+ ) => {
+ this.editStationData[language] = {
+ ...this.editStationData[language],
+ ...data,
+ };
+ };
+
+ editStation = async (id: number) => {
+ const commonDataPayload = {
+ city_id: this.editStationData.common.city_id,
+ direction: this.editStationData.common.direction,
+ icon: this.editStationData.common.icon,
+ latitude: this.editStationData.common.latitude,
+ longitude: this.editStationData.common.longitude,
+ offset_x: this.editStationData.common.offset_x,
+ offset_y: this.editStationData.common.offset_y,
+ transfers: this.editStationData.common.transfers,
+ city: this.editStationData.common.city,
+ };
+
+ for (const language of ["ru", "en", "zh"] as const) {
+ const { name, description, address } = this.editStationData[language];
+ const response = await languageInstance(language).patch(
+ `/station/${id}`,
+ {
+ name: name || "",
+ system_name: name || "", // system_name is often derived from name
+ description: description || "",
+ address: address || "",
+ ...commonDataPayload,
+ }
+ );
+
+ runInAction(() => {
+ // Update the cached preview data and station lists after successful patch
+ if (this.stationPreview[id]) {
+ this.stationPreview[id][language] = {
+ ...this.stationPreview[id][language], // Preserve common fields that might not be in the language-specific patch response
+ id: response.data.id,
+ name: response.data.name,
+ system_name: response.data.system_name,
+ description: response.data.description,
+ address: response.data.address,
+ ...commonDataPayload,
+ } as Station; // Cast to Station to satisfy type
+ }
+ if (this.stationLists[language].data) {
+ this.stationLists[language].data = this.stationLists[
+ language
+ ].data.map((station: Station) =>
+ station.id === id
+ ? ({
+ ...station,
+ name: response.data.name,
+ system_name: response.data.system_name,
+ description: response.data.description,
+ address: response.data.address,
+ ...commonDataPayload,
+ } as Station)
+ : station
+ );
+ }
+ });
+ }
+ };
+
deleteStation = async (id: number) => {
await authInstance.delete(`/station/${id}`);
runInAction(() => {
this.stations = this.stations.filter((station) => station.id !== id);
+ // Also clear from stationPreview cache
+ if (this.stationPreview[id]) {
+ delete this.stationPreview[id];
+ }
+ // Clear from stationLists as well for all languages
+ for (const lang of ["ru", "en", "zh"] as const) {
+ if (this.stationLists[lang].data) {
+ this.stationLists[lang].data = this.stationLists[lang].data.filter(
+ (station) => station.id !== id
+ );
+ }
+ }
});
};
@@ -57,6 +310,29 @@ class StationsStore {
this.station = response.data;
};
+ getStationPreview = async (id: number) => {
+ const { language } = languageStore;
+
+ if (this.stationPreview[id]?.[language]?.loaded) {
+ return;
+ }
+
+ const response = await languageInstance(language).get(`/station/${id}`);
+ runInAction(() => {
+ if (!this.stationPreview[id]) {
+ this.stationPreview[id] = {
+ ru: { loaded: false, data: {} as Station },
+ en: { loaded: false, data: {} as Station },
+ zh: { loaded: false, data: {} as Station },
+ };
+ }
+ this.stationPreview[id][language] = {
+ data: response.data,
+ loaded: true,
+ };
+ });
+ };
+
createStation = async (
name: string,
systemName: string,
@@ -69,8 +345,72 @@ class StationsStore {
});
runInAction(() => {
this.stations.push(response.data);
+ const newStation = response.data as Station;
+ if (!this.stationPreview[newStation.id]) {
+ this.stationPreview[newStation.id] = {
+ ru: { loaded: false, data: newStation },
+ en: { loaded: false, data: newStation },
+ zh: { loaded: false, data: newStation },
+ };
+ }
+ this.stationPreview[newStation.id]["ru"] = {
+ loaded: true,
+ data: newStation,
+ };
+ this.stationPreview[newStation.id]["en"] = {
+ loaded: true,
+ data: newStation,
+ };
});
};
+
+ // Reset editStationData when navigating away or after saving
+ resetEditStationData = () => {
+ this.editStationData = {
+ ru: {
+ name: "",
+ system_name: "",
+ description: "",
+ address: "",
+ loaded: false,
+ },
+ en: {
+ name: "",
+ system_name: "",
+ description: "",
+ address: "",
+ loaded: false,
+ },
+ zh: {
+ name: "",
+ system_name: "",
+ description: "",
+ address: "",
+ loaded: false,
+ },
+ common: {
+ city: "",
+ city_id: 0,
+ direction: false,
+ icon: "",
+ latitude: 0,
+ longitude: 0,
+ offset_x: 0,
+ offset_y: 0,
+ transfers: {
+ bus: "",
+ metro_blue: "",
+ metro_green: "",
+ metro_orange: "",
+ metro_purple: "",
+ metro_red: "",
+ train: "",
+ tram: "",
+ trolleybus: "",
+ },
+ },
+ };
+ };
}
export const stationsStore = new StationsStore();
diff --git a/src/shared/store/UserStore/index.ts b/src/shared/store/UserStore/index.ts
index 2be3029..25bd278 100644
--- a/src/shared/store/UserStore/index.ts
+++ b/src/shared/store/UserStore/index.ts
@@ -10,7 +10,13 @@ export type User = {
};
class UserStore {
- users: User[] = [];
+ users: {
+ data: User[];
+ loaded: boolean;
+ } = {
+ data: [],
+ loaded: false,
+ };
user: Record = {};
constructor() {
@@ -18,12 +24,13 @@ class UserStore {
}
getUsers = async () => {
- if (this.users.length > 0) return;
+ if (this.users.loaded) return;
const response = await authInstance.get("/user");
runInAction(() => {
- this.users = response.data;
+ this.users.data = response.data;
+ this.users.loaded = true;
});
};
@@ -42,7 +49,7 @@ class UserStore {
await authInstance.delete(`/user/${id}`);
runInAction(() => {
- this.users = this.users.filter((user) => user.id !== id);
+ this.users.data = this.users.data.filter((user) => user.id !== id);
delete this.user[id];
});
};
@@ -64,12 +71,15 @@ class UserStore {
};
createUser = async () => {
- const id = this.users[this.users.length - 1].id + 1;
+ let id = 1;
+ if (this.users.data.length > 0) {
+ id = this.users.data[this.users.data.length - 1].id + 1;
+ }
const response = await authInstance.post("/user", this.createUserData);
runInAction(() => {
- this.users.push({
- id,
+ this.users.data.push({
+ id: id,
...response.data,
});
});
@@ -95,7 +105,7 @@ class UserStore {
const response = await authInstance.patch(`/user/${id}`, this.editUserData);
runInAction(() => {
- this.users = this.users.map((user) =>
+ this.users.data = this.users.data.map((user) =>
user.id === id ? { ...user, ...response.data } : user
);
this.user[id] = { ...this.user[id], ...response.data };
diff --git a/src/shared/store/VehicleStore/index.ts b/src/shared/store/VehicleStore/index.ts
index c8807c6..abbb0c3 100644
--- a/src/shared/store/VehicleStore/index.ts
+++ b/src/shared/store/VehicleStore/index.ts
@@ -21,7 +21,13 @@ export type Vehicle = {
};
class VehicleStore {
- vehicles: Vehicle[] = [];
+ vehicles: {
+ data: Vehicle[];
+ loaded: boolean;
+ } = {
+ data: [],
+ loaded: false,
+ };
vehicle: Record = {};
constructor() {
@@ -29,10 +35,13 @@ class VehicleStore {
}
getVehicles = async () => {
+ if (this.vehicles.loaded) return;
+
const response = await languageInstance("ru").get(`/vehicle`);
runInAction(() => {
- this.vehicles = response.data;
+ this.vehicles.data = response.data;
+ this.vehicles.loaded = true;
});
};
@@ -40,7 +49,7 @@ class VehicleStore {
await languageInstance("ru").delete(`/vehicle/${id}`);
runInAction(() => {
- this.vehicles = this.vehicles.filter(
+ this.vehicles.data = this.vehicles.data.filter(
(vehicle) => vehicle.vehicle.id !== id
);
});
@@ -68,7 +77,7 @@ class VehicleStore {
});
runInAction(() => {
- this.vehicles.push({
+ this.vehicles.data.push({
vehicle: {
id: response.data.id,
tail_number: response.data.tail_number,
@@ -128,7 +137,7 @@ class VehicleStore {
...response.data,
},
};
- this.vehicles = this.vehicles.map((vehicle) =>
+ this.vehicles.data = this.vehicles.data.map((vehicle) =>
vehicle.vehicle.id === id
? {
...vehicle,
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
index 23a0313..560acbc 100644
--- a/tsconfig.tsbuildinfo
+++ b/tsconfig.tsbuildinfo
@@ -1 +1 @@
-{"root":["./src/app.tsx","./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/articlelistpage/index.tsx","./src/pages/carrier/index.ts","./src/pages/carrier/carriercreatepage/index.tsx","./src/pages/carrier/carrierlistpage/index.tsx","./src/pages/carrier/carrierpreviewpage/index.tsx","./src/pages/city/index.ts","./src/pages/city/citycreatepage/index.tsx","./src/pages/city/citylistpage/index.tsx","./src/pages/city/citypreviewpage/index.tsx","./src/pages/country/index.ts","./src/pages/country/countrycreatepage/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/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/index.ts","./src/pages/route/routecreatepage/index.tsx","./src/pages/route/routelistpage/index.tsx","./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/snapshot/snapshotpreviewpage/index.tsx","./src/pages/station/index.ts","./src/pages/station/stationcreatepage/index.tsx","./src/pages/station/stationlistpage/index.tsx","./src/pages/user/index.ts","./src/pages/user/userlistpage/index.tsx","./src/pages/user/userpreviewpage/index.tsx","./src/pages/vehicle/index.ts","./src/pages/vehicle/vehiclecreatepage/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/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.tsx","./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/modals/index.ts","./src/widgets/modals/selectarticledialog/index.tsx"],"version":"5.8.3"}
\ No newline at end of file
+{"root":["./src/app.tsx","./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/articlelistpage/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/carrier/carrierpreviewpage/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/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/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/index.ts","./src/pages/route/routecreatepage/index.tsx","./src/pages/route/routelistpage/index.tsx","./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/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/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/fd.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/modals/index.ts","./src/widgets/modals/selectarticledialog/index.tsx"],"errors":true,"version":"5.8.3"}
\ No newline at end of file