"use client" import { useState } from 'react' import { Card } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar' import { Badge } from '@/components/ui/badge' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Edit, Phone, Mail, Calendar, MapPin, User, Briefcase, Save, X, UserX } from 'lucide-react' // Интерфейс сотрудника interface Employee { id: string firstName: string lastName: string position: string department?: string phone: string email: string avatar?: string hireDate: string status: 'active' | 'vacation' | 'sick' | 'inactive' salary: number address: string } interface EmployeesListProps { searchQuery: string employees: Employee[] onEditEmployee: (employee: Employee) => void onDeleteEmployee: (employeeId: string) => void } export function EmployeesList({ searchQuery, employees, onEditEmployee, onDeleteEmployee }: EmployeesListProps) { const [selectedEmployee, setSelectedEmployee] = useState(null) const [isEditModalOpen, setIsEditModalOpen] = useState(false) // Фильтрация сотрудников по поисковому запросу const filteredEmployees = employees.filter(employee => `${employee.firstName} ${employee.lastName}`.toLowerCase().includes(searchQuery.toLowerCase()) || employee.position.toLowerCase().includes(searchQuery.toLowerCase()) || (employee.department && employee.department.toLowerCase().includes(searchQuery.toLowerCase())) ) const getStatusBadge = (status: Employee['status']) => { switch (status) { case 'active': return Активен case 'vacation': return В отпуске case 'sick': return На больничном case 'inactive': return Неактивен default: return Неизвестно } } const getInitials = (firstName: string, lastName: string) => { return `${firstName.charAt(0)}${lastName.charAt(0)}` } const formatSalary = (salary: number) => { return new Intl.NumberFormat('ru-RU').format(salary) + ' ₽' } const handleEditEmployee = (employee: Employee) => { onEditEmployee(employee) } const handleDeleteEmployee = (employee: Employee) => { onDeleteEmployee(employee.id) } return (
{/* Статистика */}

Всего сотрудников

{employees.length}

Активных

{employees.filter(e => e.status === 'active').length}

В отпуске

{employees.filter(e => e.status === 'vacation').length}

Отделов

{new Set(employees.map(e => e.department)).size}

{/* Список сотрудников */}
{filteredEmployees.map((employee) => (
{employee.avatar ? ( ) : null} {getInitials(employee.firstName, employee.lastName)}

{employee.firstName} {employee.lastName}

Уволить сотрудника? Вы уверены, что хотите уволить {employee.firstName} {employee.lastName}? Это действие изменит статус сотрудника на "Неактивен" и удалит его из активного списка. Отмена handleDeleteEmployee(employee)} className="bg-red-600 hover:bg-red-700 text-white" > Уволить

{employee.position}

{employee.department}

{getStatusBadge(employee.status)} {formatSalary(employee.salary)}
{employee.phone}
{employee.email}
С {new Date(employee.hireDate).toLocaleDateString('ru-RU')}
))}
{/* Модальное окно редактирования */} Редактировать сотрудника {selectedEmployee && (
setSelectedEmployee({ ...selectedEmployee, firstName: e.target.value })} className="glass-input text-white" />
setSelectedEmployee({ ...selectedEmployee, lastName: e.target.value })} className="glass-input text-white" />
setSelectedEmployee({ ...selectedEmployee, position: e.target.value })} className="glass-input text-white" />
setSelectedEmployee({ ...selectedEmployee, department: e.target.value })} className="glass-input text-white" />
setSelectedEmployee({ ...selectedEmployee, phone: e.target.value })} className="glass-input text-white" />
setSelectedEmployee({ ...selectedEmployee, salary: Number(e.target.value) })} className="glass-input text-white" />
setSelectedEmployee({ ...selectedEmployee, email: e.target.value })} className="glass-input text-white" />
setSelectedEmployee({ ...selectedEmployee, address: e.target.value })} className="glass-input text-white" />
)}
) }