Fix responsive layouts for Internaciones/Evoluciones tables and currentUser undefined error

This commit is contained in:
2026-08-09 18:29:39 +00:00
parent 3cb381acd3
commit 7675df4ba1
8 changed files with 257 additions and 206 deletions
+12
View File
@@ -1,5 +1,6 @@
import { clsx, type ClassValue } from "clsx" import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge" import { twMerge } from "tailwind-merge"
import type { Usuario } from '@/types'
export function cn(...inputs: ClassValue[]) { export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs)) return twMerge(clsx(inputs))
@@ -12,3 +13,14 @@ export function formatDateDDMMYYYY(dateString: string): string {
const [year, month, day] = parts; const [year, month, day] = parts;
return `${day}-${month}-${year}`; return `${day}-${month}-${year}`;
} }
export function getNombreProfesional(user?: Usuario | null): string {
if (!user) return 'Admin';
if (user.rol === 'admin') return 'Admin';
const apellido = user.apellido?.trim() || '';
const nombre = user.nombre?.trim() || '';
if (apellido && nombre) return `${apellido}, ${nombre}`;
if (apellido) return apellido;
if (nombre) return nombre;
return 'Admin';
}
+9 -4
View File
@@ -8,6 +8,8 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@
import { Badge } from '@/components/ui/badge'; import { Badge } from '@/components/ui/badge';
import { toast } from 'sonner'; import { toast } from 'sonner';
import type { Paciente, Cama, Area, Internacion } from '@/types'; import type { Paciente, Cama, Area, Internacion } from '@/types';
import { getNombreProfesional } from '@/lib/utils';
import { useHospitalStore } from '@/hooks/useHospitalStore';
interface EditIngresoProps { interface EditIngresoProps {
internacion: Internacion; internacion: Internacion;
@@ -31,12 +33,15 @@ export function EditIngreso({
onAgregarCama, onAgregarCama,
onVolver, onVolver,
}: EditIngresoProps) { }: EditIngresoProps) {
const { currentUser } = useHospitalStore();
const [pacienteSeleccionado] = useState(internacion.pacienteId); const [pacienteSeleccionado] = useState(internacion.pacienteId);
const [camaSeleccionada] = useState(internacion.camaId); const [camaSeleccionada] = useState(internacion.camaId);
const [areaSeleccionada] = useState(internacion.areaId); const [areaSeleccionada] = useState(internacion.areaId);
const [camaInput, setCamaInput] = useState(''); const [camaInput, setCamaInput] = useState('');
const [modoCama, setModoCama] = useState<'seleccionar' | 'escribir'>('seleccionar'); const [modoCama, setModoCama] = useState<'seleccionar' | 'escribir'>('seleccionar');
const [medico, setMedico] = useState(internacion.medicoIngresante || ''); const defaultMedico = internacion.medicoIngresante || getNombreProfesional(currentUser);
const [medico, setMedico] = useState('');
const effectiveMedico = medico || defaultMedico;
const [fechaIngresoHospital, setFechaIngresoHospital] = useState(internacion.fechaIngresoHospital || ''); const [fechaIngresoHospital, setFechaIngresoHospital] = useState(internacion.fechaIngresoHospital || '');
const [fechaIngresoClinica, setFechaIngresoClinica] = useState(internacion.fechaIngresoClinica || ''); const [fechaIngresoClinica, setFechaIngresoClinica] = useState(internacion.fechaIngresoClinica || '');
const [motivoConsulta, setMotivoConsulta] = useState(internacion.motivoConsulta || ''); const [motivoConsulta, setMotivoConsulta] = useState(internacion.motivoConsulta || '');
@@ -111,7 +116,7 @@ export function EditIngreso({
return; return;
} }
if (!medico.trim()) { if (!effectiveMedico.trim()) {
toast.error('Debe ingresar el médico ingresante'); toast.error('Debe ingresar el médico ingresante');
return; return;
} }
@@ -166,7 +171,7 @@ export function EditIngreso({
pacienteId: pacienteSeleccionado, pacienteId: pacienteSeleccionado,
camaId: camaId, camaId: camaId,
areaId: newAreaId, areaId: newAreaId,
medicoIngresante: medico.trim(), medicoIngresante: effectiveMedico.trim(),
diagnosticoIngreso: diagnosticoIngreso.trim(), diagnosticoIngreso: diagnosticoIngreso.trim(),
motivoConsulta: motivoConsulta.trim() || undefined, motivoConsulta: motivoConsulta.trim() || undefined,
enfermedadActual: enfermedadActual.trim(), enfermedadActual: enfermedadActual.trim(),
@@ -464,7 +469,7 @@ export function EditIngreso({
<Label>Médico Ingresante *</Label> <Label>Médico Ingresante *</Label>
<Input <Input
placeholder="Nombre del médico" placeholder="Nombre del médico"
value={medico} value={effectiveMedico}
onChange={(e) => setMedico(e.target.value)} onChange={(e) => setMedico(e.target.value)}
/> />
</div> </div>
+85 -76
View File
@@ -10,6 +10,9 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
import { toast } from 'sonner'; import { toast } from 'sonner';
import type { Evolucion, Internacion, Paciente, Cama, SignosVitales, ExamenFisico } from '@/types'; import type { Evolucion, Internacion, Paciente, Cama, SignosVitales, ExamenFisico } from '@/types';
import { useHospitalStore } from '@/hooks/useHospitalStore';
import { getNombreProfesional } from '@/lib/utils';
interface EvolucionesProps { interface EvolucionesProps {
evoluciones: Evolucion[]; evoluciones: Evolucion[];
@@ -36,6 +39,7 @@ export function Evoluciones({
getPacienteById, getPacienteById,
getInternacionActivaByPaciente getInternacionActivaByPaciente
}: EvolucionesProps) { }: EvolucionesProps) {
const { currentUser } = useHospitalStore();
const [busqueda, setBusqueda] = useState(''); const [busqueda, setBusqueda] = useState('');
const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>(''); const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>('');
const [dialogoAbierto, setDialogoAbierto] = useState(false); const [dialogoAbierto, setDialogoAbierto] = useState(false);
@@ -44,7 +48,10 @@ export function Evoluciones({
const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]); const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]);
const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5)); const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5));
const defaultMedico = getNombreProfesional(currentUser);
const [medico, setMedico] = useState(''); const [medico, setMedico] = useState('');
const effectiveMedico = medico || defaultMedico;
const [temperatura, setTemperatura] = useState(''); const [temperatura, setTemperatura] = useState('');
const [presionSistolica, setPresionSistolica] = useState(''); const [presionSistolica, setPresionSistolica] = useState('');
const [presionDiastolica, setPresionDiastolica] = useState(''); const [presionDiastolica, setPresionDiastolica] = useState('');
@@ -118,7 +125,7 @@ export function Evoluciones({
? internaciones.find(i => i.id === evolucionEditando.internacionId) ? internaciones.find(i => i.id === evolucionEditando.internacionId)
: getInternacionActivaByPaciente(pacienteSeleccionado); : getInternacionActivaByPaciente(pacienteSeleccionado);
if (!medico.trim()) { if (!effectiveMedico.trim()) {
toast.error('Debe completar el nombre del médico'); toast.error('Debe completar el nombre del médico');
return; return;
} }
@@ -156,7 +163,7 @@ export function Evoluciones({
const evolucionData = { const evolucionData = {
fecha, fecha,
hora, hora,
medico: medico.trim(), medico: effectiveMedico.trim(),
signosVitales, signosVitales,
examenFisico, examenFisico,
novedades: novedades || undefined, novedades: novedades || undefined,
@@ -407,7 +414,7 @@ export function Evoluciones({
<div> <div>
<Label>Médico *</Label> <Label>Médico *</Label>
<Input <Input
value={medico} value={effectiveMedico}
onChange={(e) => setMedico(e.target.value)} onChange={(e) => setMedico(e.target.value)}
placeholder="Nombre del médico" placeholder="Nombre del médico"
/> />
@@ -420,7 +427,7 @@ export function Evoluciones({
</Button> </Button>
<Button variant="outline" <Button variant="outline"
onClick={handleGuardar} onClick={handleGuardar}
disabled={!medico || (!evolucionEditando && !pacienteSeleccionado)} disabled={!effectiveMedico || (!evolucionEditando && !pacienteSeleccionado)}
> >
<Save className="h-4 w-4 mr-2" /> <Save className="h-4 w-4 mr-2" />
Guardar Evolución Guardar Evolución
@@ -445,80 +452,82 @@ export function Evoluciones({
</Card> </Card>
{evolucionesFiltradas.length > 0 ? ( {evolucionesFiltradas.length > 0 ? (
<div className="rounded-md border overflow-x-auto bg-card"> <div className="grid grid-cols-1 w-full">
<Table className="w-full min-w-max text-sm"> <div className="w-full overflow-x-auto rounded-md border bg-card pb-2">
<TableHeader> <Table className="w-full min-w-max text-sm">
<TableRow> <TableHeader>
<TableHead>Fecha</TableHead> <TableRow>
<TableHead>Cama</TableHead> <TableHead>Fecha</TableHead>
<TableHead>Paciente</TableHead> <TableHead>Cama</TableHead>
<TableHead>Profesional</TableHead> <TableHead>Paciente</TableHead>
<TableHead className="text-center">TAS</TableHead> <TableHead>Profesional</TableHead>
<TableHead className="text-center">TAD</TableHead> <TableHead className="text-center">TAS</TableHead>
<TableHead className="text-center">FC</TableHead> <TableHead className="text-center">TAD</TableHead>
<TableHead className="text-center">FR</TableHead> <TableHead className="text-center">FC</TableHead>
<TableHead className="text-center"></TableHead> <TableHead className="text-center">FR</TableHead>
<TableHead className="text-center">Sat</TableHead> <TableHead className="text-center"></TableHead>
<TableHead className="text-center w-[60px]">Acciones</TableHead> <TableHead className="text-center">Sat</TableHead>
</TableRow> <TableHead className="text-center w-[60px]">Acciones</TableHead>
</TableHeader> </TableRow>
<TableBody> </TableHeader>
{evolucionesFiltradas.map((evolucion) => { <TableBody>
const internacion = internaciones.find(i => i.id === evolucion.internacionId); {evolucionesFiltradas.map((evolucion) => {
const paciente = internacion ? getPacienteById(internacion.pacienteId) : null; const internacion = internaciones.find(i => i.id === evolucion.internacionId);
const cama = internacion ? (getCamaById ? getCamaById(internacion.camaId) : camas?.find(c => c.id === internacion.camaId)) : null; const paciente = internacion ? getPacienteById(internacion.pacienteId) : null;
const sv = evolucion.signosVitales; const cama = internacion ? (getCamaById ? getCamaById(internacion.camaId) : camas?.find(c => c.id === internacion.camaId)) : null;
const sv = evolucion.signosVitales;
return ( return (
<TableRow key={evolucion.id} className="hover:bg-muted/50"> <TableRow key={evolucion.id} className="hover:bg-muted/50">
<TableCell className="whitespace-nowrap font-medium text-xs"> <TableCell className="whitespace-nowrap font-medium text-xs">
{evolucion.fecha} {evolucion.hora || ''} {evolucion.fecha} {evolucion.hora || ''}
</TableCell> </TableCell>
<TableCell className="text-xs whitespace-nowrap"> <TableCell className="text-xs whitespace-nowrap">
{cama ? cama.numero : '-'} {cama ? cama.numero : '-'}
</TableCell> </TableCell>
<TableCell className="font-medium text-xs whitespace-nowrap"> <TableCell className="font-medium text-xs whitespace-nowrap">
{paciente ? `${paciente.apellido}, ${paciente.nombre}` : 'Sin paciente'} {paciente ? `${paciente.apellido}, ${paciente.nombre}` : 'Sin paciente'}
</TableCell> </TableCell>
<TableCell className="text-xs whitespace-nowrap"> <TableCell className="text-xs whitespace-nowrap">
{evolucion.medico || '-'} {evolucion.medico || '-'}
</TableCell> </TableCell>
<TableCell className="text-center text-xs">{sv?.presionSistolica ?? '-'}</TableCell> <TableCell className="text-center text-xs">{sv?.presionSistolica ?? '-'}</TableCell>
<TableCell className="text-center text-xs">{sv?.presionDiastolica ?? '-'}</TableCell> <TableCell className="text-center text-xs">{sv?.presionDiastolica ?? '-'}</TableCell>
<TableCell className="text-center text-xs">{sv?.frecuenciaCardiaca ?? '-'}</TableCell> <TableCell className="text-center text-xs">{sv?.frecuenciaCardiaca ?? '-'}</TableCell>
<TableCell className="text-center text-xs">{sv?.frecuenciaRespiratoria ?? '-'}</TableCell> <TableCell className="text-center text-xs">{sv?.frecuenciaRespiratoria ?? '-'}</TableCell>
<TableCell className="text-center text-xs">{sv?.temperatura !== undefined ? `${sv.temperatura}°C` : '-'}</TableCell> <TableCell className="text-center text-xs">{sv?.temperatura !== undefined ? `${sv.temperatura}°C` : '-'}</TableCell>
<TableCell className="text-center text-xs">{sv?.saturacionO2 !== undefined ? `${sv.saturacionO2}%` : '-'}</TableCell> <TableCell className="text-center text-xs">{sv?.saturacionO2 !== undefined ? `${sv.saturacionO2}%` : '-'}</TableCell>
<TableCell className="text-center p-1"> <TableCell className="text-center p-1">
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<Button size="sm" variant="ghost" className="h-8 w-8 p-0"> <Button size="sm" variant="ghost" className="h-8 w-8 p-0">
<MoreHorizontal className="h-4 w-4" /> <MoreHorizontal className="h-4 w-4" />
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent align="end"> <DropdownMenuContent align="end">
<DropdownMenuItem onClick={() => setEvolucionDetalle(evolucion)}> <DropdownMenuItem onClick={() => setEvolucionDetalle(evolucion)}>
<Eye className="mr-2 h-4 w-4" /> <Eye className="mr-2 h-4 w-4" />
Detalles Detalles
</DropdownMenuItem>
{onActualizarEvolucion && (
<DropdownMenuItem onClick={() => abrirEditar(evolucion)}>
<Pencil className="mr-2 h-4 w-4" />
Editar
</DropdownMenuItem> </DropdownMenuItem>
)} {onActualizarEvolucion && (
<DropdownMenuItem onClick={() => onEliminarEvolucion(evolucion.id)} className="text-red-600 focus:text-red-600"> <DropdownMenuItem onClick={() => abrirEditar(evolucion)}>
<Trash2 className="mr-2 h-4 w-4" /> <Pencil className="mr-2 h-4 w-4" />
Eliminar Editar
</DropdownMenuItem> </DropdownMenuItem>
</DropdownMenuContent> )}
</DropdownMenu> <DropdownMenuItem onClick={() => onEliminarEvolucion(evolucion.id)} className="text-red-600 focus:text-red-600">
</TableCell> <Trash2 className="mr-2 h-4 w-4" />
</TableRow> Eliminar
); </DropdownMenuItem>
})} </DropdownMenuContent>
</TableBody> </DropdownMenu>
</Table> </TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</div>
</div> </div>
) : ( ) : (
<div className="text-center py-12 text-gray-400"> <div className="text-center py-12 text-gray-400">
+9 -4
View File
@@ -2,6 +2,8 @@ import { useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { PDFDocument } from 'pdf-lib'; import { PDFDocument } from 'pdf-lib';
import { User } from 'lucide-react'; import { User } from 'lucide-react';
import { useHospitalStore } from '@/hooks/useHospitalStore';
import { getNombreProfesional } from '@/lib/utils';
import { import {
Accordion, Accordion,
AccordionContent, AccordionContent,
@@ -1755,13 +1757,16 @@ function SeccionEvoluciones({ evos, internacionId, add, update, del, canEdit }:
del: (id: string) => void; del: (id: string) => void;
canEdit?: boolean; canEdit?: boolean;
}) { }) {
const { currentUser } = useHospitalStore();
const [dialog, setDialog] = useState(false); const [dialog, setDialog] = useState(false);
const [edit, setEdit] = useState<Evolucion | null>(null); const [edit, setEdit] = useState<Evolucion | null>(null);
const [evoDetalle, setEvoDetalle] = useState<Evolucion | null>(null); const [evoDetalle, setEvoDetalle] = useState<Evolucion | null>(null);
const [expanded, setExpanded] = useState<string | null>(null); const [expanded, setExpanded] = useState<string | null>(null);
const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]); const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]);
const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5)); const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5));
const defaultMedico = getNombreProfesional(currentUser);
const [medico, setMedico] = useState(''); const [medico, setMedico] = useState('');
const effectiveMedico = medico || defaultMedico;
const [temperatura, setTemperatura] = useState(''); const [temperatura, setTemperatura] = useState('');
const [presionSistolica, setPresionSistolica] = useState(''); const [presionSistolica, setPresionSistolica] = useState('');
const [presionDiastolica, setPresionDiastolica] = useState(''); const [presionDiastolica, setPresionDiastolica] = useState('');
@@ -1829,7 +1834,7 @@ function SeccionEvoluciones({ evos, internacionId, add, update, del, canEdit }:
const evosFiltered = evos.filter(e => e.internacionId === internacionId).sort((a, b) => new Date(b.fecha + 'T' + b.hora).getTime() - new Date(a.fecha + 'T' + a.hora).getTime()); const evosFiltered = evos.filter(e => e.internacionId === internacionId).sort((a, b) => new Date(b.fecha + 'T' + b.hora).getTime() - new Date(a.fecha + 'T' + a.hora).getTime());
const handle = async () => { const handle = async () => {
if (!medico.trim()) { if (!effectiveMedico.trim()) {
toast.error('Ingrese el nombre del médico'); toast.error('Ingrese el nombre del médico');
return; return;
} }
@@ -1839,7 +1844,7 @@ function SeccionEvoluciones({ evos, internacionId, add, update, del, canEdit }:
const examenFisico = snc || cardiovascular || respiratorio || abdominal || genitourinario || pielAnexos || soma const examenFisico = 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 } ? { SNC: snc || undefined, Cardiovascular: cardiovascular || undefined, Respiratorio: respiratorio || undefined, Abdominal: abdominal || undefined, Genitourinario: genitourinario || undefined, PielAnexos: pielAnexos || undefined, SOMA: soma || undefined }
: undefined; : undefined;
const data = { fecha, hora, medico: medico.trim(), signosVitales, examenFisico, novedades: novedades || undefined, comentario: comentario || undefined, pendientes: pendientes || undefined }; const data = { fecha, hora, medico: effectiveMedico.trim(), signosVitales, examenFisico, novedades: novedades || undefined, comentario: comentario || undefined, pendientes: pendientes || undefined };
try { try {
if (edit) { if (edit) {
@@ -1898,9 +1903,9 @@ function SeccionEvoluciones({ evos, internacionId, add, update, del, canEdit }:
<div><Label>Comentario</Label><textarea className="w-full p-2 border rounded-md text-sm min-h-[80px] bg-transparent dark:bg-input/30" value={comentario} onChange={e => setComentario(e.target.value)} placeholder="Comentarios adicionales..." /></div> <div><Label>Comentario</Label><textarea className="w-full p-2 border rounded-md text-sm min-h-[80px] bg-transparent dark:bg-input/30" 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] bg-transparent dark:bg-input/30" value={pendientes} onChange={e => setPendientes(e.target.value)} placeholder="Pendientes..." /></div> <div><Label>Pendientes</Label><textarea className="w-full p-2 border rounded-md text-sm min-h-[80px] bg-transparent dark:bg-input/30" value={pendientes} onChange={e => setPendientes(e.target.value)} placeholder="Pendientes..." /></div>
</div> </div>
<div><Label>Médico *</Label><Input value={medico} onChange={e => setMedico(e.target.value)} placeholder="Nombre del médico" /></div> <div><Label>Médico *</Label><Input value={effectiveMedico} onChange={e => setMedico(e.target.value)} placeholder="Nombre del médico" /></div>
</div> </div>
<div className="flex justify-end gap-2 mt-4"><Button variant="outline" onClick={() => { reset(); setDialog(false); }}><X className="h-4 w-4 mr-2" />Cancelar</Button><Button onClick={handle} disabled={!medico}><Save className="h-4 w-4 mr-2" />Guardar Evolución</Button></div> <div className="flex justify-end gap-2 mt-4"><Button variant="outline" onClick={() => { reset(); setDialog(false); }}><X className="h-4 w-4 mr-2" />Cancelar</Button><Button onClick={handle} disabled={!effectiveMedico}><Save className="h-4 w-4 mr-2" />Guardar Evolución</Button></div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
{evosFiltered.length === 0 ? ( {evosFiltered.length === 0 ? (
+107 -101
View File
@@ -11,7 +11,8 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
import { toast } from 'sonner'; import { toast } from 'sonner';
import type { Internacion, Paciente, Cama, Area, Evolucion, Laboratorio, Cultivo } from '@/types'; import type { Internacion, Paciente, Cama, Area, Evolucion, Laboratorio, Cultivo } from '@/types';
import { formatDateDDMMYYYY } from '@/lib/utils'; import { formatDateDDMMYYYY, getNombreProfesional } from '@/lib/utils';
import { useHospitalStore } from '@/hooks/useHospitalStore';
interface InternacionesProps { interface InternacionesProps {
internaciones: Internacion[]; internaciones: Internacion[];
@@ -45,6 +46,7 @@ export function Internaciones({
onVerHC, onVerHC,
onNuevoIngreso, onNuevoIngreso,
}: InternacionesProps) { }: InternacionesProps) {
const { currentUser } = useHospitalStore();
const [filtroEstado, setFiltroEstado] = useState<'todas' | 'activas' | 'finalizadas'>('todas'); const [filtroEstado, setFiltroEstado] = useState<'todas' | 'activas' | 'finalizadas'>('todas');
const [dialogoNuevaAbierto, setDialogoNuevaAbierto] = useState(false); const [dialogoNuevaAbierto, setDialogoNuevaAbierto] = useState(false);
const [dialogoEgresoAbierto, setDialogoEgresoAbierto] = useState(false); const [dialogoEgresoAbierto, setDialogoEgresoAbierto] = useState(false);
@@ -58,6 +60,8 @@ export function Internaciones({
const [motivoConsulta, setMotivoConsulta] = useState(''); const [motivoConsulta, setMotivoConsulta] = useState('');
const [antecedentesEnfermedadActual, setAntecedentesEnfermedadActual] = useState(''); const [antecedentesEnfermedadActual, setAntecedentesEnfermedadActual] = useState('');
const [medicoIngresante, setMedicoIngresante] = useState(''); const [medicoIngresante, setMedicoIngresante] = useState('');
const defaultMedico = getNombreProfesional(currentUser);
const effectiveMedico = medicoIngresante || defaultMedico;
// Formulario nueva internación // Formulario nueva internación
const [fechaEgreso, setFechaEgreso] = useState(''); const [fechaEgreso, setFechaEgreso] = useState('');
@@ -71,7 +75,7 @@ export function Internaciones({
setDiagnosticoIngreso(''); setDiagnosticoIngreso('');
setEnfermedadActual(''); setEnfermedadActual('');
setAntecedentesEnfermedadActual(''); setAntecedentesEnfermedadActual('');
setMedicoIngresante(''); setMedicoIngresante(getNombreProfesional(currentUser));
}; };
const resetFormularioEgreso = () => { const resetFormularioEgreso = () => {
@@ -82,7 +86,7 @@ export function Internaciones({
}; };
const handleIniciarInternacion = async () => { const handleIniciarInternacion = async () => {
if (pacienteSeleccionado && camaSeleccionada && areaSeleccionada && (diagnosticoIngreso || motivoConsulta) && enfermedadActual && medicoIngresante) { if (pacienteSeleccionado && camaSeleccionada && areaSeleccionada && (diagnosticoIngreso || motivoConsulta) && enfermedadActual && effectiveMedico) {
try { try {
await onIniciarInternacion({ await onIniciarInternacion({
pacienteId: pacienteSeleccionado, pacienteId: pacienteSeleccionado,
@@ -92,7 +96,7 @@ export function Internaciones({
motivoConsulta, motivoConsulta,
enfermedadActual, enfermedadActual,
antecedentesEnfermedadActual: antecedentesEnfermedadActual || undefined, antecedentesEnfermedadActual: antecedentesEnfermedadActual || undefined,
medicoIngresante, medicoIngresante: effectiveMedico,
}); });
toast.success('Internación iniciada correctamente'); toast.success('Internación iniciada correctamente');
resetFormularioNueva(); resetFormularioNueva();
@@ -344,7 +348,7 @@ export function Internaciones({
<div> <div>
<Label>Médico Ingresante *</Label> <Label>Médico Ingresante *</Label>
<Input <Input
value={medicoIngresante} value={effectiveMedico}
onChange={(e) => setMedicoIngresante(e.target.value)} onChange={(e) => setMedicoIngresante(e.target.value)}
placeholder="Nombre del médico ingresante" placeholder="Nombre del médico ingresante"
/> />
@@ -352,7 +356,7 @@ export function Internaciones({
<Button variant="outline" <Button variant="outline"
className="w-full" className="w-full"
onClick={handleIniciarInternacion} onClick={handleIniciarInternacion}
disabled={!pacienteSeleccionado || !camaSeleccionada || !motivoConsulta || !enfermedadActual || !medicoIngresante} disabled={!pacienteSeleccionado || !camaSeleccionada || !motivoConsulta || !enfermedadActual || !effectiveMedico}
> >
<Plus className="h-4 w-4 mr-2" /> <Plus className="h-4 w-4 mr-2" />
Iniciar Internación Iniciar Internación
@@ -402,104 +406,106 @@ export function Internaciones({
</p> </p>
</div> </div>
) : ( ) : (
<div className="rounded-md border overflow-x-auto bg-card"> <div className="grid grid-cols-1 w-full">
<Table className="w-full min-w-max text-sm"> <div className="w-full overflow-x-auto rounded-md border bg-card pb-2">
<TableHeader> <Table className="w-full min-w-max text-sm">
<TableRow> <TableHeader>
<TableHead>Cama</TableHead> <TableRow>
<TableHead>Apellido</TableHead> <TableHead>Cama</TableHead>
<TableHead>Nombre</TableHead> <TableHead>Apellido</TableHead>
<TableHead className="text-center">Edad</TableHead> <TableHead>Nombre</TableHead>
<TableHead className="text-center">DNI</TableHead> <TableHead className="text-center">Edad</TableHead>
<TableHead className="text-center">Estado</TableHead> <TableHead className="text-center">DNI</TableHead>
<TableHead className="text-center">Fecha Ingreso</TableHead> <TableHead className="text-center">Estado</TableHead>
<TableHead className="text-center">Duración</TableHead> <TableHead className="text-center">Fecha Ingreso</TableHead>
<TableHead className="text-center w-[60px]">Acciones</TableHead> <TableHead className="text-center">Duración</TableHead>
</TableRow> <TableHead className="text-center w-[60px]">Acciones</TableHead>
</TableHeader> </TableRow>
<TableBody> </TableHeader>
{internacionesFiltradas.map((internacion) => { <TableBody>
const paciente = getPacienteById(internacion.pacienteId); {internacionesFiltradas.map((internacion) => {
const cama = getCamaById(internacion.camaId); const paciente = getPacienteById(internacion.pacienteId);
const fechaIng = internacion.fechaIngresoClinica const cama = getCamaById(internacion.camaId);
? formatDateDDMMYYYY(internacion.fechaIngresoClinica) const fechaIng = internacion.fechaIngresoClinica
: (internacion.fechaIngreso ? formatDateDDMMYYYY(internacion.fechaIngreso) : '-'); ? formatDateDDMMYYYY(internacion.fechaIngresoClinica)
: (internacion.fechaIngreso ? formatDateDDMMYYYY(internacion.fechaIngreso) : '-');
return ( return (
<TableRow key={internacion.id} className="hover:bg-muted/50"> <TableRow key={internacion.id} className="hover:bg-muted/50">
<TableCell className="font-medium text-xs whitespace-nowrap"> <TableCell className="font-medium text-xs whitespace-nowrap">
{cama ? cama.numero : '-'} {cama ? cama.numero : '-'}
</TableCell> </TableCell>
<TableCell className="text-xs font-medium whitespace-nowrap"> <TableCell className="text-xs font-medium whitespace-nowrap">
{paciente?.apellido || '-'} {paciente?.apellido || '-'}
</TableCell> </TableCell>
<TableCell className="text-xs font-medium whitespace-nowrap"> <TableCell className="text-xs font-medium whitespace-nowrap">
{paciente?.nombre || '-'} {paciente?.nombre || '-'}
</TableCell> </TableCell>
<TableCell className="text-center text-xs whitespace-nowrap"> <TableCell className="text-center text-xs whitespace-nowrap">
{calcularEdad(paciente?.fechaNacimiento)} {calcularEdad(paciente?.fechaNacimiento)}
</TableCell> </TableCell>
<TableCell className="text-center text-xs whitespace-nowrap font-mono"> <TableCell className="text-center text-xs whitespace-nowrap font-mono">
{paciente?.dni || '-'} {paciente?.dni || '-'}
</TableCell> </TableCell>
<TableCell className="text-center"> <TableCell className="text-center">
{internacion.activa ? ( {internacion.activa ? (
<Badge className="bg-purple-100 text-purple-800 dark:bg-purple-950/80 dark:text-purple-300 border-purple-200 hover:bg-purple-100"> <Badge className="bg-purple-100 text-purple-800 dark:bg-purple-950/80 dark:text-purple-300 border-purple-200 hover:bg-purple-100">
Activa Activa
</Badge>
) : (
<Badge variant="outline" className="bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300 border-gray-300">
Alta
</Badge>
)}
</TableCell>
<TableCell className="text-center text-xs whitespace-nowrap">
{fechaIng}
</TableCell>
<TableCell className="text-center text-xs whitespace-nowrap">
{(() => {
const dias = calcularDiasDuracion(internacion);
if (dias === null) return '-';
const esMenorOIgual10 = dias <= 10;
return (
<Badge
className={
esMenorOIgual10
? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-950/80 dark:text-emerald-300 border-emerald-200 hover:bg-emerald-100'
: 'bg-red-100 text-red-800 dark:bg-red-950/80 dark:text-red-300 border-red-200 hover:bg-red-100'
}
>
{dias} {dias === 1 ? 'día' : 'días'}
</Badge> </Badge>
); ) : (
})()} <Badge variant="outline" className="bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300 border-gray-300">
</TableCell> Alta
<TableCell className="text-center p-1"> </Badge>
<DropdownMenu> )}
<DropdownMenuTrigger asChild> </TableCell>
<Button size="sm" variant="ghost" className="h-8 w-8 p-0"> <TableCell className="text-center text-xs whitespace-nowrap">
<MoreHorizontal className="h-4 w-4" /> {fechaIng}
</Button> </TableCell>
</DropdownMenuTrigger> <TableCell className="text-center text-xs whitespace-nowrap">
<DropdownMenuContent align="end"> {(() => {
<DropdownMenuItem onClick={() => { if (typeof onVerHC === 'function') onVerHC(internacion.id); }}> const dias = calcularDiasDuracion(internacion);
<FileText className="mr-2 h-4 w-4" /> if (dias === null) return '-';
Ver HC const esMenorOIgual10 = dias <= 10;
</DropdownMenuItem> return (
{internacion.activa && ( <Badge
<DropdownMenuItem onClick={() => abrirDialogoEgreso(internacion)}> className={
<LogOut className="mr-2 h-4 w-4" /> esMenorOIgual10
Registrar Egreso ? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-950/80 dark:text-emerald-300 border-emerald-200 hover:bg-emerald-100'
: 'bg-red-100 text-red-800 dark:bg-red-950/80 dark:text-red-300 border-red-200 hover:bg-red-100'
}
>
{dias} {dias === 1 ? 'día' : 'días'}
</Badge>
);
})()}
</TableCell>
<TableCell className="text-center p-1">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button size="sm" variant="ghost" className="h-8 w-8 p-0">
<MoreHorizontal className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem onClick={() => { if (typeof onVerHC === 'function') onVerHC(internacion.id); }}>
<FileText className="mr-2 h-4 w-4" />
Ver HC
</DropdownMenuItem> </DropdownMenuItem>
)} {internacion.activa && (
</DropdownMenuContent> <DropdownMenuItem onClick={() => abrirDialogoEgreso(internacion)}>
</DropdownMenu> <LogOut className="mr-2 h-4 w-4" />
</TableCell> Registrar Egreso
</TableRow> </DropdownMenuItem>
); )}
})} </DropdownMenuContent>
</TableBody> </DropdownMenu>
</Table> </TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</div>
</div> </div>
)} )}
+10 -7
View File
@@ -3,7 +3,8 @@ import { Bed, CheckCircle2, Clock, Wrench, User, Plus, Trash, Edit2, Save, X } f
import { Card, CardContent } from '@/components/ui/card'; import { Card, CardContent } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge'; import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { formatDateDDMMYYYY } from '@/lib/utils'; import { formatDateDDMMYYYY, getNombreProfesional } from '@/lib/utils';
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { Label } from '@/components/ui/label'; import { Label } from '@/components/ui/label';
@@ -42,7 +43,7 @@ export function MapaCamas({
getPacienteById, getPacienteById,
getInternacionById getInternacionById
}: MapaCamasProps) { }: MapaCamasProps) {
const { canEditCama, canAccessArea } = useHospitalStore(); const { canEditCama, canAccessArea, currentUser } = useHospitalStore();
const [filtroSala, setFiltroSala] = useState<string>('todas'); const [filtroSala, setFiltroSala] = useState<string>('todas');
const [filtroTipo, setFiltroTipo] = useState<string>('todos'); const [filtroTipo, setFiltroTipo] = useState<string>('todos');
const [filtroEstado, setFiltroEstado] = useState<string>('todos'); const [filtroEstado, setFiltroEstado] = useState<string>('todos');
@@ -53,6 +54,8 @@ export function MapaCamas({
const [enfermedadActual, setEnfermedadActual] = useState(''); const [enfermedadActual, setEnfermedadActual] = useState('');
const [antecedentesEnfermedadActual, setAntecedentesEnfermedadActual] = useState(''); const [antecedentesEnfermedadActual, setAntecedentesEnfermedadActual] = useState('');
const [medico, setMedico] = useState(''); const [medico, setMedico] = useState('');
const defaultMedico = getNombreProfesional(currentUser);
const effectiveMedico = medico || defaultMedico;
const [dialogoAbierto, setDialogoAbierto] = useState(false); const [dialogoAbierto, setDialogoAbierto] = useState(false);
// Area dialog state // Area dialog state
const [areaDialogOpen, setAreaDialogOpen] = useState(false); const [areaDialogOpen, setAreaDialogOpen] = useState(false);
@@ -148,7 +151,7 @@ export function MapaCamas({
}); });
const handleOcuparCama = () => { const handleOcuparCama = () => {
if (camaSeleccionada && areaSeleccionada && pacienteSeleccionado && diagnostico && enfermedadActual && medico) { if (camaSeleccionada && areaSeleccionada && pacienteSeleccionado && diagnostico && enfermedadActual && effectiveMedico) {
onIniciarInternacion({ onIniciarInternacion({
pacienteId: pacienteSeleccionado, pacienteId: pacienteSeleccionado,
camaId: camaSeleccionada.id, camaId: camaSeleccionada.id,
@@ -156,7 +159,7 @@ export function MapaCamas({
diagnosticoIngreso: diagnostico, diagnosticoIngreso: diagnostico,
enfermedadActual, enfermedadActual,
antecedentesEnfermedadActual: antecedentesEnfermedadActual || undefined, antecedentesEnfermedadActual: antecedentesEnfermedadActual || undefined,
medicoIngresante: medico, medicoIngresante: effectiveMedico,
}); });
setDialogoAbierto(false); setDialogoAbierto(false);
setCamaSeleccionada(null); setCamaSeleccionada(null);
@@ -165,7 +168,7 @@ export function MapaCamas({
setDiagnostico(''); setDiagnostico('');
setEnfermedadActual(''); setEnfermedadActual('');
setAntecedentesEnfermedadActual(''); setAntecedentesEnfermedadActual('');
setMedico(''); setMedico(getNombreProfesional(currentUser));
} }
}; };
@@ -414,7 +417,7 @@ export function MapaCamas({
<input <input
type="text" type="text"
className="w-full p-2 border rounded-md text-sm" className="w-full p-2 border rounded-md text-sm"
value={medico} value={effectiveMedico}
onChange={(e) => setMedico(e.target.value)} onChange={(e) => setMedico(e.target.value)}
placeholder="Nombre del médico..." placeholder="Nombre del médico..."
/> />
@@ -422,7 +425,7 @@ export function MapaCamas({
<Button variant="outline" <Button variant="outline"
className="w-full" className="w-full"
onClick={handleOcuparCama} onClick={handleOcuparCama}
disabled={!pacienteSeleccionado || !diagnostico || !enfermedadActual || !medico} disabled={!pacienteSeleccionado || !diagnostico || !enfermedadActual || !effectiveMedico}
> >
<Plus className="h-4 w-4 mr-1" /> <Plus className="h-4 w-4 mr-1" />
Iniciar Internación Iniciar Internación
+8 -3
View File
@@ -8,6 +8,8 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@
import { Badge } from '@/components/ui/badge'; import { Badge } from '@/components/ui/badge';
import { toast } from 'sonner'; import { toast } from 'sonner';
import type { Paciente, Cama, Area, Internacion } from '@/types'; import type { Paciente, Cama, Area, Internacion } from '@/types';
import { getNombreProfesional } from '@/lib/utils';
import { useHospitalStore } from '@/hooks/useHospitalStore';
interface NuevoIngresoProps { interface NuevoIngresoProps {
pacientes: Paciente[]; pacientes: Paciente[];
@@ -22,12 +24,15 @@ interface NuevoIngresoProps {
} }
export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, onAgregarCama, onVolver, getAreaName }: NuevoIngresoProps) { export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, onAgregarCama, onVolver, getAreaName }: NuevoIngresoProps) {
const { currentUser } = useHospitalStore();
const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>(''); const [pacienteSeleccionado, setPacienteSeleccionado] = useState<string>('');
const [busqueda, setBusqueda] = useState(''); const [busqueda, setBusqueda] = useState('');
const [camaSeleccionada, setCamaSeleccionada] = useState(''); const [camaSeleccionada, setCamaSeleccionada] = useState('');
const [camaInput, setCamaInput] = useState(''); const [camaInput, setCamaInput] = useState('');
const [modoCama, setModoCama] = useState<'seleccionar' | 'escribir'>('seleccionar'); const [modoCama, setModoCama] = useState<'seleccionar' | 'escribir'>('seleccionar');
const [medico, setMedico] = useState(''); const [medico, setMedico] = useState('');
const defaultMedico = getNombreProfesional(currentUser);
const effectiveMedico = medico || defaultMedico;
const [fechaIngresoHospital, setFechaIngresoHospital] = useState(''); const [fechaIngresoHospital, setFechaIngresoHospital] = useState('');
const [fechaIngresoClinica, setFechaIngresoClinica] = useState(''); const [fechaIngresoClinica, setFechaIngresoClinica] = useState('');
const [motivoConsulta, setMotivoConsulta] = useState(''); const [motivoConsulta, setMotivoConsulta] = useState('');
@@ -131,7 +136,7 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
return; return;
} }
if (!medico.trim()) { if (!effectiveMedico.trim()) {
toast.error('Debe ingresar el nombre del Médico Ingresante'); toast.error('Debe ingresar el nombre del Médico Ingresante');
return; return;
} }
@@ -176,7 +181,7 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
pacienteId: pacienteSeleccionado, pacienteId: pacienteSeleccionado,
camaId: camaId, camaId: camaId,
areaId: newAreaId, areaId: newAreaId,
medicoIngresante: medico.trim(), medicoIngresante: effectiveMedico.trim(),
diagnosticoIngreso: diagnosticoIngreso.trim(), diagnosticoIngreso: diagnosticoIngreso.trim(),
motivoConsulta: motivoConsulta.trim() || undefined, motivoConsulta: motivoConsulta.trim() || undefined,
enfermedadActual: enfermedadActual.trim(), enfermedadActual: enfermedadActual.trim(),
@@ -463,7 +468,7 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on
<Label>Médico Ingresante *</Label> <Label>Médico Ingresante *</Label>
<Input <Input
placeholder="Nombre del médico" placeholder="Nombre del médico"
value={medico} value={effectiveMedico}
onChange={(e) => setMedico(e.target.value)} onChange={(e) => setMedico(e.target.value)}
/> />
</div> </div>
+17 -11
View File
@@ -10,6 +10,8 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
import { Plus, Pencil, Trash2, X } from 'lucide-react'; import { Plus, Pencil, Trash2, X } from 'lucide-react';
import type { Indicacion, IndicacionTipo, ViaAdministracion, TipoPlanHidratacion, TipoInsulina, ATB } from '@/types'; import type { Indicacion, IndicacionTipo, ViaAdministracion, TipoPlanHidratacion, TipoInsulina, ATB } from '@/types';
import { useHospitalStore } from '@/hooks/useHospitalStore';
import { getNombreProfesional } from '@/lib/utils';
export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId, add, update, del, movimientos, onAgregarMovimiento, canEdit, atbList = [], addATB, updateATB }: { export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId, add, update, del, movimientos, onAgregarMovimiento, canEdit, atbList = [], addATB, updateATB }: {
recomendaciones: Indicacion[]; recomendaciones: Indicacion[];
@@ -25,12 +27,15 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
addATB?: (a: Omit<ATB, 'id'>) => Promise<unknown>; addATB?: (a: Omit<ATB, 'id'>) => Promise<unknown>;
updateATB?: (id: string, datos: Partial<ATB>) => void; updateATB?: (id: string, datos: Partial<ATB>) => void;
}) { }) {
const { currentUser } = useHospitalStore();
const list: Indicacion[] = Array.isArray(recomendaciones) ? recomendaciones : []; const list: Indicacion[] = Array.isArray(recomendaciones) ? recomendaciones : [];
const movs = Array.isArray(movimientos) ? movimientos : []; const movs = Array.isArray(movimientos) ? movimientos : [];
const [dialog, setDialog] = useState(false); const [dialog, setDialog] = useState(false);
const [edit, setEdit] = useState<Indicacion | null>(null); const [edit, setEdit] = useState<Indicacion | null>(null);
const [deleteConfirmInd, setDeleteConfirmInd] = useState<Indicacion | null>(null); const [deleteConfirmInd, setDeleteConfirmInd] = useState<Indicacion | null>(null);
const [deleteMedico, setDeleteMedico] = useState<string>(''); const defaultMedico = getNombreProfesional(currentUser);
const [deleteMedico, setDeleteMedico] = useState('');
const effectiveDeleteMedico = deleteMedico || defaultMedico;
const formatIndicacion = (i: Indicacion): string => { const formatIndicacion = (i: Indicacion): string => {
if (i.tipo === 'Farmacologica' || i.tipo === 'Farmacologica Profilactica' || i.tipo === 'Farmacologica Antibiótico') return `${i.droga || ''} ${i.dosis || ''} ${i.frecuenciaHoras ? `c/${i.frecuenciaHoras}hs` : ''} ${i.via || ''}`.trim(); if (i.tipo === 'Farmacologica' || i.tipo === 'Farmacologica Profilactica' || i.tipo === 'Farmacologica Antibiótico') return `${i.droga || ''} ${i.dosis || ''} ${i.frecuenciaHoras ? `c/${i.frecuenciaHoras}hs` : ''} ${i.via || ''}`.trim();
@@ -80,6 +85,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
const [unidadesAlmuerzo, setUnidadesAlmuerzo] = useState<number | ''>(''); const [unidadesAlmuerzo, setUnidadesAlmuerzo] = useState<number | ''>('');
const [unidadesNoche, setUnidadesNoche] = useState<number | ''>(''); const [unidadesNoche, setUnidadesNoche] = useState<number | ''>('');
const [medico, setMedico] = useState(''); const [medico, setMedico] = useState('');
const effectiveMedico = medico || defaultMedico;
const [showHistorial, setShowHistorial] = useState(false); const [showHistorial, setShowHistorial] = useState(false);
const vias: ViaAdministracion[] = ['Via Oral', 'EV', 'IM', 'SC', 'Por GGT', 'Por SNG']; const vias: ViaAdministracion[] = ['Via Oral', 'EV', 'IM', 'SC', 'Por GGT', 'Por SNG'];
@@ -104,7 +110,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
setUnidadesDesayuno(''); setUnidadesDesayuno('');
setUnidadesAlmuerzo(''); setUnidadesAlmuerzo('');
setUnidadesNoche(''); setUnidadesNoche('');
setMedico(''); setMedico(getNombreProfesional(currentUser));
}; };
const loadEdit = (i: Indicacion) => { const loadEdit = (i: Indicacion) => {
@@ -129,7 +135,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
}; };
const handleGuardar = async () => { const handleGuardar = async () => {
if (!medico.trim()) return; if (!effectiveMedico.trim()) return;
if ((tipo === 'Farmacologica' || tipo === 'Farmacologica Profilactica' || tipo === 'Farmacologica Antibiótico') && (!droga.trim() || !dosis.trim())) return; if ((tipo === 'Farmacologica' || tipo === 'Farmacologica Profilactica' || tipo === 'Farmacologica Antibiótico') && (!droga.trim() || !dosis.trim())) return;
if (tipo === 'Farmacologica Insulina' && (!unidadesDesayuno && !unidadesAlmuerzo && !unidadesNoche)) return; if (tipo === 'Farmacologica Insulina' && (!unidadesDesayuno && !unidadesAlmuerzo && !unidadesNoche)) return;
if (tipo === 'No Farmacologica' && !indicacionNoFco.trim()) return; if (tipo === 'No Farmacologica' && !indicacionNoFco.trim()) return;
@@ -140,7 +146,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
internacionId, internacionId,
tipo, tipo,
estado: 'Activa', estado: 'Activa',
medicoCrea: medico, medicoCrea: effectiveMedico,
fechaCrea: new Date().toISOString().split('T')[0], fechaCrea: new Date().toISOString().split('T')[0],
}; };
@@ -177,7 +183,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
internacionId, internacionId,
tipo: 'Modificacion', tipo: 'Modificacion',
fecha, fecha,
profesional: medico, profesional: effectiveMedico,
indicacionPrevia: formatIndicacion(edit), indicacionPrevia: formatIndicacion(edit),
indicacionNueva: formatIndicacion({ ...edit, ...data } as Indicacion), indicacionNueva: formatIndicacion({ ...edit, ...data } as Indicacion),
}); });
@@ -203,7 +209,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
internacionId, internacionId,
tipo: 'Nueva', tipo: 'Nueva',
fecha, fecha,
profesional: medico, profesional: effectiveMedico,
indicacionNueva: formatIndicacion({ ...data, id: newId } as Indicacion), indicacionNueva: formatIndicacion({ ...data, id: newId } as Indicacion),
}); });
} }
@@ -283,7 +289,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
<div> <div>
<Label>Médico *</Label> <Label>Médico *</Label>
<Input value={medico} onChange={e => setMedico(e.target.value)} placeholder="Nombre del médico" /> <Input value={effectiveMedico} onChange={e => setMedico(e.target.value)} placeholder="Nombre del médico" />
</div> </div>
{(tipo === 'Farmacologica' || tipo === 'Farmacologica Antibiótico') && ( {(tipo === 'Farmacologica' || tipo === 'Farmacologica Antibiótico') && (
@@ -356,7 +362,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
</div> </div>
<div className="flex justify-end gap-2 mt-4"> <div className="flex justify-end gap-2 mt-4">
<Button variant="outline" onClick={() => setDialog(false)}><X className="h-4 w-4 mr-2" />Cancelar</Button> <Button variant="outline" onClick={() => setDialog(false)}><X className="h-4 w-4 mr-2" />Cancelar</Button>
<Button onClick={handleGuardar} disabled={!medico.trim()}>Guardar</Button> <Button onClick={handleGuardar} disabled={!effectiveMedico.trim()}>Guardar</Button>
</div> </div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
@@ -405,7 +411,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
</Button>} </Button>}
{canEdit && <Button size="sm" variant="outline" className="h-7 w-7 p-0 text-red-600 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-950/30" title="Eliminar" onClick={() => { {canEdit && <Button size="sm" variant="outline" className="h-7 w-7 p-0 text-red-600 hover:text-red-700 hover:bg-red-50 dark:hover:bg-red-950/30" title="Eliminar" onClick={() => {
setDeleteConfirmInd(ind); setDeleteConfirmInd(ind);
setDeleteMedico(ind.medicoCrea || ''); setDeleteMedico(getNombreProfesional(currentUser));
}}> }}>
<Trash2 className="h-3.5 w-3.5" /> <Trash2 className="h-3.5 w-3.5" />
</Button>} </Button>}
@@ -437,7 +443,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
<Label htmlFor="delete-medico">Médico que suspende / elimina *</Label> <Label htmlFor="delete-medico">Médico que suspende / elimina *</Label>
<Input <Input
id="delete-medico" id="delete-medico"
value={deleteMedico} value={effectiveDeleteMedico}
onChange={(e) => setDeleteMedico(e.target.value)} onChange={(e) => setDeleteMedico(e.target.value)}
placeholder="Nombre del profesional..." placeholder="Nombre del profesional..."
/> />
@@ -450,7 +456,7 @@ export function SeccionIndicaciones({ recomendaciones, internacionId, pacienteId
<Button <Button
variant="destructive" variant="destructive"
onClick={async () => { onClick={async () => {
const med = deleteMedico.trim() || deleteConfirmInd.medicoCrea || 'Médico'; const med = effectiveDeleteMedico.trim() || deleteConfirmInd.medicoCrea || 'Médico';
const indToDel = deleteConfirmInd; const indToDel = deleteConfirmInd;
setDeleteConfirmInd(null); setDeleteConfirmInd(null);
await handleSuspender(indToDel, med); await handleSuspender(indToDel, med);