переделана логика загрузки модели, замена страницы Объекты на другой внешний вид, добавление в меню пункта Объекты

This commit is contained in:
2026-02-03 19:00:02 +03:00
parent 458222817e
commit 5e58f6ef76
24 changed files with 3514 additions and 1161 deletions

View File

@@ -15,7 +15,8 @@ export const SIDEBAR_ITEM_MAP = {
1: { type: 'route', value: MainRoutes.DASHBOARD },
2: { type: 'route', value: MainRoutes.NAVIGATION },
8: { type: 'route', value: MainRoutes.ALERTS },
9: { type: 'route', value: MainRoutes.REPORTS }
9: { type: 'route', value: MainRoutes.REPORTS },
10: { type: 'route', value: MainRoutes.OBJECTS }
} as const
export class NavigationService {

View File

@@ -0,0 +1,94 @@
import React from 'react'
import { useRouter } from 'next/navigation'
import useNavigationStore from '@/app/store/navigationStore'
import type { NavigationStore } from '@/app/store/navigationStore'
export enum MainRoutes {
DASHBOARD = '/dashboard',
NAVIGATION = '/navigation',
ALERTS = '/alerts',
REPORTS = '/reports',
OBJECTS = '/objects'
}
export const SIDEBAR_ITEM_MAP = {
1: { type: 'route', value: MainRoutes.DASHBOARD },
2: { type: 'route', value: MainRoutes.NAVIGATION },
8: { type: 'route', value: MainRoutes.ALERTS },
9: { type: 'route', value: MainRoutes.REPORTS }
} as const
export class NavigationService {
private router!: ReturnType<typeof useRouter>
private navigationStore!: NavigationStore
private initialized = false
init(router: ReturnType<typeof useRouter>, navigationStore: NavigationStore) {
if (this.initialized) {
return // Предотвращаем повторную инициализацию
}
this.router = router
this.navigationStore = navigationStore
this.initialized = true
}
isInitialized(): boolean {
return this.initialized
}
navigateToRoute(route: MainRoutes) {
// Убираем подменю перед переходом на другую страницу
if (route !== MainRoutes.NAVIGATION) {
this.navigationStore.setCurrentSubmenu(null)
}
this.router.push(route)
}
handleSidebarItemClick(itemId: number, currentPath: string): boolean {
if (!this.initialized) {
console.error('NavigationService not initialized!')
return false
}
const mapping = SIDEBAR_ITEM_MAP[itemId as keyof typeof SIDEBAR_ITEM_MAP]
if (!mapping) {
return false
}
if (mapping.type === 'route') {
this.navigateToRoute(mapping.value as MainRoutes)
return true
}
return false
}
goBack() {
this.navigationStore.goBack()
}
selectObjectAndGoToDashboard(objectId: string, objectTitle: string) {
this.navigationStore.setCurrentObject(objectId, objectTitle)
// Проверяем, что подменю закрыто перед навигацией
this.navigationStore.setCurrentSubmenu(null)
const url = `${MainRoutes.DASHBOARD}?objectId=${encodeURIComponent(objectId)}&objectTitle=${encodeURIComponent(objectTitle)}`
this.router.push(url)
}
}
export const navigationService = new NavigationService()
export function useNavigationService() {
const router = useRouter()
const navigationStore = useNavigationStore()
React.useMemo(() => {
if (!navigationService.isInitialized()) {
navigationService.init(router, navigationStore)
}
}, [router, navigationStore])
return navigationService
}