'use client' import React, { useState } from 'react' import * as statusColors from '../../lib/statusColors' interface DetectorsDataType { detectors: Record } interface ListOfDetectorsProps { objectId?: string detectorsData: DetectorsDataType onDetectorMenuClick: (detector: DetectorType) => void onClose?: () => void is3DReady?: boolean } interface DetectorType { detector_id: number name: string serial_number: string object: string status: string checked: boolean type: string detector_type: string location: string floor: number notifications: Array<{ id: number type: string message: string timestamp: string acknowledged: boolean priority: string }> } const ListOfDetectors: React.FC = ({ objectId, detectorsData, onDetectorMenuClick, onClose, is3DReady = true }) => { const [searchTerm, setSearchTerm] = useState('') // конвертация детекторов в array и фильтруем по objectId и тексту запроса const detectorsArray = Object.values(detectorsData.detectors) as DetectorType[] let filteredDetectors = objectId ? detectorsArray.filter(detector => detector.object === objectId) : detectorsArray // Фильтр-поиск if (searchTerm) { filteredDetectors = filteredDetectors.filter(detector => detector.name.toLowerCase().includes(searchTerm.toLowerCase()) || detector.location.toLowerCase().includes(searchTerm.toLowerCase()) || detector.serial_number.toLowerCase().includes(searchTerm.toLowerCase()) ) } // Сортировка детекторов по имени const sortedDetectors = filteredDetectors.sort((a, b) => a.name.localeCompare(b.name)) const getStatusColor = (status: string) => { switch (status) { case statusColors.STATUS_COLOR_CRITICAL: return 'bg-red-500' case statusColors.STATUS_COLOR_WARNING: return 'bg-orange-500' case statusColors.STATUS_COLOR_NORMAL: return 'bg-green-500' default: return 'bg-gray-500' } } const getStatusText = (status: string) => { switch (status) { case statusColors.STATUS_COLOR_CRITICAL: return 'Критический' case statusColors.STATUS_COLOR_WARNING: return 'Предупреждение' case statusColors.STATUS_COLOR_NORMAL: return 'Норма' default: return 'Неизвестно' } } const handleDetectorMenuClick = (detector: DetectorType) => { // Проверяем валидность данных детектора перед передачей if (!detector || !detector.detector_id || !detector.serial_number) { console.warn('[ListOfDetectors] Invalid detector data, skipping menu click:', detector) return } onDetectorMenuClick(detector) } return (

Список датчиков

{onClose && ( )}
setSearchTerm(e.target.value)} className="w-full bg-[rgb(27,30,40)] text-white placeholder-gray-400 px-4 py-2 rounded-lg border border-gray-600 focus:border-blue-500 focus:outline-none" />
{sortedDetectors.length} детекторов
{sortedDetectors.length === 0 ? (
Детекторы не найдены
) : ( sortedDetectors.map(detector => (
{detector.name}
{detector.location}
{getStatusText(detector.status)} {detector.checked && ( )}
)) )}
) } export default ListOfDetectors