Agregar hora a laboratorios: modal importar, save con hora seleccionada

This commit is contained in:
2026-04-17 01:43:22 -03:00
parent e9df92a1fb
commit 711b910344
6 changed files with 497 additions and 545 deletions
+50 -50
View File
@@ -26,12 +26,12 @@ interface MapaCamasProps {
getInternacionById: (id: string) => Internacion | undefined;
}
export function MapaCamas({
export function MapaCamas({
camas,
areas,
pacientes,
pacientes,
internaciones,
onActualizarCama,
onActualizarCama,
onAgregarCama,
onEliminarCama,
onIniciarInternacion,
@@ -117,7 +117,7 @@ export function MapaCamas({
const getOrden = (sala: number) => {
const grupo = Math.floor(sala / 100);
const esPar = sala % 2 === 0;
if (grupo === 2) {
if (esPar) return { grupo: 2, suborden: 0, sala }; // 2XX pares, menor a mayor
return { grupo: 1, suborden: 1, sala }; // 2XX impares, mayor a menor
@@ -173,7 +173,7 @@ export function MapaCamas({
return !internacionActiva;
});
return (
return (
<div className="space-y-6 dark:text-white">
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">
<div>
@@ -187,25 +187,25 @@ return (
<Badge variant="outline" className="bg-red-50 text-red-700">
{camas.filter(c => c.estado === 'Ocupada').length} Ocupadas
</Badge>
<div className="ml-4 flex items-center gap-2 flex-wrap sm:flex-nowrap">
<Button variant="outline" onClick={() => {
setEditingAreaId(null);
setAreaNombre('');
setAreaDialogOpen(true);
}} className="text-xs px-2 py-1 sm:text-sm sm:px-4 sm:py-2">
Administrar Áreas
</Button>
<Button variant="outline" onClick={() => {
setEditingBed(null);
setBedNumero('');
setBedTipo('General');
setBedAreaId(areas?.[0]?.id);
setBedDialogOpen(true);
}} className="text-xs px-2 py-1 sm:text-sm sm:px-4 sm:py-2">
<Plus className="h-3 w-3 sm:h-4 sm:w-4 sm:mr-1" />
<span className="hidden sm:inline">Agregar Cama</span>
</Button>
</div>
<div className="ml-4 flex items-center gap-2 flex-wrap sm:flex-nowrap">
<Button variant="outline" onClick={() => {
setEditingAreaId(null);
setAreaNombre('');
setAreaDialogOpen(true);
}} className="text-xs px-2 py-1 sm:text-sm sm:px-4 sm:py-2">
Administrar Áreas
</Button>
<Button variant="outline" onClick={() => {
setEditingBed(null);
setBedNumero('');
setBedTipo('General');
setBedAreaId(areas?.[0]?.id);
setBedDialogOpen(true);
}} className="text-xs px-2 py-1 sm:text-sm sm:px-4 sm:py-2">
<Plus className="h-3 w-3 sm:h-4 sm:w-4 sm:mr-1" />
<span className="hidden sm:inline">Agregar Cama</span>
</Button>
</div>
</div>
</div>
@@ -265,11 +265,11 @@ return (
{sortedCamas.map((cama) => {
const paciente = cama.pacienteId ? getPacienteById(cama.pacienteId) : null;
const internacion = cama.internacionId ? getInternacionById(cama.internacionId) : null;
return (
<Dialog key={cama.id}>
<DialogTrigger asChild>
<Card
<Card
className={`cursor-pointer hover:shadow-md transition-shadow border-2 w-full ${getEstadoColor(cama)}`}
onClick={() => setCamaSeleccionada(cama)}
>
@@ -291,12 +291,12 @@ return (
</div>
)}
</CardContent>
</Card>
</DialogTrigger>
<DialogContent className="sm:max-w-md">
<DialogHeader>
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<Bed className="h-5 w-5" />
Cama {cama.numero} - {cama.areaId ? areaById[cama.areaId] ?? 'Área desconocida' : 'Sin área'}
@@ -309,7 +309,7 @@ return (
</Badge>
<Badge variant="outline">{cama.tipo}</Badge>
</div>
{cama.estado === 'Ocupada' && paciente && internacion && (
<div className="bg-gray-50 p-4 rounded-lg space-y-2">
<p className="font-medium">Paciente:</p>
@@ -328,7 +328,7 @@ return (
<Dialog open={dialogoAbierto} onOpenChange={setDialogoAbierto}>
<DialogTrigger asChild>
<Button variant="outline"
className="w-full"
className="w-full"
onClick={() => {
setCamaSeleccionada(cama);
setDialogoAbierto(true);
@@ -398,22 +398,22 @@ return (
placeholder="Nombre del médico..."
/>
</div>
<Button variant="outline"
className="w-full"
onClick={handleOcuparCama}
disabled={!pacienteSeleccionado || !diagnostico || !enfermedadActual || !medico}
>
<Plus className="h-4 w-4 mr-1" />
Iniciar Internación
</Button>
<Button variant="outline"
className="w-full"
onClick={handleOcuparCama}
disabled={!pacienteSeleccionado || !diagnostico || !enfermedadActual || !medico}
>
<Plus className="h-4 w-4 mr-1" />
Iniciar Internación
</Button>
</div>
</DialogContent>
</Dialog>
)}
{cama.estado !== 'Disponible' && (
<Button
variant="outline"
<Button
variant="outline"
className="w-full"
onClick={() => handleCambiarEstado(cama, 'Disponible')}
>
@@ -421,10 +421,10 @@ return (
Disponible
</Button>
)}
{cama.estado !== 'Reparacion' && (
<Button
variant="outline"
<Button
variant="outline"
className="w-full"
onClick={() => handleCambiarEstado(cama, 'Reparacion')}
>
@@ -432,10 +432,10 @@ return (
Reparacion
</Button>
)}
{cama.estado !== 'Reservada' && (
<Button
variant="outline"
<Button
variant="outline"
className="w-full"
onClick={() => handleCambiarEstado(cama, 'Reservada')}
>
@@ -444,7 +444,7 @@ return (
</Button>
)}
<Button variant="outline" onClick={() => {
setEditingBed(cama);
setBedNumero(cama.numero);
@@ -462,9 +462,9 @@ return (
<Trash className="h-4 w-4 mr-1" />Eliminar
</Button>
</div>
</div>
</div>
</div>
</DialogContent>
</Dialog>
);