import React, { useState, useEffect } from 'react'; import { X, Trash2 } from 'lucide-react'; import { DevPipelineItem, DevPipelineStatus, Employee } from '../../types'; import { backendApi } from '../../services/apiClient'; interface Props { item: DevPipelineItem | null; onClose: () => void; onSuccess: () => void; } const STAGES: { id: DevPipelineStatus; label: string }[] = [ { id: 'incoming', label: 'Входящие' }, { id: 'analysis', label: 'Анализ' }, { id: 'agenda_approval', label: 'Согласование повестки' }, { id: 'in_person', label: 'Очная часть' }, { id: 'absentee', label: 'Заочная часть' }, { id: 'protocol_formation', label: 'Формирование протокола' }, { id: 'protocol_to_gzhi', label: 'Отправка протокола в ГЖИ' }, { id: 'gzhi_order', label: 'Приказ ГЖИ' }, { id: 'success', label: 'Успех' }, { id: 'failure', label: 'Провал' }, ]; export const EditPipelineObjectModal: React.FC = ({ item, onClose, onSuccess }) => { const [formData, setFormData] = useState>({}); const [employees, setEmployees] = useState([]); const [loading, setLoading] = useState(false); const [loadingEmployees, setLoadingEmployees] = useState(true); const [deleting, setDeleting] = useState(false); useEffect(() => { if (item) { setFormData({ address: item.address, type: item.type, floors: item.floors, area: item.area, apartments: item.apartments, status: item.status, probability: item.probability, expectedRevenue: item.expectedRevenue, manager: item.manager, notes: item.notes ?? '', }); fetchEmployees(); } }, [item]); const fetchEmployees = async () => { try { setLoadingEmployees(true); const data = await backendApi.getEmployees(); setEmployees(data.filter(emp => emp.status === 'active')); } catch (error) { console.error('Error fetching employees:', error); setEmployees([]); } finally { setLoadingEmployees(false); } }; if (!item) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.address || !formData.manager) { alert('Заполните обязательные поля: адрес и менеджер'); return; } if ((formData.area ?? 0) <= 0 || (formData.apartments ?? 0) <= 0 || (formData.floors ?? 0) <= 0) { alert('Площадь, количество квартир и этажность должны быть больше 0'); return; } try { setLoading(true); await backendApi.updateDevelopmentPipeline(item.id, { address: formData.address, type: formData.type, floors: formData.floors, area: formData.area, apartments: formData.apartments, status: formData.status, probability: formData.probability, expectedRevenue: formData.expectedRevenue, manager: formData.manager, notes: formData.notes ?? undefined, }); window.dispatchEvent(new CustomEvent('mkd-pipeline-changed')); onSuccess(); onClose(); } catch (error: unknown) { const err = error as { message?: string; error?: string }; alert(err?.message || err?.error || 'Ошибка при сохранении'); } finally { setLoading(false); } }; const handleDelete = async () => { if (!confirm('Удалить объект из воронки?')) return; try { setDeleting(true); await backendApi.deleteDevelopmentPipeline(item.id); window.dispatchEvent(new CustomEvent('mkd-pipeline-changed')); onSuccess(); onClose(); } catch (error: unknown) { const err = error as { message?: string; error?: string }; alert(err?.message || err?.error || 'Ошибка при удалении'); } finally { setDeleting(false); } }; return (
e.stopPropagation()} >

Карточка объекта

setFormData({ ...formData, address: e.target.value })} placeholder="ул. Примерная, д. 1" className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
setFormData({ ...formData, floors: parseInt(e.target.value, 10) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
setFormData({ ...formData, area: parseFloat(e.target.value) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
setFormData({ ...formData, apartments: parseInt(e.target.value, 10) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
setFormData({ ...formData, probability: parseInt(e.target.value, 10) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
setFormData({ ...formData, expectedRevenue: parseFloat(e.target.value) || 0 })} className="w-full p-2.5 rounded-xl border border-slate-200 text-sm focus:ring-2 focus:ring-primary-500 outline-none" />
{loadingEmployees ? (
Загрузка...
) : ( )}