import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Plus, MoreVertical, Eye, Edit, Trash2, Building2, } from 'lucide-react'; import { Button } from '@components/atoms/Button'; import { Card, CardHeader, CardTitle, CardContent } from '@components/molecules/Card'; import { DataTable, type Column } from '@components/organisms/DataTable'; import { Dropdown, type DropdownItem } from '@components/organisms/Dropdown'; import { ConfirmModal } from '@components/organisms/Modal'; import { Breadcrumbs } from '@components/organisms/Breadcrumbs'; import { NoDataEmptyState, ErrorEmptyState } from '@components/templates/EmptyState'; import { useCompanies } from '@features/companies/hooks'; import { CompanyFiltersPanel } from '@features/companies/components/CompanyFiltersPanel'; import type { Company } from '@features/companies/types'; import { formatDate } from '@utils/formatters'; export function CompaniesListPage() { const navigate = useNavigate(); const [companyToDelete, setCompanyToDelete] = useState(null); const { companies, total, page, totalPages, isLoading, error, filters, setFilters, deleteCompany, refresh, } = useCompanies({ page: 1, limit: 10 }); const getActionsMenu = (company: Company): DropdownItem[] => { return [ { key: 'view', label: 'Ver detalle', icon: , onClick: () => navigate(`/companies/${company.id}`), }, { key: 'edit', label: 'Editar', icon: , onClick: () => navigate(`/companies/${company.id}/edit`), }, { key: 'delete', label: 'Eliminar', icon: , danger: true, onClick: () => setCompanyToDelete(company), }, ]; }; const columns: Column[] = [ { key: 'company', header: 'Empresa', render: (company) => (
{company.name}
{company.taxId || '-'}
), }, { key: 'legalName', header: 'Razón social', render: (company) => ( {company.legalName || '-'} ), }, { key: 'parent', header: 'Empresa matriz', render: (company) => ( {company.parentCompanyName || '-'} ), }, { key: 'currency', header: 'Moneda', render: (company) => ( {company.currencyCode || 'MXN'} ), }, { key: 'createdAt', header: 'Creado', sortable: true, render: (company) => ( {formatDate(company.createdAt, 'short')} ), }, { key: 'actions', header: '', render: (company) => ( } items={getActionsMenu(company)} align="right" /> ), }, ]; const handlePageChange = (newPage: number) => { setFilters({ ...filters, page: newPage }); }; const handleSort = (key: string) => { const newOrder = filters.sortBy === key && filters.sortOrder === 'asc' ? 'desc' : 'asc'; setFilters({ ...filters, sortBy: key, sortOrder: newOrder }); }; const handleDeleteConfirm = async () => { if (companyToDelete) { await deleteCompany(companyToDelete.id); setCompanyToDelete(null); } }; if (error) { return (
); } return (

Empresas

Gestiona las empresas del sistema

Lista de empresas
{companies.length === 0 && !isLoading ? ( navigate('/companies/new')} /> ) : ( )}
{/* Delete confirmation modal */} setCompanyToDelete(null)} onConfirm={handleDeleteConfirm} title="Eliminar empresa" message={`¿Estás seguro de que deseas eliminar "${companyToDelete?.name}"? Esta acción no se puede deshacer.`} variant="danger" confirmText="Eliminar" />
); } export default CompaniesListPage;