import React, { useState, useEffect } from 'react'; import { District, Building, DomaApplication, Employee } from '../../types'; import { PerformanceCard } from './PerformanceCard'; import { EditDistrictModal } from './EditDistrictModal'; import { backendApi } from '../../services/apiClient'; import { Plus } from 'lucide-react'; interface Props { aggregatedData: any; onSelectDistrict: (d: District) => void; canManage: boolean; onAddDistrict: (payload: { name: string; managerName: string }) => void; onDeleteDistrict: (d: District) => void; onViewStaff: (d: District) => void; onDistrictUpdated?: () => void; role: string; employees?: Employee[]; } export const DistrictsSummary: React.FC = ({ aggregatedData, onSelectDistrict, canManage, onAddDistrict, onDeleteDistrict, onViewStaff, onDistrictUpdated, role, employees = [], }) => { const [isCreateOpen, setIsCreateOpen] = useState(false); const [editDistrict, setEditDistrict] = useState(null); const [name, setName] = useState(''); const [managerName, setManagerName] = useState('Не назначен'); const [availableEmployees, setAvailableEmployees] = useState([]); const [loadingEmployees, setLoadingEmployees] = useState(false); // Загружаем список сотрудников при открытии формы useEffect(() => { if (isCreateOpen) { fetchEmployees(); } }, [isCreateOpen]); const fetchEmployees = async () => { try { setLoadingEmployees(true); const data = await backendApi.getEmployees(); setAvailableEmployees(Array.isArray(data) ? data : []); } catch (error) { console.error('Error fetching employees:', error); setAvailableEmployees([]); } finally { setLoadingEmployees(false); } }; const UNASSIGNED_MANAGER = 'Не назначен'; // Фильтруем сотрудников: только мастера и начальники участка const eligibleManagers = availableEmployees.filter(emp => { if (emp.status !== 'active') return false; const positionLower = emp.position.toLowerCase(); return positionLower.includes('мастер') || positionLower.includes('начальник участка'); }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!name.trim()) return; onAddDistrict({ name: name.trim(), managerName: managerName === '' ? UNASSIGNED_MANAGER : managerName.trim() }); setIsCreateOpen(false); setName(''); setManagerName(UNASSIGNED_MANAGER); }; return (

Обзор участков

{role === 'MASTER' ? 'Моя зона ответственности' : 'Контроль по всей компании'}
{canManage && ( )}
{isCreateOpen && canManage && (
setName(e.target.value)} placeholder="Например: Участок №3 (Южный)" className="w-full border border-slate-200 rounded-xl px-3 py-2 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
{loadingEmployees ? (
Загрузка сотрудников...
) : ( )}
)}
{Object.values(aggregatedData).map((data: any) => { const assignedToDistrict = employees.filter(emp => { const ids = emp.assignedDistrictIds?.length ? emp.assignedDistrictIds : (emp.assignedDistrictId ? [emp.assignedDistrictId] : []); return ids.includes(data.district.id); }); const staffCount = assignedToDistrict.length; const managerFromDb = data.district.managerName?.trim(); const managerDisplay = (managerFromDb && managerFromDb !== UNASSIGNED_MANAGER) ? managerFromDb : (assignedToDistrict.length > 0 ? assignedToDistrict[0].name : UNASSIGNED_MANAGER); return ( onSelectDistrict(data.district)} type="district" buildingCount={data.buildings.length} staffCount={staffCount} onDelete={canManage ? () => onDeleteDistrict(data.district) : undefined} onViewStaff={() => onViewStaff(data.district)} onEdit={canManage ? () => setEditDistrict(data.district) : undefined} /> ); })}
{editDistrict && ( setEditDistrict(null)} onSaved={() => { onDistrictUpdated?.(); }} employees={employees} /> )}
); };