import React, { useState, useEffect } from 'react'; import { X } from 'lucide-react'; import { DevPipelineItem, DevPipelineStatus, Employee } from '../../types'; import { backendApi } from '../../services/apiClient'; interface Props { isOpen: boolean; onClose: () => void; onSuccess: () => void; } export const AddPipelineObjectModal: React.FC = ({ isOpen, onClose, onSuccess }) => { const [formData, setFormData] = useState({ address: '', type: 'old' as 'old' | 'new', floors: 5, area: 0, apartments: 0, status: 'incoming' as DevPipelineStatus, probability: 0, expectedRevenue: 0, manager: '', notes: '', }); const [employees, setEmployees] = useState([]); const [loading, setLoading] = useState(false); const [loadingEmployees, setLoadingEmployees] = useState(true); useEffect(() => { if (isOpen) { fetchEmployees(); } }, [isOpen]); 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 (!isOpen) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.address || !formData.manager) { alert('Заполните обязательные поля: адрес и менеджер'); return; } if (formData.area <= 0 || formData.apartments <= 0 || formData.floors <= 0) { alert('Площадь, количество квартир и этажность должны быть больше 0'); return; } try { setLoading(true); // Преобразуем данные для отправки на бэкенд (snake_case для бэкенда) const payload = { address: formData.address.trim(), type: formData.type, floors: formData.floors, area: formData.area, apartments: formData.apartments, status: formData.status, probability: formData.probability, expected_revenue: formData.expectedRevenue, manager: formData.manager.trim(), notes: formData.notes.trim() || null, }; await backendApi.createDevelopmentPipeline(payload); window.dispatchEvent(new CustomEvent('mkd-pipeline-changed')); window.dispatchEvent(new CustomEvent('mkd-dev-summary-changed')); onSuccess(); onClose(); // Сброс формы setFormData({ address: '', type: 'old', floors: 5, area: 0, apartments: 0, status: 'incoming', probability: 0, expectedRevenue: 0, manager: '', notes: '', }); } catch (error: any) { console.error('Error creating pipeline object:', error); const errorMessage = error?.message || error?.error || 'Ошибка при создании объекта'; alert(errorMessage); } finally { setLoading(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) || 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) || 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) || 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 ? (
Загрузка...
) : ( )}