import React, { useState, useEffect } from 'react'; import { useAuth } from '../../contexts/AuthContext'; import { useTenant } from '../../contexts/TenantContext'; import toast from 'react-hot-toast'; import { PlusIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline'; import LpaltoModal from '../../components/modals/LpaltoModal'; import logger from '../../utils/logger'; import { useTranslation } from 'react-i18next'; interface LpaltoEntry { _id: string; rut: string; nombre: string; tipoPersona: 'Empresa' | 'Persona'; tipoLista: string; nombreSubLista: string; fechaIncorporacion: string; createdAt: string; updatedAt: string; } const API_URL = globalThis.__APP_ENV__?.VITE_API_BASE_URL || 'https://duxiter.azurianlab.com/api'; const TenantLpalto = () => { const { tenant } = useTenant(); const { t } = useTranslation(); const [entries, setEntries] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); const [showAddModal, setShowAddModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [selectedEntry, setSelectedEntry] = useState(null); const [tipoPersonaFilter, setTipoPersonaFilter] = useState(''); const [nombreSubListaFilter, setNombreSubListaFilter] = useState(''); const [selectedIds, setSelectedIds] = useState([]); const [isDeleting, setIsDeleting] = useState(false); // Sanitize RUT: remove dots, keep dash const sanitizeRut = (rut: string): string => { return rut.replace(/\./g, ''); }; // Fetch entries const fetchEntries = async () => { try { setLoading(true); const token = localStorage.getItem('token'); // Build query parameters const queryParams = new URLSearchParams(); if (search) { // If search looks like a RUT, sanitize it if (search.includes('.') || search.includes('-')) { queryParams.append('search', sanitizeRut(search)); } else { queryParams.append('search', search); } } if (tipoPersonaFilter) queryParams.append('tipoPersona', tipoPersonaFilter); if (nombreSubListaFilter) queryParams.append('nombreSubLista', nombreSubListaFilter); const response = await fetch(`${API_URL}/lpalto?${queryParams.toString()}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error(t('lpaltoPage.fetchError')); } const data = await response.json(); setEntries(data); } catch (error) { logger.error('Error fetching entries:', error); toast.error(error instanceof Error ? error.message : t('lpaltoPage.fetchErrorGeneric')); setEntries([]); // Ensure entries is an array to prevent .map error } finally { setLoading(false); } }; useEffect(() => { fetchEntries(); }, [search, tipoPersonaFilter, nombreSubListaFilter]); // Delete entry const deleteEntry = async (id: string) => { if (!window.confirm(t('lpaltoPage.confirmDeleteMessage'))) { return; } try { const token = localStorage.getItem('token'); const response = await fetch(`${API_URL}/lpalto/${id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error(t('lpaltoPage.deleteError')); } toast.success(t('lpaltoPage.deleteSuccess')); fetchEntries(); // Refresh the list } catch (error) { logger.error('Error deleting entry:', error); toast.error(t('lpaltoPage.deleteError')); } }; // Delete multiple entries const deleteSelectedEntries = async () => { if (selectedIds.length === 0) return; if (!window.confirm(t('lpaltoPage.confirmDeleteMessage'))) { return; } setIsDeleting(true); const token = localStorage.getItem('token'); let successCount = 0; let errorCount = 0; for (const id of selectedIds) { try { const response = await fetch(`${API_URL}/lpalto/${id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { successCount++; } else { errorCount++; } } catch (error) { logger.error('Error deleting entry:', error); errorCount++; } } setIsDeleting(false); setSelectedIds([]); if (successCount > 0) { toast.success(`${successCount} registros eliminados`); } if (errorCount > 0) { toast.error(`${errorCount} registros no pudieron ser eliminados`); } fetchEntries(); }; // Toggle individual checkbox const toggleSelect = (id: string) => { setSelectedIds(prev => prev.includes(id) ? prev.filter(i => i !== id) : [...prev, id] ); }; // Toggle all checkboxes const toggleSelectAll = () => { if (selectedIds.length === entries.length) { setSelectedIds([]); } else { setSelectedIds(entries.map(entry => entry._id)); } }; // Get unique sub-list names for filter dropdown const uniqueSubListas = Array.from(new Set(entries.map(entry => entry.nombreSubLista))); return (

{t('lpaltoPage.title')}

{t('lpaltoPage.subtitle')}

{t('lpaltoPage.formatHint')}
{/* Filters */}
setSearch(e.target.value)} placeholder={t('lpaltoPage.searchPlaceholder')} className="block w-full rounded-md border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 pl-10 focus:border-primary-500 focus:ring-primary-500 sm:text-sm text-gray-900 dark:text-white" />
{/* Delete selected button */}
{/* Entries Table */}
{loading ? ( ) : entries.length === 0 ? ( ) : ( entries.map((entry) => ( )) )}
0 && selectedIds.length === entries.length} onChange={toggleSelectAll} className="h-4 w-4 rounded border-gray-300 text-primary-600 focus:ring-primary-500" /> {t('lpaltoPage.headers.rut')} {t('lpaltoPage.headers.nombre')} {t('lpaltoPage.headers.tipoPersona')} {t('lpaltoPage.headers.tipoLista')} {t('lpaltoPage.headers.nombreSubLista')} {t('lpaltoPage.headers.fechaIncorporacion')} {t('lpaltoPage.headers.acciones')}
{t('common.loading')}
{t('common.noResults')}
toggleSelect(entry._id)} className="h-4 w-4 rounded border-gray-300 text-primary-600 focus:ring-primary-500" /> {entry.rut} {entry.nombre} {entry.tipoPersona} {entry.tipoLista} {entry.nombreSubLista} {new Date(entry.fechaIncorporacion).toLocaleDateString('es-CL')}
{/* Add/Edit Modal */} { setShowAddModal(false); setShowEditModal(false); setSelectedEntry(null); }} entry={selectedEntry || undefined} onSuccess={fetchEntries} />
); }; export default TenantLpalto;