Переделана навигация к датчикам, добавлена работа поиска тултипов на модели, добавлен функционал перехода из дашборда и истории тревог к датчику с тревогой на 3д модели
This commit is contained in:
@@ -117,6 +117,9 @@ export interface NavigationStore {
|
||||
isOnNavigationPage: () => boolean
|
||||
getCurrentRoute: () => string | null
|
||||
getActiveSidebarItem: () => number
|
||||
|
||||
// Навигация к датчику на 3D-модели
|
||||
navigateToSensor: (sensorSerialNumber: string, floor: number | null, viewType: 'building' | 'floor') => Promise<string | null>
|
||||
}
|
||||
|
||||
const useNavigationStore = create<NavigationStore>()(
|
||||
@@ -368,6 +371,105 @@ const useNavigationStore = create<NavigationStore>()(
|
||||
if (showListOfDetectors) return 7 // Список датчиков
|
||||
if (showSensors) return 8 // Сенсоры
|
||||
return 2 // Навигация (базовая)
|
||||
},
|
||||
|
||||
// Навигация к датчику на 3D-модели
|
||||
navigateToSensor: async (sensorSerialNumber: string, floor: number | null, viewType: 'building' | 'floor') => {
|
||||
const { currentObject, loadZones } = get()
|
||||
|
||||
if (!currentObject.id) {
|
||||
console.error('[navigateToSensor] No current object selected')
|
||||
return null
|
||||
}
|
||||
|
||||
// Загружаем зоны для объекта (из кэша или API)
|
||||
await loadZones(currentObject.id)
|
||||
|
||||
const { currentZones } = get()
|
||||
|
||||
if (!currentZones || currentZones.length === 0) {
|
||||
console.error('[navigateToSensor] No zones available for object', currentObject.id)
|
||||
return null
|
||||
}
|
||||
|
||||
let targetZone: Zone | undefined
|
||||
|
||||
if (viewType === 'building') {
|
||||
// Для общего вида здания - ищем самую верхнюю зону (первую в списке)
|
||||
targetZone = currentZones[0]
|
||||
console.log('[navigateToSensor] Building view - selected first zone:', targetZone?.name)
|
||||
} else if (viewType === 'floor') {
|
||||
// Для вида на этаже - ищем зону, где есть этот датчик
|
||||
// Сначала проверяем зоны с sensors массивом
|
||||
for (const zone of currentZones) {
|
||||
if (zone.sensors && Array.isArray(zone.sensors)) {
|
||||
const hasSensor = zone.sensors.some(s =>
|
||||
s.serial_number === sensorSerialNumber ||
|
||||
s.name === sensorSerialNumber
|
||||
)
|
||||
if (hasSensor) {
|
||||
targetZone = zone
|
||||
console.log('[navigateToSensor] Found sensor in zone:', zone.name, 'sensors:', zone.sensors.length)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Если не нашли по sensors, пробуем по floor
|
||||
if (!targetZone && floor !== null) {
|
||||
// Ищем зоны с соответствующим floor (кроме общего вида)
|
||||
const floorZones = currentZones.filter(z =>
|
||||
z.floor === floor &&
|
||||
z.order !== 0 &&
|
||||
z.model_path
|
||||
)
|
||||
|
||||
if (floorZones.length > 0) {
|
||||
targetZone = floorZones[0]
|
||||
console.log('[navigateToSensor] Found zone by floor:', targetZone.name, 'floor:', floor)
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback на общий вид, если не нашли зону этажа
|
||||
if (!targetZone) {
|
||||
console.warn(`[navigateToSensor] No zone found with sensor ${sensorSerialNumber} or floor ${floor}, falling back to building view`)
|
||||
targetZone = currentZones[0]
|
||||
}
|
||||
}
|
||||
|
||||
if (!targetZone || !targetZone.model_path) {
|
||||
console.error('[navigateToSensor] No valid zone with model_path found')
|
||||
return null
|
||||
}
|
||||
|
||||
// Устанавливаем состояние для навигации
|
||||
set({
|
||||
currentModelPath: targetZone.model_path,
|
||||
// Открываем Зоны контроля (Monitoring) - она автоматически закроется после загрузки модели
|
||||
showMonitoring: true,
|
||||
// Закрываем остальные меню
|
||||
showFloorNavigation: false,
|
||||
showNotifications: false,
|
||||
showListOfDetectors: false,
|
||||
// НЕ закрываем showSensors - оставляем как есть для подсветки датчиков
|
||||
// showSensors: false, <- Убрали!
|
||||
showDetectorMenu: false,
|
||||
showAlertMenu: false,
|
||||
selectedDetector: null,
|
||||
selectedAlert: null,
|
||||
})
|
||||
|
||||
console.log('[navigateToSensor] Navigation prepared:', {
|
||||
sensorSerialNumber,
|
||||
floor,
|
||||
viewType,
|
||||
modelPath: targetZone.model_path,
|
||||
zoneName: targetZone.name,
|
||||
zoneId: targetZone.id
|
||||
})
|
||||
|
||||
// Возвращаем serial_number для установки focusedSensorId в компоненте
|
||||
return sensorSerialNumber
|
||||
}
|
||||
}),
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user