import React from 'react'; import { Contact } from '../../../entities/crm/contact'; import { Company } from '../../../entities/crm/company'; import { Lead } from '../../../entities/crm/lead'; import { Button } from '../../../shared/ui/Button'; import { Badge } from '../../../shared/ui/Badge'; import { formatCurrencyMinor } from '../../../shared/lib/currency'; import { Search, Plus, Building, ChevronRight, Sparkles, Check } from 'lucide-react'; export interface CrmTableViewProps { activeTab: 'contacts' | 'companies' | 'leads'; search: string; onSearchChange: (value: string) => void; contacts: Contact[]; companies: Company[]; leads: Lead[]; onSelectContact: (contact: Contact) => void; onSelectCompany: (company: Company) => void; onAddContact: () => void; onAddCompany: () => void; onAddLead: () => void; onConvertLead: (lead: Lead) => void; } export const CrmTableView: React.FC = ({ activeTab, search, onSearchChange, contacts, companies, leads, onSelectContact, onSelectCompany, onAddContact, onAddCompany, onAddLead, onConvertLead, }) => { if (activeTab === 'contacts') { return (
onSearchChange(e.target.value)} placeholder="Поиск по имени, телефону, email..." className="w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green" />
{contacts .filter( (c) => `${c.firstName} ${c.lastName}`.toLowerCase().includes(search.toLowerCase()) || c.phone?.includes(search) || c.email?.toLowerCase().includes(search.toLowerCase()) ) .map((contact) => { const comp = companies.find((co) => co.id === contact.companyId); return ( onSelectContact(contact)} className="hover:bg-krona-workspace/50 cursor-pointer transition-colors" > ); })}
ФИО / Контакт Компания Телефон Email Роли Действие
{contact.firstName[0]} {contact.lastName?.[0]}
{contact.firstName} {contact.lastName}
{contact.jobTitle && (
{contact.jobTitle}
)}
{comp?.name || '—'} {contact.phone || '—'} {contact.email || '—'}
{contact.roles?.map((r) => ( {r} ))}
); } if (activeTab === 'companies') { return (
onSearchChange(e.target.value)} placeholder="Поиск по названию, ИНН..." className="w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green" />
{companies .filter( (c) => c.name.toLowerCase().includes(search.toLowerCase()) || c.inn?.includes(search) || c.address?.toLowerCase().includes(search.toLowerCase()) ) .map((company) => ( onSelectCompany(company)} className="hover:bg-krona-workspace/50 cursor-pointer transition-colors" > ))}
Название компании ИНН Город Телефон Роли Действие
{company.name}
{company.legalName && (
{company.legalName}
)}
{company.inn || '—'} {company.address || '—'} {company.phone || '—'}
{company.roles?.map((r) => ( {r} ))}
); } if (activeTab === 'leads') { return (
onSearchChange(e.target.value)} placeholder="Поиск лидов..." className="w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green" />
{leads .filter( (lead) => lead.title.toLowerCase().includes(search.toLowerCase()) || lead.contactName?.toLowerCase().includes(search.toLowerCase()) || lead.phone?.includes(search) || lead.email?.toLowerCase().includes(search.toLowerCase()) ) .map((lead) => ( ))}
Название лида Контактное лицо Контакты Оценка бюджета Статус Конвертация
{lead.title} {lead.contactName}
{lead.phone}
{lead.email}
{lead.estimatedValue ? formatCurrencyMinor(lead.estimatedValue.minor) : '—'} {lead.status === 'converted' ? 'Конвертирован' : lead.status === 'new' ? 'Новый' : lead.status} {lead.status !== 'converted' ? ( ) : ( Сделка создана )}
); } return null; };