543 lines
24 KiB
TypeScript
543 lines
24 KiB
TypeScript
import { useState } from 'react';
|
|
import { FileText, Plus, Search, Calendar, Clock, Thermometer, Heart, Activity, Wind, Droplets, Pencil, Trash2, ChevronDown, ChevronUp, X, Save } from 'lucide-react';
|
|
import { Card, CardContent } from '@/components/ui/card';
|
|
import { Badge } from '@/components/ui/badge';
|
|
import { Button } from '@/components/ui/button';
|
|
import { Input } from '@/components/ui/input';
|
|
import { Label } from '@/components/ui/label';
|
|
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
|
import type { Evolucion, Internacion, Paciente, SignosVitales, ExamenFisico } from '@/types';
|
|
|
|
interface EvolucionesProps {
|
|
evoluciones: Evolucion[];
|
|
internaciones: Internacion[];
|
|
pacientes: Paciente[];
|
|
onAgregarEvolucion: (evolucion: Omit<Evolucion, 'id'>) => void;
|
|
onActualizarEvolucion?: (id: string, datos: Partial<Evolucion>) => void;
|
|
onEliminarEvolucion: (id: string) => void;
|
|
getPacienteById: (id: string) => Paciente | undefined;
|
|
getInternacionActivaByPaciente: (pacienteId: string) => Internacion | undefined;
|
|
}
|
|
|
|
export function Evoluciones({
|
|
evoluciones,
|
|
internaciones,
|
|
pacientes,
|
|
onAgregarEvolucion,
|
|
onActualizarEvolucion,
|
|
onEliminarEvolucion,
|
|
getPacienteById,
|
|
getInternacionActivaByPaciente
|
|
}: EvolucionesProps) {
|
|
const [busqueda, setBusqueda] = useState('');
|
|
const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>('');
|
|
const [dialogoAbierto, setDialogoAbierto] = useState(false);
|
|
const [evolucionExpandida, setEvolucionExpandida] = useState<string | null>(null);
|
|
const [evolucionEditando, setEvolucionEditando] = useState<Evolucion | null>(null);
|
|
|
|
const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]);
|
|
const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5));
|
|
const [medico, setMedico] = useState('');
|
|
const [temperatura, setTemperatura] = useState('');
|
|
const [presionSistolica, setPresionSistolica] = useState('');
|
|
const [presionDiastolica, setPresionDiastolica] = useState('');
|
|
const [frecuenciaCardiaca, setFrecuenciaCardiaca] = useState('');
|
|
const [frecuenciaRespiratoria, setFrecuenciaRespiratoria] = useState('');
|
|
const [saturacionO2, setSaturacionO2] = useState('');
|
|
const [snc, setSnc] = useState('');
|
|
const [cardiovascular, setCardiovascular] = useState('');
|
|
const [respiratorio, setRespiratorio] = useState('');
|
|
const [abdominal, setAbdominal] = useState('');
|
|
const [genitourinario, setGenitourinario] = useState('');
|
|
const [pielAnexos, setPielAnexos] = useState('');
|
|
const [soma, setSoma] = useState('');
|
|
const [novedades, setNovedades] = useState('');
|
|
const [comentario, setComentario] = useState('');
|
|
const [pendientes, setPendientes] = useState('');
|
|
|
|
const resetFormulario = () => {
|
|
setFecha(new Date().toISOString().split('T')[0]);
|
|
setHora(new Date().toTimeString().slice(0, 5));
|
|
setMedico('');
|
|
setTemperatura('');
|
|
setPresionSistolica('');
|
|
setPresionDiastolica('');
|
|
setFrecuenciaCardiaca('');
|
|
setFrecuenciaRespiratoria('');
|
|
setSaturacionO2('');
|
|
setSnc('');
|
|
setCardiovascular('');
|
|
setRespiratorio('');
|
|
setAbdominal('');
|
|
setGenitourinario('');
|
|
setPielAnexos('');
|
|
setSoma('');
|
|
setNovedades('');
|
|
setComentario('');
|
|
setPendientes('');
|
|
setEvolucionEditando(null);
|
|
};
|
|
|
|
const abrirEditar = (evo: Evolucion) => {
|
|
setEvolucionEditando(evo);
|
|
setFecha(evo.fecha);
|
|
setHora(evo.hora);
|
|
setMedico(evo.medico);
|
|
setTemperatura(evo.signosVitales?.temperatura?.toString() || '');
|
|
setPresionSistolica(evo.signosVitales?.presionSistolica?.toString() || '');
|
|
setPresionDiastolica(evo.signosVitales?.presionDiastolica?.toString() || '');
|
|
setFrecuenciaCardiaca(evo.signosVitales?.frecuenciaCardiaca?.toString() || '');
|
|
setFrecuenciaRespiratoria(evo.signosVitales?.frecuenciaRespiratoria?.toString() || '');
|
|
setSaturacionO2(evo.signosVitales?.saturacionO2?.toString() || '');
|
|
setSnc(evo.examenFisico?.SNC || '');
|
|
setCardiovascular(evo.examenFisico?.Cardiovascular || '');
|
|
setRespiratorio(evo.examenFisico?.Respiratorio || '');
|
|
setAbdominal(evo.examenFisico?.Abdominal || '');
|
|
setGenitourinario(evo.examenFisico?.Genitourinario || '');
|
|
setPielAnexos(evo.examenFisico?.PielAnexos || '');
|
|
setSoma(evo.examenFisico?.SOMA || '');
|
|
setNovedades(evo.novedades || '');
|
|
setComentario(evo.comentario || '');
|
|
setPendientes(evo.pendientes || '');
|
|
setDialogoAbierto(true);
|
|
};
|
|
|
|
const handleGuardar = () => {
|
|
const internacion = getInternacionActivaByPaciente(pacienteSeleccionado);
|
|
if (!internacion || !medico) return;
|
|
|
|
const signosVitales: SignosVitales | undefined =
|
|
temperatura || presionSistolica || frecuenciaCardiaca
|
|
? {
|
|
temperatura: temperatura ? parseFloat(temperatura) : undefined,
|
|
presionSistolica: presionSistolica ? parseInt(presionSistolica) : undefined,
|
|
presionDiastolica: presionDiastolica ? parseInt(presionDiastolica) : undefined,
|
|
frecuenciaCardiaca: frecuenciaCardiaca ? parseInt(frecuenciaCardiaca) : undefined,
|
|
frecuenciaRespiratoria: frecuenciaRespiratoria ? parseInt(frecuenciaRespiratoria) : undefined,
|
|
saturacionO2: saturacionO2 ? parseInt(saturacionO2) : undefined,
|
|
}
|
|
: undefined;
|
|
|
|
const examenFisico: ExamenFisico | undefined =
|
|
snc || cardiovascular || respiratorio || abdominal || genitourinario || pielAnexos || soma
|
|
? {
|
|
SNC: snc || undefined,
|
|
Cardiovascular: cardiovascular || undefined,
|
|
Respiratorio: respiratorio || undefined,
|
|
Abdominal: abdominal || undefined,
|
|
Genitourinario: genitourinario || undefined,
|
|
PielAnexos: pielAnexos || undefined,
|
|
SOMA: soma || undefined,
|
|
}
|
|
: undefined;
|
|
|
|
const evolucionData = {
|
|
fecha,
|
|
hora,
|
|
medico,
|
|
signosVitales,
|
|
examenFisico,
|
|
novedades: novedades || undefined,
|
|
comentario: comentario || undefined,
|
|
pendientes: pendientes || undefined,
|
|
};
|
|
|
|
if (evolucionEditando && onActualizarEvolucion) {
|
|
onActualizarEvolucion(evolucionEditando.id, evolucionData);
|
|
} else {
|
|
onAgregarEvolucion({ ...evolucionData, internacionId: internacion.id });
|
|
}
|
|
|
|
resetFormulario();
|
|
setDialogoAbierto(false);
|
|
};
|
|
|
|
const pacientesInternados = pacientes.filter(p => {
|
|
const internacion = getInternacionActivaByPaciente(p.id);
|
|
return internacion !== undefined;
|
|
});
|
|
|
|
const evolucionesFiltradas = evoluciones
|
|
.filter(e => {
|
|
const internacion = internaciones.find(i => i.id === e.internacionId);
|
|
if (!internacion) return false;
|
|
const paciente = getPacienteById(internacion.pacienteId);
|
|
if (!paciente) return false;
|
|
|
|
return !busqueda ||
|
|
paciente.nombre.toLowerCase().includes(busqueda.toLowerCase()) ||
|
|
paciente.apellido.toLowerCase().includes(busqueda.toLowerCase()) ||
|
|
paciente.dni.includes(busqueda);
|
|
})
|
|
.sort((a, b) => new Date(b.fecha + 'T' + b.hora).getTime() - new Date(a.fecha + 'T' + a.hora).getTime());
|
|
|
|
const getSignosVitalesTexto = (sv: SignosVitales | undefined) => {
|
|
if (!sv) return null;
|
|
const partes: string[] = [];
|
|
if (sv.presionSistolica && sv.presionDiastolica) partes.push(`PA: ${sv.presionSistolica}/${sv.presionDiastolica}`);
|
|
if (sv.frecuenciaCardiaca) partes.push(`FC: ${sv.frecuenciaCardiaca}`);
|
|
if (sv.frecuenciaRespiratoria) partes.push(`FR: ${sv.frecuenciaRespiratoria}`);
|
|
if (sv.temperatura) partes.push(`T: ${sv.temperatura}°C`);
|
|
if (sv.saturacionO2) partes.push(`SatO2: ${sv.saturacionO2}%`);
|
|
return partes.join(' | ');
|
|
};
|
|
|
|
return (
|
|
<div className="space-y-6 dark:text-white overflow-x-hidden max-w-screen">
|
|
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">
|
|
<div>
|
|
<h1 className="text-2xl font-bold text-gray-900 dark:text-white">Evoluciones Diarias</h1>
|
|
<p className="text-gray-500 dark:text-gray-400">Registro de evoluciones y signos vitales</p>
|
|
</div>
|
|
<Dialog open={dialogoAbierto} onOpenChange={setDialogoAbierto}>
|
|
<DialogTrigger asChild>
|
|
<Button variant="outline" onClick={resetFormulario}>
|
|
<Plus className="h-4 w-4 mr-2" />
|
|
Nueva Evolución
|
|
</Button>
|
|
</DialogTrigger>
|
|
<DialogContent className="sm:max-w-2xl max-h-[90vh] overflow-y-auto">
|
|
<DialogHeader>
|
|
<DialogTitle>
|
|
{evolucionEditando ? 'Editar Evolución' : 'Nueva Evolución'}
|
|
</DialogTitle>
|
|
</DialogHeader>
|
|
<div className="space-y-4">
|
|
{!evolucionEditando && (
|
|
<div>
|
|
<Label>Paciente *</Label>
|
|
<Select value={pacienteSeleccionado} onValueChange={setPacienteSeleccionado}>
|
|
<SelectTrigger>
|
|
<SelectValue placeholder="Seleccionar paciente internado" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{pacientesInternados.map(p => (
|
|
<SelectItem key={p.id} value={p.id}>
|
|
{p.apellido}, {p.nombre} - DNI: {p.dni}
|
|
</SelectItem>
|
|
))}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
)}
|
|
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
|
<div>
|
|
<Label>Fecha *</Label>
|
|
<Input type="date" value={fecha} onChange={(e) => setFecha(e.target.value)} />
|
|
</div>
|
|
<div>
|
|
<Label>Hora *</Label>
|
|
<Input type="time" value={hora} onChange={(e) => setHora(e.target.value)} />
|
|
</div>
|
|
</div>
|
|
|
|
<div className="bg-blue-50 p-3 rounded-lg border border-blue-200">
|
|
<p className="text-sm font-bold text-blue-800 mb-3 flex items-center gap-2">
|
|
<Activity className="h-4 w-4" />
|
|
Signos Vitales
|
|
</p>
|
|
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4">
|
|
<div>
|
|
<Label className="flex items-center gap-1">
|
|
<Heart className="h-4 w-4" />TAS
|
|
</Label>
|
|
<Input
|
|
type="number"
|
|
value={presionSistolica}
|
|
onChange={(e) => setPresionSistolica(e.target.value)}
|
|
placeholder="120"
|
|
/>
|
|
</div>
|
|
<div>
|
|
<Label className="flex items-center gap-1">
|
|
<Heart className="h-4 w-4" />TAD
|
|
</Label>
|
|
<Input
|
|
type="number"
|
|
value={presionDiastolica}
|
|
onChange={(e) => setPresionDiastolica(e.target.value)}
|
|
placeholder="80"
|
|
/>
|
|
</div>
|
|
<div>
|
|
<Label className="flex items-center gap-1">
|
|
<Activity className="h-4 w-4" />FC
|
|
</Label>
|
|
<Input
|
|
type="number"
|
|
value={frecuenciaCardiaca}
|
|
onChange={(e) => setFrecuenciaCardiaca(e.target.value)}
|
|
placeholder="72"
|
|
/>
|
|
</div>
|
|
<div>
|
|
<Label className="flex items-center gap-1">
|
|
<Wind className="h-4 w-4" />FR
|
|
</Label>
|
|
<Input
|
|
type="number"
|
|
value={frecuenciaRespiratoria}
|
|
onChange={(e) => setFrecuenciaRespiratoria(e.target.value)}
|
|
placeholder="16"
|
|
/>
|
|
</div>
|
|
<div>
|
|
<Label className="flex items-center gap-1">
|
|
<Thermometer className="h-4 w-4" />T°
|
|
</Label>
|
|
<Input
|
|
type="number"
|
|
step="0.1"
|
|
value={temperatura}
|
|
onChange={(e) => setTemperatura(e.target.value)}
|
|
placeholder="36.5"
|
|
/>
|
|
</div>
|
|
<div>
|
|
<Label className="flex items-center gap-1">
|
|
<Droplets className="h-4 w-4" />SatO2
|
|
</Label>
|
|
<Input
|
|
type="number"
|
|
value={saturacionO2}
|
|
onChange={(e) => setSaturacionO2(e.target.value)}
|
|
placeholder="98"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="bg-green-50 p-3 rounded-lg border border-green-200">
|
|
<p className="text-sm font-bold text-green-800 mb-3 flex items-center gap-2">
|
|
<FileText className="h-4 w-4" />
|
|
Examen Físico
|
|
</p>
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
|
<div>
|
|
<Label>SNC</Label>
|
|
<textarea className="w-full p-2 border rounded-md text-sm min-h-[60px]" value={snc} onChange={(e) => setSnc(e.target.value)} placeholder="Estado neurológico" />
|
|
</div>
|
|
<div>
|
|
<Label>Cardiovascular</Label>
|
|
<textarea className="w-full p-2 border rounded-md text-sm min-h-[60px]" value={cardiovascular} onChange={(e) => setCardiovascular(e.target.value)} placeholder="Hallazgos cardiovasculares" />
|
|
</div>
|
|
<div>
|
|
<Label>Respiratorio</Label>
|
|
<textarea className="w-full p-2 border rounded-md text-sm min-h-[60px]" value={respiratorio} onChange={(e) => setRespiratorio(e.target.value)} placeholder="Hallazgos respiratorios" />
|
|
</div>
|
|
<div>
|
|
<Label>Abdominal</Label>
|
|
<textarea className="w-full p-2 border rounded-md text-sm min-h-[60px]" value={abdominal} onChange={(e) => setAbdominal(e.target.value)} placeholder="Hallazgos abdominales" />
|
|
</div>
|
|
<div>
|
|
<Label>Genitourinario</Label>
|
|
<textarea className="w-full p-2 border rounded-md text-sm min-h-[60px]" value={genitourinario} onChange={(e) => setGenitourinario(e.target.value)} placeholder="Hallazgos genitourinarios" />
|
|
</div>
|
|
<div>
|
|
<Label>Piel y anexos</Label>
|
|
<textarea className="w-full p-2 border rounded-md text-sm min-h-[60px]" value={pielAnexos} onChange={(e) => setPielAnexos(e.target.value)} placeholder="Estado de piel y anexos" />
|
|
</div>
|
|
<div>
|
|
<Label>SOMA</Label>
|
|
<Input value={soma} onChange={(e) => setSoma(e.target.value)} placeholder="Estado SOMA" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<Label>Novedades</Label>
|
|
<textarea
|
|
className="w-full p-2 border rounded-md text-sm min-h-[80px]"
|
|
value={novedades}
|
|
onChange={(e) => setNovedades(e.target.value)}
|
|
placeholder="Novedades..."
|
|
/>
|
|
</div>
|
|
|
|
<div>
|
|
<Label>Comentario</Label>
|
|
<textarea
|
|
className="w-full p-2 border rounded-md text-sm min-h-[80px]"
|
|
value={comentario}
|
|
onChange={(e) => setComentario(e.target.value)}
|
|
placeholder="Comentarios adicionales..."
|
|
/>
|
|
</div>
|
|
|
|
<div>
|
|
<Label>Pendientes</Label>
|
|
<textarea
|
|
className="w-full p-2 border rounded-md text-sm min-h-[80px]"
|
|
value={pendientes}
|
|
onChange={(e) => setPendientes(e.target.value)}
|
|
placeholder="Pendientes..."
|
|
/>
|
|
</div>
|
|
|
|
<div>
|
|
<Label>Médico *</Label>
|
|
<Input
|
|
value={medico}
|
|
onChange={(e) => setMedico(e.target.value)}
|
|
placeholder="Nombre del médico"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div className="flex justify-end gap-2 mt-4">
|
|
<Button variant="outline" onClick={() => { resetFormulario(); setDialogoAbierto(false); }}>
|
|
<X className="h-4 w-4 mr-2" />
|
|
Cancelar
|
|
</Button>
|
|
<Button variant="outline"
|
|
onClick={handleGuardar}
|
|
disabled={!medico || (!evolucionEditando && !pacienteSeleccionado)}
|
|
>
|
|
<Save className="h-4 w-4 mr-2" />
|
|
Guardar Evolución
|
|
</Button>
|
|
</div>
|
|
</DialogContent>
|
|
</Dialog>
|
|
</div>
|
|
|
|
<Card>
|
|
<CardContent className="p-4">
|
|
<div className="relative">
|
|
<Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" />
|
|
<Input
|
|
className="pl-10"
|
|
placeholder="Buscar por paciente..."
|
|
value={busqueda}
|
|
onChange={(e) => setBusqueda(e.target.value)}
|
|
/>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
<div className="space-y-4">
|
|
{evolucionesFiltradas.map((evolucion) => {
|
|
const internacion = internaciones.find(i => i.id === evolucion.internacionId);
|
|
const paciente = internacion ? getPacienteById(internacion.pacienteId) : null;
|
|
const signosTexto = getSignosVitalesTexto(evolucion.signosVitales);
|
|
const estaExpandida = evolucionExpandida === evolucion.id;
|
|
|
|
return (
|
|
<Card key={evolucion.id} className="hover:shadow-md transition-shadow">
|
|
<CardContent className="p-4">
|
|
<div className="flex flex-col gap-4">
|
|
{/* Patient Info */}
|
|
<div className="flex flex-col gap-3">
|
|
<div className="flex items-center gap-3">
|
|
<div className="h-10 w-10 bg-blue-100 rounded-full flex items-center justify-center">
|
|
<FileText className="h-5 w-5 text-blue-600" />
|
|
</div>
|
|
<div>
|
|
<h3 className="font-bold">
|
|
{paciente ? `${paciente.apellido}, ${paciente.nombre}` : 'Paciente no encontrado'}
|
|
</h3>
|
|
<div className="flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-gray-500">
|
|
<span className="flex items-center gap-1">
|
|
<Calendar className="h-3 w-3" />
|
|
{evolucion.fecha}
|
|
</span>
|
|
<span className="flex items-center gap-1">
|
|
<Clock className="h-3 w-3" />
|
|
{evolucion.hora}
|
|
</span>
|
|
<Badge variant="outline">{evolucion.medico}</Badge>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className="flex flex-wrap items-center gap-2">
|
|
<Button
|
|
size="sm"
|
|
variant="outline"
|
|
onClick={() => setEvolucionExpandida(estaExpandida ? null : evolucion.id)}
|
|
>
|
|
{estaExpandida ? <ChevronUp className="h-4 w-4" /> : <ChevronDown className="h-4 w-4" />}
|
|
</Button>
|
|
{onActualizarEvolucion && (
|
|
<Button size="sm" variant="outline" onClick={() => abrirEditar(evolucion)}>
|
|
<Pencil className="h-4 w-4" />
|
|
</Button>
|
|
)}
|
|
<Button variant="outline"
|
|
size="sm"
|
|
className="text-red-600"
|
|
onClick={() => onEliminarEvolucion(evolucion.id)}
|
|
>
|
|
<Trash2 className="h-4 w-4" />
|
|
Eliminar
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
|
|
{signosTexto && (
|
|
<div className="bg-blue-50 p-3 rounded-lg">
|
|
<p className="text-sm font-medium text-blue-800 flex items-center gap-2">
|
|
<Activity className="h-4 w-4" />
|
|
Signos Vitales: {signosTexto}
|
|
</p>
|
|
</div>
|
|
)}
|
|
|
|
{estaExpandida && (
|
|
<>
|
|
{evolucion.examenFisico && (
|
|
<div className="bg-green-50 p-3 rounded-lg border border-green-200">
|
|
<p className="text-sm font-medium text-green-800 mb-2">Examen Físico:</p>
|
|
<div className="grid grid-cols-1 sm:grid-cols-4 gap-2 text-xs">
|
|
{evolucion.examenFisico.SNC && <div><span className="font-medium">SNC:</span> {evolucion.examenFisico.SNC}</div>}
|
|
{evolucion.examenFisico.Cardiovascular && <div><span className="font-medium">CV:</span> {evolucion.examenFisico.Cardiovascular}</div>}
|
|
{evolucion.examenFisico.Respiratorio && <div><span className="font-medium">Resp:</span> {evolucion.examenFisico.Respiratorio}</div>}
|
|
{evolucion.examenFisico.Abdominal && <div><span className="font-medium">Abd:</span> {evolucion.examenFisico.Abdominal}</div>}
|
|
{evolucion.examenFisico.Genitourinario && <div><span className="font-medium">GU:</span> {evolucion.examenFisico.Genitourinario}</div>}
|
|
{evolucion.examenFisico.PielAnexos && <div><span className="font-medium">Piel:</span> {evolucion.examenFisico.PielAnexos}</div>}
|
|
{evolucion.examenFisico.SOMA && <div><span className="font-medium">SOMA:</span> {evolucion.examenFisico.SOMA}</div>}
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
{evolucion.novedades && (
|
|
<div className="bg-red-50 p-3 rounded-lg border border-red-200 mt-3">
|
|
<p className="text-sm font-medium text-red-800 mb-1">Novedades:</p>
|
|
<p className="text-sm text-gray-800 whitespace-pre-wrap">{evolucion.novedades}</p>
|
|
</div>
|
|
)}
|
|
|
|
{evolucion.comentario && (
|
|
<div>
|
|
<p className="text-sm font-medium text-gray-700">Comentario:</p>
|
|
<p className="text-sm text-gray-600 whitespace-pre-wrap">{evolucion.comentario}</p>
|
|
</div>
|
|
)}
|
|
|
|
{evolucion.pendientes && (
|
|
<div className="bg-amber-50 p-3 rounded-lg border border-amber-200">
|
|
<p className="text-sm font-medium text-amber-800 mb-1">Pendientes:</p>
|
|
<p className="text-sm text-amber-700 whitespace-pre-wrap">{evolucion.pendientes}</p>
|
|
</div>
|
|
)}
|
|
</>
|
|
)}
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
})}
|
|
</div>
|
|
|
|
{evolucionesFiltradas.length === 0 && (
|
|
<div className="text-center py-12 text-gray-400">
|
|
<FileText className="h-16 w-16 mx-auto mb-4 opacity-50" />
|
|
<p className="text-lg">
|
|
{busqueda ? 'No se encontraron evoluciones con esa búsqueda' : 'No hay evoluciones registradas'}
|
|
</p>
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|